@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.
Files changed (181) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/.turbo/turbo-test.log +5 -5
  3. package/.turbo/turbo-type-check.log +1 -1
  4. package/CHANGELOG.md +41 -0
  5. package/dist/scripts/convert-flow-exec.js +2 -2
  6. package/dist/scripts/convert-flow-exec.js.map +1 -1
  7. package/dist/scripts/print-schema.js +5 -5
  8. package/dist/scripts/print-schema.js.map +1 -1
  9. package/dist/src/fluent-builder.d.ts +29 -29
  10. package/dist/src/fluent-builder.d.ts.map +1 -1
  11. package/dist/src/fluent-builder.js +81 -81
  12. package/dist/src/fluent-builder.js.map +1 -1
  13. package/dist/src/{getNarratives.d.ts → getScenes.d.ts} +6 -6
  14. package/dist/src/getScenes.d.ts.map +1 -0
  15. package/dist/src/{getNarratives.js → getScenes.js} +16 -16
  16. package/dist/src/getScenes.js.map +1 -0
  17. package/dist/src/id/addAutoIds.d.ts.map +1 -1
  18. package/dist/src/id/addAutoIds.js +22 -22
  19. package/dist/src/id/addAutoIds.js.map +1 -1
  20. package/dist/src/id/hasAllIds.d.ts.map +1 -1
  21. package/dist/src/id/hasAllIds.js +2 -2
  22. package/dist/src/id/hasAllIds.js.map +1 -1
  23. package/dist/src/index.d.ts +8 -8
  24. package/dist/src/index.d.ts.map +1 -1
  25. package/dist/src/index.js +4 -4
  26. package/dist/src/index.js.map +1 -1
  27. package/dist/src/loader/index.js +1 -1
  28. package/dist/src/loader/index.js.map +1 -1
  29. package/dist/src/loader/runtime-cjs.js +1 -1
  30. package/dist/src/loader/runtime-cjs.js.map +1 -1
  31. package/dist/src/narrative-context.d.ts +9 -9
  32. package/dist/src/narrative-context.d.ts.map +1 -1
  33. package/dist/src/narrative-context.js +47 -47
  34. package/dist/src/narrative-context.js.map +1 -1
  35. package/dist/src/narrative-registry.d.ts +6 -6
  36. package/dist/src/narrative-registry.d.ts.map +1 -1
  37. package/dist/src/narrative-registry.js +26 -26
  38. package/dist/src/narrative-registry.js.map +1 -1
  39. package/dist/src/narrative.d.ts +5 -5
  40. package/dist/src/narrative.d.ts.map +1 -1
  41. package/dist/src/narrative.js +26 -27
  42. package/dist/src/narrative.js.map +1 -1
  43. package/dist/src/parse-graphql-request.d.ts +1 -1
  44. package/dist/src/parse-graphql-request.d.ts.map +1 -1
  45. package/dist/src/parse-graphql-request.js +3 -3
  46. package/dist/src/parse-graphql-request.js.map +1 -1
  47. package/dist/src/samples/items.narrative.js +2 -2
  48. package/dist/src/samples/items.narrative.js.map +1 -1
  49. package/dist/src/samples/mixed-given-types.narrative.js +2 -2
  50. package/dist/src/samples/mixed-given-types.narrative.js.map +1 -1
  51. package/dist/src/samples/place-order.narrative.js +2 -2
  52. package/dist/src/samples/place-order.narrative.js.map +1 -1
  53. package/dist/src/samples/questionnaires.narrative.js +2 -2
  54. package/dist/src/samples/questionnaires.narrative.js.map +1 -1
  55. package/dist/src/samples/seasonal-assistant.schema.json +2 -2
  56. package/dist/src/samples/test-with-ids.narrative.js +2 -2
  57. package/dist/src/samples/test-with-ids.narrative.js.map +1 -1
  58. package/dist/src/schema.d.ts +136 -136
  59. package/dist/src/schema.d.ts.map +1 -1
  60. package/dist/src/schema.js +76 -76
  61. package/dist/src/schema.js.map +1 -1
  62. package/dist/src/slice-builder.d.ts +6 -6
  63. package/dist/src/slice-builder.d.ts.map +1 -1
  64. package/dist/src/slice-builder.js +21 -21
  65. package/dist/src/slice-builder.js.map +1 -1
  66. package/dist/src/transformers/model-to-narrative/analysis/lint-helpers.js +1 -1
  67. package/dist/src/transformers/model-to-narrative/analysis/lint-helpers.js.map +1 -1
  68. package/dist/src/transformers/model-to-narrative/cross-module-imports.js +4 -4
  69. package/dist/src/transformers/model-to-narrative/cross-module-imports.js.map +1 -1
  70. package/dist/src/transformers/model-to-narrative/generators/compose.js +3 -3
  71. package/dist/src/transformers/model-to-narrative/generators/compose.js.map +1 -1
  72. package/dist/src/transformers/model-to-narrative/generators/flow.d.ts +2 -2
  73. package/dist/src/transformers/model-to-narrative/generators/flow.d.ts.map +1 -1
  74. package/dist/src/transformers/model-to-narrative/generators/flow.js +20 -20
  75. package/dist/src/transformers/model-to-narrative/generators/flow.js.map +1 -1
  76. package/dist/src/transformers/model-to-narrative/generators/imports.d.ts +1 -1
  77. package/dist/src/transformers/model-to-narrative/generators/imports.d.ts.map +1 -1
  78. package/dist/src/transformers/model-to-narrative/generators/imports.js +1 -1
  79. package/dist/src/transformers/model-to-narrative/generators/imports.js.map +1 -1
  80. package/dist/src/transformers/model-to-narrative/generators/module-code.js +14 -14
  81. package/dist/src/transformers/model-to-narrative/generators/module-code.js.map +1 -1
  82. package/dist/src/transformers/model-to-narrative/index.d.ts +4 -4
  83. package/dist/src/transformers/model-to-narrative/index.d.ts.map +1 -1
  84. package/dist/src/transformers/model-to-narrative/index.js +1 -1
  85. package/dist/src/transformers/model-to-narrative/spec-traversal.d.ts +2 -2
  86. package/dist/src/transformers/model-to-narrative/spec-traversal.d.ts.map +1 -1
  87. package/dist/src/transformers/model-to-narrative/spec-traversal.js +5 -5
  88. package/dist/src/transformers/model-to-narrative/spec-traversal.js.map +1 -1
  89. package/dist/src/transformers/model-to-narrative/types.d.ts +1 -1
  90. package/dist/src/transformers/model-to-narrative/types.d.ts.map +1 -1
  91. package/dist/src/transformers/model-to-narrative/utils/integration-extractor.d.ts +1 -1
  92. package/dist/src/transformers/model-to-narrative/utils/integration-extractor.d.ts.map +1 -1
  93. package/dist/src/transformers/model-to-narrative/utils/integration-extractor.js +4 -4
  94. package/dist/src/transformers/model-to-narrative/utils/integration-extractor.js.map +1 -1
  95. package/dist/src/transformers/model-to-narrative/validate-modules.d.ts +1 -1
  96. package/dist/src/transformers/model-to-narrative/validate-modules.d.ts.map +1 -1
  97. package/dist/src/transformers/model-to-narrative/validate-modules.js +19 -19
  98. package/dist/src/transformers/model-to-narrative/validate-modules.js.map +1 -1
  99. package/dist/src/transformers/narrative-to-model/assemble.d.ts +2 -2
  100. package/dist/src/transformers/narrative-to-model/assemble.d.ts.map +1 -1
  101. package/dist/src/transformers/narrative-to-model/assemble.js +10 -3
  102. package/dist/src/transformers/narrative-to-model/assemble.js.map +1 -1
  103. package/dist/src/transformers/narrative-to-model/debug.d.ts.map +1 -1
  104. package/dist/src/transformers/narrative-to-model/debug.js +1 -1
  105. package/dist/src/transformers/narrative-to-model/debug.js.map +1 -1
  106. package/dist/src/transformers/narrative-to-model/derive-modules.d.ts +2 -2
  107. package/dist/src/transformers/narrative-to-model/derive-modules.d.ts.map +1 -1
  108. package/dist/src/transformers/narrative-to-model/derive-modules.js +9 -9
  109. package/dist/src/transformers/narrative-to-model/derive-modules.js.map +1 -1
  110. package/dist/src/transformers/narrative-to-model/index.d.ts +2 -2
  111. package/dist/src/transformers/narrative-to-model/index.d.ts.map +1 -1
  112. package/dist/src/transformers/narrative-to-model/index.js +39 -39
  113. package/dist/src/transformers/narrative-to-model/index.js.map +1 -1
  114. package/dist/src/transformers/narrative-to-model/spec-processors.js +1 -1
  115. package/dist/src/transformers/narrative-to-model/spec-processors.js.map +1 -1
  116. package/dist/src/transformers/narrative-to-model/strings.d.ts +1 -1
  117. package/dist/src/transformers/narrative-to-model/strings.d.ts.map +1 -1
  118. package/dist/src/transformers/narrative-to-model/strings.js +6 -6
  119. package/dist/src/transformers/narrative-to-model/strings.js.map +1 -1
  120. package/dist/src/validate-slice-requests.d.ts +4 -4
  121. package/dist/src/validate-slice-requests.d.ts.map +1 -1
  122. package/dist/src/validate-slice-requests.js +34 -34
  123. package/dist/src/validate-slice-requests.js.map +1 -1
  124. package/dist/tsconfig.tsbuildinfo +1 -1
  125. package/package.json +4 -4
  126. package/scripts/convert-flow-exec.ts +2 -2
  127. package/scripts/print-schema.ts +8 -8
  128. package/src/fluent-builder.specs.ts +3 -3
  129. package/src/fluent-builder.ts +141 -141
  130. package/src/{getNarratives.cache.specs.ts → getScenes.cache.specs.ts} +45 -45
  131. package/src/{getNarratives.specs.ts → getScenes.specs.ts} +302 -300
  132. package/src/{getNarratives.ts → getScenes.ts} +20 -20
  133. package/src/id/addAutoIds.specs.ts +105 -105
  134. package/src/id/addAutoIds.ts +26 -26
  135. package/src/id/hasAllIds.specs.ts +59 -59
  136. package/src/id/hasAllIds.ts +6 -6
  137. package/src/index.ts +12 -13
  138. package/src/loader/index.ts +1 -1
  139. package/src/loader/runtime-cjs.ts +1 -1
  140. package/src/model-to-narrative.specs.ts +133 -135
  141. package/src/narrative-context.specs.ts +24 -24
  142. package/src/narrative-context.ts +61 -61
  143. package/src/narrative-registry.ts +31 -31
  144. package/src/narrative.ts +31 -33
  145. package/src/parse-graphql-request.specs.ts +5 -5
  146. package/src/parse-graphql-request.ts +3 -3
  147. package/src/samples/items.narrative.ts +2 -2
  148. package/src/samples/mixed-given-types.narrative.ts +2 -2
  149. package/src/samples/place-order.narrative.ts +2 -2
  150. package/src/samples/questionnaires.narrative.ts +2 -2
  151. package/src/samples/seasonal-assistant.schema.json +2 -2
  152. package/src/samples/test-with-ids.narrative.ts +2 -2
  153. package/src/schema.specs.ts +99 -91
  154. package/src/schema.ts +89 -89
  155. package/src/slice-builder.ts +30 -30
  156. package/src/transformers/model-to-narrative/analysis/lint-helpers.ts +1 -1
  157. package/src/transformers/model-to-narrative/cross-module-imports.specs.ts +43 -43
  158. package/src/transformers/model-to-narrative/cross-module-imports.ts +4 -4
  159. package/src/transformers/model-to-narrative/generators/compose.ts +4 -4
  160. package/src/transformers/model-to-narrative/generators/flow.ts +36 -36
  161. package/src/transformers/model-to-narrative/generators/imports.ts +1 -1
  162. package/src/transformers/model-to-narrative/generators/module-code.ts +15 -15
  163. package/src/transformers/model-to-narrative/index.ts +4 -4
  164. package/src/transformers/model-to-narrative/modules.specs.ts +58 -58
  165. package/src/transformers/model-to-narrative/spec-traversal.specs.ts +43 -43
  166. package/src/transformers/model-to-narrative/spec-traversal.ts +6 -6
  167. package/src/transformers/model-to-narrative/types.ts +1 -1
  168. package/src/transformers/model-to-narrative/utils/integration-extractor.ts +5 -5
  169. package/src/transformers/model-to-narrative/validate-modules.ts +22 -22
  170. package/src/transformers/narrative-to-model/assemble.ts +12 -4
  171. package/src/transformers/narrative-to-model/debug.ts +1 -1
  172. package/src/transformers/narrative-to-model/derive-modules.specs.ts +35 -35
  173. package/src/transformers/narrative-to-model/derive-modules.ts +11 -11
  174. package/src/transformers/narrative-to-model/index.ts +47 -47
  175. package/src/transformers/narrative-to-model/spec-processors.ts +1 -1
  176. package/src/transformers/narrative-to-model/strings.ts +6 -6
  177. package/src/transformers/narrative-to-model/type-inference.specs.ts +11 -11
  178. package/src/validate-slice-requests.specs.ts +113 -113
  179. package/src/validate-slice-requests.ts +49 -49
  180. package/dist/src/getNarratives.d.ts.map +0 -1
  181. package/dist/src/getNarratives.js.map +0 -1
