@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.
Files changed (102) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +755 -28
  3. package/dist/adapters/in-memory-registry.d.ts +18 -0
  4. package/dist/adapters/in-memory-registry.d.ts.map +1 -0
  5. package/dist/adapters/in-memory-registry.js +25 -0
  6. package/dist/adapters/in-memory-sequence-tracker.d.ts +28 -0
  7. package/dist/adapters/in-memory-sequence-tracker.d.ts.map +1 -0
  8. package/dist/adapters/in-memory-sequence-tracker.js +82 -0
  9. package/dist/adapters/in-memory-state-manager.d.ts +24 -0
  10. package/dist/adapters/in-memory-state-manager.d.ts.map +1 -0
  11. package/dist/adapters/in-memory-state-manager.js +81 -0
  12. package/dist/adapters/in-memory-store.d.ts +18 -0
  13. package/dist/adapters/in-memory-store.d.ts.map +1 -0
  14. package/dist/adapters/in-memory-store.js +25 -0
  15. package/dist/adapters/index.d.ts +5 -0
  16. package/dist/adapters/index.d.ts.map +1 -0
  17. package/dist/adapters/index.js +4 -0
  18. package/dist/constants/headers.d.ts +10 -0
  19. package/dist/constants/headers.d.ts.map +1 -0
  20. package/dist/constants/headers.js +9 -0
  21. package/dist/constants/index.d.ts +2 -0
  22. package/dist/constants/index.d.ts.map +1 -0
  23. package/dist/constants/index.js +1 -0
  24. package/dist/contracts/framework-adapter.d.ts +118 -0
  25. package/dist/contracts/framework-adapter.d.ts.map +1 -0
  26. package/dist/contracts/framework-adapter.js +1 -0
  27. package/dist/contracts/index.d.ts +2 -0
  28. package/dist/contracts/index.d.ts.map +1 -0
  29. package/dist/contracts/index.js +1 -0
  30. package/dist/domain/config-builder.d.ts +9 -0
  31. package/dist/domain/config-builder.d.ts.map +1 -0
  32. package/dist/domain/config-builder.js +20 -0
  33. package/dist/domain/index.d.ts +5 -0
  34. package/dist/domain/index.d.ts.map +1 -0
  35. package/dist/domain/index.js +4 -0
  36. package/dist/domain/path-extraction.d.ts +17 -0
  37. package/dist/domain/path-extraction.d.ts.map +1 -0
  38. package/dist/domain/path-extraction.js +60 -0
  39. package/dist/domain/regex-matching.d.ts +20 -0
  40. package/dist/domain/regex-matching.d.ts.map +1 -0
  41. package/dist/domain/regex-matching.js +27 -0
  42. package/dist/domain/response-selector.d.ts +22 -0
  43. package/dist/domain/response-selector.d.ts.map +1 -0
  44. package/dist/domain/response-selector.js +337 -0
  45. package/dist/domain/scenario-manager.d.ts +20 -0
  46. package/dist/domain/scenario-manager.d.ts.map +1 -0
  47. package/dist/domain/scenario-manager.js +90 -0
  48. package/dist/domain/template-replacement.d.ts +11 -0
  49. package/dist/domain/template-replacement.d.ts.map +1 -0
  50. package/dist/domain/template-replacement.js +94 -0
  51. package/dist/index.d.ts +8 -0
  52. package/dist/index.d.ts.map +1 -0
  53. package/dist/index.js +8 -0
  54. package/dist/ports/driven/request-context.d.ts +43 -0
  55. package/dist/ports/driven/request-context.d.ts.map +1 -0
  56. package/dist/ports/driven/request-context.js +1 -0
  57. package/dist/ports/driven/response-selector.d.ts +34 -0
  58. package/dist/ports/driven/response-selector.d.ts.map +1 -0
  59. package/dist/ports/driven/response-selector.js +9 -0
  60. package/dist/ports/driven/scenario-registry.d.ts +46 -0
  61. package/dist/ports/driven/scenario-registry.d.ts.map +1 -0
  62. package/dist/ports/driven/scenario-registry.js +1 -0
  63. package/dist/ports/driven/scenario-store.d.ts +33 -0
  64. package/dist/ports/driven/scenario-store.d.ts.map +1 -0
  65. package/dist/ports/driven/scenario-store.js +1 -0
  66. package/dist/ports/driven/sequence-tracker.d.ts +49 -0
  67. package/dist/ports/driven/sequence-tracker.d.ts.map +1 -0
  68. package/dist/ports/driven/sequence-tracker.js +1 -0
  69. package/dist/ports/driven/state-manager.d.ts +56 -0
  70. package/dist/ports/driven/state-manager.d.ts.map +1 -0
  71. package/dist/ports/driven/state-manager.js +1 -0
  72. package/dist/ports/driving/scenario-manager.d.ts +99 -0
  73. package/dist/ports/driving/scenario-manager.d.ts.map +1 -0
  74. package/dist/ports/driving/scenario-manager.js +1 -0
  75. package/dist/ports/index.d.ts +8 -0
  76. package/dist/ports/index.d.ts.map +1 -0
  77. package/dist/ports/index.js +1 -0
  78. package/dist/schemas/index.d.ts +18 -0
  79. package/dist/schemas/index.d.ts.map +1 -0
  80. package/dist/schemas/index.js +17 -0
  81. package/dist/schemas/match-criteria.d.ts +27 -0
  82. package/dist/schemas/match-criteria.d.ts.map +1 -0
  83. package/dist/schemas/match-criteria.js +71 -0
  84. package/dist/schemas/scenario-definition.d.ts +276 -0
  85. package/dist/schemas/scenario-definition.d.ts.map +1 -0
  86. package/dist/schemas/scenario-definition.js +78 -0
  87. package/dist/schemas/scenario-requests.d.ts +33 -0
  88. package/dist/schemas/scenario-requests.d.ts.map +1 -0
  89. package/dist/schemas/scenario-requests.js +29 -0
  90. package/dist/schemas/scenarios-object.d.ts +91 -0
  91. package/dist/schemas/scenarios-object.d.ts.map +1 -0
  92. package/dist/schemas/scenarios-object.js +17 -0
  93. package/dist/types/config.d.ts +70 -0
  94. package/dist/types/config.d.ts.map +1 -0
  95. package/dist/types/config.js +1 -0
  96. package/dist/types/index.d.ts +4 -0
  97. package/dist/types/index.d.ts.map +1 -0
  98. package/dist/types/index.js +1 -0
  99. package/dist/types/scenario.d.ts +141 -0
  100. package/dist/types/scenario.d.ts.map +1 -0
  101. package/dist/types/scenario.js +1 -0
  102. 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.1",
4
- "description": "OIDC trusted publishing setup package for @scenarist/core",
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
- "oidc",
7
- "trusted-publishing",
8
- "setup"
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
+ }