@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
|
@@ -48,14 +48,14 @@ describe('computeCrossModuleImports', () => {
|
|
|
48
48
|
it('returns empty array for derived modules', () => {
|
|
49
49
|
const model: Model = {
|
|
50
50
|
variant: 'specs',
|
|
51
|
-
|
|
51
|
+
scenes: [],
|
|
52
52
|
messages: [],
|
|
53
53
|
integrations: [],
|
|
54
54
|
modules: [
|
|
55
55
|
{
|
|
56
56
|
sourceFile: 'derived.ts',
|
|
57
57
|
isDerived: true,
|
|
58
|
-
contains: {
|
|
58
|
+
contains: { sceneIds: [] },
|
|
59
59
|
declares: { messages: [] },
|
|
60
60
|
},
|
|
61
61
|
],
|
|
@@ -69,11 +69,11 @@ describe('computeCrossModuleImports', () => {
|
|
|
69
69
|
it('returns empty array when module declares all needed types', () => {
|
|
70
70
|
const model: Model = {
|
|
71
71
|
variant: 'specs',
|
|
72
|
-
|
|
72
|
+
scenes: [
|
|
73
73
|
{
|
|
74
74
|
name: 'Test',
|
|
75
75
|
id: 'test-1',
|
|
76
|
-
|
|
76
|
+
moments: [
|
|
77
77
|
{
|
|
78
78
|
name: 'test',
|
|
79
79
|
type: 'command',
|
|
@@ -108,7 +108,7 @@ describe('computeCrossModuleImports', () => {
|
|
|
108
108
|
{
|
|
109
109
|
sourceFile: 'self-contained.ts',
|
|
110
110
|
isDerived: false,
|
|
111
|
-
contains: {
|
|
111
|
+
contains: { sceneIds: ['test-1'] },
|
|
112
112
|
declares: { messages: [{ kind: 'command', name: 'DoSomething' }] },
|
|
113
113
|
},
|
|
114
114
|
],
|
|
@@ -122,11 +122,11 @@ describe('computeCrossModuleImports', () => {
|
|
|
122
122
|
it('returns empty array when needed type is not declared by any module', () => {
|
|
123
123
|
const model: Model = {
|
|
124
124
|
variant: 'specs',
|
|
125
|
-
|
|
125
|
+
scenes: [
|
|
126
126
|
{
|
|
127
127
|
name: 'Test',
|
|
128
128
|
id: 'test-1',
|
|
129
|
-
|
|
129
|
+
moments: [
|
|
130
130
|
{
|
|
131
131
|
name: 'test',
|
|
132
132
|
type: 'command',
|
|
@@ -161,7 +161,7 @@ describe('computeCrossModuleImports', () => {
|
|
|
161
161
|
{
|
|
162
162
|
sourceFile: 'consumer.ts',
|
|
163
163
|
isDerived: false,
|
|
164
|
-
contains: {
|
|
164
|
+
contains: { sceneIds: ['test-1'] },
|
|
165
165
|
declares: { messages: [] },
|
|
166
166
|
},
|
|
167
167
|
],
|
|
@@ -175,12 +175,12 @@ describe('computeCrossModuleImports', () => {
|
|
|
175
175
|
it('generates import when type is declared by another authored module', () => {
|
|
176
176
|
const model: Model = {
|
|
177
177
|
variant: 'specs',
|
|
178
|
-
|
|
179
|
-
{ name: 'Shared', id: 'shared-1',
|
|
178
|
+
scenes: [
|
|
179
|
+
{ name: 'Shared', id: 'shared-1', moments: [] },
|
|
180
180
|
{
|
|
181
181
|
name: 'Consumer',
|
|
182
182
|
id: 'consumer-1',
|
|
183
|
-
|
|
183
|
+
moments: [
|
|
184
184
|
{
|
|
185
185
|
name: 'test',
|
|
186
186
|
type: 'command',
|
|
@@ -215,13 +215,13 @@ describe('computeCrossModuleImports', () => {
|
|
|
215
215
|
{
|
|
216
216
|
sourceFile: 'shared/types.ts',
|
|
217
217
|
isDerived: false,
|
|
218
|
-
contains: {
|
|
218
|
+
contains: { sceneIds: ['shared-1'] },
|
|
219
219
|
declares: { messages: [{ kind: 'event', name: 'SharedEvent' }] },
|
|
220
220
|
},
|
|
221
221
|
{
|
|
222
222
|
sourceFile: 'features/consumer.ts',
|
|
223
223
|
isDerived: false,
|
|
224
|
-
contains: {
|
|
224
|
+
contains: { sceneIds: ['consumer-1'] },
|
|
225
225
|
declares: { messages: [] },
|
|
226
226
|
},
|
|
227
227
|
],
|
|
@@ -236,12 +236,12 @@ describe('computeCrossModuleImports', () => {
|
|
|
236
236
|
it('groups multiple types from same module into single import', () => {
|
|
237
237
|
const model: Model = {
|
|
238
238
|
variant: 'specs',
|
|
239
|
-
|
|
240
|
-
{ name: 'Shared', id: 'shared-1',
|
|
239
|
+
scenes: [
|
|
240
|
+
{ name: 'Shared', id: 'shared-1', moments: [] },
|
|
241
241
|
{
|
|
242
242
|
name: 'Consumer',
|
|
243
243
|
id: 'consumer-1',
|
|
244
|
-
|
|
244
|
+
moments: [
|
|
245
245
|
{
|
|
246
246
|
name: 'test',
|
|
247
247
|
type: 'command',
|
|
@@ -282,7 +282,7 @@ describe('computeCrossModuleImports', () => {
|
|
|
282
282
|
{
|
|
283
283
|
sourceFile: 'shared.ts',
|
|
284
284
|
isDerived: false,
|
|
285
|
-
contains: {
|
|
285
|
+
contains: { sceneIds: ['shared-1'] },
|
|
286
286
|
declares: {
|
|
287
287
|
messages: [
|
|
288
288
|
{ kind: 'event', name: 'EventA' },
|
|
@@ -293,7 +293,7 @@ describe('computeCrossModuleImports', () => {
|
|
|
293
293
|
{
|
|
294
294
|
sourceFile: 'consumer.ts',
|
|
295
295
|
isDerived: false,
|
|
296
|
-
contains: {
|
|
296
|
+
contains: { sceneIds: ['consumer-1'] },
|
|
297
297
|
declares: { messages: [] },
|
|
298
298
|
},
|
|
299
299
|
],
|
|
@@ -309,11 +309,11 @@ describe('computeCrossModuleImports', () => {
|
|
|
309
309
|
it('ignores types declared by derived modules', () => {
|
|
310
310
|
const model: Model = {
|
|
311
311
|
variant: 'specs',
|
|
312
|
-
|
|
312
|
+
scenes: [
|
|
313
313
|
{
|
|
314
314
|
name: 'Consumer',
|
|
315
315
|
id: 'consumer-1',
|
|
316
|
-
|
|
316
|
+
moments: [
|
|
317
317
|
{
|
|
318
318
|
name: 'test',
|
|
319
319
|
type: 'command',
|
|
@@ -348,13 +348,13 @@ describe('computeCrossModuleImports', () => {
|
|
|
348
348
|
{
|
|
349
349
|
sourceFile: 'derived.ts',
|
|
350
350
|
isDerived: true,
|
|
351
|
-
contains: {
|
|
351
|
+
contains: { sceneIds: [] },
|
|
352
352
|
declares: { messages: [{ kind: 'event', name: 'DerivedEvent' }] },
|
|
353
353
|
},
|
|
354
354
|
{
|
|
355
355
|
sourceFile: 'consumer.ts',
|
|
356
356
|
isDerived: false,
|
|
357
|
-
contains: {
|
|
357
|
+
contains: { sceneIds: ['consumer-1'] },
|
|
358
358
|
declares: { messages: [] },
|
|
359
359
|
},
|
|
360
360
|
],
|
|
@@ -369,13 +369,13 @@ describe('computeCrossModuleImports', () => {
|
|
|
369
369
|
it('sorts imports by source path', () => {
|
|
370
370
|
const model: Model = {
|
|
371
371
|
variant: 'specs',
|
|
372
|
-
|
|
373
|
-
{ name: 'Types1', id: 'types-1',
|
|
374
|
-
{ name: 'Types2', id: 'types-2',
|
|
372
|
+
scenes: [
|
|
373
|
+
{ name: 'Types1', id: 'types-1', moments: [] },
|
|
374
|
+
{ name: 'Types2', id: 'types-2', moments: [] },
|
|
375
375
|
{
|
|
376
376
|
name: 'Consumer',
|
|
377
377
|
id: 'consumer-1',
|
|
378
|
-
|
|
378
|
+
moments: [
|
|
379
379
|
{
|
|
380
380
|
name: 'test',
|
|
381
381
|
type: 'command',
|
|
@@ -416,19 +416,19 @@ describe('computeCrossModuleImports', () => {
|
|
|
416
416
|
{
|
|
417
417
|
sourceFile: 'z-types.ts',
|
|
418
418
|
isDerived: false,
|
|
419
|
-
contains: {
|
|
419
|
+
contains: { sceneIds: ['types-1'] },
|
|
420
420
|
declares: { messages: [{ kind: 'event', name: 'ZEvent' }] },
|
|
421
421
|
},
|
|
422
422
|
{
|
|
423
423
|
sourceFile: 'a-types.ts',
|
|
424
424
|
isDerived: false,
|
|
425
|
-
contains: {
|
|
425
|
+
contains: { sceneIds: ['types-2'] },
|
|
426
426
|
declares: { messages: [{ kind: 'event', name: 'AEvent' }] },
|
|
427
427
|
},
|
|
428
428
|
{
|
|
429
429
|
sourceFile: 'consumer.ts',
|
|
430
430
|
isDerived: false,
|
|
431
|
-
contains: {
|
|
431
|
+
contains: { sceneIds: ['consumer-1'] },
|
|
432
432
|
declares: { messages: [] },
|
|
433
433
|
},
|
|
434
434
|
],
|
|
@@ -445,14 +445,14 @@ describe('computeAllCrossModuleDependencies', () => {
|
|
|
445
445
|
it('returns empty maps when no cross-module imports exist', () => {
|
|
446
446
|
const model: Model = {
|
|
447
447
|
variant: 'specs',
|
|
448
|
-
|
|
448
|
+
scenes: [{ name: 'Test', id: 'test-1', moments: [] }],
|
|
449
449
|
messages: [{ type: 'event', source: 'internal', name: 'LocalEvent', fields: [] }],
|
|
450
450
|
integrations: [],
|
|
451
451
|
modules: [
|
|
452
452
|
{
|
|
453
453
|
sourceFile: 'self-contained.ts',
|
|
454
454
|
isDerived: false,
|
|
455
|
-
contains: {
|
|
455
|
+
contains: { sceneIds: ['test-1'] },
|
|
456
456
|
declares: { messages: [{ kind: 'event', name: 'LocalEvent' }] },
|
|
457
457
|
},
|
|
458
458
|
],
|
|
@@ -467,12 +467,12 @@ describe('computeAllCrossModuleDependencies', () => {
|
|
|
467
467
|
it('computes imports and exports in a single pass', () => {
|
|
468
468
|
const model: Model = {
|
|
469
469
|
variant: 'specs',
|
|
470
|
-
|
|
471
|
-
{ name: 'Shared', id: 'shared-1',
|
|
470
|
+
scenes: [
|
|
471
|
+
{ name: 'Shared', id: 'shared-1', moments: [] },
|
|
472
472
|
{
|
|
473
473
|
name: 'Consumer',
|
|
474
474
|
id: 'consumer-1',
|
|
475
|
-
|
|
475
|
+
moments: [
|
|
476
476
|
{
|
|
477
477
|
name: 'test',
|
|
478
478
|
type: 'command',
|
|
@@ -507,13 +507,13 @@ describe('computeAllCrossModuleDependencies', () => {
|
|
|
507
507
|
{
|
|
508
508
|
sourceFile: 'shared/types.ts',
|
|
509
509
|
isDerived: false,
|
|
510
|
-
contains: {
|
|
510
|
+
contains: { sceneIds: ['shared-1'] },
|
|
511
511
|
declares: { messages: [{ kind: 'event', name: 'SharedEvent' }] },
|
|
512
512
|
},
|
|
513
513
|
{
|
|
514
514
|
sourceFile: 'features/consumer.ts',
|
|
515
515
|
isDerived: false,
|
|
516
|
-
contains: {
|
|
516
|
+
contains: { sceneIds: ['consumer-1'] },
|
|
517
517
|
declares: { messages: [] },
|
|
518
518
|
},
|
|
519
519
|
],
|
|
@@ -534,12 +534,12 @@ describe('computeAllCrossModuleDependencies', () => {
|
|
|
534
534
|
it('aggregates exports from multiple importing modules', () => {
|
|
535
535
|
const model: Model = {
|
|
536
536
|
variant: 'specs',
|
|
537
|
-
|
|
538
|
-
{ name: 'Shared', id: 'shared-1',
|
|
537
|
+
scenes: [
|
|
538
|
+
{ name: 'Shared', id: 'shared-1', moments: [] },
|
|
539
539
|
{
|
|
540
540
|
name: 'Consumer1',
|
|
541
541
|
id: 'consumer-1',
|
|
542
|
-
|
|
542
|
+
moments: [
|
|
543
543
|
{
|
|
544
544
|
name: 'test',
|
|
545
545
|
type: 'command',
|
|
@@ -565,7 +565,7 @@ describe('computeAllCrossModuleDependencies', () => {
|
|
|
565
565
|
{
|
|
566
566
|
name: 'Consumer2',
|
|
567
567
|
id: 'consumer-2',
|
|
568
|
-
|
|
568
|
+
moments: [
|
|
569
569
|
{
|
|
570
570
|
name: 'test',
|
|
571
571
|
type: 'command',
|
|
@@ -598,7 +598,7 @@ describe('computeAllCrossModuleDependencies', () => {
|
|
|
598
598
|
{
|
|
599
599
|
sourceFile: 'shared.ts',
|
|
600
600
|
isDerived: false,
|
|
601
|
-
contains: {
|
|
601
|
+
contains: { sceneIds: ['shared-1'] },
|
|
602
602
|
declares: {
|
|
603
603
|
messages: [
|
|
604
604
|
{ kind: 'event', name: 'EventA' },
|
|
@@ -609,13 +609,13 @@ describe('computeAllCrossModuleDependencies', () => {
|
|
|
609
609
|
{
|
|
610
610
|
sourceFile: 'consumer1.ts',
|
|
611
611
|
isDerived: false,
|
|
612
|
-
contains: {
|
|
612
|
+
contains: { sceneIds: ['consumer-1'] },
|
|
613
613
|
declares: { messages: [] },
|
|
614
614
|
},
|
|
615
615
|
{
|
|
616
616
|
sourceFile: 'consumer2.ts',
|
|
617
617
|
isDerived: false,
|
|
618
|
-
contains: {
|
|
618
|
+
contains: { sceneIds: ['consumer-2'] },
|
|
619
619
|
declares: { messages: [] },
|
|
620
620
|
},
|
|
621
621
|
],
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { Model, Module } from '../../index';
|
|
2
2
|
import { basename, dirname, extname, join, relative } from '../../loader/fs-path';
|
|
3
3
|
import { parseMessageKey, sortImportsBySource, toMessageKey } from './ordering';
|
|
4
|
-
import {
|
|
4
|
+
import { collectMessageKeysFromScenes } from './spec-traversal';
|
|
5
5
|
import type { CrossModuleImport } from './types';
|
|
6
6
|
|
|
7
7
|
export type { CrossModuleImport };
|
|
@@ -123,10 +123,10 @@ function convertToImports(fromSourceFile: string, dependencyMap: Map<string, str
|
|
|
123
123
|
}
|
|
124
124
|
|
|
125
125
|
function collectUsedMessageKeysForModule(module: Module, model: Model): Set<string> {
|
|
126
|
-
const
|
|
127
|
-
const
|
|
126
|
+
const sceneIds = new Set(module.contains.sceneIds);
|
|
127
|
+
const scenes = model.scenes.filter((n) => n.id && sceneIds.has(n.id));
|
|
128
128
|
|
|
129
|
-
const usedKeys =
|
|
129
|
+
const usedKeys = collectMessageKeysFromScenes(scenes);
|
|
130
130
|
|
|
131
131
|
const modelKeys = new Set(model.messages.map((m) => toMessageKey(m.type, m.name)));
|
|
132
132
|
return new Set([...usedKeys].filter((k) => modelKeys.has(k)));
|
|
@@ -10,7 +10,7 @@ import { buildTypeAliases } from './types';
|
|
|
10
10
|
export function generateTypeScriptCode(schema: Model, opts: { flowImport: string; integrationImport: string }): string {
|
|
11
11
|
const f = ts.factory;
|
|
12
12
|
const messages = schema.messages ?? [];
|
|
13
|
-
const flows = schema.
|
|
13
|
+
const flows = schema.scenes ?? [];
|
|
14
14
|
const integrations = schema.integrations ?? [];
|
|
15
15
|
|
|
16
16
|
const allTypeIntegrationNames = extractTypeIntegrationNames(flows);
|
|
@@ -61,14 +61,14 @@ export function generateTypeScriptCode(schema: Model, opts: { flowImport: string
|
|
|
61
61
|
const usedMessages = messages.filter((msg) => {
|
|
62
62
|
const isImportedFromIntegration = usedTypeIntegrationNames.includes(msg.name);
|
|
63
63
|
const isUsedInFlow = usageAnalysis.usedTypes.has(msg.name);
|
|
64
|
-
const
|
|
64
|
+
const hasEmptyFlowMoments = flows.length === 0 || flows.every((flow) => flow.moments.length === 0);
|
|
65
65
|
|
|
66
66
|
// Don't generate local definitions for types imported from integrations
|
|
67
67
|
if (isImportedFromIntegration) {
|
|
68
68
|
return false;
|
|
69
69
|
}
|
|
70
70
|
|
|
71
|
-
return isUsedInFlow ||
|
|
71
|
+
return isUsedInFlow || hasEmptyFlowMoments;
|
|
72
72
|
});
|
|
73
73
|
|
|
74
74
|
const statements = buildStatements(
|
|
@@ -94,7 +94,7 @@ function buildStatements(
|
|
|
94
94
|
typeIntegrationNames: string[],
|
|
95
95
|
valueIntegrationNames: string[],
|
|
96
96
|
usedFlowFunctionNames: string[],
|
|
97
|
-
flows: Model['
|
|
97
|
+
flows: Model['scenes'],
|
|
98
98
|
): ts.Statement[] {
|
|
99
99
|
const statements: ts.Statement[] = [];
|
|
100
100
|
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import type tsNS from 'typescript';
|
|
2
2
|
import type { z } from 'zod';
|
|
3
3
|
import type {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
4
|
+
CommandMoment as CommandMomentType,
|
|
5
|
+
ExperienceMoment as ExperienceMomentType,
|
|
6
|
+
QueryMoment as QueryMomentType,
|
|
7
|
+
ReactMoment as ReactMomentType,
|
|
8
|
+
Scene,
|
|
9
9
|
} from '../../../index';
|
|
10
10
|
import type {
|
|
11
11
|
ClientSpecNode,
|
|
@@ -19,17 +19,17 @@ import type {
|
|
|
19
19
|
import { jsonToExpr } from '../ast/emit-helpers';
|
|
20
20
|
import { buildConsolidatedGwtSpecBlock, type GWTBlock } from './gwt';
|
|
21
21
|
|
|
22
|
-
type
|
|
23
|
-
type
|
|
24
|
-
type
|
|
25
|
-
type
|
|
22
|
+
type CommandMoment = CommandMomentType;
|
|
23
|
+
type QueryMoment = QueryMomentType;
|
|
24
|
+
type ReactMoment = ReactMomentType;
|
|
25
|
+
type ExperienceMoment = ExperienceMomentType;
|
|
26
26
|
type Example = z.infer<typeof ExampleSchema>;
|
|
27
27
|
type DataSinkItem = z.infer<typeof DataSinkSchema>;
|
|
28
28
|
type DataSourceItem = z.infer<typeof DataSourceSchema>;
|
|
29
29
|
type DataTargetItem = z.infer<typeof DataTargetSchema>;
|
|
30
30
|
type Destination = z.infer<typeof DestinationSchema>;
|
|
31
31
|
type Origin = z.infer<typeof OriginSchema>;
|
|
32
|
-
type
|
|
32
|
+
type Moment = CommandMoment | QueryMoment | ReactMoment | ExperienceMoment;
|
|
33
33
|
|
|
34
34
|
function buildClientSpecNode(
|
|
35
35
|
ts: typeof import('typescript'),
|
|
@@ -400,7 +400,7 @@ function addClientToChain(
|
|
|
400
400
|
ts: typeof import('typescript'),
|
|
401
401
|
f: tsNS.NodeFactory,
|
|
402
402
|
chain: tsNS.Expression,
|
|
403
|
-
slice:
|
|
403
|
+
slice: CommandMoment | QueryMoment | ReactMoment | ExperienceMoment,
|
|
404
404
|
): tsNS.Expression {
|
|
405
405
|
if (
|
|
406
406
|
'client' in slice &&
|
|
@@ -427,7 +427,7 @@ function addClientToChain(
|
|
|
427
427
|
function addRequestToChain(
|
|
428
428
|
f: tsNS.NodeFactory,
|
|
429
429
|
chain: tsNS.Expression,
|
|
430
|
-
slice:
|
|
430
|
+
slice: CommandMoment | QueryMoment | ReactMoment | ExperienceMoment,
|
|
431
431
|
): tsNS.Expression {
|
|
432
432
|
if ('request' in slice && slice.request !== null && slice.request !== undefined) {
|
|
433
433
|
const gqlTpl = f.createNoSubstitutionTemplateLiteral(slice.request);
|
|
@@ -487,12 +487,12 @@ function processGivenStep(step: StepWithDocString, gwtBlock: GWTBlock): void {
|
|
|
487
487
|
|
|
488
488
|
function processWhenStep(
|
|
489
489
|
step: StepWithDocString,
|
|
490
|
-
|
|
490
|
+
momentType: 'command' | 'query' | 'react' | 'experience',
|
|
491
491
|
gwtBlock: GWTBlock,
|
|
492
492
|
): void {
|
|
493
|
-
if (
|
|
493
|
+
if (momentType === 'command') {
|
|
494
494
|
gwtBlock.when = { commandRef: step.text, exampleData: step.docString ?? {} };
|
|
495
|
-
} else if (
|
|
495
|
+
} else if (momentType === 'react' || momentType === 'query') {
|
|
496
496
|
const eventData = { eventRef: step.text, exampleData: step.docString ?? {} };
|
|
497
497
|
if (!gwtBlock.when) {
|
|
498
498
|
gwtBlock.when = [eventData];
|
|
@@ -508,7 +508,7 @@ function processThenStep(step: StepWithDocString, gwtBlock: GWTBlock): void {
|
|
|
508
508
|
|
|
509
509
|
function processStepsFormat(
|
|
510
510
|
steps: Step[],
|
|
511
|
-
|
|
511
|
+
momentType: 'command' | 'query' | 'react' | 'experience',
|
|
512
512
|
gwtBlock: GWTBlock,
|
|
513
513
|
): void {
|
|
514
514
|
let effectiveKeyword: 'Given' | 'When' | 'Then' = 'Given';
|
|
@@ -526,7 +526,7 @@ function processStepsFormat(
|
|
|
526
526
|
if (effectiveKeyword === 'Given') {
|
|
527
527
|
processGivenStep(step, gwtBlock);
|
|
528
528
|
} else if (effectiveKeyword === 'When') {
|
|
529
|
-
processWhenStep(step,
|
|
529
|
+
processWhenStep(step, momentType, gwtBlock);
|
|
530
530
|
} else if (effectiveKeyword === 'Then') {
|
|
531
531
|
processThenStep(step, gwtBlock);
|
|
532
532
|
}
|
|
@@ -558,13 +558,13 @@ function processOldFormat(oldExample: OldFormatExample, gwtBlock: GWTBlock): voi
|
|
|
558
558
|
}
|
|
559
559
|
}
|
|
560
560
|
|
|
561
|
-
function convertExampleToGWT(example: Example,
|
|
561
|
+
function convertExampleToGWT(example: Example, momentType: 'command' | 'query' | 'react' | 'experience'): GWTBlock {
|
|
562
562
|
const gwtBlock: GWTBlock = { then: [] };
|
|
563
563
|
const oldExample = example as OldFormatExample;
|
|
564
564
|
(gwtBlock as { name?: string }).name = oldExample.name ?? oldExample.description;
|
|
565
565
|
|
|
566
566
|
if (oldExample.steps !== undefined && oldExample.steps.length > 0) {
|
|
567
|
-
processStepsFormat(oldExample.steps,
|
|
567
|
+
processStepsFormat(oldExample.steps, momentType, gwtBlock);
|
|
568
568
|
} else {
|
|
569
569
|
processOldFormat(oldExample, gwtBlock);
|
|
570
570
|
}
|
|
@@ -598,14 +598,14 @@ function buildConsolidatedRules(
|
|
|
598
598
|
ts: typeof import('typescript'),
|
|
599
599
|
f: tsNS.NodeFactory,
|
|
600
600
|
ruleGroups: Map<string, RuleGroup>,
|
|
601
|
-
|
|
601
|
+
momentType: 'command' | 'query' | 'react' | 'experience',
|
|
602
602
|
messages?: Array<{ type: string; name: string; fields: Array<{ name: string; type: string; required: boolean }> }>,
|
|
603
603
|
): tsNS.Statement[] {
|
|
604
604
|
const allRuleStatements: tsNS.Statement[] = [];
|
|
605
605
|
|
|
606
606
|
for (const { rule, examples } of ruleGroups.values()) {
|
|
607
607
|
const gwtBlocks = examples.map((example) => {
|
|
608
|
-
const gwtBlock = convertExampleToGWT(example,
|
|
608
|
+
const gwtBlock = convertExampleToGWT(example, momentType);
|
|
609
609
|
const extendedGwtBlock = gwtBlock as GWTBlock & {
|
|
610
610
|
ruleDescription?: string;
|
|
611
611
|
exampleDescription?: string;
|
|
@@ -623,7 +623,7 @@ function buildConsolidatedRules(
|
|
|
623
623
|
});
|
|
624
624
|
|
|
625
625
|
allRuleStatements.push(
|
|
626
|
-
buildConsolidatedGwtSpecBlock(ts, f, { id: rule.id, description: rule.name }, gwtBlocks,
|
|
626
|
+
buildConsolidatedGwtSpecBlock(ts, f, { id: rule.id, description: rule.name }, gwtBlocks, momentType, messages),
|
|
627
627
|
);
|
|
628
628
|
}
|
|
629
629
|
|
|
@@ -634,11 +634,11 @@ function buildSingleSpecStatements(
|
|
|
634
634
|
ts: typeof import('typescript'),
|
|
635
635
|
f: tsNS.NodeFactory,
|
|
636
636
|
spec: SpecType,
|
|
637
|
-
|
|
637
|
+
momentType: 'command' | 'query' | 'react' | 'experience',
|
|
638
638
|
messages?: Array<{ type: string; name: string; fields: Array<{ name: string; type: string; required: boolean }> }>,
|
|
639
639
|
): tsNS.Statement {
|
|
640
640
|
const ruleGroups = buildRuleGroups(spec.rules);
|
|
641
|
-
const allRuleStatements = buildConsolidatedRules(ts, f, ruleGroups,
|
|
641
|
+
const allRuleStatements = buildConsolidatedRules(ts, f, ruleGroups, momentType, messages);
|
|
642
642
|
|
|
643
643
|
const arrowFunction = f.createArrowFunction(
|
|
644
644
|
undefined,
|
|
@@ -681,8 +681,8 @@ function convertOldSpecToNewFormat(oldSpec: OldSpecFormat): SpecType | null {
|
|
|
681
681
|
function buildServerStatements(
|
|
682
682
|
ts: typeof import('typescript'),
|
|
683
683
|
f: tsNS.NodeFactory,
|
|
684
|
-
server:
|
|
685
|
-
|
|
684
|
+
server: CommandMoment['server'] | QueryMoment['server'] | ReactMoment['server'],
|
|
685
|
+
momentType: 'command' | 'query' | 'react' | 'experience',
|
|
686
686
|
messages?: Array<{ type: string; name: string; fields: Array<{ name: string; type: string; required: boolean }> }>,
|
|
687
687
|
): tsNS.Statement[] {
|
|
688
688
|
const statements: tsNS.Statement[] = [];
|
|
@@ -700,12 +700,12 @@ function buildServerStatements(
|
|
|
700
700
|
if (server.specs !== null && server.specs !== undefined) {
|
|
701
701
|
if (Array.isArray(server.specs)) {
|
|
702
702
|
for (const spec of server.specs as SpecType[]) {
|
|
703
|
-
statements.push(buildSingleSpecStatements(ts, f, spec,
|
|
703
|
+
statements.push(buildSingleSpecStatements(ts, f, spec, momentType, messages));
|
|
704
704
|
}
|
|
705
705
|
} else {
|
|
706
706
|
const convertedSpec = convertOldSpecToNewFormat(server.specs as OldSpecFormat);
|
|
707
707
|
if (convertedSpec !== null) {
|
|
708
|
-
statements.push(buildSingleSpecStatements(ts, f, convertedSpec,
|
|
708
|
+
statements.push(buildSingleSpecStatements(ts, f, convertedSpec, momentType, messages));
|
|
709
709
|
}
|
|
710
710
|
}
|
|
711
711
|
}
|
|
@@ -717,16 +717,16 @@ function addServerToChain(
|
|
|
717
717
|
ts: typeof import('typescript'),
|
|
718
718
|
f: tsNS.NodeFactory,
|
|
719
719
|
chain: tsNS.Expression,
|
|
720
|
-
slice:
|
|
720
|
+
slice: CommandMoment | QueryMoment | ReactMoment | ExperienceMoment,
|
|
721
721
|
messages?: Array<{ type: string; name: string; fields: Array<{ name: string; type: string; required: boolean }> }>,
|
|
722
722
|
): tsNS.Expression {
|
|
723
723
|
if ('server' in slice && slice.server !== null && slice.server !== undefined) {
|
|
724
|
-
const
|
|
724
|
+
const momentType = slice.type as 'command' | 'query' | 'react' | 'experience';
|
|
725
725
|
const serverStatements = buildServerStatements(
|
|
726
726
|
ts,
|
|
727
727
|
f,
|
|
728
728
|
slice.server,
|
|
729
|
-
|
|
729
|
+
momentType === 'experience' ? 'react' : momentType,
|
|
730
730
|
messages,
|
|
731
731
|
);
|
|
732
732
|
|
|
@@ -744,10 +744,10 @@ function addServerToChain(
|
|
|
744
744
|
return chain;
|
|
745
745
|
}
|
|
746
746
|
|
|
747
|
-
function
|
|
747
|
+
function buildMoment(
|
|
748
748
|
ts: typeof import('typescript'),
|
|
749
749
|
f: tsNS.NodeFactory,
|
|
750
|
-
slice:
|
|
750
|
+
slice: CommandMoment | QueryMoment | ReactMoment | ExperienceMoment,
|
|
751
751
|
messages?: Array<{ type: string; name: string; fields: Array<{ name: string; type: string; required: boolean }> }>,
|
|
752
752
|
): tsNS.Statement {
|
|
753
753
|
const sliceCtor =
|
|
@@ -775,12 +775,12 @@ function buildSlice(
|
|
|
775
775
|
|
|
776
776
|
export function buildFlowStatements(
|
|
777
777
|
ts: typeof import('typescript'),
|
|
778
|
-
flow:
|
|
778
|
+
flow: Scene,
|
|
779
779
|
messages?: Array<{ type: string; name: string; fields: Array<{ name: string; type: string; required: boolean }> }>,
|
|
780
780
|
): tsNS.Statement[] {
|
|
781
781
|
const f = ts.factory;
|
|
782
782
|
|
|
783
|
-
const body = (flow.
|
|
783
|
+
const body = (flow.moments ?? []).map((sl: Moment) => buildMoment(ts, f, sl, messages));
|
|
784
784
|
|
|
785
785
|
const flowArgs: tsNS.Expression[] = [f.createStringLiteral(flow.name)];
|
|
786
786
|
if (flow.id !== null && flow.id !== undefined) {
|
|
@@ -797,7 +797,7 @@ export function buildFlowStatements(
|
|
|
797
797
|
),
|
|
798
798
|
);
|
|
799
799
|
|
|
800
|
-
const flowExpr = f.createCallExpression(f.createIdentifier('
|
|
800
|
+
const flowExpr = f.createCallExpression(f.createIdentifier('scene'), undefined, flowArgs);
|
|
801
801
|
|
|
802
802
|
return [f.createExpressionStatement(flowExpr)];
|
|
803
803
|
}
|