@auto-engineer/narrative 1.138.0 → 1.140.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +1 -1
- package/.turbo/turbo-test.log +5 -5
- package/.turbo/turbo-type-check.log +1 -1
- package/CHANGELOG.md +41 -0
- package/dist/scripts/convert-flow-exec.js +2 -2
- package/dist/scripts/convert-flow-exec.js.map +1 -1
- package/dist/scripts/print-schema.js +5 -5
- package/dist/scripts/print-schema.js.map +1 -1
- package/dist/src/fluent-builder.d.ts +29 -29
- package/dist/src/fluent-builder.d.ts.map +1 -1
- package/dist/src/fluent-builder.js +81 -81
- package/dist/src/fluent-builder.js.map +1 -1
- package/dist/src/{getNarratives.d.ts → getScenes.d.ts} +6 -6
- package/dist/src/getScenes.d.ts.map +1 -0
- package/dist/src/{getNarratives.js → getScenes.js} +16 -16
- package/dist/src/getScenes.js.map +1 -0
- package/dist/src/id/addAutoIds.d.ts.map +1 -1
- package/dist/src/id/addAutoIds.js +22 -22
- package/dist/src/id/addAutoIds.js.map +1 -1
- package/dist/src/id/hasAllIds.d.ts.map +1 -1
- package/dist/src/id/hasAllIds.js +2 -2
- package/dist/src/id/hasAllIds.js.map +1 -1
- package/dist/src/index.d.ts +8 -8
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +4 -4
- package/dist/src/index.js.map +1 -1
- package/dist/src/loader/index.js +1 -1
- package/dist/src/loader/index.js.map +1 -1
- package/dist/src/loader/runtime-cjs.js +1 -1
- package/dist/src/loader/runtime-cjs.js.map +1 -1
- package/dist/src/narrative-context.d.ts +9 -9
- package/dist/src/narrative-context.d.ts.map +1 -1
- package/dist/src/narrative-context.js +47 -47
- package/dist/src/narrative-context.js.map +1 -1
- package/dist/src/narrative-registry.d.ts +6 -6
- package/dist/src/narrative-registry.d.ts.map +1 -1
- package/dist/src/narrative-registry.js +26 -26
- package/dist/src/narrative-registry.js.map +1 -1
- package/dist/src/narrative.d.ts +5 -5
- package/dist/src/narrative.d.ts.map +1 -1
- package/dist/src/narrative.js +26 -27
- package/dist/src/narrative.js.map +1 -1
- package/dist/src/parse-graphql-request.d.ts +1 -1
- package/dist/src/parse-graphql-request.d.ts.map +1 -1
- package/dist/src/parse-graphql-request.js +3 -3
- package/dist/src/parse-graphql-request.js.map +1 -1
- package/dist/src/samples/items.narrative.js +2 -2
- package/dist/src/samples/items.narrative.js.map +1 -1
- package/dist/src/samples/mixed-given-types.narrative.js +2 -2
- package/dist/src/samples/mixed-given-types.narrative.js.map +1 -1
- package/dist/src/samples/place-order.narrative.js +2 -2
- package/dist/src/samples/place-order.narrative.js.map +1 -1
- package/dist/src/samples/questionnaires.narrative.js +2 -2
- package/dist/src/samples/questionnaires.narrative.js.map +1 -1
- package/dist/src/samples/seasonal-assistant.schema.json +2 -2
- package/dist/src/samples/test-with-ids.narrative.js +2 -2
- package/dist/src/samples/test-with-ids.narrative.js.map +1 -1
- package/dist/src/schema.d.ts +136 -136
- package/dist/src/schema.d.ts.map +1 -1
- package/dist/src/schema.js +76 -76
- package/dist/src/schema.js.map +1 -1
- package/dist/src/slice-builder.d.ts +6 -6
- package/dist/src/slice-builder.d.ts.map +1 -1
- package/dist/src/slice-builder.js +21 -21
- package/dist/src/slice-builder.js.map +1 -1
- package/dist/src/transformers/model-to-narrative/analysis/lint-helpers.js +1 -1
- package/dist/src/transformers/model-to-narrative/analysis/lint-helpers.js.map +1 -1
- package/dist/src/transformers/model-to-narrative/cross-module-imports.js +4 -4
- package/dist/src/transformers/model-to-narrative/cross-module-imports.js.map +1 -1
- package/dist/src/transformers/model-to-narrative/generators/compose.js +3 -3
- package/dist/src/transformers/model-to-narrative/generators/compose.js.map +1 -1
- package/dist/src/transformers/model-to-narrative/generators/flow.d.ts +2 -2
- package/dist/src/transformers/model-to-narrative/generators/flow.d.ts.map +1 -1
- package/dist/src/transformers/model-to-narrative/generators/flow.js +20 -20
- package/dist/src/transformers/model-to-narrative/generators/flow.js.map +1 -1
- package/dist/src/transformers/model-to-narrative/generators/imports.d.ts +1 -1
- package/dist/src/transformers/model-to-narrative/generators/imports.d.ts.map +1 -1
- package/dist/src/transformers/model-to-narrative/generators/imports.js +1 -1
- package/dist/src/transformers/model-to-narrative/generators/imports.js.map +1 -1
- package/dist/src/transformers/model-to-narrative/generators/module-code.js +14 -14
- package/dist/src/transformers/model-to-narrative/generators/module-code.js.map +1 -1
- package/dist/src/transformers/model-to-narrative/index.d.ts +4 -4
- package/dist/src/transformers/model-to-narrative/index.d.ts.map +1 -1
- package/dist/src/transformers/model-to-narrative/index.js +1 -1
- package/dist/src/transformers/model-to-narrative/spec-traversal.d.ts +2 -2
- package/dist/src/transformers/model-to-narrative/spec-traversal.d.ts.map +1 -1
- package/dist/src/transformers/model-to-narrative/spec-traversal.js +5 -5
- package/dist/src/transformers/model-to-narrative/spec-traversal.js.map +1 -1
- package/dist/src/transformers/model-to-narrative/types.d.ts +1 -1
- package/dist/src/transformers/model-to-narrative/types.d.ts.map +1 -1
- package/dist/src/transformers/model-to-narrative/utils/integration-extractor.d.ts +1 -1
- package/dist/src/transformers/model-to-narrative/utils/integration-extractor.d.ts.map +1 -1
- package/dist/src/transformers/model-to-narrative/utils/integration-extractor.js +4 -4
- package/dist/src/transformers/model-to-narrative/utils/integration-extractor.js.map +1 -1
- package/dist/src/transformers/model-to-narrative/validate-modules.d.ts +1 -1
- package/dist/src/transformers/model-to-narrative/validate-modules.d.ts.map +1 -1
- package/dist/src/transformers/model-to-narrative/validate-modules.js +19 -19
- package/dist/src/transformers/model-to-narrative/validate-modules.js.map +1 -1
- package/dist/src/transformers/narrative-to-model/assemble.d.ts +2 -2
- package/dist/src/transformers/narrative-to-model/assemble.d.ts.map +1 -1
- package/dist/src/transformers/narrative-to-model/assemble.js +10 -3
- package/dist/src/transformers/narrative-to-model/assemble.js.map +1 -1
- package/dist/src/transformers/narrative-to-model/debug.d.ts.map +1 -1
- package/dist/src/transformers/narrative-to-model/debug.js +1 -1
- package/dist/src/transformers/narrative-to-model/debug.js.map +1 -1
- package/dist/src/transformers/narrative-to-model/derive-modules.d.ts +2 -2
- package/dist/src/transformers/narrative-to-model/derive-modules.d.ts.map +1 -1
- package/dist/src/transformers/narrative-to-model/derive-modules.js +9 -9
- package/dist/src/transformers/narrative-to-model/derive-modules.js.map +1 -1
- package/dist/src/transformers/narrative-to-model/index.d.ts +2 -2
- package/dist/src/transformers/narrative-to-model/index.d.ts.map +1 -1
- package/dist/src/transformers/narrative-to-model/index.js +39 -39
- package/dist/src/transformers/narrative-to-model/index.js.map +1 -1
- package/dist/src/transformers/narrative-to-model/spec-processors.js +1 -1
- package/dist/src/transformers/narrative-to-model/spec-processors.js.map +1 -1
- package/dist/src/transformers/narrative-to-model/strings.d.ts +1 -1
- package/dist/src/transformers/narrative-to-model/strings.d.ts.map +1 -1
- package/dist/src/transformers/narrative-to-model/strings.js +6 -6
- package/dist/src/transformers/narrative-to-model/strings.js.map +1 -1
- package/dist/src/validate-slice-requests.d.ts +4 -4
- package/dist/src/validate-slice-requests.d.ts.map +1 -1
- package/dist/src/validate-slice-requests.js +34 -34
- package/dist/src/validate-slice-requests.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +4 -4
- package/scripts/convert-flow-exec.ts +2 -2
- package/scripts/print-schema.ts +8 -8
- package/src/fluent-builder.specs.ts +3 -3
- package/src/fluent-builder.ts +141 -141
- package/src/{getNarratives.cache.specs.ts → getScenes.cache.specs.ts} +45 -45
- package/src/{getNarratives.specs.ts → getScenes.specs.ts} +302 -300
- package/src/{getNarratives.ts → getScenes.ts} +20 -20
- package/src/id/addAutoIds.specs.ts +105 -105
- package/src/id/addAutoIds.ts +26 -26
- package/src/id/hasAllIds.specs.ts +59 -59
- package/src/id/hasAllIds.ts +6 -6
- package/src/index.ts +12 -13
- package/src/loader/index.ts +1 -1
- package/src/loader/runtime-cjs.ts +1 -1
- package/src/model-to-narrative.specs.ts +133 -135
- package/src/narrative-context.specs.ts +24 -24
- package/src/narrative-context.ts +61 -61
- package/src/narrative-registry.ts +31 -31
- package/src/narrative.ts +31 -33
- package/src/parse-graphql-request.specs.ts +5 -5
- package/src/parse-graphql-request.ts +3 -3
- package/src/samples/items.narrative.ts +2 -2
- package/src/samples/mixed-given-types.narrative.ts +2 -2
- package/src/samples/place-order.narrative.ts +2 -2
- package/src/samples/questionnaires.narrative.ts +2 -2
- package/src/samples/seasonal-assistant.schema.json +2 -2
- package/src/samples/test-with-ids.narrative.ts +2 -2
- package/src/schema.specs.ts +99 -91
- package/src/schema.ts +89 -89
- package/src/slice-builder.ts +30 -30
- package/src/transformers/model-to-narrative/analysis/lint-helpers.ts +1 -1
- package/src/transformers/model-to-narrative/cross-module-imports.specs.ts +43 -43
- package/src/transformers/model-to-narrative/cross-module-imports.ts +4 -4
- package/src/transformers/model-to-narrative/generators/compose.ts +4 -4
- package/src/transformers/model-to-narrative/generators/flow.ts +36 -36
- package/src/transformers/model-to-narrative/generators/imports.ts +1 -1
- package/src/transformers/model-to-narrative/generators/module-code.ts +15 -15
- package/src/transformers/model-to-narrative/index.ts +4 -4
- package/src/transformers/model-to-narrative/modules.specs.ts +58 -58
- package/src/transformers/model-to-narrative/spec-traversal.specs.ts +43 -43
- package/src/transformers/model-to-narrative/spec-traversal.ts +6 -6
- package/src/transformers/model-to-narrative/types.ts +1 -1
- package/src/transformers/model-to-narrative/utils/integration-extractor.ts +5 -5
- package/src/transformers/model-to-narrative/validate-modules.ts +22 -22
- package/src/transformers/narrative-to-model/assemble.ts +12 -4
- package/src/transformers/narrative-to-model/debug.ts +1 -1
- package/src/transformers/narrative-to-model/derive-modules.specs.ts +35 -35
- package/src/transformers/narrative-to-model/derive-modules.ts +11 -11
- package/src/transformers/narrative-to-model/index.ts +47 -47
- package/src/transformers/narrative-to-model/spec-processors.ts +1 -1
- package/src/transformers/narrative-to-model/strings.ts +6 -6
- package/src/transformers/narrative-to-model/type-inference.specs.ts +11 -11
- package/src/validate-slice-requests.specs.ts +113 -113
- package/src/validate-slice-requests.ts +49 -49
- package/dist/src/getNarratives.d.ts.map +0 -1
- package/dist/src/getNarratives.js.map +0 -1
|
@@ -20,7 +20,7 @@ export type { GeneratedFile };
|
|
|
20
20
|
|
|
21
21
|
export function generateAllModulesCode(model: Model, opts: GenerateModuleCodeOptions): GeneratedFile[] {
|
|
22
22
|
const modules =
|
|
23
|
-
model.modules && model.modules.length > 0 ? model.modules : deriveModules(model.
|
|
23
|
+
model.modules && model.modules.length > 0 ? model.modules : deriveModules(model.scenes, model.messages);
|
|
24
24
|
|
|
25
25
|
// Compute all cross-module dependencies in a single pass
|
|
26
26
|
const { importsPerModule, exportsPerModule } = computeAllCrossModuleDependencies(modules, model);
|
|
@@ -40,16 +40,16 @@ export function generateAllModulesCode(model: Model, opts: GenerateModuleCodeOpt
|
|
|
40
40
|
return sortFilesByPath(files);
|
|
41
41
|
}
|
|
42
42
|
|
|
43
|
-
function
|
|
43
|
+
function getScenesForModule(module: Module, model: Model): Model['scenes'] {
|
|
44
44
|
if (module.isDerived) {
|
|
45
|
-
return model.
|
|
46
|
-
const
|
|
47
|
-
return
|
|
45
|
+
return model.scenes.filter((n) => {
|
|
46
|
+
const sceneSourceFile = n.sourceFile ?? 'generated.narrative.ts';
|
|
47
|
+
return sceneSourceFile === module.sourceFile;
|
|
48
48
|
});
|
|
49
49
|
}
|
|
50
50
|
|
|
51
|
-
const
|
|
52
|
-
return model.
|
|
51
|
+
const sceneIds = new Set(module.contains.sceneIds);
|
|
52
|
+
return model.scenes.filter((n) => n.id && sceneIds.has(n.id));
|
|
53
53
|
}
|
|
54
54
|
|
|
55
55
|
function generateModuleCode(
|
|
@@ -61,12 +61,12 @@ function generateModuleCode(
|
|
|
61
61
|
): string {
|
|
62
62
|
const f = ts.factory;
|
|
63
63
|
|
|
64
|
-
const
|
|
64
|
+
const scenes = getScenesForModule(module, model);
|
|
65
65
|
const declaredMessageKeys = new Set(module.declares.messages.map((m) => `${m.kind}:${m.name}`));
|
|
66
66
|
const messages = model.messages.filter((m) => declaredMessageKeys.has(`${m.type}:${m.name}`));
|
|
67
67
|
const integrations = model.integrations ?? [];
|
|
68
68
|
|
|
69
|
-
const allTypeIntegrationNames = extractTypeIntegrationNames(
|
|
69
|
+
const allTypeIntegrationNames = extractTypeIntegrationNames(scenes);
|
|
70
70
|
const allValueIntegrationNames = integrations.map((integration) => integrationNameToPascalCase(integration.name));
|
|
71
71
|
|
|
72
72
|
const allFlowFunctionNames = [...ALL_FLOW_FUNCTION_NAMES];
|
|
@@ -77,7 +77,7 @@ function generateModuleCode(
|
|
|
77
77
|
allTypeIntegrationNames,
|
|
78
78
|
allValueIntegrationNames,
|
|
79
79
|
allFlowFunctionNames,
|
|
80
|
-
|
|
80
|
+
scenes,
|
|
81
81
|
[],
|
|
82
82
|
);
|
|
83
83
|
const preliminaryFile = f.createSourceFile(
|
|
@@ -120,10 +120,10 @@ function generateModuleCode(
|
|
|
120
120
|
}
|
|
121
121
|
|
|
122
122
|
// For derived modules, only include types that are actually used in flow code
|
|
123
|
-
// or when there's no flow code (
|
|
123
|
+
// or when there's no flow code (hasEmptyFlowMoments)
|
|
124
124
|
const isUsedInFlow = usageAnalysis.usedTypes.has(msg.name);
|
|
125
|
-
const
|
|
126
|
-
return isUsedInFlow ||
|
|
125
|
+
const hasEmptyFlowMoments = scenes.length === 0 || scenes.every((flow) => flow.moments.length === 0);
|
|
126
|
+
return isUsedInFlow || hasEmptyFlowMoments;
|
|
127
127
|
});
|
|
128
128
|
|
|
129
129
|
const statements = buildStatements(
|
|
@@ -133,7 +133,7 @@ function generateModuleCode(
|
|
|
133
133
|
usedTypeIntegrationNames,
|
|
134
134
|
usedValueIntegrationNames,
|
|
135
135
|
usedFlowFunctionNames,
|
|
136
|
-
|
|
136
|
+
scenes,
|
|
137
137
|
crossModuleImports,
|
|
138
138
|
exportedTypes,
|
|
139
139
|
);
|
|
@@ -150,7 +150,7 @@ function buildStatements(
|
|
|
150
150
|
typeIntegrationNames: string[],
|
|
151
151
|
valueIntegrationNames: string[],
|
|
152
152
|
usedFlowFunctionNames: string[],
|
|
153
|
-
flows: Model['
|
|
153
|
+
flows: Model['scenes'],
|
|
154
154
|
crossModuleImports: CrossModuleImport[],
|
|
155
155
|
exportedTypes?: Set<string>,
|
|
156
156
|
): ts.Statement[] {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { Model } from '../../index';
|
|
2
2
|
import { formatWithPrettier } from './formatting/prettier';
|
|
3
3
|
import { generateAllModulesCode } from './generators/module-code';
|
|
4
|
-
import type {
|
|
4
|
+
import type { GeneratedScenes } from './types';
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
7
|
* Converts a schema specification to TypeScript flow DSL code files.
|
|
@@ -11,9 +11,9 @@ import type { GeneratedNarratives } from './types';
|
|
|
11
11
|
* and flow specifications. Each module in the model produces one output file.
|
|
12
12
|
*
|
|
13
13
|
* @param model The complete schema specification conforming to SpecsSchema
|
|
14
|
-
* @returns Promise resolving to
|
|
14
|
+
* @returns Promise resolving to GeneratedScenes with files array
|
|
15
15
|
*/
|
|
16
|
-
export async function modelToNarrative(model: Model): Promise<
|
|
16
|
+
export async function modelToNarrative(model: Model): Promise<GeneratedScenes> {
|
|
17
17
|
const flowImport = '@auto-engineer/narrative';
|
|
18
18
|
const integrationImport = extractIntegrationImportFromModel(model);
|
|
19
19
|
|
|
@@ -36,4 +36,4 @@ function extractIntegrationImportFromModel(model: Model): string {
|
|
|
36
36
|
return '';
|
|
37
37
|
}
|
|
38
38
|
|
|
39
|
-
export type {
|
|
39
|
+
export type { GeneratedScenes } from './types';
|
|
@@ -8,18 +8,18 @@ describe('module functionality', () => {
|
|
|
8
8
|
it('produces self-contained files with duplicated types for each sourceFile', async () => {
|
|
9
9
|
const model: Model = {
|
|
10
10
|
variant: 'specs',
|
|
11
|
-
|
|
11
|
+
scenes: [
|
|
12
12
|
{
|
|
13
13
|
name: 'Orders',
|
|
14
14
|
id: 'orders-flow',
|
|
15
15
|
sourceFile: 'orders.narrative.ts',
|
|
16
|
-
|
|
16
|
+
moments: [],
|
|
17
17
|
},
|
|
18
18
|
{
|
|
19
19
|
name: 'Users',
|
|
20
20
|
id: 'users-flow',
|
|
21
21
|
sourceFile: 'users.narrative.ts',
|
|
22
|
-
|
|
22
|
+
moments: [],
|
|
23
23
|
},
|
|
24
24
|
],
|
|
25
25
|
messages: [
|
|
@@ -35,13 +35,13 @@ describe('module functionality', () => {
|
|
|
35
35
|
{
|
|
36
36
|
sourceFile: 'orders.narrative.ts',
|
|
37
37
|
isDerived: true,
|
|
38
|
-
contains: {
|
|
38
|
+
contains: { sceneIds: ['orders-flow'] },
|
|
39
39
|
declares: { messages: [{ kind: 'event', name: 'SharedEvent' }] },
|
|
40
40
|
},
|
|
41
41
|
{
|
|
42
42
|
sourceFile: 'users.narrative.ts',
|
|
43
43
|
isDerived: true,
|
|
44
|
-
contains: {
|
|
44
|
+
contains: { sceneIds: ['users-flow'] },
|
|
45
45
|
declares: { messages: [{ kind: 'event', name: 'SharedEvent' }] },
|
|
46
46
|
},
|
|
47
47
|
],
|
|
@@ -73,16 +73,16 @@ describe('module functionality', () => {
|
|
|
73
73
|
it('generates cross-module imports for types declared by other modules', async () => {
|
|
74
74
|
const model: Model = {
|
|
75
75
|
variant: 'specs',
|
|
76
|
-
|
|
76
|
+
scenes: [
|
|
77
77
|
{
|
|
78
78
|
name: 'Shared Types',
|
|
79
79
|
id: 'shared-types',
|
|
80
|
-
|
|
80
|
+
moments: [],
|
|
81
81
|
},
|
|
82
82
|
{
|
|
83
83
|
name: 'Orders',
|
|
84
84
|
id: 'orders-flow',
|
|
85
|
-
|
|
85
|
+
moments: [
|
|
86
86
|
{
|
|
87
87
|
name: 'create order',
|
|
88
88
|
type: 'command',
|
|
@@ -132,7 +132,7 @@ describe('module functionality', () => {
|
|
|
132
132
|
{
|
|
133
133
|
sourceFile: 'shared/types.narrative.ts',
|
|
134
134
|
isDerived: false,
|
|
135
|
-
contains: {
|
|
135
|
+
contains: { sceneIds: ['shared-types'] },
|
|
136
136
|
declares: {
|
|
137
137
|
messages: [{ kind: 'event', name: 'OrderCreated' }],
|
|
138
138
|
},
|
|
@@ -140,7 +140,7 @@ describe('module functionality', () => {
|
|
|
140
140
|
{
|
|
141
141
|
sourceFile: 'features/orders.narrative.ts',
|
|
142
142
|
isDerived: false,
|
|
143
|
-
contains: {
|
|
143
|
+
contains: { sceneIds: ['orders-flow'] },
|
|
144
144
|
declares: {
|
|
145
145
|
messages: [{ kind: 'command', name: 'CreateOrder' }],
|
|
146
146
|
},
|
|
@@ -166,19 +166,19 @@ describe('module functionality', () => {
|
|
|
166
166
|
it('detects duplicate sourceFiles', () => {
|
|
167
167
|
const model: Model = {
|
|
168
168
|
variant: 'specs',
|
|
169
|
-
|
|
169
|
+
scenes: [],
|
|
170
170
|
messages: [],
|
|
171
171
|
modules: [
|
|
172
172
|
{
|
|
173
173
|
sourceFile: 'same-file.ts',
|
|
174
174
|
isDerived: false,
|
|
175
|
-
contains: {
|
|
175
|
+
contains: { sceneIds: [] },
|
|
176
176
|
declares: { messages: [] },
|
|
177
177
|
},
|
|
178
178
|
{
|
|
179
179
|
sourceFile: 'same-file.ts',
|
|
180
180
|
isDerived: false,
|
|
181
|
-
contains: {
|
|
181
|
+
contains: { sceneIds: [] },
|
|
182
182
|
declares: { messages: [] },
|
|
183
183
|
},
|
|
184
184
|
],
|
|
@@ -194,19 +194,19 @@ describe('module functionality', () => {
|
|
|
194
194
|
it('detects narrative assigned to multiple authored modules', () => {
|
|
195
195
|
const model: Model = {
|
|
196
196
|
variant: 'specs',
|
|
197
|
-
|
|
197
|
+
scenes: [{ name: 'Test', id: 'test-narrative', moments: [] }],
|
|
198
198
|
messages: [],
|
|
199
199
|
modules: [
|
|
200
200
|
{
|
|
201
201
|
sourceFile: 'a.ts',
|
|
202
202
|
isDerived: false,
|
|
203
|
-
contains: {
|
|
203
|
+
contains: { sceneIds: ['test-narrative'] },
|
|
204
204
|
declares: { messages: [] },
|
|
205
205
|
},
|
|
206
206
|
{
|
|
207
207
|
sourceFile: 'b.ts',
|
|
208
208
|
isDerived: false,
|
|
209
|
-
contains: {
|
|
209
|
+
contains: { sceneIds: ['test-narrative'] },
|
|
210
210
|
declares: { messages: [] },
|
|
211
211
|
},
|
|
212
212
|
],
|
|
@@ -214,25 +214,25 @@ describe('module functionality', () => {
|
|
|
214
214
|
|
|
215
215
|
const errors = validateModules(model);
|
|
216
216
|
|
|
217
|
-
expect(errors.some((e) => e.type === '
|
|
217
|
+
expect(errors.some((e) => e.type === 'scene_multi_assigned')).toBe(true);
|
|
218
218
|
});
|
|
219
219
|
|
|
220
220
|
it('detects message declared by multiple authored modules', () => {
|
|
221
221
|
const model: Model = {
|
|
222
222
|
variant: 'specs',
|
|
223
|
-
|
|
223
|
+
scenes: [],
|
|
224
224
|
messages: [{ type: 'event', source: 'internal', name: 'SharedEvent', fields: [] }],
|
|
225
225
|
modules: [
|
|
226
226
|
{
|
|
227
227
|
sourceFile: 'a.ts',
|
|
228
228
|
isDerived: false,
|
|
229
|
-
contains: {
|
|
229
|
+
contains: { sceneIds: [] },
|
|
230
230
|
declares: { messages: [{ kind: 'event', name: 'SharedEvent' }] },
|
|
231
231
|
},
|
|
232
232
|
{
|
|
233
233
|
sourceFile: 'b.ts',
|
|
234
234
|
isDerived: false,
|
|
235
|
-
contains: {
|
|
235
|
+
contains: { sceneIds: [] },
|
|
236
236
|
declares: { messages: [{ kind: 'event', name: 'SharedEvent' }] },
|
|
237
237
|
},
|
|
238
238
|
],
|
|
@@ -246,19 +246,19 @@ describe('module functionality', () => {
|
|
|
246
246
|
it('allows type duplication in derived modules', () => {
|
|
247
247
|
const model: Model = {
|
|
248
248
|
variant: 'specs',
|
|
249
|
-
|
|
249
|
+
scenes: [],
|
|
250
250
|
messages: [{ type: 'event', source: 'internal', name: 'SharedEvent', fields: [] }],
|
|
251
251
|
modules: [
|
|
252
252
|
{
|
|
253
253
|
sourceFile: 'file1.ts',
|
|
254
254
|
isDerived: true,
|
|
255
|
-
contains: {
|
|
255
|
+
contains: { sceneIds: [] },
|
|
256
256
|
declares: { messages: [{ kind: 'event', name: 'SharedEvent' }] },
|
|
257
257
|
},
|
|
258
258
|
{
|
|
259
259
|
sourceFile: 'file2.ts',
|
|
260
260
|
isDerived: true,
|
|
261
|
-
contains: {
|
|
261
|
+
contains: { sceneIds: [] },
|
|
262
262
|
declares: { messages: [{ kind: 'event', name: 'SharedEvent' }] },
|
|
263
263
|
},
|
|
264
264
|
],
|
|
@@ -272,7 +272,7 @@ describe('module functionality', () => {
|
|
|
272
272
|
it('returns no errors for empty modules array', () => {
|
|
273
273
|
const model: Model = {
|
|
274
274
|
variant: 'specs',
|
|
275
|
-
|
|
275
|
+
scenes: [{ name: 'Test', id: 'test-1', moments: [] }],
|
|
276
276
|
messages: [{ type: 'event', source: 'internal', name: 'TestEvent', fields: [] }],
|
|
277
277
|
modules: [],
|
|
278
278
|
};
|
|
@@ -285,13 +285,13 @@ describe('module functionality', () => {
|
|
|
285
285
|
it('detects narrative not found in model', () => {
|
|
286
286
|
const model: Model = {
|
|
287
287
|
variant: 'specs',
|
|
288
|
-
|
|
288
|
+
scenes: [],
|
|
289
289
|
messages: [],
|
|
290
290
|
modules: [
|
|
291
291
|
{
|
|
292
292
|
sourceFile: 'a.ts',
|
|
293
293
|
isDerived: false,
|
|
294
|
-
contains: {
|
|
294
|
+
contains: { sceneIds: ['nonexistent-narrative'] },
|
|
295
295
|
declares: { messages: [] },
|
|
296
296
|
},
|
|
297
297
|
],
|
|
@@ -299,20 +299,20 @@ describe('module functionality', () => {
|
|
|
299
299
|
|
|
300
300
|
const errors = validateModules(model);
|
|
301
301
|
|
|
302
|
-
expect(errors.some((e) => e.type === '
|
|
302
|
+
expect(errors.some((e) => e.type === 'scene_not_found')).toBe(true);
|
|
303
303
|
expect(errors[0].message).toContain('nonexistent-narrative');
|
|
304
304
|
});
|
|
305
305
|
|
|
306
|
-
it('detects unassigned
|
|
306
|
+
it('detects unassigned scenes', () => {
|
|
307
307
|
const model: Model = {
|
|
308
308
|
variant: 'specs',
|
|
309
|
-
|
|
309
|
+
scenes: [{ name: 'Orphan', id: 'orphan-narrative', moments: [] }],
|
|
310
310
|
messages: [],
|
|
311
311
|
modules: [
|
|
312
312
|
{
|
|
313
313
|
sourceFile: 'a.ts',
|
|
314
314
|
isDerived: false,
|
|
315
|
-
contains: {
|
|
315
|
+
contains: { sceneIds: [] },
|
|
316
316
|
declares: { messages: [] },
|
|
317
317
|
},
|
|
318
318
|
],
|
|
@@ -320,20 +320,20 @@ describe('module functionality', () => {
|
|
|
320
320
|
|
|
321
321
|
const errors = validateModules(model);
|
|
322
322
|
|
|
323
|
-
expect(errors.some((e) => e.type === '
|
|
324
|
-
expect(errors.find((e) => e.type === '
|
|
323
|
+
expect(errors.some((e) => e.type === 'scene_unassigned')).toBe(true);
|
|
324
|
+
expect(errors.find((e) => e.type === 'scene_unassigned')!.message).toContain('orphan-narrative');
|
|
325
325
|
});
|
|
326
326
|
|
|
327
327
|
it('detects undeclared messages', () => {
|
|
328
328
|
const model: Model = {
|
|
329
329
|
variant: 'specs',
|
|
330
|
-
|
|
330
|
+
scenes: [],
|
|
331
331
|
messages: [{ type: 'event', source: 'internal', name: 'UndeclaredEvent', fields: [] }],
|
|
332
332
|
modules: [
|
|
333
333
|
{
|
|
334
334
|
sourceFile: 'a.ts',
|
|
335
335
|
isDerived: false,
|
|
336
|
-
contains: {
|
|
336
|
+
contains: { sceneIds: [] },
|
|
337
337
|
declares: { messages: [] },
|
|
338
338
|
},
|
|
339
339
|
],
|
|
@@ -361,18 +361,18 @@ describe('module functionality', () => {
|
|
|
361
361
|
it('generates separate files for each sourceFile in derived modules', async () => {
|
|
362
362
|
const model: Model = {
|
|
363
363
|
variant: 'specs',
|
|
364
|
-
|
|
364
|
+
scenes: [
|
|
365
365
|
{
|
|
366
366
|
name: 'Orders',
|
|
367
367
|
id: 'orders-flow',
|
|
368
368
|
sourceFile: 'orders.narrative.ts',
|
|
369
|
-
|
|
369
|
+
moments: [],
|
|
370
370
|
},
|
|
371
371
|
{
|
|
372
372
|
name: 'Users',
|
|
373
373
|
id: 'users-flow',
|
|
374
374
|
sourceFile: 'users.narrative.ts',
|
|
375
|
-
|
|
375
|
+
moments: [],
|
|
376
376
|
},
|
|
377
377
|
],
|
|
378
378
|
messages: [
|
|
@@ -389,7 +389,7 @@ describe('module functionality', () => {
|
|
|
389
389
|
{
|
|
390
390
|
sourceFile: 'orders.narrative.ts',
|
|
391
391
|
isDerived: true,
|
|
392
|
-
contains: {
|
|
392
|
+
contains: { sceneIds: ['orders-flow'] },
|
|
393
393
|
declares: {
|
|
394
394
|
messages: [
|
|
395
395
|
{ kind: 'command', name: 'CreateOrder' },
|
|
@@ -400,7 +400,7 @@ describe('module functionality', () => {
|
|
|
400
400
|
{
|
|
401
401
|
sourceFile: 'users.narrative.ts',
|
|
402
402
|
isDerived: true,
|
|
403
|
-
contains: {
|
|
403
|
+
contains: { sceneIds: ['users-flow'] },
|
|
404
404
|
declares: {
|
|
405
405
|
messages: [
|
|
406
406
|
{ kind: 'command', name: 'CreateOrder' },
|
|
@@ -419,16 +419,16 @@ describe('module functionality', () => {
|
|
|
419
419
|
const ordersFile = result.files.find((f) => f.path === 'orders.narrative.ts');
|
|
420
420
|
const usersFile = result.files.find((f) => f.path === 'users.narrative.ts');
|
|
421
421
|
|
|
422
|
-
expect(ordersFile?.code).toContain("
|
|
423
|
-
expect(usersFile?.code).toContain("
|
|
422
|
+
expect(ordersFile?.code).toContain("scene('Orders'");
|
|
423
|
+
expect(usersFile?.code).toContain("scene('Users'");
|
|
424
424
|
});
|
|
425
425
|
|
|
426
426
|
it('duplicates types in each derived module file', async () => {
|
|
427
427
|
const model: Model = {
|
|
428
428
|
variant: 'specs',
|
|
429
|
-
|
|
430
|
-
{ name: 'Flow A', id: 'flow-a', sourceFile: 'a.narrative.ts',
|
|
431
|
-
{ name: 'Flow B', id: 'flow-b', sourceFile: 'b.narrative.ts',
|
|
429
|
+
scenes: [
|
|
430
|
+
{ name: 'Flow A', id: 'flow-a', sourceFile: 'a.narrative.ts', moments: [] },
|
|
431
|
+
{ name: 'Flow B', id: 'flow-b', sourceFile: 'b.narrative.ts', moments: [] },
|
|
432
432
|
],
|
|
433
433
|
messages: [
|
|
434
434
|
{
|
|
@@ -443,13 +443,13 @@ describe('module functionality', () => {
|
|
|
443
443
|
{
|
|
444
444
|
sourceFile: 'a.narrative.ts',
|
|
445
445
|
isDerived: true,
|
|
446
|
-
contains: {
|
|
446
|
+
contains: { sceneIds: ['flow-a'] },
|
|
447
447
|
declares: { messages: [{ kind: 'event', name: 'SharedEvent' }] },
|
|
448
448
|
},
|
|
449
449
|
{
|
|
450
450
|
sourceFile: 'b.narrative.ts',
|
|
451
451
|
isDerived: true,
|
|
452
|
-
contains: {
|
|
452
|
+
contains: { sceneIds: ['flow-b'] },
|
|
453
453
|
declares: { messages: [{ kind: 'event', name: 'SharedEvent' }] },
|
|
454
454
|
},
|
|
455
455
|
],
|
|
@@ -465,12 +465,12 @@ describe('module functionality', () => {
|
|
|
465
465
|
it('generates cross-module imports for authored modules', async () => {
|
|
466
466
|
const model: Model = {
|
|
467
467
|
variant: 'specs',
|
|
468
|
-
|
|
469
|
-
{ name: 'Shared Types', id: 'shared-types',
|
|
468
|
+
scenes: [
|
|
469
|
+
{ name: 'Shared Types', id: 'shared-types', moments: [] },
|
|
470
470
|
{
|
|
471
471
|
name: 'Orders',
|
|
472
472
|
id: 'orders-flow',
|
|
473
|
-
|
|
473
|
+
moments: [
|
|
474
474
|
{
|
|
475
475
|
name: 'create order',
|
|
476
476
|
type: 'command',
|
|
@@ -516,13 +516,13 @@ describe('module functionality', () => {
|
|
|
516
516
|
{
|
|
517
517
|
sourceFile: 'shared/types.narrative.ts',
|
|
518
518
|
isDerived: false,
|
|
519
|
-
contains: {
|
|
519
|
+
contains: { sceneIds: ['shared-types'] },
|
|
520
520
|
declares: { messages: [{ kind: 'event', name: 'OrderCreated' }] },
|
|
521
521
|
},
|
|
522
522
|
{
|
|
523
523
|
sourceFile: 'features/orders.narrative.ts',
|
|
524
524
|
isDerived: false,
|
|
525
|
-
contains: {
|
|
525
|
+
contains: { sceneIds: ['orders-flow'] },
|
|
526
526
|
declares: { messages: [{ kind: 'command', name: 'CreateOrder' }] },
|
|
527
527
|
},
|
|
528
528
|
],
|
|
@@ -543,10 +543,10 @@ describe('module functionality', () => {
|
|
|
543
543
|
it('sorts output files alphabetically by path', async () => {
|
|
544
544
|
const model: Model = {
|
|
545
545
|
variant: 'specs',
|
|
546
|
-
|
|
547
|
-
{ name: 'Z', id: 'z', sourceFile: 'z.narrative.ts',
|
|
548
|
-
{ name: 'A', id: 'a', sourceFile: 'a.narrative.ts',
|
|
549
|
-
{ name: 'M', id: 'm', sourceFile: 'm.narrative.ts',
|
|
546
|
+
scenes: [
|
|
547
|
+
{ name: 'Z', id: 'z', sourceFile: 'z.narrative.ts', moments: [] },
|
|
548
|
+
{ name: 'A', id: 'a', sourceFile: 'a.narrative.ts', moments: [] },
|
|
549
|
+
{ name: 'M', id: 'm', sourceFile: 'm.narrative.ts', moments: [] },
|
|
550
550
|
],
|
|
551
551
|
messages: [],
|
|
552
552
|
integrations: [],
|
|
@@ -554,19 +554,19 @@ describe('module functionality', () => {
|
|
|
554
554
|
{
|
|
555
555
|
sourceFile: 'z.narrative.ts',
|
|
556
556
|
isDerived: true,
|
|
557
|
-
contains: {
|
|
557
|
+
contains: { sceneIds: ['z'] },
|
|
558
558
|
declares: { messages: [] },
|
|
559
559
|
},
|
|
560
560
|
{
|
|
561
561
|
sourceFile: 'a.narrative.ts',
|
|
562
562
|
isDerived: true,
|
|
563
|
-
contains: {
|
|
563
|
+
contains: { sceneIds: ['a'] },
|
|
564
564
|
declares: { messages: [] },
|
|
565
565
|
},
|
|
566
566
|
{
|
|
567
567
|
sourceFile: 'm.narrative.ts',
|
|
568
568
|
isDerived: true,
|
|
569
|
-
contains: {
|
|
569
|
+
contains: { sceneIds: ['m'] },
|
|
570
570
|
declares: { messages: [] },
|
|
571
571
|
},
|
|
572
572
|
],
|