@auto-engineer/server-generator-apollo-emmett 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.
Files changed (170) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/.turbo/turbo-test.log +4 -4
  3. package/.turbo/turbo-type-check.log +1 -1
  4. package/CHANGELOG.md +39 -0
  5. package/DEBUG.md +4 -4
  6. package/dist/src/codegen/extract/data-sink.d.ts +2 -2
  7. package/dist/src/codegen/extract/data-sink.d.ts.map +1 -1
  8. package/dist/src/codegen/extract/data-sink.js +2 -2
  9. package/dist/src/codegen/extract/data-sink.js.map +1 -1
  10. package/dist/src/codegen/extract/events.d.ts +3 -3
  11. package/dist/src/codegen/extract/events.d.ts.map +1 -1
  12. package/dist/src/codegen/extract/events.js +11 -11
  13. package/dist/src/codegen/extract/events.js.map +1 -1
  14. package/dist/src/codegen/extract/gwt.d.ts +2 -2
  15. package/dist/src/codegen/extract/gwt.d.ts.map +1 -1
  16. package/dist/src/codegen/extract/gwt.js +2 -2
  17. package/dist/src/codegen/extract/gwt.js.map +1 -1
  18. package/dist/src/codegen/extract/imports.d.ts +4 -4
  19. package/dist/src/codegen/extract/imports.d.ts.map +1 -1
  20. package/dist/src/codegen/extract/imports.js +8 -8
  21. package/dist/src/codegen/extract/imports.js.map +1 -1
  22. package/dist/src/codegen/extract/messages.d.ts +2 -2
  23. package/dist/src/codegen/extract/messages.d.ts.map +1 -1
  24. package/dist/src/codegen/extract/messages.js +9 -9
  25. package/dist/src/codegen/extract/messages.js.map +1 -1
  26. package/dist/src/codegen/extract/projection.d.ts +7 -7
  27. package/dist/src/codegen/extract/projection.d.ts.map +1 -1
  28. package/dist/src/codegen/extract/projection.js +3 -3
  29. package/dist/src/codegen/extract/projection.js.map +1 -1
  30. package/dist/src/codegen/extract/query.d.ts +2 -2
  31. package/dist/src/codegen/extract/query.d.ts.map +1 -1
  32. package/dist/src/codegen/extract/query.js.map +1 -1
  33. package/dist/src/codegen/extract/slice-normalizer.d.ts +4 -4
  34. package/dist/src/codegen/extract/slice-normalizer.d.ts.map +1 -1
  35. package/dist/src/codegen/extract/slice-normalizer.js +7 -7
  36. package/dist/src/codegen/extract/slice-normalizer.js.map +1 -1
  37. package/dist/src/codegen/extract/states.d.ts +3 -3
  38. package/dist/src/codegen/extract/states.d.ts.map +1 -1
  39. package/dist/src/codegen/extract/states.js.map +1 -1
  40. package/dist/src/codegen/extract/step-converter.d.ts +7 -7
  41. package/dist/src/codegen/extract/step-converter.d.ts.map +1 -1
  42. package/dist/src/codegen/extract/step-converter.js +12 -12
  43. package/dist/src/codegen/extract/step-converter.js.map +1 -1
  44. package/dist/src/codegen/extract/step-types.d.ts +4 -4
  45. package/dist/src/codegen/extract/step-types.d.ts.map +1 -1
  46. package/dist/src/codegen/extract/step-types.js +1 -1
  47. package/dist/src/codegen/extract/step-types.js.map +1 -1
  48. package/dist/src/codegen/scaffoldFromSchema.d.ts +12 -12
  49. package/dist/src/codegen/scaffoldFromSchema.d.ts.map +1 -1
  50. package/dist/src/codegen/scaffoldFromSchema.js +113 -101
  51. package/dist/src/codegen/scaffoldFromSchema.js.map +1 -1
  52. package/dist/src/codegen/templates/command/commands.specs.ts +3 -3
  53. package/dist/src/codegen/templates/command/decide.specs.specs.ts +52 -52
  54. package/dist/src/codegen/templates/command/decide.specs.ts +12 -12
  55. package/dist/src/codegen/templates/command/decide.specs.ts.ejs +1 -1
  56. package/dist/src/codegen/templates/command/events.specs.ts +3 -3
  57. package/dist/src/codegen/templates/command/evolve.specs.ts +3 -3
  58. package/dist/src/codegen/templates/command/handle.specs.ts +13 -13
  59. package/dist/src/codegen/templates/command/mutation.resolver.specs.ts +19 -19
  60. package/dist/src/codegen/templates/command/register.specs.ts +3 -3
  61. package/dist/src/codegen/templates/command/state.specs.ts +3 -3
  62. package/dist/src/codegen/templates/query/events.specs.ts +4 -4
  63. package/dist/src/codegen/templates/query/projection.specs.specs.ts +60 -60
  64. package/dist/src/codegen/templates/query/projection.specs.ts +54 -29
  65. package/dist/src/codegen/templates/query/projection.specs.ts.ejs +2 -2
  66. package/dist/src/codegen/templates/query/query.resolver.specs.ts +63 -63
  67. package/dist/src/codegen/templates/query/query.resolver.ts.ejs +1 -1
  68. package/dist/src/codegen/templates/query/state.specs.ts +9 -9
  69. package/dist/src/codegen/templates/react/react.specs.specs.ts +15 -15
  70. package/dist/src/codegen/templates/react/react.specs.ts +16 -16
  71. package/dist/src/codegen/templates/react/react.specs.ts.ejs +9 -9
  72. package/dist/src/codegen/templates/react/react.ts.ejs +5 -5
  73. package/dist/src/codegen/templates/react/react.ts.specs.ts +33 -33
  74. package/dist/src/codegen/templates/react/register.specs.ts +7 -7
  75. package/dist/src/codegen/templates/react/register.ts.ejs +4 -4
  76. package/dist/src/codegen/test-data/specVariant1.d.ts.map +1 -1
  77. package/dist/src/codegen/test-data/specVariant1.js +3 -2
  78. package/dist/src/codegen/test-data/specVariant1.js.map +1 -1
  79. package/dist/src/codegen/types.d.ts +2 -2
  80. package/dist/src/codegen/types.d.ts.map +1 -1
  81. package/dist/src/commands/generate-server.d.ts +21 -21
  82. package/dist/src/commands/generate-server.d.ts.map +1 -1
  83. package/dist/src/commands/generate-server.js +81 -63
  84. package/dist/src/commands/generate-server.js.map +1 -1
  85. package/dist/src/commands/initialize-server.d.ts.map +1 -1
  86. package/dist/src/commands/initialize-server.js +2 -2
  87. package/dist/src/commands/initialize-server.js.map +1 -1
  88. package/dist/src/domain/flows/shared/types.d.ts +14 -0
  89. package/dist/src/domain/flows/shared/types.d.ts.map +1 -0
  90. package/dist/src/domain/flows/shared/types.js +2 -0
  91. package/dist/src/domain/flows/shared/types.js.map +1 -0
  92. package/dist/src/domain/flows/shared/types.ts +15 -0
  93. package/dist/src/domain/narratives/shared/types.d.ts +14 -0
  94. package/dist/src/domain/narratives/shared/types.d.ts.map +1 -0
  95. package/dist/src/domain/narratives/shared/types.js +2 -0
  96. package/dist/src/domain/narratives/shared/types.js.map +1 -0
  97. package/dist/src/domain/narratives/shared/types.ts +15 -0
  98. package/dist/src/index.d.ts +1 -1
  99. package/dist/src/index.d.ts.map +1 -1
  100. package/dist/src/server.js +3 -3
  101. package/dist/src/server.js.map +1 -1
  102. package/dist/src/server.ts +3 -3
  103. package/dist/src/utils/loadRegisterFiles.d.ts +2 -2
  104. package/dist/src/utils/loadRegisterFiles.d.ts.map +1 -1
  105. package/dist/src/utils/loadRegisterFiles.js.map +1 -1
  106. package/dist/src/utils/loadRegisterFiles.ts +5 -5
  107. package/dist/src/utils/loadResolvers.js +1 -1
  108. package/dist/src/utils/loadResolvers.js.map +1 -1
  109. package/dist/src/utils/loadResolvers.ts +1 -1
  110. package/dist/tsconfig.tsbuildinfo +1 -1
  111. package/package.json +4 -4
  112. package/src/codegen/extract/data-sink.ts +5 -5
  113. package/src/codegen/extract/events.ts +15 -15
  114. package/src/codegen/extract/gwt.ts +4 -4
  115. package/src/codegen/extract/imports.specs.ts +19 -19
  116. package/src/codegen/extract/imports.ts +13 -13
  117. package/src/codegen/extract/messages.specs.ts +30 -30
  118. package/src/codegen/extract/messages.ts +16 -16
  119. package/src/codegen/extract/projection.specs.ts +22 -22
  120. package/src/codegen/extract/projection.ts +9 -9
  121. package/src/codegen/extract/query.ts +2 -2
  122. package/src/codegen/extract/slice-normalizer.specs.ts +11 -11
  123. package/src/codegen/extract/slice-normalizer.ts +14 -14
  124. package/src/codegen/extract/states.ts +4 -4
  125. package/src/codegen/extract/step-converter.specs.ts +9 -9
  126. package/src/codegen/extract/step-converter.ts +15 -15
  127. package/src/codegen/extract/step-types.specs.ts +12 -12
  128. package/src/codegen/extract/step-types.ts +4 -4
  129. package/src/codegen/findEventSource.specs.ts +23 -23
  130. package/src/codegen/scaffoldErrors.specs.ts +4 -4
  131. package/src/codegen/scaffoldFromSchema.filter.specs.ts +32 -32
  132. package/src/codegen/scaffoldFromSchema.ts +146 -132
  133. package/src/codegen/templates/command/commands.specs.ts +3 -3
  134. package/src/codegen/templates/command/decide.specs.specs.ts +52 -52
  135. package/src/codegen/templates/command/decide.specs.ts +12 -12
  136. package/src/codegen/templates/command/decide.specs.ts.ejs +1 -1
  137. package/src/codegen/templates/command/events.specs.ts +3 -3
  138. package/src/codegen/templates/command/evolve.specs.ts +3 -3
  139. package/src/codegen/templates/command/handle.specs.ts +13 -13
  140. package/src/codegen/templates/command/mutation.resolver.specs.ts +19 -19
  141. package/src/codegen/templates/command/register.specs.ts +3 -3
  142. package/src/codegen/templates/command/state.specs.ts +3 -3
  143. package/src/codegen/templates/query/events.specs.ts +4 -4
  144. package/src/codegen/templates/query/projection.specs.specs.ts +60 -60
  145. package/src/codegen/templates/query/projection.specs.ts +54 -29
  146. package/src/codegen/templates/query/projection.specs.ts.ejs +2 -2
  147. package/src/codegen/templates/query/query.resolver.specs.ts +63 -63
  148. package/src/codegen/templates/query/query.resolver.ts.ejs +1 -1
  149. package/src/codegen/templates/query/state.specs.ts +9 -9
  150. package/src/codegen/templates/react/react.specs.specs.ts +15 -15
  151. package/src/codegen/templates/react/react.specs.ts +16 -16
  152. package/src/codegen/templates/react/react.specs.ts.ejs +9 -9
  153. package/src/codegen/templates/react/react.ts.ejs +5 -5
  154. package/src/codegen/templates/react/react.ts.specs.ts +33 -33
  155. package/src/codegen/templates/react/register.specs.ts +7 -7
  156. package/src/codegen/templates/react/register.ts.ejs +4 -4
  157. package/src/codegen/test-data/specVariant1.json +1 -1
  158. package/src/codegen/test-data/specVariant1.ts +3 -2
  159. package/src/codegen/test-data/specVariant2.json +1 -1
  160. package/src/codegen/types.ts +2 -2
  161. package/src/commands/generate-server.specs.ts +81 -79
  162. package/src/commands/generate-server.ts +110 -88
  163. package/src/commands/initialize-server.specs.ts +4 -4
  164. package/src/commands/initialize-server.ts +5 -2
  165. package/src/domain/flows/shared/types.ts +15 -0
  166. package/src/domain/narratives/shared/types.ts +15 -0
  167. package/src/index.ts +1 -1
  168. package/src/server.ts +3 -3
  169. package/src/utils/loadRegisterFiles.ts +5 -5
  170. package/src/utils/loadResolvers.ts +1 -1