@@ -1,10 +1,10 @@
1
1
  import type { IFileStore } from '@auto-engineer/file-store';
2
2
  import createDebug from 'debug';
3
3
  import { sha256 } from 'js-sha256';
4
- import type { Model, Narrative } from './index';
4
+ import type { Model, Scene } from './index';
5
5
  import { executeAST } from './loader';
6
6
  import { registry } from './narrative-registry';
7
- import { narrativesToModel } from './transformers/narrative-to-model';
7
+ import { scenesToModel } from './transformers/narrative-to-model';
8
8
 
9
9
  const dirnamePosix = (p: string) => {
10
10
  const s = p.replace(/\/+$/, '');
@@ -12,7 +12,7 @@ const dirnamePosix = (p: string) => {
12
12
  return i > 0 ? s.slice(0, i) : '/';
13
13
  };
14
14
 
15
- const debug = createDebug('auto:narrative:getNarratives');
15
+ const debug = createDebug('auto:narrative:getScenes');
16
16
 
17
17
  const toPosix = (p: string) => p.replace(/\\/g, '/');
18
18
  const DEFAULT_PATTERN = /\.(narrative|integration)\.(ts|tsx|js|jsx|mjs|cjs)$/;
@@ -51,7 +51,7 @@ async function hashFiles(vfs: IFileStore, files: string[]): Promise<string> {
51
51
  return hasher.hex();
52
52
  }
53
53
 
54
- export interface GetNarrativesOptions {
54
+ export interface GetScenesOptions {
55
55
  vfs: IFileStore;
56
56
  root: string;
57
57
  pattern?: RegExp;
@@ -61,7 +61,7 @@ export interface GetNarrativesOptions {
61
61
 
62
62
  interface CacheEntry {
63
63
  result: {
64
- narratives: Narrative[];
64
+ scenes: Scene[];
65
65
  vfsFiles: string[];
66
66
  externals: string[];
67
67
  typings: Record<string, string[]>;
@@ -119,10 +119,10 @@ async function validateCache(
119
119
  return null;
120
120
  }
121
121
 
122
- export const getNarratives = async (
123
- opts: GetNarrativesOptions,
122
+ export const getScenes = async (
123
+ opts: GetScenesOptions,
124
124
  ): Promise<{
125
- narratives: Narrative[];
125
+ scenes: Scene[];
126
126
  vfsFiles: string[];
127
127
  externals: string[];
128
128
  typings: Record<string, string[]>;
@@ -144,14 +144,14 @@ export const getNarratives = async (
144
144
  if (seedFiles.length === 0) {
145
145
  debug('no candidate files found. root=%s pattern=%s', normRoot, String(pattern));
146
146
  return {
147
- narratives: [],
147
+ scenes: [],
148
148
  vfsFiles: [],
149
149
  externals: [],
150
150
  typings: {},
151
151
  typeMap: new Map(),
152
152
  typesByFile: new Map(),
153
153
  givenTypesByFile: new Map(),
154
- toModel: () => ({ variant: 'specs' as const, narratives: [], messages: [], modules: [] }),
154
+ toModel: () => ({ variant: 'specs' as const, scenes: [], messages: [], modules: [], narratives: [] }),
155
155
  };
156
156
  }
157
157
 
@@ -168,16 +168,16 @@ export const getNarratives = async (
168
168
 
169
169
  const exec = await executeAST(seedFiles, vfs, importMap, projectRoot);
170
170
 
171
- const narratives: Narrative[] = registry.getAllNarratives();
171
+ const scenes: Scene[] = registry.getAllScenes();
172
172
  const result = {
173
- narratives,
174
- vfsFiles: exec.vfsFiles, // absolute posix paths of all VFS modules in the graph
175
- externals: exec.externals, // external specifiers used
176
- typings: exec.typings, // { pkgName: [abs d.ts paths] }
177
- typeMap: exec.typeMap, // mapping from TypeScript type names to string literals
178
- typesByFile: exec.typesByFile, // mapping from file path to type definitions in that file
179
- givenTypesByFile: exec.givenTypesByFile, // mapping from file path to given type info
180
- toModel: (): Model => narrativesToModel(narratives, exec.typesByFile),
173
+ scenes,
174
+ vfsFiles: exec.vfsFiles,
175
+ externals: exec.externals,
176
+ typings: exec.typings,
177
+ typeMap: exec.typeMap,
178
+ typesByFile: exec.typesByFile,
179
+ givenTypesByFile: exec.givenTypesByFile,
180
+ toModel: (): Model => scenesToModel(scenes, exec.typesByFile),
181
181
  };
182
182
 
183
183
  const contentHash = await hashFiles(vfs, exec.vfsFiles);
@@ -188,7 +188,7 @@ export const getNarratives = async (
188
188
  return result;
189
189
  };
190
190
 
191
- export const clearGetNarrativesCache = (): void => {
191
+ export const clearGetScenesCache = (): void => {
192
192
  compilationCache.clear();
193
193
  debug('cleared compilation cache');
194
194
  };
@@ -5,13 +5,13 @@ import { addAutoIds } from './';
5
5
  describe('addAutoIds', () => {
6
6
  const flows: Model = {
7
7
  variant: 'specs',
8
- narratives: [
8
+ scenes: [
9
9
  {
10
10
  name: 'Test Flow',
11
- slices: [
11
+ moments: [
12
12
  {
13
13
  type: 'command',
14
- name: 'Test Command Slice',
14
+ name: 'Test Command Moment',
15
15
  client: { specs: [] },
16
16
  server: {
17
17
  description: 'Test server',
@@ -36,7 +36,7 @@ describe('addAutoIds', () => {
36
36
  },
37
37
  {
38
38
  type: 'query',
39
- name: 'Test Query Slice',
39
+ name: 'Test Query Moment',
40
40
  id: 'EXISTING-SLICE-001',
41
41
  client: { specs: [] },
42
42
  server: {
@@ -55,10 +55,10 @@ describe('addAutoIds', () => {
55
55
  {
56
56
  name: 'Flow with ID',
57
57
  id: 'EXISTING-FLOW-001',
58
- slices: [
58
+ moments: [
59
59
  {
60
60
  type: 'react',
61
- name: 'React Slice',
61
+ name: 'React Moment',
62
62
  server: {
63
63
  specs: [
64
64
  {
@@ -87,13 +87,13 @@ describe('addAutoIds', () => {
87
87
  it('should assign IDs to entities that do not have them', () => {
88
88
  const result = addAutoIds(flows);
89
89
 
90
- expect(result.narratives[0].id).toMatch(AUTO_ID_REGEX);
91
- expect(result.narratives[1].id).toBe('EXISTING-FLOW-001');
92
- expect(result.narratives[0].slices[0].id).toMatch(AUTO_ID_REGEX);
93
- expect(result.narratives[0].slices[1].id).toBe('EXISTING-SLICE-001');
94
- expect(result.narratives[1].slices[0].id).toMatch(AUTO_ID_REGEX);
95
- const slice0 = result.narratives[0].slices[0];
96
- const slice1 = result.narratives[1].slices[0];
90
+ expect(result.scenes[0].id).toMatch(AUTO_ID_REGEX);
91
+ expect(result.scenes[1].id).toBe('EXISTING-FLOW-001');
92
+ expect(result.scenes[0].moments[0].id).toMatch(AUTO_ID_REGEX);
93
+ expect(result.scenes[0].moments[1].id).toBe('EXISTING-SLICE-001');
94
+ expect(result.scenes[1].moments[0].id).toMatch(AUTO_ID_REGEX);
95
+ const slice0 = result.scenes[0].moments[0];
96
+ const slice1 = result.scenes[1].moments[0];
97
97
 
98
98
  if ('server' in slice0 && slice0.server?.specs != null && Array.isArray(slice0.server.specs)) {
99
99
  expect(slice0.server.specs[0].rules[0].id).toMatch(AUTO_ID_REGEX);
@@ -106,42 +106,42 @@ describe('addAutoIds', () => {
106
106
  });
107
107
 
108
108
  it('should not mutate the original flows', () => {
109
- const originalFlow = flows.narratives[0];
110
- const originalSlice = originalFlow.slices[0];
109
+ const originalScene = flows.scenes[0];
110
+ const originalMoment = originalScene.moments[0];
111
111
 
112
112
  addAutoIds(flows);
113
113
 
114
- expect(originalFlow.id).toBeUndefined();
115
- expect(originalSlice.id).toBeUndefined();
114
+ expect(originalScene.id).toBeUndefined();
115
+ expect(originalMoment.id).toBeUndefined();
116
116
  if (
117
- 'server' in originalSlice &&
118
- originalSlice.server?.specs !== undefined &&
119
- Array.isArray(originalSlice.server.specs) &&
120
- originalSlice.server.specs.length > 0
117
+ 'server' in originalMoment &&
118
+ originalMoment.server?.specs !== undefined &&
119
+ Array.isArray(originalMoment.server.specs) &&
120
+ originalMoment.server.specs.length > 0
121
121
  ) {
122
- expect(originalSlice.server.specs[0].rules[0].id).toBeUndefined();
122
+ expect(originalMoment.server.specs[0].rules[0].id).toBeUndefined();
123
123
  }
124
124
  });
125
125
 
126
126
  it('should preserve existing IDs and not overwrite them', () => {
127
127
  const result = addAutoIds(flows);
128
128
 
129
- expect(result.narratives[1].id).toBe('EXISTING-FLOW-001');
130
- expect(result.narratives[0].slices[1].id).toBe('EXISTING-SLICE-001');
129
+ expect(result.scenes[1].id).toBe('EXISTING-FLOW-001');
130
+ expect(result.scenes[0].moments[1].id).toBe('EXISTING-SLICE-001');
131
131
 
132
- const testSlice = result.narratives[0].slices[0];
133
- if ('server' in testSlice && testSlice.server?.specs != null && Array.isArray(testSlice.server.specs)) {
134
- expect(testSlice.server.specs[0].rules[1].id).toBe('EXISTING-RULE-001');
132
+ const testMoment = result.scenes[0].moments[0];
133
+ if ('server' in testMoment && testMoment.server?.specs != null && Array.isArray(testMoment.server.specs)) {
134
+ expect(testMoment.server.specs[0].rules[1].id).toBe('EXISTING-RULE-001');
135
135
  }
136
136
  });
137
137
 
138
138
  it('should handle flows without server blocks', () => {
139
139
  const modelWithoutServer: Model = {
140
140
  variant: 'specs',
141
- narratives: [
141
+ scenes: [
142
142
  {
143
143
  name: 'Simple Flow',
144
- slices: [
144
+ moments: [
145
145
  {
146
146
  type: 'command',
147
147
  name: 'Simple Command',
@@ -167,25 +167,25 @@ describe('addAutoIds', () => {
167
167
 
168
168
  const result = addAutoIds(modelWithoutServer);
169
169
 
170
- expect(result.narratives[0].id).toMatch(AUTO_ID_REGEX);
171
- expect(result.narratives[0].slices[0].id).toMatch(AUTO_ID_REGEX);
170
+ expect(result.scenes[0].id).toMatch(AUTO_ID_REGEX);
171
+ expect(result.scenes[0].moments[0].id).toMatch(AUTO_ID_REGEX);
172
172
  });
173
173
 
174
174
  it('should generate unique IDs for multiple calls', () => {
175
175
  const result1 = addAutoIds(flows);
176
176
  const result2 = addAutoIds(flows);
177
177
 
178
- expect(result1.narratives[0].id).not.toBe(result2.narratives[0].id);
179
- expect(result1.narratives[0].slices[0].id).not.toBe(result2.narratives[0].slices[0].id);
178
+ expect(result1.scenes[0].id).not.toBe(result2.scenes[0].id);
179
+ expect(result1.scenes[0].moments[0].id).not.toBe(result2.scenes[0].moments[0].id);
180
180
  });
181
181
 
182
- it('should assign IDs to experience slices', () => {
183
- const modelWithExperienceSlice: Model = {
182
+ it('should assign IDs to experience moments', () => {
183
+ const modelWithExperienceMoment: Model = {
184
184
  variant: 'specs',
185
- narratives: [
185
+ scenes: [
186
186
  {
187
187
  name: 'Experience Flow',
188
- slices: [
188
+ moments: [
189
189
  {
190
190
  type: 'experience',
191
191
  name: 'User Onboarding Experience',
@@ -212,21 +212,21 @@ describe('addAutoIds', () => {
212
212
  modules: [],
213
213
  };
214
214
 
215
- const result = addAutoIds(modelWithExperienceSlice);
215
+ const result = addAutoIds(modelWithExperienceMoment);
216
216
 
217
- expect(result.narratives[0].id).toMatch(AUTO_ID_REGEX);
218
- expect(result.narratives[0].slices[0].id).toMatch(AUTO_ID_REGEX);
219
- expect(result.narratives[0].slices[1].id).toBe('EXISTING-EXPERIENCE-SLICE-001');
217
+ expect(result.scenes[0].id).toMatch(AUTO_ID_REGEX);
218
+ expect(result.scenes[0].moments[0].id).toMatch(AUTO_ID_REGEX);
219
+ expect(result.scenes[0].moments[1].id).toBe('EXISTING-EXPERIENCE-SLICE-001');
220
220
  });
221
221
 
222
222
  it('should assign unique IDs to multiple flows with same sourceFile', () => {
223
223
  const modelWithMultipleFlowsSameSource: Model = {
224
224
  variant: 'specs',
225
- narratives: [
225
+ scenes: [
226
226
  {
227
227
  name: 'Home Screen',
228
228
  sourceFile: '/path/to/homepage.narrative.ts',
229
- slices: [
229
+ moments: [
230
230
  {
231
231
  name: 'Active Surveys Summary',
232
232
  type: 'experience',
@@ -239,7 +239,7 @@ describe('addAutoIds', () => {
239
239
  {
240
240
  name: 'Create Survey',
241
241
  sourceFile: '/path/to/homepage.narrative.ts',
242
- slices: [
242
+ moments: [
243
243
  {
244
244
  name: 'Create Survey Form',
245
245
  type: 'experience',
@@ -252,7 +252,7 @@ describe('addAutoIds', () => {
252
252
  {
253
253
  name: 'Response Analytics',
254
254
  sourceFile: '/path/to/homepage.narrative.ts',
255
- slices: [
255
+ moments: [
256
256
  {
257
257
  name: 'Response Rate Charts',
258
258
  type: 'experience',
@@ -270,34 +270,34 @@ describe('addAutoIds', () => {
270
270
 
271
271
  const result = addAutoIds(modelWithMultipleFlowsSameSource);
272
272
 
273
- expect(result.narratives[0].id).toMatch(AUTO_ID_REGEX);
274
- expect(result.narratives[1].id).toMatch(AUTO_ID_REGEX);
275
- expect(result.narratives[2].id).toMatch(AUTO_ID_REGEX);
273
+ expect(result.scenes[0].id).toMatch(AUTO_ID_REGEX);
274
+ expect(result.scenes[1].id).toMatch(AUTO_ID_REGEX);
275
+ expect(result.scenes[2].id).toMatch(AUTO_ID_REGEX);
276
276
 
277
- expect(result.narratives[0].id).not.toBe(result.narratives[1].id);
278
- expect(result.narratives[0].id).not.toBe(result.narratives[2].id);
279
- expect(result.narratives[1].id).not.toBe(result.narratives[2].id);
277
+ expect(result.scenes[0].id).not.toBe(result.scenes[1].id);
278
+ expect(result.scenes[0].id).not.toBe(result.scenes[2].id);
279
+ expect(result.scenes[1].id).not.toBe(result.scenes[2].id);
280
280
 
281
- expect(result.narratives[0].slices[0].id).toMatch(AUTO_ID_REGEX);
282
- expect(result.narratives[1].slices[0].id).toMatch(AUTO_ID_REGEX);
283
- expect(result.narratives[2].slices[0].id).toMatch(AUTO_ID_REGEX);
281
+ expect(result.scenes[0].moments[0].id).toMatch(AUTO_ID_REGEX);
282
+ expect(result.scenes[1].moments[0].id).toMatch(AUTO_ID_REGEX);
283
+ expect(result.scenes[2].moments[0].id).toMatch(AUTO_ID_REGEX);
284
284
 
285
- expect(result.narratives[0].slices[0].id).not.toBe(result.narratives[1].slices[0].id);
286
- expect(result.narratives[0].slices[0].id).not.toBe(result.narratives[2].slices[0].id);
287
- expect(result.narratives[1].slices[0].id).not.toBe(result.narratives[2].slices[0].id);
285
+ expect(result.scenes[0].moments[0].id).not.toBe(result.scenes[1].moments[0].id);
286
+ expect(result.scenes[0].moments[0].id).not.toBe(result.scenes[2].moments[0].id);
287
+ expect(result.scenes[1].moments[0].id).not.toBe(result.scenes[2].moments[0].id);
288
288
 
289
- expect(result.narratives[0].sourceFile).toBe('/path/to/homepage.narrative.ts');
290
- expect(result.narratives[1].sourceFile).toBe('/path/to/homepage.narrative.ts');
291
- expect(result.narratives[2].sourceFile).toBe('/path/to/homepage.narrative.ts');
289
+ expect(result.scenes[0].sourceFile).toBe('/path/to/homepage.narrative.ts');
290
+ expect(result.scenes[1].sourceFile).toBe('/path/to/homepage.narrative.ts');
291
+ expect(result.scenes[2].sourceFile).toBe('/path/to/homepage.narrative.ts');
292
292
  });
293
293
 
294
294
  it('should assign IDs to specs', () => {
295
295
  const modelWithSpecs: Model = {
296
296
  variant: 'specs',
297
- narratives: [
297
+ scenes: [
298
298
  {
299
299
  name: 'Test Flow',
300
- slices: [
300
+ moments: [
301
301
  {
302
302
  type: 'command',
303
303
  name: 'Test Command',
@@ -328,7 +328,7 @@ describe('addAutoIds', () => {
328
328
  };
329
329
 
330
330
  const result = addAutoIds(modelWithSpecs);
331
- const slice = result.narratives[0].slices[0];
331
+ const slice = result.scenes[0].moments[0];
332
332
 
333
333
  if ('server' in slice && slice.server?.specs != null && Array.isArray(slice.server.specs)) {
334
334
  expect(slice.server.specs[0].id).toMatch(AUTO_ID_REGEX);
@@ -339,10 +339,10 @@ describe('addAutoIds', () => {
339
339
  it('should assign IDs to steps', () => {
340
340
  const modelWithSteps: Model = {
341
341
  variant: 'specs',
342
- narratives: [
342
+ scenes: [
343
343
  {
344
344
  name: 'Test Flow',
345
- slices: [
345
+ moments: [
346
346
  {
347
347
  type: 'command',
348
348
  name: 'Test Command',
@@ -381,7 +381,7 @@ describe('addAutoIds', () => {
381
381
  };
382
382
 
383
383
  const result = addAutoIds(modelWithSteps);
384
- const slice = result.narratives[0].slices[0];
384
+ const slice = result.scenes[0].moments[0];
385
385
 
386
386
  if ('server' in slice && slice.server?.specs != null && Array.isArray(slice.server.specs)) {
387
387
  const steps = slice.server.specs[0].rules[0].examples[0].steps;
@@ -394,10 +394,10 @@ describe('addAutoIds', () => {
394
394
  it('should preserve existing example IDs', () => {
395
395
  const modelWithExistingExampleId: Model = {
396
396
  variant: 'specs',
397
- narratives: [
397
+ scenes: [
398
398
  {
399
399
  name: 'Test Flow',
400
- slices: [
400
+ moments: [
401
401
  {
402
402
  type: 'command',
403
403
  name: 'Test Command',
@@ -437,7 +437,7 @@ describe('addAutoIds', () => {
437
437
  };
438
438
 
439
439
  const result = addAutoIds(modelWithExistingExampleId);
440
- const slice = result.narratives[0].slices[0];
440
+ const slice = result.scenes[0].moments[0];
441
441
 
442
442
  if ('server' in slice && slice.server?.specs != null && Array.isArray(slice.server.specs)) {
443
443
  const examples = slice.server.specs[0].rules[0].examples;
@@ -449,10 +449,10 @@ describe('addAutoIds', () => {
449
449
  it('should assign IDs to steps with errors', () => {
450
450
  const modelWithErrorSteps: Model = {
451
451
  variant: 'specs',
452
- narratives: [
452
+ scenes: [
453
453
  {
454
454
  name: 'Test Flow',
455
- slices: [
455
+ moments: [
456
456
  {
457
457
  type: 'command',
458
458
  name: 'Test Command',
@@ -491,7 +491,7 @@ describe('addAutoIds', () => {
491
491
  };
492
492
 
493
493
  const result = addAutoIds(modelWithErrorSteps);
494
- const slice = result.narratives[0].slices[0];
494
+ const slice = result.scenes[0].moments[0];
495
495
 
496
496
  if ('server' in slice && slice.server?.specs != null && Array.isArray(slice.server.specs)) {
497
497
  const steps = slice.server.specs[0].rules[0].examples[0].steps;
@@ -504,10 +504,10 @@ describe('addAutoIds', () => {
504
504
  it('should assign IDs to client it specs', () => {
505
505
  const modelWithClientSpecs: Model = {
506
506
  variant: 'specs',
507
- narratives: [
507
+ scenes: [
508
508
  {
509
509
  name: 'Test Flow',
510
- slices: [
510
+ moments: [
511
511
  {
512
512
  type: 'experience',
513
513
  name: 'Test Experience',
@@ -527,7 +527,7 @@ describe('addAutoIds', () => {
527
527
  };
528
528
 
529
529
  const result = addAutoIds(modelWithClientSpecs);
530
- const slice = result.narratives[0].slices[0];
530
+ const slice = result.scenes[0].moments[0];
531
531
 
532
532
  if ('client' in slice && slice.client?.specs != null) {
533
533
  expect(slice.client.specs[0].id).toMatch(AUTO_ID_REGEX);
@@ -538,10 +538,10 @@ describe('addAutoIds', () => {
538
538
  it('should assign IDs to client describe specs', () => {
539
539
  const modelWithDescribe: Model = {
540
540
  variant: 'specs',
541
- narratives: [
541
+ scenes: [
542
542
  {
543
543
  name: 'Test Flow',
544
- slices: [
544
+ moments: [
545
545
  {
546
546
  type: 'experience',
547
547
  name: 'Test Experience',
@@ -570,7 +570,7 @@ describe('addAutoIds', () => {
570
570
  };
571
571
 
572
572
  const result = addAutoIds(modelWithDescribe);
573
- const slice = result.narratives[0].slices[0];
573
+ const slice = result.scenes[0].moments[0];
574
574
 
575
575
  if ('client' in slice && slice.client?.specs != null) {
576
576
  expect(slice.client.specs[0].id).toMatch(AUTO_ID_REGEX);
@@ -581,10 +581,10 @@ describe('addAutoIds', () => {
581
581
  it('should assign IDs to nested client specs', () => {
582
582
  const modelWithNestedSpecs: Model = {
583
583
  variant: 'specs',
584
- narratives: [
584
+ scenes: [
585
585
  {
586
586
  name: 'Test Flow',
587
- slices: [
587
+ moments: [
588
588
  {
589
589
  type: 'experience',
590
590
  name: 'Test Experience',
@@ -617,7 +617,7 @@ describe('addAutoIds', () => {
617
617
  };
618
618
 
619
619
  const result = addAutoIds(modelWithNestedSpecs);
620
- const slice = result.narratives[0].slices[0];
620
+ const slice = result.scenes[0].moments[0];
621
621
 
622
622
  if ('client' in slice && slice.client?.specs != null) {
623
623
  const outerDescribe = slice.client.specs[0];
@@ -642,10 +642,10 @@ describe('addAutoIds', () => {
642
642
  it('should not mutate original client specs', () => {
643
643
  const modelWithClientSpecs: Model = {
644
644
  variant: 'specs',
645
- narratives: [
645
+ scenes: [
646
646
  {
647
647
  name: 'Test Flow',
648
- slices: [
648
+ moments: [
649
649
  {
650
650
  type: 'experience',
651
651
  name: 'Test Experience',
@@ -661,7 +661,7 @@ describe('addAutoIds', () => {
661
661
  modules: [],
662
662
  };
663
663
 
664
- const originalSpec = modelWithClientSpecs.narratives[0].slices[0];
664
+ const originalSpec = modelWithClientSpecs.scenes[0].moments[0];
665
665
  addAutoIds(modelWithClientSpecs);
666
666
 
667
667
  if ('client' in originalSpec && originalSpec.client?.specs != null) {
@@ -675,11 +675,11 @@ describe('addAutoIds', () => {
675
675
  it('should assign ID to data sink without ID', () => {
676
676
  const model: Model = {
677
677
  variant: 'specs',
678
- narratives: [
678
+ scenes: [
679
679
  {
680
680
  name: 'Test Flow',
681
681
  id: 'FLOW-001',
682
- slices: [
682
+ moments: [
683
683
  {
684
684
  type: 'command',
685
685
  name: 'Test Command',
@@ -707,7 +707,7 @@ describe('addAutoIds', () => {
707
707
  };
708
708
 
709
709
  const result = addAutoIds(model);
710
- const slice = result.narratives[0].slices[0];
710
+ const slice = result.scenes[0].moments[0];
711
711
 
712
712
  if ('server' in slice && slice.server?.data) {
713
713
  expect(slice.server.data.id).toMatch(AUTO_ID_REGEX);
@@ -718,11 +718,11 @@ describe('addAutoIds', () => {
718
718
  it('should assign ID to data source without ID', () => {
719
719
  const model: Model = {
720
720
  variant: 'specs',
721
- narratives: [
721
+ scenes: [
722
722
  {
723
723
  name: 'Test Flow',
724
724
  id: 'FLOW-001',
725
- slices: [
725
+ moments: [
726
726
  {
727
727
  type: 'query',
728
728
  name: 'Test Query',
@@ -750,7 +750,7 @@ describe('addAutoIds', () => {
750
750
  };
751
751
 
752
752
  const result = addAutoIds(model);
753
- const slice = result.narratives[0].slices[0];
753
+ const slice = result.scenes[0].moments[0];
754
754
 
755
755
  if ('server' in slice && slice.server?.data) {
756
756
  expect(slice.server.data.id).toMatch(AUTO_ID_REGEX);
@@ -761,11 +761,11 @@ describe('addAutoIds', () => {
761
761
  it('should assign ID to nested _withState source without ID', () => {
762
762
  const model: Model = {
763
763
  variant: 'specs',
764
- narratives: [
764
+ scenes: [
765
765
  {
766
766
  name: 'Test Flow',
767
767
  id: 'FLOW-001',
768
- slices: [
768
+ moments: [
769
769
  {
770
770
  type: 'command',
771
771
  name: 'Test Command',
@@ -798,7 +798,7 @@ describe('addAutoIds', () => {
798
798
  };
799
799
 
800
800
  const result = addAutoIds(model);
801
- const slice = result.narratives[0].slices[0];
801
+ const slice = result.scenes[0].moments[0];
802
802
 
803
803
  if ('server' in slice && slice.server?.data) {
804
804
  const sink = slice.server.data.items[0];
@@ -812,11 +812,11 @@ describe('addAutoIds', () => {
812
812
  it('should preserve existing data item IDs', () => {
813
813
  const model: Model = {
814
814
  variant: 'specs',
815
- narratives: [
815
+ scenes: [
816
816
  {
817
817
  name: 'Test Flow',
818
818
  id: 'FLOW-001',
819
- slices: [
819
+ moments: [
820
820
  {
821
821
  type: 'react',
822
822
  name: 'Test React',
@@ -849,7 +849,7 @@ describe('addAutoIds', () => {
849
849
  };
850
850
 
851
851
  const result = addAutoIds(model);
852
- const slice = result.narratives[0].slices[0];
852
+ const slice = result.scenes[0].moments[0];
853
853
 
854
854
  if ('server' in slice && slice.server?.data) {
855
855
  expect(slice.server.data.id).toBe('EXISTING-DATA-001');
@@ -861,11 +861,11 @@ describe('addAutoIds', () => {
861
861
  it('should not mutate original data items', () => {
862
862
  const model: Model = {
863
863
  variant: 'specs',
864
- narratives: [
864
+ scenes: [
865
865
  {
866
866
  name: 'Test Flow',
867
867
  id: 'FLOW-001',
868
- slices: [
868
+ moments: [
869
869
  {
870
870
  type: 'command',
871
871
  name: 'Test Command',
@@ -892,23 +892,23 @@ describe('addAutoIds', () => {
892
892
  modules: [],
893
893
  };
894
894
 
895
- const originalSlice = model.narratives[0].slices[0];
895
+ const originalMoment = model.scenes[0].moments[0];
896
896
  addAutoIds(model);
897
897
 
898
- if ('server' in originalSlice && originalSlice.server?.data) {
899
- expect(originalSlice.server.data.id).toBeUndefined();
900
- expect(originalSlice.server.data.items[0].id).toBeUndefined();
898
+ if ('server' in originalMoment && originalMoment.server?.data) {
899
+ expect(originalMoment.server.data.id).toBeUndefined();
900
+ expect(originalMoment.server.data.items[0].id).toBeUndefined();
901
901
  }
902
902
  });
903
903
 
904
904
  it('should generate unique IDs for multiple data items', () => {
905
905
  const model: Model = {
906
906
  variant: 'specs',
907
- narratives: [
907
+ scenes: [
908
908
  {
909
909
  name: 'Test Flow',
910
910
  id: 'FLOW-001',
911
- slices: [
911
+ moments: [
912
912
  {
913
913
  type: 'react',
914
914
  name: 'Test React',
@@ -942,7 +942,7 @@ describe('addAutoIds', () => {
942
942
  };
943
943
 
944
944
  const result = addAutoIds(model);
945
- const slice = result.narratives[0].slices[0];
945
+ const slice = result.scenes[0].moments[0];
946
946
 
947
947
  if ('server' in slice && slice.server?.data) {
948
948
  expect(slice.server.data.id).toMatch(AUTO_ID_REGEX);