@auto-engineer/narrative 1.138.0 → 1.140.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/.turbo/turbo-build.log +1 -1
- package/.turbo/turbo-test.log +5 -5
- package/.turbo/turbo-type-check.log +1 -1
- package/CHANGELOG.md +41 -0
- package/dist/scripts/convert-flow-exec.js +2 -2
- package/dist/scripts/convert-flow-exec.js.map +1 -1
- package/dist/scripts/print-schema.js +5 -5
- package/dist/scripts/print-schema.js.map +1 -1
- package/dist/src/fluent-builder.d.ts +29 -29
- package/dist/src/fluent-builder.d.ts.map +1 -1
- package/dist/src/fluent-builder.js +81 -81
- package/dist/src/fluent-builder.js.map +1 -1
- package/dist/src/{getNarratives.d.ts → getScenes.d.ts} +6 -6
- package/dist/src/getScenes.d.ts.map +1 -0
- package/dist/src/{getNarratives.js → getScenes.js} +16 -16
- package/dist/src/getScenes.js.map +1 -0
- package/dist/src/id/addAutoIds.d.ts.map +1 -1
- package/dist/src/id/addAutoIds.js +22 -22
- package/dist/src/id/addAutoIds.js.map +1 -1
- package/dist/src/id/hasAllIds.d.ts.map +1 -1
- package/dist/src/id/hasAllIds.js +2 -2
- package/dist/src/id/hasAllIds.js.map +1 -1
- package/dist/src/index.d.ts +8 -8
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +4 -4
- package/dist/src/index.js.map +1 -1
- package/dist/src/loader/index.js +1 -1
- package/dist/src/loader/index.js.map +1 -1
- package/dist/src/loader/runtime-cjs.js +1 -1
- package/dist/src/loader/runtime-cjs.js.map +1 -1
- package/dist/src/narrative-context.d.ts +9 -9
- package/dist/src/narrative-context.d.ts.map +1 -1
- package/dist/src/narrative-context.js +47 -47
- package/dist/src/narrative-context.js.map +1 -1
- package/dist/src/narrative-registry.d.ts +6 -6
- package/dist/src/narrative-registry.d.ts.map +1 -1
- package/dist/src/narrative-registry.js +26 -26
- package/dist/src/narrative-registry.js.map +1 -1
- package/dist/src/narrative.d.ts +5 -5
- package/dist/src/narrative.d.ts.map +1 -1
- package/dist/src/narrative.js +26 -27
- package/dist/src/narrative.js.map +1 -1
- package/dist/src/parse-graphql-request.d.ts +1 -1
- package/dist/src/parse-graphql-request.d.ts.map +1 -1
- package/dist/src/parse-graphql-request.js +3 -3
- package/dist/src/parse-graphql-request.js.map +1 -1
- package/dist/src/samples/items.narrative.js +2 -2
- package/dist/src/samples/items.narrative.js.map +1 -1
- package/dist/src/samples/mixed-given-types.narrative.js +2 -2
- package/dist/src/samples/mixed-given-types.narrative.js.map +1 -1
- package/dist/src/samples/place-order.narrative.js +2 -2
- package/dist/src/samples/place-order.narrative.js.map +1 -1
- package/dist/src/samples/questionnaires.narrative.js +2 -2
- package/dist/src/samples/questionnaires.narrative.js.map +1 -1
- package/dist/src/samples/seasonal-assistant.schema.json +2 -2
- package/dist/src/samples/test-with-ids.narrative.js +2 -2
- package/dist/src/samples/test-with-ids.narrative.js.map +1 -1
- package/dist/src/schema.d.ts +136 -136
- package/dist/src/schema.d.ts.map +1 -1
- package/dist/src/schema.js +76 -76
- package/dist/src/schema.js.map +1 -1
- package/dist/src/slice-builder.d.ts +6 -6
- package/dist/src/slice-builder.d.ts.map +1 -1
- package/dist/src/slice-builder.js +21 -21
- package/dist/src/slice-builder.js.map +1 -1
- package/dist/src/transformers/model-to-narrative/analysis/lint-helpers.js +1 -1
- package/dist/src/transformers/model-to-narrative/analysis/lint-helpers.js.map +1 -1
- package/dist/src/transformers/model-to-narrative/cross-module-imports.js +4 -4
- package/dist/src/transformers/model-to-narrative/cross-module-imports.js.map +1 -1
- package/dist/src/transformers/model-to-narrative/generators/compose.js +3 -3
- package/dist/src/transformers/model-to-narrative/generators/compose.js.map +1 -1
- package/dist/src/transformers/model-to-narrative/generators/flow.d.ts +2 -2
- package/dist/src/transformers/model-to-narrative/generators/flow.d.ts.map +1 -1
- package/dist/src/transformers/model-to-narrative/generators/flow.js +20 -20
- package/dist/src/transformers/model-to-narrative/generators/flow.js.map +1 -1
- package/dist/src/transformers/model-to-narrative/generators/imports.d.ts +1 -1
- package/dist/src/transformers/model-to-narrative/generators/imports.d.ts.map +1 -1
- package/dist/src/transformers/model-to-narrative/generators/imports.js +1 -1
- package/dist/src/transformers/model-to-narrative/generators/imports.js.map +1 -1
- package/dist/src/transformers/model-to-narrative/generators/module-code.js +14 -14
- package/dist/src/transformers/model-to-narrative/generators/module-code.js.map +1 -1
- package/dist/src/transformers/model-to-narrative/index.d.ts +4 -4
- package/dist/src/transformers/model-to-narrative/index.d.ts.map +1 -1
- package/dist/src/transformers/model-to-narrative/index.js +1 -1
- package/dist/src/transformers/model-to-narrative/spec-traversal.d.ts +2 -2
- package/dist/src/transformers/model-to-narrative/spec-traversal.d.ts.map +1 -1
- package/dist/src/transformers/model-to-narrative/spec-traversal.js +5 -5
- package/dist/src/transformers/model-to-narrative/spec-traversal.js.map +1 -1
- package/dist/src/transformers/model-to-narrative/types.d.ts +1 -1
- package/dist/src/transformers/model-to-narrative/types.d.ts.map +1 -1
- package/dist/src/transformers/model-to-narrative/utils/integration-extractor.d.ts +1 -1
- package/dist/src/transformers/model-to-narrative/utils/integration-extractor.d.ts.map +1 -1
- package/dist/src/transformers/model-to-narrative/utils/integration-extractor.js +4 -4
- package/dist/src/transformers/model-to-narrative/utils/integration-extractor.js.map +1 -1
- package/dist/src/transformers/model-to-narrative/validate-modules.d.ts +1 -1
- package/dist/src/transformers/model-to-narrative/validate-modules.d.ts.map +1 -1
- package/dist/src/transformers/model-to-narrative/validate-modules.js +19 -19
- package/dist/src/transformers/model-to-narrative/validate-modules.js.map +1 -1
- package/dist/src/transformers/narrative-to-model/assemble.d.ts +2 -2
- package/dist/src/transformers/narrative-to-model/assemble.d.ts.map +1 -1
- package/dist/src/transformers/narrative-to-model/assemble.js +10 -3
- package/dist/src/transformers/narrative-to-model/assemble.js.map +1 -1
- package/dist/src/transformers/narrative-to-model/debug.d.ts.map +1 -1
- package/dist/src/transformers/narrative-to-model/debug.js +1 -1
- package/dist/src/transformers/narrative-to-model/debug.js.map +1 -1
- package/dist/src/transformers/narrative-to-model/derive-modules.d.ts +2 -2
- package/dist/src/transformers/narrative-to-model/derive-modules.d.ts.map +1 -1
- package/dist/src/transformers/narrative-to-model/derive-modules.js +9 -9
- package/dist/src/transformers/narrative-to-model/derive-modules.js.map +1 -1
- package/dist/src/transformers/narrative-to-model/index.d.ts +2 -2
- package/dist/src/transformers/narrative-to-model/index.d.ts.map +1 -1
- package/dist/src/transformers/narrative-to-model/index.js +39 -39
- package/dist/src/transformers/narrative-to-model/index.js.map +1 -1
- package/dist/src/transformers/narrative-to-model/spec-processors.js +1 -1
- package/dist/src/transformers/narrative-to-model/spec-processors.js.map +1 -1
- package/dist/src/transformers/narrative-to-model/strings.d.ts +1 -1
- package/dist/src/transformers/narrative-to-model/strings.d.ts.map +1 -1
- package/dist/src/transformers/narrative-to-model/strings.js +6 -6
- package/dist/src/transformers/narrative-to-model/strings.js.map +1 -1
- package/dist/src/validate-slice-requests.d.ts +4 -4
- package/dist/src/validate-slice-requests.d.ts.map +1 -1
- package/dist/src/validate-slice-requests.js +34 -34
- package/dist/src/validate-slice-requests.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +4 -4
- package/scripts/convert-flow-exec.ts +2 -2
- package/scripts/print-schema.ts +8 -8
- package/src/fluent-builder.specs.ts +3 -3
- package/src/fluent-builder.ts +141 -141
- package/src/{getNarratives.cache.specs.ts → getScenes.cache.specs.ts} +45 -45
- package/src/{getNarratives.specs.ts → getScenes.specs.ts} +302 -300
- package/src/{getNarratives.ts → getScenes.ts} +20 -20
- package/src/id/addAutoIds.specs.ts +105 -105
- package/src/id/addAutoIds.ts +26 -26
- package/src/id/hasAllIds.specs.ts +59 -59
- package/src/id/hasAllIds.ts +6 -6
- package/src/index.ts +12 -13
- package/src/loader/index.ts +1 -1
- package/src/loader/runtime-cjs.ts +1 -1
- package/src/model-to-narrative.specs.ts +133 -135
- package/src/narrative-context.specs.ts +24 -24
- package/src/narrative-context.ts +61 -61
- package/src/narrative-registry.ts +31 -31
- package/src/narrative.ts +31 -33
- package/src/parse-graphql-request.specs.ts +5 -5
- package/src/parse-graphql-request.ts +3 -3
- package/src/samples/items.narrative.ts +2 -2
- package/src/samples/mixed-given-types.narrative.ts +2 -2
- package/src/samples/place-order.narrative.ts +2 -2
- package/src/samples/questionnaires.narrative.ts +2 -2
- package/src/samples/seasonal-assistant.schema.json +2 -2
- package/src/samples/test-with-ids.narrative.ts +2 -2
- package/src/schema.specs.ts +99 -91
- package/src/schema.ts +89 -89
- package/src/slice-builder.ts +30 -30
- package/src/transformers/model-to-narrative/analysis/lint-helpers.ts +1 -1
- package/src/transformers/model-to-narrative/cross-module-imports.specs.ts +43 -43
- package/src/transformers/model-to-narrative/cross-module-imports.ts +4 -4
- package/src/transformers/model-to-narrative/generators/compose.ts +4 -4
- package/src/transformers/model-to-narrative/generators/flow.ts +36 -36
- package/src/transformers/model-to-narrative/generators/imports.ts +1 -1
- package/src/transformers/model-to-narrative/generators/module-code.ts +15 -15
- package/src/transformers/model-to-narrative/index.ts +4 -4
- package/src/transformers/model-to-narrative/modules.specs.ts +58 -58
- package/src/transformers/model-to-narrative/spec-traversal.specs.ts +43 -43
- package/src/transformers/model-to-narrative/spec-traversal.ts +6 -6
- package/src/transformers/model-to-narrative/types.ts +1 -1
- package/src/transformers/model-to-narrative/utils/integration-extractor.ts +5 -5
- package/src/transformers/model-to-narrative/validate-modules.ts +22 -22
- package/src/transformers/narrative-to-model/assemble.ts +12 -4
- package/src/transformers/narrative-to-model/debug.ts +1 -1
- package/src/transformers/narrative-to-model/derive-modules.specs.ts +35 -35
- package/src/transformers/narrative-to-model/derive-modules.ts +11 -11
- package/src/transformers/narrative-to-model/index.ts +47 -47
- package/src/transformers/narrative-to-model/spec-processors.ts +1 -1
- package/src/transformers/narrative-to-model/strings.ts +6 -6
- package/src/transformers/narrative-to-model/type-inference.specs.ts +11 -11
- package/src/validate-slice-requests.specs.ts +113 -113
- package/src/validate-slice-requests.ts +49 -49
- package/dist/src/getNarratives.d.ts.map +0 -1
- package/dist/src/getNarratives.js.map +0 -1
package/src/schema.specs.ts
CHANGED
|
@@ -1,32 +1,32 @@
|
|
|
1
1
|
import { describe, expect, it } from 'vitest';
|
|
2
2
|
import type {
|
|
3
3
|
ComponentDefinition,
|
|
4
|
-
|
|
5
|
-
|
|
4
|
+
Narrative,
|
|
5
|
+
NarrativePlanning,
|
|
6
6
|
RegionEntry,
|
|
7
7
|
SceneClassification,
|
|
8
8
|
SceneRoute,
|
|
9
9
|
UI,
|
|
10
10
|
} from './schema';
|
|
11
11
|
import {
|
|
12
|
-
|
|
12
|
+
CommandMomentSchema,
|
|
13
13
|
ComponentDefinitionSchema,
|
|
14
14
|
DataSchema,
|
|
15
15
|
DataTargetSchema,
|
|
16
16
|
DesignSchema,
|
|
17
|
-
JourneyPlanningSchema,
|
|
18
|
-
JourneySchema,
|
|
19
17
|
modelSchema,
|
|
20
|
-
|
|
18
|
+
NarrativePlanningSchema,
|
|
21
19
|
NarrativeSchema,
|
|
22
|
-
|
|
20
|
+
QueryMomentSchema,
|
|
23
21
|
RegionEntrySchema,
|
|
24
22
|
SceneClassificationSchema,
|
|
23
|
+
SceneNamesOnlySchema,
|
|
25
24
|
SceneRouteSchema,
|
|
25
|
+
SceneSchema,
|
|
26
26
|
UISchema,
|
|
27
27
|
} from './schema';
|
|
28
28
|
|
|
29
|
-
describe('
|
|
29
|
+
describe('CommandMomentSchema', () => {
|
|
30
30
|
it('should accept optional mappings field with structured entries', () => {
|
|
31
31
|
const slice = {
|
|
32
32
|
type: 'command' as const,
|
|
@@ -41,7 +41,7 @@ describe('CommandSliceSchema', () => {
|
|
|
41
41
|
],
|
|
42
42
|
};
|
|
43
43
|
|
|
44
|
-
const result =
|
|
44
|
+
const result = CommandMomentSchema.safeParse(slice);
|
|
45
45
|
|
|
46
46
|
expect(result.success).toBe(true);
|
|
47
47
|
if (result.success) {
|
|
@@ -142,11 +142,11 @@ describe('SceneClassificationSchema', () => {
|
|
|
142
142
|
});
|
|
143
143
|
});
|
|
144
144
|
|
|
145
|
-
describe('
|
|
145
|
+
describe('SceneSchema scene field', () => {
|
|
146
146
|
it('should accept a narrative with optional scene classification', () => {
|
|
147
|
-
const result =
|
|
147
|
+
const result = SceneSchema.safeParse({
|
|
148
148
|
name: 'Create Todo',
|
|
149
|
-
|
|
149
|
+
moments: [],
|
|
150
150
|
scene: {
|
|
151
151
|
kind: 'page',
|
|
152
152
|
pattern: 'create-form',
|
|
@@ -162,9 +162,9 @@ describe('NarrativeSchema scene field', () => {
|
|
|
162
162
|
});
|
|
163
163
|
|
|
164
164
|
it('should accept a narrative without scene', () => {
|
|
165
|
-
const result =
|
|
165
|
+
const result = SceneSchema.safeParse({
|
|
166
166
|
name: 'Create Todo',
|
|
167
|
-
|
|
167
|
+
moments: [],
|
|
168
168
|
});
|
|
169
169
|
expect(result.success).toBe(true);
|
|
170
170
|
if (result.success) {
|
|
@@ -173,26 +173,26 @@ describe('NarrativeSchema scene field', () => {
|
|
|
173
173
|
});
|
|
174
174
|
});
|
|
175
175
|
|
|
176
|
-
describe('
|
|
177
|
-
it('should accept a valid
|
|
178
|
-
const result =
|
|
176
|
+
describe('NarrativeSchema', () => {
|
|
177
|
+
it('should accept a valid narrative with required fields', () => {
|
|
178
|
+
const result = NarrativeSchema.safeParse({
|
|
179
179
|
name: 'Onboarding',
|
|
180
|
-
|
|
180
|
+
sceneIds: ['n-1', 'n-2'],
|
|
181
181
|
});
|
|
182
182
|
expect(result.success).toBe(true);
|
|
183
183
|
if (result.success) {
|
|
184
184
|
expect(result.data.name).toBe('Onboarding');
|
|
185
|
-
expect(result.data.
|
|
185
|
+
expect(result.data.sceneIds).toEqual(['n-1', 'n-2']);
|
|
186
186
|
}
|
|
187
187
|
});
|
|
188
188
|
|
|
189
189
|
it('should accept all optional fields', () => {
|
|
190
|
-
const result =
|
|
190
|
+
const result = NarrativeSchema.safeParse({
|
|
191
191
|
id: 'j-1',
|
|
192
192
|
name: 'Checkout',
|
|
193
193
|
description: 'Full checkout flow',
|
|
194
194
|
actors: ['buyer', 'seller'],
|
|
195
|
-
|
|
195
|
+
sceneIds: ['n-cart', 'n-pay'],
|
|
196
196
|
});
|
|
197
197
|
expect(result.success).toBe(true);
|
|
198
198
|
if (result.success) {
|
|
@@ -203,67 +203,74 @@ describe('JourneySchema', () => {
|
|
|
203
203
|
});
|
|
204
204
|
|
|
205
205
|
it('should reject missing name', () => {
|
|
206
|
-
const result =
|
|
206
|
+
const result = NarrativeSchema.safeParse({ sceneIds: ['n-1'] });
|
|
207
207
|
expect(result.success).toBe(false);
|
|
208
208
|
});
|
|
209
209
|
|
|
210
|
-
it('should reject missing
|
|
211
|
-
const result =
|
|
210
|
+
it('should reject missing sceneIds', () => {
|
|
211
|
+
const result = NarrativeSchema.safeParse({ name: 'Onboarding' });
|
|
212
212
|
expect(result.success).toBe(false);
|
|
213
213
|
});
|
|
214
214
|
});
|
|
215
215
|
|
|
216
|
-
describe('modelSchema
|
|
216
|
+
describe('modelSchema narratives field', () => {
|
|
217
217
|
const minimalModel = {
|
|
218
218
|
variant: 'specs' as const,
|
|
219
|
-
|
|
219
|
+
scenes: [],
|
|
220
220
|
messages: [],
|
|
221
221
|
modules: [],
|
|
222
|
+
narratives: [],
|
|
222
223
|
};
|
|
223
224
|
|
|
224
|
-
it('should
|
|
225
|
+
it('should reject model without narratives (required)', () => {
|
|
226
|
+
const { narratives: _, ...modelWithoutNarratives } = minimalModel;
|
|
227
|
+
const result = modelSchema.safeParse(modelWithoutNarratives);
|
|
228
|
+
expect(result.success).toBe(false);
|
|
229
|
+
});
|
|
230
|
+
|
|
231
|
+
it('should accept model with empty narratives array', () => {
|
|
225
232
|
const result = modelSchema.safeParse(minimalModel);
|
|
226
233
|
expect(result.success).toBe(true);
|
|
227
234
|
if (result.success) {
|
|
228
|
-
expect(result.data.
|
|
235
|
+
expect(result.data.narratives).toEqual([]);
|
|
229
236
|
}
|
|
230
237
|
});
|
|
231
238
|
|
|
232
|
-
it('should accept model with
|
|
239
|
+
it('should accept model with narratives array', () => {
|
|
233
240
|
const result = modelSchema.safeParse({
|
|
234
241
|
...minimalModel,
|
|
235
|
-
|
|
242
|
+
narratives: [
|
|
236
243
|
{
|
|
237
244
|
id: 'j-1',
|
|
238
245
|
name: 'Onboarding',
|
|
239
|
-
|
|
246
|
+
sceneIds: ['n-1', 'n-2'],
|
|
240
247
|
},
|
|
241
248
|
],
|
|
242
249
|
});
|
|
243
250
|
expect(result.success).toBe(true);
|
|
244
251
|
if (result.success) {
|
|
245
|
-
expect(result.data.
|
|
246
|
-
expect(result.data.
|
|
252
|
+
expect(result.data.narratives).toHaveLength(1);
|
|
253
|
+
expect(result.data.narratives![0].name).toBe('Onboarding');
|
|
247
254
|
}
|
|
248
255
|
});
|
|
249
256
|
});
|
|
250
257
|
|
|
251
|
-
describe('
|
|
252
|
-
it('should accept a valid
|
|
258
|
+
describe('NarrativePlanningSchema', () => {
|
|
259
|
+
it('should accept a valid narrative-planning variant', () => {
|
|
253
260
|
const input = {
|
|
254
|
-
variant: '
|
|
255
|
-
|
|
261
|
+
variant: 'narrative-planning',
|
|
262
|
+
narratives: [
|
|
256
263
|
{
|
|
257
264
|
name: 'Onboarding',
|
|
258
265
|
description: 'New user onboarding flow',
|
|
259
|
-
|
|
266
|
+
sceneNames: ['Sign Up', 'Verify Email'],
|
|
260
267
|
},
|
|
261
268
|
{
|
|
262
269
|
name: 'Checkout',
|
|
263
|
-
|
|
270
|
+
sceneNames: ['Add to Cart', 'Payment'],
|
|
264
271
|
},
|
|
265
272
|
],
|
|
266
|
-
|
|
273
|
+
scenes: [
|
|
267
274
|
{ name: 'Sign Up' },
|
|
268
275
|
{ name: 'Verify Email', id: 'n-verify', description: 'Email verification' },
|
|
269
276
|
{ name: 'Add to Cart' },
|
|
@@ -271,24 +278,24 @@ describe('JourneyPlanningSchema', () => {
|
|
|
271
278
|
],
|
|
272
279
|
};
|
|
273
280
|
|
|
274
|
-
const result =
|
|
281
|
+
const result = NarrativePlanningSchema.safeParse(input);
|
|
275
282
|
|
|
276
283
|
expect(result.success).toBe(true);
|
|
277
284
|
if (result.success) {
|
|
278
285
|
expect(result.data).toEqual({
|
|
279
|
-
variant: '
|
|
280
|
-
|
|
286
|
+
variant: 'narrative-planning',
|
|
287
|
+
narratives: [
|
|
281
288
|
{
|
|
282
289
|
name: 'Onboarding',
|
|
283
290
|
description: 'New user onboarding flow',
|
|
284
|
-
|
|
291
|
+
sceneNames: ['Sign Up', 'Verify Email'],
|
|
285
292
|
},
|
|
286
293
|
{
|
|
287
294
|
name: 'Checkout',
|
|
288
|
-
|
|
295
|
+
sceneNames: ['Add to Cart', 'Payment'],
|
|
289
296
|
},
|
|
290
297
|
],
|
|
291
|
-
|
|
298
|
+
scenes: [
|
|
292
299
|
{ name: 'Sign Up' },
|
|
293
300
|
{ name: 'Verify Email', id: 'n-verify', description: 'Email verification' },
|
|
294
301
|
{ name: 'Add to Cart' },
|
|
@@ -299,74 +306,74 @@ describe('JourneyPlanningSchema', () => {
|
|
|
299
306
|
});
|
|
300
307
|
|
|
301
308
|
it('should reject missing variant', () => {
|
|
302
|
-
const result =
|
|
303
|
-
journeys: [],
|
|
309
|
+
const result = NarrativePlanningSchema.safeParse({
|
|
304
310
|
narratives: [],
|
|
311
|
+
scenes: [],
|
|
305
312
|
});
|
|
306
313
|
|
|
307
314
|
expect(result.success).toBe(false);
|
|
308
315
|
});
|
|
309
316
|
|
|
310
317
|
it('should reject wrong variant', () => {
|
|
311
|
-
const result =
|
|
312
|
-
variant: '
|
|
313
|
-
journeys: [],
|
|
318
|
+
const result = NarrativePlanningSchema.safeParse({
|
|
319
|
+
variant: 'scene-names',
|
|
314
320
|
narratives: [],
|
|
321
|
+
scenes: [],
|
|
315
322
|
});
|
|
316
323
|
|
|
317
324
|
expect(result.success).toBe(false);
|
|
318
325
|
});
|
|
319
326
|
|
|
320
|
-
it('should reject missing
|
|
321
|
-
const result =
|
|
322
|
-
variant: '
|
|
323
|
-
|
|
327
|
+
it('should reject missing narratives', () => {
|
|
328
|
+
const result = NarrativePlanningSchema.safeParse({
|
|
329
|
+
variant: 'narrative-planning',
|
|
330
|
+
scenes: [],
|
|
324
331
|
});
|
|
325
332
|
|
|
326
333
|
expect(result.success).toBe(false);
|
|
327
334
|
});
|
|
328
335
|
|
|
329
|
-
it('should reject missing
|
|
330
|
-
const result =
|
|
331
|
-
variant: '
|
|
332
|
-
|
|
336
|
+
it('should reject missing scenes', () => {
|
|
337
|
+
const result = NarrativePlanningSchema.safeParse({
|
|
338
|
+
variant: 'narrative-planning',
|
|
339
|
+
narratives: [],
|
|
333
340
|
});
|
|
334
341
|
|
|
335
342
|
expect(result.success).toBe(false);
|
|
336
343
|
});
|
|
337
344
|
|
|
338
|
-
it('should accept
|
|
339
|
-
const result =
|
|
340
|
-
variant: '
|
|
341
|
-
|
|
345
|
+
it('should accept narrative with actors', () => {
|
|
346
|
+
const result = NarrativePlanningSchema.safeParse({
|
|
347
|
+
variant: 'narrative-planning',
|
|
348
|
+
narratives: [
|
|
342
349
|
{
|
|
343
350
|
name: 'Onboarding',
|
|
344
351
|
actors: ['new-user', 'admin'],
|
|
345
|
-
|
|
352
|
+
sceneNames: ['Sign Up'],
|
|
346
353
|
},
|
|
347
354
|
],
|
|
348
|
-
|
|
355
|
+
scenes: [{ name: 'Sign Up' }],
|
|
349
356
|
});
|
|
350
357
|
expect(result.success).toBe(true);
|
|
351
358
|
if (result.success) {
|
|
352
|
-
expect(result.data.
|
|
359
|
+
expect(result.data.narratives[0].actors).toEqual(['new-user', 'admin']);
|
|
353
360
|
}
|
|
354
361
|
});
|
|
355
362
|
|
|
356
|
-
it('should reject
|
|
357
|
-
const result =
|
|
358
|
-
variant: '
|
|
359
|
-
|
|
360
|
-
|
|
363
|
+
it('should reject narrative missing sceneNames', () => {
|
|
364
|
+
const result = NarrativePlanningSchema.safeParse({
|
|
365
|
+
variant: 'narrative-planning',
|
|
366
|
+
narratives: [{ name: 'Onboarding' }],
|
|
367
|
+
scenes: [],
|
|
361
368
|
});
|
|
362
369
|
|
|
363
370
|
expect(result.success).toBe(false);
|
|
364
371
|
});
|
|
365
372
|
});
|
|
366
373
|
|
|
367
|
-
describe('
|
|
374
|
+
describe('SceneNamesOnlySchema', () => {
|
|
368
375
|
it('should be exported and accept valid input', () => {
|
|
369
|
-
const result =
|
|
376
|
+
const result = SceneNamesOnlySchema.safeParse({
|
|
370
377
|
name: 'Create Todo',
|
|
371
378
|
id: 'n-1',
|
|
372
379
|
description: 'Create a todo item',
|
|
@@ -378,18 +385,18 @@ describe('NarrativeNamesOnlySchema', () => {
|
|
|
378
385
|
});
|
|
379
386
|
|
|
380
387
|
it('should require name', () => {
|
|
381
|
-
const result =
|
|
388
|
+
const result = SceneNamesOnlySchema.safeParse({ description: 'no name' });
|
|
382
389
|
expect(result.success).toBe(false);
|
|
383
390
|
});
|
|
384
391
|
});
|
|
385
392
|
|
|
386
393
|
describe('exported types', () => {
|
|
387
|
-
it('
|
|
388
|
-
const input = { name: 'Onboarding',
|
|
389
|
-
const parsed =
|
|
390
|
-
const typed:
|
|
394
|
+
it('Narrative type matches NarrativeSchema inference', () => {
|
|
395
|
+
const input = { name: 'Onboarding', sceneIds: ['n-1'] };
|
|
396
|
+
const parsed = NarrativeSchema.parse(input);
|
|
397
|
+
const typed: Narrative = parsed;
|
|
391
398
|
|
|
392
|
-
expect(typed).toEqual({ name: 'Onboarding',
|
|
399
|
+
expect(typed).toEqual({ name: 'Onboarding', sceneIds: ['n-1'] });
|
|
393
400
|
});
|
|
394
401
|
|
|
395
402
|
it('SceneClassification type matches SceneClassificationSchema inference', () => {
|
|
@@ -408,19 +415,19 @@ describe('exported types', () => {
|
|
|
408
415
|
expect(typed).toEqual({ type: 'dedicated', deepLinkable: true });
|
|
409
416
|
});
|
|
410
417
|
|
|
411
|
-
it('
|
|
418
|
+
it('NarrativePlanning type matches NarrativePlanningSchema inference', () => {
|
|
412
419
|
const input = {
|
|
413
|
-
variant: '
|
|
414
|
-
|
|
415
|
-
|
|
420
|
+
variant: 'narrative-planning' as const,
|
|
421
|
+
narratives: [{ name: 'Flow', sceneNames: ['Step 1'] }],
|
|
422
|
+
scenes: [{ name: 'Step 1' }],
|
|
416
423
|
};
|
|
417
|
-
const parsed =
|
|
418
|
-
const typed:
|
|
424
|
+
const parsed = NarrativePlanningSchema.parse(input);
|
|
425
|
+
const typed: NarrativePlanning = parsed;
|
|
419
426
|
|
|
420
427
|
expect(typed).toEqual({
|
|
421
|
-
variant: '
|
|
422
|
-
|
|
423
|
-
|
|
428
|
+
variant: 'narrative-planning',
|
|
429
|
+
narratives: [{ name: 'Flow', sceneNames: ['Step 1'] }],
|
|
430
|
+
scenes: [{ name: 'Step 1' }],
|
|
424
431
|
});
|
|
425
432
|
});
|
|
426
433
|
});
|
|
@@ -511,7 +518,7 @@ describe('DataSchema with target-only items', () => {
|
|
|
511
518
|
});
|
|
512
519
|
});
|
|
513
520
|
|
|
514
|
-
describe('
|
|
521
|
+
describe('QueryMomentSchema', () => {
|
|
515
522
|
it('should accept optional mappings field with structured entries', () => {
|
|
516
523
|
const slice = {
|
|
517
524
|
type: 'query' as const,
|
|
@@ -526,7 +533,7 @@ describe('QuerySliceSchema', () => {
|
|
|
526
533
|
],
|
|
527
534
|
};
|
|
528
535
|
|
|
529
|
-
const result =
|
|
536
|
+
const result = QueryMomentSchema.safeParse(slice);
|
|
530
537
|
|
|
531
538
|
expect(result.success).toBe(true);
|
|
532
539
|
if (result.success) {
|
|
@@ -682,9 +689,10 @@ describe('DesignSchema ui field', () => {
|
|
|
682
689
|
describe('modelSchema design.components field', () => {
|
|
683
690
|
const minimalModel = {
|
|
684
691
|
variant: 'specs' as const,
|
|
685
|
-
|
|
692
|
+
scenes: [],
|
|
686
693
|
messages: [],
|
|
687
694
|
modules: [],
|
|
695
|
+
narratives: [],
|
|
688
696
|
};
|
|
689
697
|
|
|
690
698
|
it('should accept model with design.components', () => {
|