@@ -6,10 +6,10 @@ describe('query.resolver.ts.ejs', () => {
6
6
  it('should generate a valid query resolver from request field', async () => {
7
7
  const spec: SpecsSchema = {
8
8
  variant: 'specs',
9
- narratives: [
9
+ scenes: [
10
10
  {
11
- name: 'listing-flow',
12
- slices: [
11
+ name: 'listing-scene',
12
+ moments: [
13
13
  {
14
14
  type: 'query',
15
15
  name: 'search-listings',
@@ -65,7 +65,7 @@ describe('query.resolver.ts.ejs', () => {
65
65
  ],
66
66
  };
67
67
 
68
- const { plans } = await generateScaffoldFilePlans(spec.narratives, spec.messages, undefined, 'src/domain/flows');
68
+ const { plans } = await generateScaffoldFilePlans(spec.scenes, spec.messages, undefined, 'src/domain/narratives');
69
69
  const resolverFile = plans.find((p) => p.outputPath.endsWith('query.resolver.ts'));
70
70
 
71
71
  expect(resolverFile?.contents).toMatchInlineSnapshot(`
@@ -128,10 +128,10 @@ describe('query.resolver.ts.ejs', () => {
128
128
  it('should generate a valid query resolver with array of inline object field', async () => {
129
129
  const spec: SpecsSchema = {
130
130
  variant: 'specs',
131
- narratives: [
131
+ scenes: [
132
132
  {
133
- name: 'assistant-flow',
134
- slices: [
133
+ name: 'assistant-scene',
134
+ moments: [
135
135
  {
136
136
  type: 'query',
137
137
  name: 'views-suggested-items',
@@ -188,7 +188,7 @@ describe('query.resolver.ts.ejs', () => {
188
188
  ],
189
189
  };
190
190
 
191
- const { plans } = await generateScaffoldFilePlans(spec.narratives, spec.messages, undefined, 'src/domain/flows');
191
+ const { plans } = await generateScaffoldFilePlans(spec.scenes, spec.messages, undefined, 'src/domain/narratives');
192
192
  const resolverFile = plans.find((p) => p.outputPath.endsWith('query.resolver.ts'));
193
193
 
194
194
  expect(resolverFile?.contents).toMatchInlineSnapshot(`
@@ -251,10 +251,10 @@ describe('query.resolver.ts.ejs', () => {
251
251
  it('should generate the query resolver for "views the questionnaire"', async () => {
252
252
  const spec: SpecsSchema = {
253
253
  variant: 'specs',
254
- narratives: [
254
+ scenes: [
255
255
  {
256
256
  name: 'Questionnaires',
257
- slices: [
257
+ moments: [
258
258
  {
259
259
  name: 'views the questionnaire',
260
260
  type: 'query',
@@ -352,7 +352,7 @@ describe('query.resolver.ts.ejs', () => {
352
352
  integrations: [],
353
353
  };
354
354
 
355
- const { plans } = await generateScaffoldFilePlans(spec.narratives, spec.messages, undefined, 'src/domain/flows');
355
+ const { plans } = await generateScaffoldFilePlans(spec.scenes, spec.messages, undefined, 'src/domain/narratives');
356
356
  const queryFile = plans.find(
357
357
  (p) => p.outputPath.endsWith('query.resolver.ts') && p.contents.includes('ViewsTheQuestionnaireQueryResolver'),
358
358
  );
@@ -424,10 +424,10 @@ describe('query.resolver.ts.ejs', () => {
424
424
  it('should import Float when Float fields are used', async () => {
425
425
  const spec: SpecsSchema = {
426
426
  variant: 'specs',
427
- narratives: [
427
+ scenes: [
428
428
  {
429
- name: 'product-flow',
430
- slices: [
429
+ name: 'product-scene',
430
+ moments: [
431
431
  {
432
432
  type: 'query',
433
433
  name: 'get-product-price',
@@ -479,7 +479,7 @@ describe('query.resolver.ts.ejs', () => {
479
479
  ],
480
480
  };
481
481
 
482
- const { plans } = await generateScaffoldFilePlans(spec.narratives, spec.messages, undefined, 'src/domain/flows');
482
+ const { plans } = await generateScaffoldFilePlans(spec.scenes, spec.messages, undefined, 'src/domain/narratives');
483
483
  const resolverFile = plans.find((p) => p.outputPath.endsWith('query.resolver.ts'));
484
484
 
485
485
  expect(resolverFile?.contents).toContain(
@@ -490,10 +490,10 @@ describe('query.resolver.ts.ejs', () => {
490
490
  it('should import Float when array of numbers is used', async () => {
491
491
  const spec: SpecsSchema = {
492
492
  variant: 'specs',
493
- narratives: [
493
+ scenes: [
494
494
  {
495
- name: 'stats-flow',
496
- slices: [
495
+ name: 'stats-scene',
496
+ moments: [
497
497
  {
498
498
  type: 'query',
499
499
  name: 'get-stats',
@@ -543,7 +543,7 @@ describe('query.resolver.ts.ejs', () => {
543
543
  ],
544
544
  };
545
545
 
546
- const { plans } = await generateScaffoldFilePlans(spec.narratives, spec.messages, undefined, 'src/domain/flows');
546
+ const { plans } = await generateScaffoldFilePlans(spec.scenes, spec.messages, undefined, 'src/domain/narratives');
547
547
  const resolverFile = plans.find((p) => p.outputPath.endsWith('query.resolver.ts'));
548
548
 
549
549
  expect(resolverFile?.contents).toContain('Float');
@@ -552,10 +552,10 @@ describe('query.resolver.ts.ejs', () => {
552
552
  it('should import Float when Float query arg is used', async () => {
553
553
  const spec: SpecsSchema = {
554
554
  variant: 'specs',
555
- narratives: [
555
+ scenes: [
556
556
  {
557
- name: 'search-flow',
558
- slices: [
557
+ name: 'search-scene',
558
+ moments: [
559
559
  {
560
560
  type: 'query',
561
561
  name: 'search-products',
@@ -605,7 +605,7 @@ describe('query.resolver.ts.ejs', () => {
605
605
  ],
606
606
  };
607
607
 
608
- const { plans } = await generateScaffoldFilePlans(spec.narratives, spec.messages, undefined, 'src/domain/flows');
608
+ const { plans } = await generateScaffoldFilePlans(spec.scenes, spec.messages, undefined, 'src/domain/narratives');
609
609
  const resolverFile = plans.find((p) => p.outputPath.endsWith('query.resolver.ts'));
610
610
 
611
611
  expect(resolverFile?.contents).toContain('Float');
@@ -615,10 +615,10 @@ describe('query.resolver.ts.ejs', () => {
615
615
  it('should generate a singleton query resolver that returns a single object', async () => {
616
616
  const spec: SpecsSchema = {
617
617
  variant: 'specs',
618
- narratives: [
618
+ scenes: [
619
619
  {
620
- name: 'todo-list-flow',
621
- slices: [
620
+ name: 'todo-list-scene',
621
+ moments: [
622
622
  {
623
623
  type: 'query',
624
624
  name: 'views-completion-summary',
@@ -674,7 +674,7 @@ describe('query.resolver.ts.ejs', () => {
674
674
  ],
675
675
  };
676
676
 
677
- const { plans } = await generateScaffoldFilePlans(spec.narratives, spec.messages, undefined, 'src/domain/flows');
677
+ const { plans } = await generateScaffoldFilePlans(spec.scenes, spec.messages, undefined, 'src/domain/narratives');
678
678
  const resolverFile = plans.find((p) => p.outputPath.endsWith('query.resolver.ts'));
679
679
 
680
680
  // Should return single object, not array
@@ -696,10 +696,10 @@ describe('query.resolver.ts.ejs', () => {
696
696
  it('should not treat mixed union type with quotes as enum in singleton default values', async () => {
697
697
  const spec: SpecsSchema = {
698
698
  variant: 'specs',
699
- narratives: [
699
+ scenes: [
700
700
  {
701
- name: 'order-flow',
702
- slices: [
701
+ name: 'order-scene',
702
+ moments: [
703
703
  {
704
704
  type: 'query',
705
705
  name: 'views-order-summary',
@@ -747,7 +747,7 @@ describe('query.resolver.ts.ejs', () => {
747
747
  ],
748
748
  };
749
749
 
750
- const { plans } = await generateScaffoldFilePlans(spec.narratives, spec.messages, undefined, 'src/domain/flows');
750
+ const { plans } = await generateScaffoldFilePlans(spec.scenes, spec.messages, undefined, 'src/domain/narratives');
751
751
  const resolverFile = plans.find((p) => p.outputPath.endsWith('query.resolver.ts'));
752
752
 
753
753
  expect(resolverFile?.contents).not.toContain("mixedStatus: 'pending'");
@@ -757,10 +757,10 @@ describe('query.resolver.ts.ejs', () => {
757
757
  it('should handle nested Array<{...}> in embedded ObjectType without breaking', async () => {
758
758
  const spec: SpecsSchema = {
759
759
  variant: 'specs',
760
- narratives: [
760
+ scenes: [
761
761
  {
762
- name: 'training-flow',
763
- slices: [
762
+ name: 'training-scene',
763
+ moments: [
764
764
  {
765
765
  type: 'query',
766
766
  name: 'views-workout-session',
@@ -815,7 +815,7 @@ describe('query.resolver.ts.ejs', () => {
815
815
  ],
816
816
  };
817
817
 
818
- const { plans } = await generateScaffoldFilePlans(spec.narratives, spec.messages, undefined, 'src/domain/flows');
818
+ const { plans } = await generateScaffoldFilePlans(spec.scenes, spec.messages, undefined, 'src/domain/narratives');
819
819
  const resolverFile = plans.find((p) => p.outputPath.endsWith('query.resolver.ts'));
820
820
 
821
821
  expect(resolverFile?.contents).toContain('export class WorkoutSessionPerformance');
@@ -827,10 +827,10 @@ describe('query.resolver.ts.ejs', () => {
827
827
  it('should use message type name in graphqlType and not treat it as enum', async () => {
828
828
  const spec: SpecsSchema = {
829
829
  variant: 'specs',
830
- narratives: [
830
+ scenes: [
831
831
  {
832
- name: 'recipe-flow',
833
- slices: [
832
+ name: 'recipe-scene',
833
+ moments: [
834
834
  {
835
835
  type: 'query',
836
836
  name: 'find-recipe-matches',
@@ -889,7 +889,7 @@ describe('query.resolver.ts.ejs', () => {
889
889
  ],
890
890
  };
891
891
 
892
- const { plans } = await generateScaffoldFilePlans(spec.narratives, spec.messages, undefined, 'src/domain/flows');
892
+ const { plans } = await generateScaffoldFilePlans(spec.scenes, spec.messages, undefined, 'src/domain/narratives');
893
893
  const resolverFile = plans.find((p) => p.outputPath.endsWith('query.resolver.ts'));
894
894
 
895
895
  expect(resolverFile?.contents).toMatchInlineSnapshot(`
@@ -947,10 +947,10 @@ describe('query.resolver.ts.ejs', () => {
947
947
  it('should use original-case projection name as collection name, not PascalCase', async () => {
948
948
  const spec: SpecsSchema = {
949
949
  variant: 'specs',
950
- narratives: [
950
+ scenes: [
951
951
  {
952
- name: 'video-flow',
953
- slices: [
952
+ name: 'video-scene',
953
+ moments: [
954
954
  {
955
955
  type: 'query',
956
956
  name: 'browse-videos',
@@ -998,7 +998,7 @@ describe('query.resolver.ts.ejs', () => {
998
998
  ],
999
999
  };
1000
1000
 
1001
- const { plans } = await generateScaffoldFilePlans(spec.narratives, spec.messages, undefined, 'src/domain/flows');
1001
+ const { plans } = await generateScaffoldFilePlans(spec.scenes, spec.messages, undefined, 'src/domain/narratives');
1002
1002
  const resolverFile = plans.find((p) => p.outputPath.endsWith('query.resolver.ts'));
1003
1003
 
1004
1004
  expect(resolverFile?.contents).toContain("new ReadModel<VideoListing>(ctx.database, 'videos')");
@@ -1008,10 +1008,10 @@ describe('query.resolver.ts.ejs', () => {
1008
1008
  it('should use original-case projection name in singleton collection lookup', async () => {
1009
1009
  const spec: SpecsSchema = {
1010
1010
  variant: 'specs',
1011
- narratives: [
1011
+ scenes: [
1012
1012
  {
1013
- name: 'video-flow',
1014
- slices: [
1013
+ name: 'video-scene',
1014
+ moments: [
1015
1015
  {
1016
1016
  type: 'query',
1017
1017
  name: 'views-video-stats',
@@ -1059,7 +1059,7 @@ describe('query.resolver.ts.ejs', () => {
1059
1059
  ],
1060
1060
  };
1061
1061
 
1062
- const { plans } = await generateScaffoldFilePlans(spec.narratives, spec.messages, undefined, 'src/domain/flows');
1062
+ const { plans } = await generateScaffoldFilePlans(spec.scenes, spec.messages, undefined, 'src/domain/narratives');
1063
1063
  const resolverFile = plans.find((p) => p.outputPath.endsWith('query.resolver.ts'));
1064
1064
 
1065
1065
  expect(resolverFile?.contents).toContain("ctx.database.collection<VideoStats>('videoStats').findOne()");
@@ -1069,10 +1069,10 @@ describe('query.resolver.ts.ejs', () => {
1069
1069
  it('should generate @ObjectType classes for referenced message types', async () => {
1070
1070
  const spec: SpecsSchema = {
1071
1071
  variant: 'specs',
1072
- narratives: [
1072
+ scenes: [
1073
1073
  {
1074
- name: 'recipe-flow',
1075
- slices: [
1074
+ name: 'recipe-scene',
1075
+ moments: [
1076
1076
  {
1077
1077
  type: 'query',
1078
1078
  name: 'find-recipe-matches',
@@ -1131,7 +1131,7 @@ describe('query.resolver.ts.ejs', () => {
1131
1131
  ],
1132
1132
  };
1133
1133
 
1134
- const { plans } = await generateScaffoldFilePlans(spec.narratives, spec.messages, undefined, 'src/domain/flows');
1134
+ const { plans } = await generateScaffoldFilePlans(spec.scenes, spec.messages, undefined, 'src/domain/narratives');
1135
1135
  const resolverFile = plans.find((p) => p.outputPath.endsWith('query.resolver.ts'));
1136
1136
 
1137
1137
  expect(resolverFile?.contents).toMatchInlineSnapshot(`
@@ -1189,10 +1189,10 @@ describe('query.resolver.ts.ejs', () => {
1189
1189
  it('should map custom input type args to GraphQLJSON and Record<string, unknown>', async () => {
1190
1190
  const spec: SpecsSchema = {
1191
1191
  variant: 'specs',
1192
- narratives: [
1192
+ scenes: [
1193
1193
  {
1194
- name: 'workout-flow',
1195
- slices: [
1194
+ name: 'workout-scene',
1195
+ moments: [
1196
1196
  {
1197
1197
  type: 'query',
1198
1198
  name: 'list-workouts',
@@ -1240,7 +1240,7 @@ describe('query.resolver.ts.ejs', () => {
1240
1240
  ],
1241
1241
  };
1242
1242
 
1243
- const { plans } = await generateScaffoldFilePlans(spec.narratives, spec.messages, undefined, 'src/domain/flows');
1243
+ const { plans } = await generateScaffoldFilePlans(spec.scenes, spec.messages, undefined, 'src/domain/narratives');
1244
1244
  const resolverFile = plans.find((p) => p.outputPath.endsWith('query.resolver.ts'));
1245
1245
 
1246
1246
  expect(resolverFile?.contents).toContain("import { GraphQLJSON } from 'graphql-type-json';");
@@ -1254,10 +1254,10 @@ describe('query.resolver.ts.ejs', () => {
1254
1254
  it('should map query arg to state field via value matching when names differ', async () => {
1255
1255
  const spec: SpecsSchema = {
1256
1256
  variant: 'specs',
1257
- narratives: [
1257
+ scenes: [
1258
1258
  {
1259
- name: 'workout-flow',
1260
- slices: [
1259
+ name: 'workout-scene',
1260
+ moments: [
1261
1261
  {
1262
1262
  type: 'command',
1263
1263
  name: 'create-workout',
@@ -1372,7 +1372,7 @@ describe('query.resolver.ts.ejs', () => {
1372
1372
  ],
1373
1373
  };
1374
1374
 
1375
- const { plans } = await generateScaffoldFilePlans(spec.narratives, spec.messages, undefined, 'src/domain/flows');
1375
+ const { plans } = await generateScaffoldFilePlans(spec.scenes, spec.messages, undefined, 'src/domain/narratives');
1376
1376
  const resolverFile = plans.find((p) => p.outputPath.endsWith('view-workout/query.resolver.ts'));
1377
1377
 
1378
1378
  expect(resolverFile?.contents).toMatchInlineSnapshot(`
@@ -1421,10 +1421,10 @@ describe('query.resolver.ts.ejs', () => {
1421
1421
  it('should generate operator-based filters from explicit mappings', async () => {
1422
1422
  const spec: SpecsSchema = {
1423
1423
  variant: 'specs',
1424
- narratives: [
1424
+ scenes: [
1425
1425
  {
1426
- name: 'rental-flow',
1427
- slices: [
1426
+ name: 'rental-scene',
1427
+ moments: [
1428
1428
  {
1429
1429
  type: 'query',
1430
1430
  name: 'search-listings',
@@ -1486,7 +1486,7 @@ describe('query.resolver.ts.ejs', () => {
1486
1486
  ],
1487
1487
  };
1488
1488
 
1489
- const { plans } = await generateScaffoldFilePlans(spec.narratives, spec.messages, undefined, 'src/domain/flows');
1489
+ const { plans } = await generateScaffoldFilePlans(spec.scenes, spec.messages, undefined, 'src/domain/narratives');
1490
1490
  const resolverFile = plans.find((p) => p.outputPath.endsWith('query.resolver.ts'));
1491
1491
 
1492
1492
  expect(resolverFile?.contents).toContain('item.numBedrooms < minBedrooms');
@@ -2,7 +2,7 @@
2
2
  const target = slice?.server?.data?.items?.[0]?.target;
3
3
  const projection = slice?.server?.data?.items?.[0]?.origin;
4
4
  const isSingleton = projection?.singleton === true;
5
- const queryName = parsedRequest?.operationName ?? camelCase(sliceName);
5
+ const queryName = parsedRequest?.operationName ?? camelCase(momentName);
6
6
  const viewType = target?.name ? pascalCase(target.name) : 'UnknownView';
7
7
  const collectionName = projectionName || 'unknown-collection';
8
8
  const message = messages?.find(m => m.name === viewType);
@@ -6,10 +6,10 @@ describe('state.ts.ejs', () => {
6
6
  it('should generate a valid state definition file for a query slice with a state message', async () => {
7
7
  const spec: SpecsSchema = {
8
8
  variant: 'specs',
9
- narratives: [
9
+ scenes: [
10
10
  {
11
11
  name: 'Inventory management',
12
- slices: [
12
+ moments: [
13
13
  {
14
14
  type: 'query',
15
15
  name: 'Get available items',
@@ -55,7 +55,7 @@ describe('state.ts.ejs', () => {
55
55
  ],
56
56
  };
57
57
 
58
- const { plans } = await generateScaffoldFilePlans(spec.narratives, spec.messages, undefined, 'src/domain/flows');
58
+ const { plans } = await generateScaffoldFilePlans(spec.scenes, spec.messages, undefined, 'src/domain/narratives');
59
59
  const stateFile = plans.find((p) => p.outputPath.endsWith('state.ts'));
60
60
 
61
61
  expect(stateFile?.contents).toMatchInlineSnapshot(`
@@ -73,10 +73,10 @@ describe('state.ts.ejs', () => {
73
73
  it('should render projection state fields as required even when spec says required: false', async () => {
74
74
  const spec: SpecsSchema = {
75
75
  variant: 'specs',
76
- narratives: [
76
+ scenes: [
77
77
  {
78
78
  name: 'Workout tracking',
79
- slices: [
79
+ moments: [
80
80
  {
81
81
  type: 'query',
82
82
  name: 'Get workout history',
@@ -119,7 +119,7 @@ describe('state.ts.ejs', () => {
119
119
  ],
120
120
  };
121
121
 
122
- const { plans } = await generateScaffoldFilePlans(spec.narratives, spec.messages, undefined, 'src/domain/flows');
122
+ const { plans } = await generateScaffoldFilePlans(spec.scenes, spec.messages, undefined, 'src/domain/narratives');
123
123
  const stateFile = plans.find((p) => p.outputPath.endsWith('state.ts'));
124
124
 
125
125
  expect(stateFile?.contents).toMatchInlineSnapshot(`
@@ -136,10 +136,10 @@ describe('state.ts.ejs', () => {
136
136
  it('should export fallback UnknownState when query slice has no data config', async () => {
137
137
  const spec: SpecsSchema = {
138
138
  variant: 'specs',
139
- narratives: [
139
+ scenes: [
140
140
  {
141
141
  name: 'Dashboard',
142
- slices: [
142
+ moments: [
143
143
  {
144
144
  type: 'query',
145
145
  name: 'View summary',
@@ -156,7 +156,7 @@ describe('state.ts.ejs', () => {
156
156
  messages: [],
157
157
  };
158
158
 
159
- const { plans } = await generateScaffoldFilePlans(spec.narratives, spec.messages, undefined, 'src/domain/flows');
159
+ const { plans } = await generateScaffoldFilePlans(spec.scenes, spec.messages, undefined, 'src/domain/narratives');
160
160
  const stateFile = plans.find((p) => p.outputPath.endsWith('state.ts'));
161
161
 
162
162
  expect(stateFile?.contents).toMatchInlineSnapshot(`
@@ -6,10 +6,10 @@ describe('react.specs.ts.ejs (react slice)', () => {
6
6
  it('should generate correct react.specs.ts', async () => {
7
7
  const spec: SpecsSchema = {
8
8
  variant: 'specs',
9
- narratives: [
9
+ scenes: [
10
10
  {
11
11
  name: 'manage bookings',
12
- slices: [
12
+ moments: [
13
13
  {
14
14
  type: 'command',
15
15
  name: 'guest submits booking request',
@@ -163,7 +163,7 @@ describe('react.specs.ts.ejs (react slice)', () => {
163
163
  ],
164
164
  };
165
165
 
166
- const { plans } = await generateScaffoldFilePlans(spec.narratives, spec.messages, undefined, 'src/domain/flows');
166
+ const { plans } = await generateScaffoldFilePlans(spec.scenes, spec.messages, undefined, 'src/domain/narratives');
167
167
 
168
168
  const specFile = plans.find((p) => p.outputPath.endsWith('react.specs.ts'));
169
169
  expect(specFile?.contents).toMatchInlineSnapshot(`
@@ -238,10 +238,10 @@ describe('react.specs.ts.ejs (react slice)', () => {
238
238
  it('should use correct field types from commands array (number fields not strings)', async () => {
239
239
  const spec: SpecsSchema = {
240
240
  variant: 'specs',
241
- narratives: [
241
+ scenes: [
242
242
  {
243
- name: 'tipping flow',
244
- slices: [
243
+ name: 'tipping scene',
244
+ moments: [
245
245
  {
246
246
  type: 'command',
247
247
  name: 'complete appointment',
@@ -342,7 +342,7 @@ describe('react.specs.ts.ejs (react slice)', () => {
342
342
  ],
343
343
  };
344
344
 
345
- const { plans } = await generateScaffoldFilePlans(spec.narratives, spec.messages, undefined, 'src/domain/flows');
345
+ const { plans } = await generateScaffoldFilePlans(spec.scenes, spec.messages, undefined, 'src/domain/narratives');
346
346
 
347
347
  const specFile = plans.find((p) => p.outputPath.endsWith('react.specs.ts'));
348
348
  expect(specFile?.contents).toBeDefined();
@@ -356,10 +356,10 @@ describe('react.specs.ts.ejs (react slice)', () => {
356
356
  it('should exclude event And-steps from ReactorCommand type and then assertions', async () => {
357
357
  const spec: SpecsSchema = {
358
358
  variant: 'specs',
359
- narratives: [
359
+ scenes: [
360
360
  {
361
- name: 'notification flow',
362
- slices: [
361
+ name: 'notification scene',
362
+ moments: [
363
363
  {
364
364
  type: 'command',
365
365
  name: 'earn points',
@@ -451,7 +451,7 @@ describe('react.specs.ts.ejs (react slice)', () => {
451
451
  ],
452
452
  };
453
453
 
454
- const { plans } = await generateScaffoldFilePlans(spec.narratives, spec.messages, undefined, 'src/domain/flows');
454
+ const { plans } = await generateScaffoldFilePlans(spec.scenes, spec.messages, undefined, 'src/domain/narratives');
455
455
  const specFile = plans.find((p) => p.outputPath.endsWith('notify-milestone/react.specs.ts'));
456
456
 
457
457
  expect(specFile?.contents).toContain('type ReactorCommand = SendNotification;');
@@ -463,10 +463,10 @@ describe('react.specs.ts.ejs (react slice)', () => {
463
463
  it('should seed event store with Given state data via appendToStream', async () => {
464
464
  const spec: SpecsSchema = {
465
465
  variant: 'specs',
466
- narratives: [
466
+ scenes: [
467
467
  {
468
- name: 'barbershop flow',
469
- slices: [
468
+ name: 'barbershop scene',
469
+ moments: [
470
470
  {
471
471
  type: 'command',
472
472
  name: 'cancel appointment',
@@ -583,7 +583,7 @@ describe('react.specs.ts.ejs (react slice)', () => {
583
583
  ],
584
584
  };
585
585
 
586
- const { plans } = await generateScaffoldFilePlans(spec.narratives, spec.messages, undefined, 'src/domain/flows');
586
+ const { plans } = await generateScaffoldFilePlans(spec.scenes, spec.messages, undefined, 'src/domain/narratives');
587
587
 
588
588
  const specFile = plans.find((p) => p.outputPath.endsWith('notify-barber-of-cancellation/react.specs.ts'));
589
589
  expect(specFile?.contents).toMatchInlineSnapshot(`
@@ -6,10 +6,10 @@ describe('handle.ts.ejs (react slice)', () => {
6
6
  it('should generate correct react.ts', async () => {
7
7
  const spec: SpecsSchema = {
8
8
  variant: 'specs',
9
- narratives: [
9
+ scenes: [
10
10
  {
11
11
  name: 'manage bookings',
12
- slices: [
12
+ moments: [
13
13
  {
14
14
  type: 'command',
15
15
  name: 'guest submits booking request',
@@ -229,7 +229,7 @@ describe('handle.ts.ejs (react slice)', () => {
229
229
  ],
230
230
  };
231
231
 
232
- const { plans } = await generateScaffoldFilePlans(spec.narratives, spec.messages, undefined, 'src/domain/flows');
232
+ const { plans } = await generateScaffoldFilePlans(spec.scenes, spec.messages, undefined, 'src/domain/narratives');
233
233
  const handleFile = plans.find((p) => p.outputPath.endsWith('react.ts'));
234
234
 
235
235
  expect(handleFile?.contents).toMatchInlineSnapshot(`
@@ -290,13 +290,13 @@ describe('handle.ts.ejs (react slice)', () => {
290
290
  `);
291
291
  });
292
292
 
293
- it('should generate cross-flow import path in react.ts', async () => {
293
+ it('should generate cross-scene import path in react.ts', async () => {
294
294
  const spec: SpecsSchema = {
295
295
  variant: 'specs',
296
- narratives: [
296
+ scenes: [
297
297
  {
298
298
  name: 'order management',
299
- slices: [
299
+ moments: [
300
300
  {
301
301
  type: 'command',
302
302
  name: 'create order',
@@ -329,12 +329,12 @@ describe('handle.ts.ejs (react slice)', () => {
329
329
  },
330
330
  {
331
331
  name: 'fulfillment',
332
- slices: [
332
+ moments: [
333
333
  {
334
334
  type: 'react',
335
335
  name: 'notify warehouse',
336
336
  server: {
337
- description: 'Reacts to OrderCreated from order management flow',
337
+ description: 'Reacts to OrderCreated from order management scene',
338
338
  specs: [
339
339
  {
340
340
  type: 'gherkin',
@@ -381,7 +381,7 @@ describe('handle.ts.ejs (react slice)', () => {
381
381
  ],
382
382
  };
383
383
 
384
- const { plans } = await generateScaffoldFilePlans(spec.narratives, spec.messages, undefined, 'src/domain/flows');
384
+ const { plans } = await generateScaffoldFilePlans(spec.scenes, spec.messages, undefined, 'src/domain/narratives');
385
385
  const reactFile = plans.find((p) => p.outputPath.endsWith('notify-warehouse/react.ts'));
386
386
 
387
387
  expect(reactFile?.contents).toContain("from '../../order-management/create-order/events'");
@@ -390,10 +390,10 @@ describe('handle.ts.ejs (react slice)', () => {
390
390
  it('should not self-reference react slice when trigger event has no known producer', async () => {
391
391
  const spec: SpecsSchema = {
392
392
  variant: 'specs',
393
- narratives: [
393
+ scenes: [
394
394
  {
395
395
  name: 'notifications',
396
- slices: [
396
+ moments: [
397
397
  {
398
398
  type: 'react',
399
399
  name: 'notify on external event',
@@ -451,7 +451,7 @@ describe('handle.ts.ejs (react slice)', () => {
451
451
  ],
452
452
  };
453
453
 
454
- const { plans } = await generateScaffoldFilePlans(spec.narratives, spec.messages, undefined, 'src/domain/flows');
454
+ const { plans } = await generateScaffoldFilePlans(spec.scenes, spec.messages, undefined, 'src/domain/narratives');
455
455
  const reactFile = plans.find((p) => p.outputPath.endsWith('notify-on-external-event/react.ts'));
456
456
  const registerFile = plans.find((p) => p.outputPath.endsWith('notify-on-external-event/register.ts'));
457
457
  const specsFile = plans.find((p) => p.outputPath.endsWith('notify-on-external-event/react.specs.ts'));
@@ -464,10 +464,10 @@ describe('handle.ts.ejs (react slice)', () => {
464
464
  it('should normalize Pattern B-full: swap trigger from given to when', async () => {
465
465
  const spec: SpecsSchema = {
466
466
  variant: 'specs',
467
- narratives: [
467
+ scenes: [
468
468
  {
469
469
  name: 'order management',
470
- slices: [
470
+ moments: [
471
471
  {
472
472
  type: 'command',
473
473
  name: 'process payment',
@@ -500,7 +500,7 @@ describe('handle.ts.ejs (react slice)', () => {
500
500
  },
501
501
  {
502
502
  name: 'fulfillment',
503
- slices: [
503
+ moments: [
504
504
  {
505
505
  type: 'react',
506
506
  name: 'adjust inventory',
@@ -559,7 +559,7 @@ describe('handle.ts.ejs (react slice)', () => {
559
559
  ],
560
560
  };
561
561
 
562
- const { plans } = await generateScaffoldFilePlans(spec.narratives, spec.messages, undefined, 'src/domain/flows');
562
+ const { plans } = await generateScaffoldFilePlans(spec.scenes, spec.messages, undefined, 'src/domain/narratives');
563
563
  const reactFile = plans.find((p) => p.outputPath.endsWith('adjust-inventory/react.ts'));
564
564
 
565
565
  expect(reactFile?.contents).toContain('inMemoryReactor<PaymentProcessed>');