@auto-engineer/narrative 1.139.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 +18 -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
|
@@ -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,
|
|
4
|
+
import type { Model, Scene } from './index';
|
|
5
5
|
import { executeAST } from './loader';
|
|
6
6
|
import { registry } from './narrative-registry';
|
|
7
|
-
import {
|
|
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:
|
|
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
|
|
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
|
-
|
|
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
|
|
123
|
-
opts:
|
|
122
|
+
export const getScenes = async (
|
|
123
|
+
opts: GetScenesOptions,
|
|
124
124
|
): Promise<{
|
|
125
|
-
|
|
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
|
-
|
|
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,
|
|
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
|
|
171
|
+
const scenes: Scene[] = registry.getAllScenes();
|
|
172
172
|
const result = {
|
|
173
|
-
|
|
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 =>
|
|
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
|
|
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
|
-
|
|
8
|
+
scenes: [
|
|
9
9
|
{
|
|
10
10
|
name: 'Test Flow',
|
|
11
|
-
|
|
11
|
+
moments: [
|
|
12
12
|
{
|
|
13
13
|
type: 'command',
|
|
14
|
-
name: 'Test Command
|
|
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
|
|
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
|
-
|
|
58
|
+
moments: [
|
|
59
59
|
{
|
|
60
60
|
type: 'react',
|
|
61
|
-
name: 'React
|
|
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.
|
|
91
|
-
expect(result.
|
|
92
|
-
expect(result.
|
|
93
|
-
expect(result.
|
|
94
|
-
expect(result.
|
|
95
|
-
const slice0 = result.
|
|
96
|
-
const slice1 = result.
|
|
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
|
|
110
|
-
const
|
|
109
|
+
const originalScene = flows.scenes[0];
|
|
110
|
+
const originalMoment = originalScene.moments[0];
|
|
111
111
|
|
|
112
112
|
addAutoIds(flows);
|
|
113
113
|
|
|
114
|
-
expect(
|
|
115
|
-
expect(
|
|
114
|
+
expect(originalScene.id).toBeUndefined();
|
|
115
|
+
expect(originalMoment.id).toBeUndefined();
|
|
116
116
|
if (
|
|
117
|
-
'server' in
|
|
118
|
-
|
|
119
|
-
Array.isArray(
|
|
120
|
-
|
|
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(
|
|
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.
|
|
130
|
-
expect(result.
|
|
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
|
|
133
|
-
if ('server' in
|
|
134
|
-
expect(
|
|
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
|
-
|
|
141
|
+
scenes: [
|
|
142
142
|
{
|
|
143
143
|
name: 'Simple Flow',
|
|
144
|
-
|
|
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.
|
|
171
|
-
expect(result.
|
|
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.
|
|
179
|
-
expect(result1.
|
|
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
|
|
183
|
-
const
|
|
182
|
+
it('should assign IDs to experience moments', () => {
|
|
183
|
+
const modelWithExperienceMoment: Model = {
|
|
184
184
|
variant: 'specs',
|
|
185
|
-
|
|
185
|
+
scenes: [
|
|
186
186
|
{
|
|
187
187
|
name: 'Experience Flow',
|
|
188
|
-
|
|
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(
|
|
215
|
+
const result = addAutoIds(modelWithExperienceMoment);
|
|
216
216
|
|
|
217
|
-
expect(result.
|
|
218
|
-
expect(result.
|
|
219
|
-
expect(result.
|
|
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
|
-
|
|
225
|
+
scenes: [
|
|
226
226
|
{
|
|
227
227
|
name: 'Home Screen',
|
|
228
228
|
sourceFile: '/path/to/homepage.narrative.ts',
|
|
229
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
274
|
-
expect(result.
|
|
275
|
-
expect(result.
|
|
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.
|
|
278
|
-
expect(result.
|
|
279
|
-
expect(result.
|
|
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.
|
|
282
|
-
expect(result.
|
|
283
|
-
expect(result.
|
|
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.
|
|
286
|
-
expect(result.
|
|
287
|
-
expect(result.
|
|
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.
|
|
290
|
-
expect(result.
|
|
291
|
-
expect(result.
|
|
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
|
-
|
|
297
|
+
scenes: [
|
|
298
298
|
{
|
|
299
299
|
name: 'Test Flow',
|
|
300
|
-
|
|
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.
|
|
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
|
-
|
|
342
|
+
scenes: [
|
|
343
343
|
{
|
|
344
344
|
name: 'Test Flow',
|
|
345
|
-
|
|
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.
|
|
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
|
-
|
|
397
|
+
scenes: [
|
|
398
398
|
{
|
|
399
399
|
name: 'Test Flow',
|
|
400
|
-
|
|
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.
|
|
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
|
-
|
|
452
|
+
scenes: [
|
|
453
453
|
{
|
|
454
454
|
name: 'Test Flow',
|
|
455
|
-
|
|
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.
|
|
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
|
-
|
|
507
|
+
scenes: [
|
|
508
508
|
{
|
|
509
509
|
name: 'Test Flow',
|
|
510
|
-
|
|
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.
|
|
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
|
-
|
|
541
|
+
scenes: [
|
|
542
542
|
{
|
|
543
543
|
name: 'Test Flow',
|
|
544
|
-
|
|
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.
|
|
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
|
-
|
|
584
|
+
scenes: [
|
|
585
585
|
{
|
|
586
586
|
name: 'Test Flow',
|
|
587
|
-
|
|
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.
|
|
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
|
-
|
|
645
|
+
scenes: [
|
|
646
646
|
{
|
|
647
647
|
name: 'Test Flow',
|
|
648
|
-
|
|
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.
|
|
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
|
-
|
|
678
|
+
scenes: [
|
|
679
679
|
{
|
|
680
680
|
name: 'Test Flow',
|
|
681
681
|
id: 'FLOW-001',
|
|
682
|
-
|
|
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.
|
|
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
|
-
|
|
721
|
+
scenes: [
|
|
722
722
|
{
|
|
723
723
|
name: 'Test Flow',
|
|
724
724
|
id: 'FLOW-001',
|
|
725
|
-
|
|
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.
|
|
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
|
-
|
|
764
|
+
scenes: [
|
|
765
765
|
{
|
|
766
766
|
name: 'Test Flow',
|
|
767
767
|
id: 'FLOW-001',
|
|
768
|
-
|
|
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.
|
|
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
|
-
|
|
815
|
+
scenes: [
|
|
816
816
|
{
|
|
817
817
|
name: 'Test Flow',
|
|
818
818
|
id: 'FLOW-001',
|
|
819
|
-
|
|
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.
|
|
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
|
-
|
|
864
|
+
scenes: [
|
|
865
865
|
{
|
|
866
866
|
name: 'Test Flow',
|
|
867
867
|
id: 'FLOW-001',
|
|
868
|
-
|
|
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
|
|
895
|
+
const originalMoment = model.scenes[0].moments[0];
|
|
896
896
|
addAutoIds(model);
|
|
897
897
|
|
|
898
|
-
if ('server' in
|
|
899
|
-
expect(
|
|
900
|
-
expect(
|
|
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
|
-
|
|
907
|
+
scenes: [
|
|
908
908
|
{
|
|
909
909
|
name: 'Test Flow',
|
|
910
910
|
id: 'FLOW-001',
|
|
911
|
-
|
|
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.
|
|
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);
|