@scenarist/core 0.0.1 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +755 -28
- package/dist/adapters/in-memory-registry.d.ts +18 -0
- package/dist/adapters/in-memory-registry.d.ts.map +1 -0
- package/dist/adapters/in-memory-registry.js +25 -0
- package/dist/adapters/in-memory-sequence-tracker.d.ts +28 -0
- package/dist/adapters/in-memory-sequence-tracker.d.ts.map +1 -0
- package/dist/adapters/in-memory-sequence-tracker.js +82 -0
- package/dist/adapters/in-memory-state-manager.d.ts +24 -0
- package/dist/adapters/in-memory-state-manager.d.ts.map +1 -0
- package/dist/adapters/in-memory-state-manager.js +81 -0
- package/dist/adapters/in-memory-store.d.ts +18 -0
- package/dist/adapters/in-memory-store.d.ts.map +1 -0
- package/dist/adapters/in-memory-store.js +25 -0
- package/dist/adapters/index.d.ts +5 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +4 -0
- package/dist/constants/headers.d.ts +10 -0
- package/dist/constants/headers.d.ts.map +1 -0
- package/dist/constants/headers.js +9 -0
- package/dist/constants/index.d.ts +2 -0
- package/dist/constants/index.d.ts.map +1 -0
- package/dist/constants/index.js +1 -0
- package/dist/contracts/framework-adapter.d.ts +118 -0
- package/dist/contracts/framework-adapter.d.ts.map +1 -0
- package/dist/contracts/framework-adapter.js +1 -0
- package/dist/contracts/index.d.ts +2 -0
- package/dist/contracts/index.d.ts.map +1 -0
- package/dist/contracts/index.js +1 -0
- package/dist/domain/config-builder.d.ts +9 -0
- package/dist/domain/config-builder.d.ts.map +1 -0
- package/dist/domain/config-builder.js +20 -0
- package/dist/domain/index.d.ts +5 -0
- package/dist/domain/index.d.ts.map +1 -0
- package/dist/domain/index.js +4 -0
- package/dist/domain/path-extraction.d.ts +17 -0
- package/dist/domain/path-extraction.d.ts.map +1 -0
- package/dist/domain/path-extraction.js +60 -0
- package/dist/domain/regex-matching.d.ts +20 -0
- package/dist/domain/regex-matching.d.ts.map +1 -0
- package/dist/domain/regex-matching.js +27 -0
- package/dist/domain/response-selector.d.ts +22 -0
- package/dist/domain/response-selector.d.ts.map +1 -0
- package/dist/domain/response-selector.js +337 -0
- package/dist/domain/scenario-manager.d.ts +20 -0
- package/dist/domain/scenario-manager.d.ts.map +1 -0
- package/dist/domain/scenario-manager.js +90 -0
- package/dist/domain/template-replacement.d.ts +11 -0
- package/dist/domain/template-replacement.d.ts.map +1 -0
- package/dist/domain/template-replacement.js +94 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/ports/driven/request-context.d.ts +43 -0
- package/dist/ports/driven/request-context.d.ts.map +1 -0
- package/dist/ports/driven/request-context.js +1 -0
- package/dist/ports/driven/response-selector.d.ts +34 -0
- package/dist/ports/driven/response-selector.d.ts.map +1 -0
- package/dist/ports/driven/response-selector.js +9 -0
- package/dist/ports/driven/scenario-registry.d.ts +46 -0
- package/dist/ports/driven/scenario-registry.d.ts.map +1 -0
- package/dist/ports/driven/scenario-registry.js +1 -0
- package/dist/ports/driven/scenario-store.d.ts +33 -0
- package/dist/ports/driven/scenario-store.d.ts.map +1 -0
- package/dist/ports/driven/scenario-store.js +1 -0
- package/dist/ports/driven/sequence-tracker.d.ts +49 -0
- package/dist/ports/driven/sequence-tracker.d.ts.map +1 -0
- package/dist/ports/driven/sequence-tracker.js +1 -0
- package/dist/ports/driven/state-manager.d.ts +56 -0
- package/dist/ports/driven/state-manager.d.ts.map +1 -0
- package/dist/ports/driven/state-manager.js +1 -0
- package/dist/ports/driving/scenario-manager.d.ts +99 -0
- package/dist/ports/driving/scenario-manager.d.ts.map +1 -0
- package/dist/ports/driving/scenario-manager.js +1 -0
- package/dist/ports/index.d.ts +8 -0
- package/dist/ports/index.d.ts.map +1 -0
- package/dist/ports/index.js +1 -0
- package/dist/schemas/index.d.ts +18 -0
- package/dist/schemas/index.d.ts.map +1 -0
- package/dist/schemas/index.js +17 -0
- package/dist/schemas/match-criteria.d.ts +27 -0
- package/dist/schemas/match-criteria.d.ts.map +1 -0
- package/dist/schemas/match-criteria.js +71 -0
- package/dist/schemas/scenario-definition.d.ts +276 -0
- package/dist/schemas/scenario-definition.d.ts.map +1 -0
- package/dist/schemas/scenario-definition.js +78 -0
- package/dist/schemas/scenario-requests.d.ts +33 -0
- package/dist/schemas/scenario-requests.d.ts.map +1 -0
- package/dist/schemas/scenario-requests.js +29 -0
- package/dist/schemas/scenarios-object.d.ts +91 -0
- package/dist/schemas/scenarios-object.d.ts.map +1 -0
- package/dist/schemas/scenarios-object.js +17 -0
- package/dist/types/config.d.ts +70 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +1 -0
- package/dist/types/index.d.ts +4 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +1 -0
- package/dist/types/scenario.d.ts +141 -0
- package/dist/types/scenario.d.ts.map +1 -0
- package/dist/types/scenario.js +1 -0
- package/package.json +67 -7
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import type { HttpMethod, ScenaristScenario } from '../schemas/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* HTTP request data for response selection.
|
|
4
|
+
* Framework adapters extract this from their specific request objects.
|
|
5
|
+
* Used by ResponseSelector to match requests against MockDefinition criteria.
|
|
6
|
+
*/
|
|
7
|
+
export type HttpRequestContext = {
|
|
8
|
+
readonly method: HttpMethod;
|
|
9
|
+
readonly url: string;
|
|
10
|
+
readonly body?: unknown;
|
|
11
|
+
readonly headers: Readonly<Record<string, string>>;
|
|
12
|
+
readonly query: Readonly<Record<string, string>>;
|
|
13
|
+
/**
|
|
14
|
+
* Path parameters extracted from URL pattern matching.
|
|
15
|
+
*
|
|
16
|
+
* MSW compatibility:
|
|
17
|
+
* - Simple params (:id) → string
|
|
18
|
+
* - Repeating params (:path+) → ReadonlyArray<string>
|
|
19
|
+
* - Absent optional params (:id?) → key omitted from object
|
|
20
|
+
*/
|
|
21
|
+
readonly params?: Readonly<Record<string, string | ReadonlyArray<string>>>;
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Mock paired with its extracted URL path parameters.
|
|
25
|
+
* Used to pass both the mock definition and its params through the pipeline.
|
|
26
|
+
*
|
|
27
|
+
* When URL matching succeeds, params are extracted from the URL pattern.
|
|
28
|
+
* After ResponseSelector chooses a mock, those params are added to HttpRequestContext
|
|
29
|
+
* so template replacement can use them via {{params.key}} syntax.
|
|
30
|
+
*
|
|
31
|
+
* Example:
|
|
32
|
+
* ```typescript
|
|
33
|
+
* // Mock with pattern: '/users/:id'
|
|
34
|
+
* // Request URL: '/users/123'
|
|
35
|
+
* // Result: { mock: {...}, params: { id: '123' } }
|
|
36
|
+
* ```
|
|
37
|
+
*/
|
|
38
|
+
export type ScenaristMockWithParams = {
|
|
39
|
+
readonly mock: import('../schemas/index.js').ScenaristMock;
|
|
40
|
+
readonly params?: Readonly<Record<string, string | ReadonlyArray<string>>>;
|
|
41
|
+
};
|
|
42
|
+
/**
|
|
43
|
+
* State capture configuration for stateful mocks (Phase 3).
|
|
44
|
+
* Maps state keys to path expressions for extracting values from requests.
|
|
45
|
+
*
|
|
46
|
+
* Path syntax:
|
|
47
|
+
* - 'body.field' - Extract from request body
|
|
48
|
+
* - 'headers.field' - Extract from request headers
|
|
49
|
+
* - 'query.field' - Extract from query parameters
|
|
50
|
+
*
|
|
51
|
+
* Array syntax:
|
|
52
|
+
* - 'stateKey[]' - Append to array (creates array if doesn't exist)
|
|
53
|
+
* - 'stateKey' - Overwrite value
|
|
54
|
+
*
|
|
55
|
+
* Example:
|
|
56
|
+
* ```typescript
|
|
57
|
+
* captureState: {
|
|
58
|
+
* 'cartItems[]': 'body.item', // Append item to cartItems array
|
|
59
|
+
* 'userId': 'headers.x-user-id' // Store user ID from header
|
|
60
|
+
* }
|
|
61
|
+
* ```
|
|
62
|
+
*
|
|
63
|
+
* NOTE: CaptureState type is now schema-inferred from ScenaristCaptureConfigSchema.
|
|
64
|
+
*/
|
|
65
|
+
/**
|
|
66
|
+
* Serializable mock definition.
|
|
67
|
+
* Represents an HTTP mock that can be converted to MSW handlers at runtime.
|
|
68
|
+
*
|
|
69
|
+
* A mock must have EITHER `response` (single response) OR `sequence` (ordered responses).
|
|
70
|
+
*
|
|
71
|
+
* NOTE: MockDefinition type is now schema-inferred from ScenaristMockSchema.
|
|
72
|
+
*/
|
|
73
|
+
/**
|
|
74
|
+
* Serializable scenario definition.
|
|
75
|
+
* This is pure data that can be:
|
|
76
|
+
* - Stored in Redis for distributed testing
|
|
77
|
+
* - Saved to files for version control
|
|
78
|
+
* - Fetched from remote APIs
|
|
79
|
+
* - Stored in databases
|
|
80
|
+
*
|
|
81
|
+
* At runtime, ScenaristMocks are converted to MSW HttpHandlers.
|
|
82
|
+
*
|
|
83
|
+
* NOTE: ScenarioDefinition type is now schema-inferred from ScenaristScenarioSchema.
|
|
84
|
+
*/
|
|
85
|
+
/**
|
|
86
|
+
* Represents an active scenario for a specific test ID.
|
|
87
|
+
* Stores only references to enable serialization to Redis/storage.
|
|
88
|
+
*
|
|
89
|
+
* To get the full scenario definition, look up scenarioId in the registry.
|
|
90
|
+
*/
|
|
91
|
+
export type ActiveScenario = {
|
|
92
|
+
readonly scenarioId: string;
|
|
93
|
+
};
|
|
94
|
+
/**
|
|
95
|
+
* Result type for operations that can fail.
|
|
96
|
+
* Prefer this over throwing exceptions for expected error cases.
|
|
97
|
+
*/
|
|
98
|
+
export type ScenaristResult<T, E = Error> = {
|
|
99
|
+
readonly success: true;
|
|
100
|
+
readonly data: T;
|
|
101
|
+
} | {
|
|
102
|
+
readonly success: false;
|
|
103
|
+
readonly error: E;
|
|
104
|
+
};
|
|
105
|
+
/**
|
|
106
|
+
* Scenarios object type enforced across all adapters.
|
|
107
|
+
* Ensures scenarios are defined as a named object for type inference.
|
|
108
|
+
*
|
|
109
|
+
* This enables TypeScript to extract scenario IDs from object keys,
|
|
110
|
+
* providing autocomplete and type safety in adapter APIs.
|
|
111
|
+
*
|
|
112
|
+
* @example
|
|
113
|
+
* ```typescript
|
|
114
|
+
* const scenarios = {
|
|
115
|
+
* cartWithState: { id: 'cartWithState', name: 'Cart with State', ... },
|
|
116
|
+
* premiumUser: { id: 'premiumUser', name: 'Premium User', ... },
|
|
117
|
+
* } as const satisfies ScenaristScenarios;
|
|
118
|
+
* ```
|
|
119
|
+
*/
|
|
120
|
+
export type ScenaristScenarios = Record<string, ScenaristScenario>;
|
|
121
|
+
/**
|
|
122
|
+
* Extract scenario IDs from scenarios object for type safety.
|
|
123
|
+
* Enables TypeScript autocomplete for scenario names in tests and adapters.
|
|
124
|
+
*
|
|
125
|
+
* The `& string` ensures the result is always a string type (not `string | number | symbol`).
|
|
126
|
+
*
|
|
127
|
+
* @template T - Scenarios object type
|
|
128
|
+
*
|
|
129
|
+
* @example
|
|
130
|
+
* ```typescript
|
|
131
|
+
* const scenarios = {
|
|
132
|
+
* cartWithState: { ... },
|
|
133
|
+
* premiumUser: { ... },
|
|
134
|
+
* } as const;
|
|
135
|
+
*
|
|
136
|
+
* type MyScenarioIds = ScenarioIds<typeof scenarios>;
|
|
137
|
+
* // Result: 'cartWithState' | 'premiumUser'
|
|
138
|
+
* ```
|
|
139
|
+
*/
|
|
140
|
+
export type ScenarioIds<T extends ScenaristScenarios> = keyof T & string;
|
|
141
|
+
//# sourceMappingURL=scenario.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scenario.d.ts","sourceRoot":"","sources":["../../src/types/scenario.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAEzE;;;;GAIG;AACH,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAC5B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACnD,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACjD;;;;;;;OAOG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;CAC5E,CAAC;AAEF;;;;;;;;;;;;;;GAcG;AACH,MAAM,MAAM,uBAAuB,GAAG;IACpC,QAAQ,CAAC,IAAI,EAAE,OAAO,qBAAqB,EAAE,aAAa,CAAC;IAC3D,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;CAC5E,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH;;;;;;;GAOG;AAEH;;;;;;;;;;;GAWG;AAEH;;;;;GAKG;AACH,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,eAAe,CAAC,CAAC,EAAE,CAAC,GAAG,KAAK,IACpC;IAAE,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAA;CAAE,GAC5C;IAAE,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAA;CAAE,CAAC;AAEnD;;;;;;;;;;;;;;GAcG;AACH,MAAM,MAAM,kBAAkB,GAAG,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;AAEnE;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,kBAAkB,IAAI,MAAM,CAAC,GAAG,MAAM,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/package.json
CHANGED
|
@@ -1,10 +1,70 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@scenarist/core",
|
|
3
|
-
"version": "0.0
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Internal: Hexagonal architecture core for scenario-based testing with MSW",
|
|
5
|
+
"author": "Paul Hammond (citypaul) <paul@packsoftware.co.uk>",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"homepage": "https://github.com/citypaul/scenarist#readme",
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "https://github.com/citypaul/scenarist.git",
|
|
11
|
+
"directory": "internal/core"
|
|
12
|
+
},
|
|
13
|
+
"bugs": {
|
|
14
|
+
"url": "https://github.com/citypaul/scenarist/issues"
|
|
15
|
+
},
|
|
5
16
|
"keywords": [
|
|
6
|
-
"
|
|
7
|
-
"
|
|
8
|
-
"
|
|
9
|
-
|
|
10
|
-
|
|
17
|
+
"msw",
|
|
18
|
+
"mock-service-worker",
|
|
19
|
+
"testing",
|
|
20
|
+
"scenario-testing",
|
|
21
|
+
"test-isolation",
|
|
22
|
+
"e2e-testing",
|
|
23
|
+
"integration-testing",
|
|
24
|
+
"hexagonal-architecture",
|
|
25
|
+
"typescript"
|
|
26
|
+
],
|
|
27
|
+
"engines": {
|
|
28
|
+
"node": ">=18.0.0"
|
|
29
|
+
},
|
|
30
|
+
"publishConfig": {
|
|
31
|
+
"access": "public"
|
|
32
|
+
},
|
|
33
|
+
"type": "module",
|
|
34
|
+
"sideEffects": false,
|
|
35
|
+
"main": "./dist/index.js",
|
|
36
|
+
"types": "./dist/index.d.ts",
|
|
37
|
+
"exports": {
|
|
38
|
+
".": {
|
|
39
|
+
"types": "./dist/index.d.ts",
|
|
40
|
+
"import": "./dist/index.js"
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
"files": [
|
|
44
|
+
"dist",
|
|
45
|
+
"README.md",
|
|
46
|
+
"LICENSE"
|
|
47
|
+
],
|
|
48
|
+
"dependencies": {
|
|
49
|
+
"msw": "^2.12.1",
|
|
50
|
+
"redos-detector": "^6.1.2",
|
|
51
|
+
"zod": "^4.1.12"
|
|
52
|
+
},
|
|
53
|
+
"devDependencies": {
|
|
54
|
+
"@vitest/coverage-v8": "^4.0.8",
|
|
55
|
+
"@vitest/ui": "^4.0.8",
|
|
56
|
+
"eslint": "^9.39.1",
|
|
57
|
+
"typescript": "^5.9.3",
|
|
58
|
+
"vitest": "^4.0.8",
|
|
59
|
+
"@scenarist/eslint-config": "0.0.0",
|
|
60
|
+
"@scenarist/typescript-config": "0.0.0"
|
|
61
|
+
},
|
|
62
|
+
"scripts": {
|
|
63
|
+
"build": "tsc",
|
|
64
|
+
"dev": "tsc --watch",
|
|
65
|
+
"test": "vitest run",
|
|
66
|
+
"test:watch": "vitest",
|
|
67
|
+
"lint": "eslint .",
|
|
68
|
+
"typecheck": "tsc --project tsconfig.typecheck.json --noEmit"
|
|
69
|
+
}
|
|
70
|
+
}
|