@auto-engineer/narrative 0.15.0 → 0.17.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/CHANGELOG.md +28 -0
- package/dist/src/getNarratives.js +1 -1
- package/dist/src/getNarratives.js.map +1 -1
- package/dist/src/id/addAutoIds.d.ts.map +1 -1
- package/dist/src/id/addAutoIds.js +15 -0
- 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 +6 -1
- package/dist/src/id/hasAllIds.js.map +1 -1
- package/dist/src/index.d.ts +5 -2
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +1 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/loader/runtime-cjs.d.ts.map +1 -1
- package/dist/src/loader/runtime-cjs.js +3 -2
- package/dist/src/loader/runtime-cjs.js.map +1 -1
- package/dist/src/schema.d.ts +301 -143
- package/dist/src/schema.d.ts.map +1 -1
- package/dist/src/schema.js +26 -0
- package/dist/src/schema.js.map +1 -1
- package/dist/src/transformers/model-to-narrative/cross-module-imports.d.ts +6 -0
- package/dist/src/transformers/model-to-narrative/cross-module-imports.d.ts.map +1 -0
- package/dist/src/transformers/model-to-narrative/cross-module-imports.js +63 -0
- package/dist/src/transformers/model-to-narrative/cross-module-imports.js.map +1 -0
- package/dist/src/transformers/model-to-narrative/generators/flow.d.ts +1 -4
- package/dist/src/transformers/model-to-narrative/generators/flow.d.ts.map +1 -1
- package/dist/src/transformers/model-to-narrative/generators/flow.js.map +1 -1
- package/dist/src/transformers/model-to-narrative/generators/module-code.d.ts +9 -0
- package/dist/src/transformers/model-to-narrative/generators/module-code.d.ts.map +1 -0
- package/dist/src/transformers/model-to-narrative/generators/module-code.js +102 -0
- package/dist/src/transformers/model-to-narrative/generators/module-code.js.map +1 -0
- package/dist/src/transformers/model-to-narrative/index.d.ts +6 -4
- package/dist/src/transformers/model-to-narrative/index.d.ts.map +1 -1
- package/dist/src/transformers/model-to-narrative/index.js +10 -6
- package/dist/src/transformers/model-to-narrative/index.js.map +1 -1
- package/dist/src/transformers/model-to-narrative/ordering.d.ts +10 -0
- package/dist/src/transformers/model-to-narrative/ordering.d.ts.map +1 -0
- package/dist/src/transformers/model-to-narrative/ordering.js +37 -0
- package/dist/src/transformers/model-to-narrative/ordering.js.map +1 -0
- package/dist/src/transformers/model-to-narrative/spec-traversal.d.ts +3 -0
- package/dist/src/transformers/model-to-narrative/spec-traversal.d.ts.map +1 -0
- package/dist/src/transformers/model-to-narrative/spec-traversal.js +54 -0
- package/dist/src/transformers/model-to-narrative/spec-traversal.js.map +1 -0
- package/dist/src/transformers/model-to-narrative/types.d.ts +12 -0
- package/dist/src/transformers/model-to-narrative/types.d.ts.map +1 -0
- package/dist/src/transformers/model-to-narrative/types.js +2 -0
- package/dist/src/transformers/model-to-narrative/types.js.map +1 -0
- package/dist/src/transformers/model-to-narrative/validate-modules.d.ts +8 -0
- package/dist/src/transformers/model-to-narrative/validate-modules.d.ts.map +1 -0
- package/dist/src/transformers/model-to-narrative/validate-modules.js +121 -0
- package/dist/src/transformers/model-to-narrative/validate-modules.js.map +1 -0
- package/dist/src/transformers/narrative-to-model/assemble.d.ts.map +1 -1
- package/dist/src/transformers/narrative-to-model/assemble.js +5 -1
- package/dist/src/transformers/narrative-to-model/assemble.js.map +1 -1
- package/dist/src/transformers/narrative-to-model/derive-modules.d.ts +3 -0
- package/dist/src/transformers/narrative-to-model/derive-modules.d.ts.map +1 -0
- package/dist/src/transformers/narrative-to-model/derive-modules.js +29 -0
- package/dist/src/transformers/narrative-to-model/derive-modules.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +5 -4
- package/src/getNarratives.specs.ts +214 -1
- package/src/getNarratives.ts +1 -1
- package/src/id/addAutoIds.specs.ts +180 -0
- package/src/id/addAutoIds.ts +16 -1
- package/src/id/hasAllIds.specs.ts +87 -0
- package/src/id/hasAllIds.ts +10 -2
- package/src/index.ts +7 -0
- package/src/loader/runtime-cjs.ts +3 -2
- package/src/model-to-narrative.specs.ts +467 -17
- package/src/schema.ts +28 -0
- package/src/transformers/model-to-narrative/cross-module-imports.specs.ts +450 -0
- package/src/transformers/model-to-narrative/cross-module-imports.ts +83 -0
- package/src/transformers/model-to-narrative/generators/flow.ts +11 -10
- package/src/transformers/model-to-narrative/generators/module-code.ts +186 -0
- package/src/transformers/model-to-narrative/index.ts +19 -7
- package/src/transformers/model-to-narrative/modules.specs.ts +625 -0
- package/src/transformers/model-to-narrative/ordering.specs.ts +104 -0
- package/src/transformers/model-to-narrative/ordering.ts +46 -0
- package/src/transformers/model-to-narrative/spec-traversal.specs.ts +418 -0
- package/src/transformers/model-to-narrative/spec-traversal.ts +63 -0
- package/src/transformers/model-to-narrative/types.ts +13 -0
- package/src/transformers/model-to-narrative/validate-modules.ts +159 -0
- package/src/transformers/narrative-to-model/assemble.ts +7 -2
- package/src/transformers/narrative-to-model/derive-modules.specs.ts +121 -0
- package/src/transformers/narrative-to-model/derive-modules.ts +36 -0
- package/tsconfig.json +1 -1
- package/tsconfig.test.json +2 -1
- package/dist/src/fluent-builder.specs.d.ts +0 -2
- package/dist/src/fluent-builder.specs.d.ts.map +0 -1
- package/dist/src/fluent-builder.specs.js +0 -28
- package/dist/src/fluent-builder.specs.js.map +0 -1
- package/dist/src/getNarratives.cache.specs.d.ts +0 -2
- package/dist/src/getNarratives.cache.specs.d.ts.map +0 -1
- package/dist/src/getNarratives.cache.specs.js +0 -234
- package/dist/src/getNarratives.cache.specs.js.map +0 -1
- package/dist/src/getNarratives.specs.d.ts +0 -2
- package/dist/src/getNarratives.specs.d.ts.map +0 -1
- package/dist/src/getNarratives.specs.js +0 -1307
- package/dist/src/getNarratives.specs.js.map +0 -1
- package/dist/src/id/addAutoIds.specs.d.ts +0 -2
- package/dist/src/id/addAutoIds.specs.d.ts.map +0 -1
- package/dist/src/id/addAutoIds.specs.js +0 -602
- package/dist/src/id/addAutoIds.specs.js.map +0 -1
- package/dist/src/id/hasAllIds.specs.d.ts +0 -2
- package/dist/src/id/hasAllIds.specs.d.ts.map +0 -1
- package/dist/src/id/hasAllIds.specs.js +0 -424
- package/dist/src/id/hasAllIds.specs.js.map +0 -1
- package/dist/src/model-to-narrative.specs.d.ts +0 -2
- package/dist/src/model-to-narrative.specs.d.ts.map +0 -1
- package/dist/src/model-to-narrative.specs.js +0 -2437
- package/dist/src/model-to-narrative.specs.js.map +0 -1
- package/dist/src/narrative-context.specs.d.ts +0 -2
- package/dist/src/narrative-context.specs.d.ts.map +0 -1
- package/dist/src/narrative-context.specs.js +0 -260
- package/dist/src/narrative-context.specs.js.map +0 -1
- package/dist/src/transformers/model-to-narrative/generators/gwt.specs.d.ts +0 -2
- package/dist/src/transformers/model-to-narrative/generators/gwt.specs.d.ts.map +0 -1
- package/dist/src/transformers/model-to-narrative/generators/gwt.specs.js +0 -142
- package/dist/src/transformers/model-to-narrative/generators/gwt.specs.js.map +0 -1
- package/dist/src/transformers/narrative-to-model/type-inference.specs.d.ts +0 -2
- package/dist/src/transformers/narrative-to-model/type-inference.specs.d.ts.map +0 -1
- package/dist/src/transformers/narrative-to-model/type-inference.specs.js +0 -177
- package/dist/src/transformers/narrative-to-model/type-inference.specs.js.map +0 -1
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import type { Model } from '../../index';
|
|
2
|
+
import { toMessageKey } from './ordering';
|
|
3
|
+
|
|
4
|
+
export interface ValidationError {
|
|
5
|
+
type:
|
|
6
|
+
| 'duplicate_id'
|
|
7
|
+
| 'derived_id_mismatch'
|
|
8
|
+
| 'narrative_unassigned'
|
|
9
|
+
| 'narrative_multi_assigned'
|
|
10
|
+
| 'message_multi_declared'
|
|
11
|
+
| 'message_undeclared'
|
|
12
|
+
| 'narrative_not_found';
|
|
13
|
+
message: string;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export function validateModules(model: Model): ValidationError[] {
|
|
17
|
+
const errors: ValidationError[] = [];
|
|
18
|
+
const modules = model.modules ?? [];
|
|
19
|
+
|
|
20
|
+
if (modules.length === 0) {
|
|
21
|
+
return errors;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
errors.push(...validateUniqueModuleIds(modules));
|
|
25
|
+
errors.push(...validateDerivedModuleIds(modules));
|
|
26
|
+
|
|
27
|
+
const authoredModules = modules.filter((m) => !m.isDerived);
|
|
28
|
+
if (authoredModules.length === 0) {
|
|
29
|
+
return errors;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
errors.push(...validateNarrativeAssignments(authoredModules, model));
|
|
33
|
+
errors.push(...validateMessageDeclarations(authoredModules, model));
|
|
34
|
+
|
|
35
|
+
return errors;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function validateUniqueModuleIds(modules: Model['modules']): ValidationError[] {
|
|
39
|
+
const errors: ValidationError[] = [];
|
|
40
|
+
const idCounts = new Map<string, number>();
|
|
41
|
+
|
|
42
|
+
for (const module of modules) {
|
|
43
|
+
idCounts.set(module.id, (idCounts.get(module.id) ?? 0) + 1);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
for (const [id, count] of idCounts) {
|
|
47
|
+
if (count > 1) {
|
|
48
|
+
errors.push({
|
|
49
|
+
type: 'duplicate_id',
|
|
50
|
+
message: `Module ID '${id}' is used by ${count} modules`,
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
return errors;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function validateDerivedModuleIds(modules: Model['modules']): ValidationError[] {
|
|
59
|
+
const errors: ValidationError[] = [];
|
|
60
|
+
|
|
61
|
+
for (const module of modules) {
|
|
62
|
+
if (module.isDerived && module.id !== module.sourceFile) {
|
|
63
|
+
errors.push({
|
|
64
|
+
type: 'derived_id_mismatch',
|
|
65
|
+
message: `Derived module ID '${module.id}' must equal sourceFile '${module.sourceFile}'`,
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
return errors;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function validateNarrativeAssignments(authoredModules: Model['modules'], model: Model): ValidationError[] {
|
|
74
|
+
const errors: ValidationError[] = [];
|
|
75
|
+
const narrativeAssignments = new Map<string, string[]>();
|
|
76
|
+
|
|
77
|
+
for (const module of authoredModules) {
|
|
78
|
+
for (const narrativeId of module.contains.narrativeIds) {
|
|
79
|
+
if (!narrativeAssignments.has(narrativeId)) {
|
|
80
|
+
narrativeAssignments.set(narrativeId, []);
|
|
81
|
+
}
|
|
82
|
+
narrativeAssignments.get(narrativeId)!.push(module.id);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
const modelNarrativeIds = new Set(model.narratives.map((n) => n.id).filter((id): id is string => id !== undefined));
|
|
87
|
+
|
|
88
|
+
for (const [narrativeId, moduleIds] of narrativeAssignments) {
|
|
89
|
+
if (!modelNarrativeIds.has(narrativeId)) {
|
|
90
|
+
errors.push({
|
|
91
|
+
type: 'narrative_not_found',
|
|
92
|
+
message: `Narrative '${narrativeId}' referenced by module(s) [${moduleIds.join(', ')}] does not exist`,
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
if (moduleIds.length > 1) {
|
|
96
|
+
errors.push({
|
|
97
|
+
type: 'narrative_multi_assigned',
|
|
98
|
+
message: `Narrative '${narrativeId}' is assigned to multiple modules: [${moduleIds.join(', ')}]`,
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
const assignedNarrativeIds = new Set(narrativeAssignments.keys());
|
|
104
|
+
for (const narrative of model.narratives) {
|
|
105
|
+
if (narrative.id && !assignedNarrativeIds.has(narrative.id)) {
|
|
106
|
+
errors.push({
|
|
107
|
+
type: 'narrative_unassigned',
|
|
108
|
+
message: `Narrative '${narrative.id}' (${narrative.name}) is not assigned to any module`,
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
return errors;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
function validateMessageDeclarations(authoredModules: Model['modules'], model: Model): ValidationError[] {
|
|
117
|
+
const errors: ValidationError[] = [];
|
|
118
|
+
const messageDeclarations = new Map<string, string[]>();
|
|
119
|
+
|
|
120
|
+
for (const module of authoredModules) {
|
|
121
|
+
for (const msg of module.declares.messages) {
|
|
122
|
+
const key = toMessageKey(msg.kind, msg.name);
|
|
123
|
+
if (!messageDeclarations.has(key)) {
|
|
124
|
+
messageDeclarations.set(key, []);
|
|
125
|
+
}
|
|
126
|
+
messageDeclarations.get(key)!.push(module.id);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
for (const [msgKey, moduleIds] of messageDeclarations) {
|
|
131
|
+
if (moduleIds.length > 1) {
|
|
132
|
+
errors.push({
|
|
133
|
+
type: 'message_multi_declared',
|
|
134
|
+
message: `Message '${msgKey}' is declared by multiple modules: [${moduleIds.join(', ')}]`,
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
const declaredMessages = new Set(messageDeclarations.keys());
|
|
140
|
+
const modelMessageKeys = new Set(model.messages.map((m) => toMessageKey(m.type, m.name)));
|
|
141
|
+
|
|
142
|
+
for (const msgKey of modelMessageKeys) {
|
|
143
|
+
if (!declaredMessages.has(msgKey)) {
|
|
144
|
+
errors.push({
|
|
145
|
+
type: 'message_undeclared',
|
|
146
|
+
message: `Message '${msgKey}' exists in model but is not declared by any authored module`,
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
return errors;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
export function throwOnValidationErrors(errors: ValidationError[]): void {
|
|
155
|
+
if (errors.length > 0) {
|
|
156
|
+
const messages = errors.map((e) => ` - ${e.message}`).join('\n');
|
|
157
|
+
throw new Error(`Module validation failed:\n${messages}`);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
@@ -1,10 +1,15 @@
|
|
|
1
|
-
import type { Model, Narrative } from '../../index';
|
|
1
|
+
import type { Message, Model, Narrative } from '../../index';
|
|
2
|
+
import { deriveModules } from './derive-modules';
|
|
2
3
|
|
|
3
4
|
export function assembleSpecs(narratives: Narrative[], messages: unknown[], integrations: unknown[]): Model {
|
|
5
|
+
const typedMessages = messages as Message[];
|
|
6
|
+
const modules = deriveModules(narratives, typedMessages);
|
|
7
|
+
|
|
4
8
|
return {
|
|
5
9
|
variant: 'specs' as const,
|
|
6
10
|
narratives,
|
|
7
|
-
messages:
|
|
11
|
+
messages: typedMessages,
|
|
8
12
|
integrations: integrations as Model['integrations'],
|
|
13
|
+
modules,
|
|
9
14
|
};
|
|
10
15
|
}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import type { Message, Narrative } from '../../index';
|
|
3
|
+
import { deriveModules } from './derive-modules';
|
|
4
|
+
|
|
5
|
+
describe('deriveModules', () => {
|
|
6
|
+
it('groups narratives by sourceFile into separate modules', () => {
|
|
7
|
+
const narratives: Narrative[] = [
|
|
8
|
+
{ name: 'Orders', id: 'orders-1', sourceFile: 'orders.narrative.ts', slices: [] },
|
|
9
|
+
{ name: 'Users', id: 'users-1', sourceFile: 'users.narrative.ts', slices: [] },
|
|
10
|
+
];
|
|
11
|
+
const messages: Message[] = [];
|
|
12
|
+
|
|
13
|
+
const modules = deriveModules(narratives, messages);
|
|
14
|
+
|
|
15
|
+
expect(modules).toHaveLength(2);
|
|
16
|
+
expect(modules.map((m) => m.sourceFile).sort()).toEqual(['orders.narrative.ts', 'users.narrative.ts']);
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
it('uses default sourceFile when narrative has no sourceFile', () => {
|
|
20
|
+
const narratives: Narrative[] = [{ name: 'Default', id: 'default-1', slices: [] }];
|
|
21
|
+
const messages: Message[] = [];
|
|
22
|
+
|
|
23
|
+
const modules = deriveModules(narratives, messages);
|
|
24
|
+
|
|
25
|
+
expect(modules).toHaveLength(1);
|
|
26
|
+
expect(modules[0].sourceFile).toBe('generated.narrative.ts');
|
|
27
|
+
expect(modules[0].id).toBe('generated.narrative.ts');
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
it('generates synthetic narrative IDs when narratives have no ID', () => {
|
|
31
|
+
const narratives: Narrative[] = [
|
|
32
|
+
{ name: 'First', slices: [] },
|
|
33
|
+
{ name: 'Second', slices: [] },
|
|
34
|
+
];
|
|
35
|
+
const messages: Message[] = [];
|
|
36
|
+
|
|
37
|
+
const modules = deriveModules(narratives, messages);
|
|
38
|
+
|
|
39
|
+
expect(modules).toHaveLength(1);
|
|
40
|
+
expect(modules[0].contains.narrativeIds).toEqual(['__derived_0_0_First', '__derived_0_1_Second']);
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
it('sets isDerived to true for all generated modules', () => {
|
|
44
|
+
const narratives: Narrative[] = [{ name: 'Test', id: 'test-1', slices: [] }];
|
|
45
|
+
const messages: Message[] = [];
|
|
46
|
+
|
|
47
|
+
const modules = deriveModules(narratives, messages);
|
|
48
|
+
|
|
49
|
+
expect(modules[0].isDerived).toBe(true);
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
it('includes all messages in declares for each module', () => {
|
|
53
|
+
const narratives: Narrative[] = [
|
|
54
|
+
{ name: 'Orders', id: 'orders-1', sourceFile: 'orders.narrative.ts', slices: [] },
|
|
55
|
+
{ name: 'Users', id: 'users-1', sourceFile: 'users.narrative.ts', slices: [] },
|
|
56
|
+
];
|
|
57
|
+
const messages: Message[] = [
|
|
58
|
+
{ type: 'command', name: 'CreateOrder', fields: [] },
|
|
59
|
+
{ type: 'event', source: 'internal', name: 'OrderCreated', fields: [] },
|
|
60
|
+
];
|
|
61
|
+
|
|
62
|
+
const modules = deriveModules(narratives, messages);
|
|
63
|
+
|
|
64
|
+
for (const mod of modules) {
|
|
65
|
+
expect(mod.declares.messages).toEqual([
|
|
66
|
+
{ kind: 'command', name: 'CreateOrder' },
|
|
67
|
+
{ kind: 'event', name: 'OrderCreated' },
|
|
68
|
+
]);
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
it('sorts declared messages by kind:name', () => {
|
|
73
|
+
const narratives: Narrative[] = [{ name: 'Test', id: 'test-1', slices: [] }];
|
|
74
|
+
const messages: Message[] = [
|
|
75
|
+
{ type: 'state', name: 'ZState', fields: [] },
|
|
76
|
+
{ type: 'command', name: 'ACommand', fields: [] },
|
|
77
|
+
{ type: 'event', source: 'internal', name: 'MEvent', fields: [] },
|
|
78
|
+
];
|
|
79
|
+
|
|
80
|
+
const modules = deriveModules(narratives, messages);
|
|
81
|
+
|
|
82
|
+
expect(modules[0].declares.messages).toEqual([
|
|
83
|
+
{ kind: 'command', name: 'ACommand' },
|
|
84
|
+
{ kind: 'event', name: 'MEvent' },
|
|
85
|
+
{ kind: 'state', name: 'ZState' },
|
|
86
|
+
]);
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
it('creates independent message arrays for each module', () => {
|
|
90
|
+
const narratives: Narrative[] = [
|
|
91
|
+
{ name: 'A', id: 'a', sourceFile: 'a.ts', slices: [] },
|
|
92
|
+
{ name: 'B', id: 'b', sourceFile: 'b.ts', slices: [] },
|
|
93
|
+
];
|
|
94
|
+
const messages: Message[] = [{ type: 'event', source: 'internal', name: 'SharedEvent', fields: [] }];
|
|
95
|
+
|
|
96
|
+
const modules = deriveModules(narratives, messages);
|
|
97
|
+
|
|
98
|
+
expect(modules[0].declares.messages).not.toBe(modules[1].declares.messages);
|
|
99
|
+
expect(modules[0].declares.messages).toEqual(modules[1].declares.messages);
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
it('returns empty array when no narratives provided', () => {
|
|
103
|
+
const modules = deriveModules([], []);
|
|
104
|
+
|
|
105
|
+
expect(modules).toEqual([]);
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
it('groups multiple narratives with same sourceFile into one module', () => {
|
|
109
|
+
const narratives: Narrative[] = [
|
|
110
|
+
{ name: 'Flow1', id: 'flow-1', sourceFile: 'shared.ts', slices: [] },
|
|
111
|
+
{ name: 'Flow2', id: 'flow-2', sourceFile: 'shared.ts', slices: [] },
|
|
112
|
+
{ name: 'Flow3', id: 'flow-3', sourceFile: 'shared.ts', slices: [] },
|
|
113
|
+
];
|
|
114
|
+
const messages: Message[] = [];
|
|
115
|
+
|
|
116
|
+
const modules = deriveModules(narratives, messages);
|
|
117
|
+
|
|
118
|
+
expect(modules).toHaveLength(1);
|
|
119
|
+
expect(modules[0].contains.narrativeIds).toEqual(['flow-1', 'flow-2', 'flow-3']);
|
|
120
|
+
});
|
|
121
|
+
});
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { Message, Module, Narrative } from '../../index';
|
|
2
|
+
|
|
3
|
+
const DEFAULT_SOURCE_FILE = 'generated.narrative.ts';
|
|
4
|
+
|
|
5
|
+
export function deriveModules(narratives: Narrative[], messages: Message[]): Module[] {
|
|
6
|
+
const bySourceFile = groupNarrativesBySourceFile(narratives);
|
|
7
|
+
|
|
8
|
+
return Array.from(bySourceFile.entries()).map(([sourceFile, narrs], index) => {
|
|
9
|
+
const narrativeIds = narrs.map((n, i) => n.id ?? `__derived_${index}_${i}_${n.name}`);
|
|
10
|
+
const messageRefs = messages
|
|
11
|
+
.map((m) => ({ kind: m.type, name: m.name }))
|
|
12
|
+
.sort((a, b) => `${a.kind}:${a.name}`.localeCompare(`${b.kind}:${b.name}`));
|
|
13
|
+
|
|
14
|
+
return {
|
|
15
|
+
id: sourceFile,
|
|
16
|
+
sourceFile,
|
|
17
|
+
isDerived: true,
|
|
18
|
+
contains: { narrativeIds },
|
|
19
|
+
declares: { messages: messageRefs },
|
|
20
|
+
};
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function groupNarrativesBySourceFile(narratives: Narrative[]): Map<string, Narrative[]> {
|
|
25
|
+
const groups = new Map<string, Narrative[]>();
|
|
26
|
+
|
|
27
|
+
for (const narrative of narratives) {
|
|
28
|
+
const sourceFile = narrative.sourceFile ?? DEFAULT_SOURCE_FILE;
|
|
29
|
+
if (!groups.has(sourceFile)) {
|
|
30
|
+
groups.set(sourceFile, []);
|
|
31
|
+
}
|
|
32
|
+
groups.get(sourceFile)!.push(narrative);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
return groups;
|
|
36
|
+
}
|
package/tsconfig.json
CHANGED
package/tsconfig.test.json
CHANGED
|
@@ -2,8 +2,9 @@
|
|
|
2
2
|
"extends": "./tsconfig.json",
|
|
3
3
|
"compilerOptions": {
|
|
4
4
|
"composite": false,
|
|
5
|
+
"rootDir": ".",
|
|
5
6
|
"types": ["vitest/globals", "node"]
|
|
6
7
|
},
|
|
7
|
-
"include": ["src/**/*"
|
|
8
|
+
"include": ["src/**/*"],
|
|
8
9
|
"exclude": ["node_modules", "dist"]
|
|
9
10
|
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"fluent-builder.specs.d.ts","sourceRoot":"","sources":["../../src/fluent-builder.specs.ts"],"names":[],"mappings":""}
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import { afterEach, beforeEach, describe, expect, it } from 'vitest';
|
|
2
|
-
import { command, react } from './fluent-builder.js';
|
|
3
|
-
import { clearCurrentNarrative, startNarrative } from './narrative-context.js';
|
|
4
|
-
import { createIntegration } from './types.js';
|
|
5
|
-
// Test integrations
|
|
6
|
-
const MailChimp = createIntegration('mailchimp', 'MailChimp');
|
|
7
|
-
const Twilio = createIntegration('twilio', 'Twilio');
|
|
8
|
-
describe('via method', () => {
|
|
9
|
-
beforeEach(() => {
|
|
10
|
-
startNarrative('test-flow');
|
|
11
|
-
});
|
|
12
|
-
afterEach(() => {
|
|
13
|
-
clearCurrentNarrative();
|
|
14
|
-
});
|
|
15
|
-
it('should accept a single integration', () => {
|
|
16
|
-
const slice = command('test').via(MailChimp);
|
|
17
|
-
expect(slice).toBeDefined();
|
|
18
|
-
});
|
|
19
|
-
it('should accept multiple integrations as array', () => {
|
|
20
|
-
const slice = command('test').via([MailChimp, Twilio]);
|
|
21
|
-
expect(slice).toBeDefined();
|
|
22
|
-
});
|
|
23
|
-
it('should work with react', () => {
|
|
24
|
-
const slice = react('test').via([MailChimp, Twilio]);
|
|
25
|
-
expect(slice).toBeDefined();
|
|
26
|
-
});
|
|
27
|
-
});
|
|
28
|
-
//# sourceMappingURL=fluent-builder.specs.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"fluent-builder.specs.js","sourceRoot":"","sources":["../../src/fluent-builder.specs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACrE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC5E,OAAO,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAE5C,oBAAoB;AACpB,MAAM,SAAS,GAAG,iBAAiB,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;AAC9D,MAAM,MAAM,GAAG,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAErD,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;IAC1B,UAAU,CAAC,GAAG,EAAE;QACd,cAAc,CAAC,WAAW,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,qBAAqB,EAAE,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAE7C,MAAM,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;IAC9B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;QAEvD,MAAM,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;IAC9B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wBAAwB,EAAE,GAAG,EAAE;QAChC,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;QAErD,MAAM,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;IAC9B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"getNarratives.cache.specs.d.ts","sourceRoot":"","sources":["../../src/getNarratives.cache.specs.ts"],"names":[],"mappings":""}
|
|
@@ -1,234 +0,0 @@
|
|
|
1
|
-
import { InMemoryFileStore } from '@auto-engineer/file-store';
|
|
2
|
-
import gql from 'graphql-tag';
|
|
3
|
-
import { beforeEach, describe, expect, it } from 'vitest';
|
|
4
|
-
import * as dataBuilders from './data-narrative-builders.js';
|
|
5
|
-
import * as fluent from './fluent-builder.js';
|
|
6
|
-
import { clearGetNarrativesCache, getNarratives } from './getNarratives.js';
|
|
7
|
-
import * as flowApi from './narrative.js';
|
|
8
|
-
import * as typesApi from './types.js';
|
|
9
|
-
const importMap = {
|
|
10
|
-
'../flow': flowApi,
|
|
11
|
-
'../fluent-builder': fluent,
|
|
12
|
-
'../data-flow-builders': dataBuilders,
|
|
13
|
-
'../types': typesApi,
|
|
14
|
-
'graphql-tag': { default: gql, gql },
|
|
15
|
-
};
|
|
16
|
-
const pattern = /\.(narrative)\.(ts)$/;
|
|
17
|
-
describe('getNarratives caching', () => {
|
|
18
|
-
let vfs;
|
|
19
|
-
const root = '/test';
|
|
20
|
-
beforeEach(() => {
|
|
21
|
-
vfs = new InMemoryFileStore();
|
|
22
|
-
clearGetNarrativesCache();
|
|
23
|
-
});
|
|
24
|
-
it('should rebuild cache when a helper file is modified', async () => {
|
|
25
|
-
const helperContent1 = `
|
|
26
|
-
export function formatName(name: string): string {
|
|
27
|
-
return name.toUpperCase();
|
|
28
|
-
}
|
|
29
|
-
`;
|
|
30
|
-
const flowContent = `
|
|
31
|
-
import { narrative } from '../narrative.js';
|
|
32
|
-
import { formatName } from './helper.js';
|
|
33
|
-
|
|
34
|
-
narrative('TestFlow', () => {
|
|
35
|
-
const name = formatName('test');
|
|
36
|
-
});
|
|
37
|
-
`;
|
|
38
|
-
await vfs.write('/test/helper.ts', new TextEncoder().encode(helperContent1));
|
|
39
|
-
await vfs.write('/test/test.narrative.ts', new TextEncoder().encode(flowContent));
|
|
40
|
-
const firstCallResult = await getNarratives({ vfs, root, pattern, fastFsScan: true, importMap });
|
|
41
|
-
const hash1 = firstCallResult.vfsFiles.sort().join(',');
|
|
42
|
-
const helperContent2 = `
|
|
43
|
-
export function formatName(name: string): string {
|
|
44
|
-
return name.toLowerCase(); // Changed implementation
|
|
45
|
-
}
|
|
46
|
-
`;
|
|
47
|
-
await vfs.write('/test/helper.ts', new TextEncoder().encode(helperContent2));
|
|
48
|
-
const secondCallResult = await getNarratives({ vfs, root, pattern, fastFsScan: true, importMap });
|
|
49
|
-
const hash2 = secondCallResult.vfsFiles.sort().join(',');
|
|
50
|
-
expect(hash1).toBe(hash2);
|
|
51
|
-
expect(secondCallResult.narratives).toBeDefined();
|
|
52
|
-
});
|
|
53
|
-
it('should rebuild cache when import map changes', async () => {
|
|
54
|
-
const flowContent = `
|
|
55
|
-
import { narrative } from '../narrative.js';
|
|
56
|
-
|
|
57
|
-
narrative('TestFlow', () => {
|
|
58
|
-
const x = 1;
|
|
59
|
-
});
|
|
60
|
-
`;
|
|
61
|
-
await vfs.write('/test/test.narrative.ts', new TextEncoder().encode(flowContent));
|
|
62
|
-
const importMap1 = { 'test-module': { default: 'value1' } };
|
|
63
|
-
const result1 = await getNarratives({ vfs, root, importMap: importMap1, pattern, fastFsScan: true });
|
|
64
|
-
const importMap2 = { 'test-module': { default: 'value2' } };
|
|
65
|
-
const result2 = await getNarratives({ vfs, root, importMap: importMap2, pattern, fastFsScan: true });
|
|
66
|
-
expect(result1.narratives.length).toBe(result2.narratives.length);
|
|
67
|
-
});
|
|
68
|
-
it('should rebuild cache when a new dependency is added', async () => {
|
|
69
|
-
const helperContent1 = `
|
|
70
|
-
export function getValue(): string {
|
|
71
|
-
return 'direct';
|
|
72
|
-
}
|
|
73
|
-
`;
|
|
74
|
-
const flowContent = `
|
|
75
|
-
import { narrative } from '../narrative.js';
|
|
76
|
-
import { getValue } from './helper.js';
|
|
77
|
-
|
|
78
|
-
narrative('TestFlow', () => {
|
|
79
|
-
const val = getValue();
|
|
80
|
-
});
|
|
81
|
-
`;
|
|
82
|
-
await vfs.write('/test/helper.ts', new TextEncoder().encode(helperContent1));
|
|
83
|
-
await vfs.write('/test/test.narrative.ts', new TextEncoder().encode(flowContent));
|
|
84
|
-
const firstCallResult = await getNarratives({ vfs, root, pattern, fastFsScan: true, importMap });
|
|
85
|
-
const filesCount1 = firstCallResult.vfsFiles.length;
|
|
86
|
-
const transitiveContent = `
|
|
87
|
-
export function transitiveHelper(): string {
|
|
88
|
-
return 'transitive';
|
|
89
|
-
}
|
|
90
|
-
`;
|
|
91
|
-
const helperContent2 = `
|
|
92
|
-
import { transitiveHelper } from './transitive.js';
|
|
93
|
-
|
|
94
|
-
export function getValue(): string {
|
|
95
|
-
return transitiveHelper();
|
|
96
|
-
}
|
|
97
|
-
`;
|
|
98
|
-
await vfs.write('/test/transitive.ts', new TextEncoder().encode(transitiveContent));
|
|
99
|
-
await vfs.write('/test/helper.ts', new TextEncoder().encode(helperContent2));
|
|
100
|
-
const secondCallResult = await getNarratives({ vfs, root, pattern, fastFsScan: true, importMap });
|
|
101
|
-
const filesCount2 = secondCallResult.vfsFiles.length;
|
|
102
|
-
expect(filesCount2).toBeGreaterThan(filesCount1);
|
|
103
|
-
expect(secondCallResult.vfsFiles.some((f) => f.includes('transitive'))).toBe(true);
|
|
104
|
-
});
|
|
105
|
-
it('should not rebuild cache when an unrelated file is touched', async () => {
|
|
106
|
-
const flowContent = `
|
|
107
|
-
import { narrative } from '../narrative.js';
|
|
108
|
-
|
|
109
|
-
narrative('TestFlow', () => {
|
|
110
|
-
const x = 1;
|
|
111
|
-
});
|
|
112
|
-
`;
|
|
113
|
-
await vfs.write('/test/test.narrative.ts', new TextEncoder().encode(flowContent));
|
|
114
|
-
await vfs.write('/test/unrelated.txt', new TextEncoder().encode('initial content'));
|
|
115
|
-
const firstCallResult = await getNarratives({ vfs, root, pattern, fastFsScan: true, importMap });
|
|
116
|
-
await vfs.write('/test/unrelated.txt', new TextEncoder().encode('modified content'));
|
|
117
|
-
const secondCallResult = await getNarratives({ vfs, root, pattern, fastFsScan: true, importMap });
|
|
118
|
-
expect(secondCallResult.vfsFiles.some((f) => f.includes('unrelated.txt'))).toBe(false);
|
|
119
|
-
expect(firstCallResult.vfsFiles).toEqual(secondCallResult.vfsFiles);
|
|
120
|
-
});
|
|
121
|
-
it('should rebuild cache when a file is deleted from the graph', async () => {
|
|
122
|
-
const flowContent1 = `
|
|
123
|
-
import { narrative } from '../narrative.js';
|
|
124
|
-
|
|
125
|
-
narrative('TestFlow1', () => {
|
|
126
|
-
const x = 1;
|
|
127
|
-
});
|
|
128
|
-
`;
|
|
129
|
-
const flowContent2 = `
|
|
130
|
-
import { narrative } from '../narrative.js';
|
|
131
|
-
|
|
132
|
-
narrative('TestFlow2', () => {
|
|
133
|
-
const x = 2;
|
|
134
|
-
});
|
|
135
|
-
`;
|
|
136
|
-
await vfs.write('/test/test.narrative.ts', new TextEncoder().encode(flowContent1));
|
|
137
|
-
await vfs.write('/test/test2.narrative.ts', new TextEncoder().encode(flowContent2));
|
|
138
|
-
const firstCallResult = await getNarratives({ vfs, root, pattern, fastFsScan: true, importMap });
|
|
139
|
-
expect(firstCallResult.narratives.length).toBeGreaterThanOrEqual(2);
|
|
140
|
-
await vfs.remove('/test/test2.narrative.ts');
|
|
141
|
-
const secondCallResult = await getNarratives({ vfs, root, pattern, fastFsScan: true, importMap });
|
|
142
|
-
expect(secondCallResult.narratives.length).toBeLessThan(firstCallResult.narratives.length);
|
|
143
|
-
expect(secondCallResult.vfsFiles.length).toBeLessThan(firstCallResult.vfsFiles.length);
|
|
144
|
-
});
|
|
145
|
-
it('should rebuild cache when a file is renamed', async () => {
|
|
146
|
-
const flowContent = `
|
|
147
|
-
import { narrative } from '../narrative.js';
|
|
148
|
-
|
|
149
|
-
narrative('TestFlow', () => {
|
|
150
|
-
const x = 1;
|
|
151
|
-
});
|
|
152
|
-
`;
|
|
153
|
-
await vfs.write('/test/test.narrative.ts', new TextEncoder().encode(flowContent));
|
|
154
|
-
const firstCallResult = await getNarratives({ vfs, root, pattern, fastFsScan: true, importMap });
|
|
155
|
-
expect(firstCallResult.vfsFiles.some((f) => f.includes('test.narrative.ts'))).toBe(true);
|
|
156
|
-
const content = await vfs.read('/test/test.narrative.ts');
|
|
157
|
-
if (content) {
|
|
158
|
-
await vfs.write('/test/renamed.narrative.ts', content);
|
|
159
|
-
await vfs.remove('/test/test.narrative.ts');
|
|
160
|
-
}
|
|
161
|
-
const secondCallResult = await getNarratives({ vfs, root, pattern, fastFsScan: true });
|
|
162
|
-
expect(secondCallResult.vfsFiles.some((f) => f.includes('renamed.narrative.ts'))).toBe(true);
|
|
163
|
-
expect(secondCallResult.vfsFiles.some((f) => f.includes('test.narrative.ts'))).toBe(false);
|
|
164
|
-
});
|
|
165
|
-
it('should handle .d.ts files if they affect the graph', async () => {
|
|
166
|
-
const dtsContent = `
|
|
167
|
-
declare module 'custom-module' {
|
|
168
|
-
export function customFunc(): string;
|
|
169
|
-
}
|
|
170
|
-
`;
|
|
171
|
-
const flowContent = `
|
|
172
|
-
import { narrative } from '../narrative.js';
|
|
173
|
-
|
|
174
|
-
narrative('TestFlow', () => {
|
|
175
|
-
const x: string = 'test';
|
|
176
|
-
});
|
|
177
|
-
`;
|
|
178
|
-
await vfs.write('/test/types.d.ts', new TextEncoder().encode(dtsContent));
|
|
179
|
-
await vfs.write('/test/test.narrative.ts', new TextEncoder().encode(flowContent));
|
|
180
|
-
const result = await getNarratives({ vfs, root, pattern, fastFsScan: true, importMap });
|
|
181
|
-
expect(result.vfsFiles.some((f) => f.endsWith('.d.ts'))).toBe(false);
|
|
182
|
-
});
|
|
183
|
-
it('should rebuild when import map keys change even with same values', async () => {
|
|
184
|
-
const flowContent = `
|
|
185
|
-
import { narrative } from '../narrative.js';
|
|
186
|
-
|
|
187
|
-
narrative('TestFlow', () => {
|
|
188
|
-
const x = 1;
|
|
189
|
-
});
|
|
190
|
-
`;
|
|
191
|
-
await vfs.write('/test/test.narrative.ts', new TextEncoder().encode(flowContent));
|
|
192
|
-
const importMap1 = { 'module-a': 'value', 'module-b': 'value' };
|
|
193
|
-
const result1 = await getNarratives({ vfs, root, importMap: importMap1, pattern, fastFsScan: true });
|
|
194
|
-
const importMap2 = { 'module-c': 'value', 'module-d': 'value' };
|
|
195
|
-
const result2 = await getNarratives({ vfs, root, importMap: importMap2, pattern, fastFsScan: true });
|
|
196
|
-
expect(result1.narratives).toEqual(result2.narratives); // Same flows
|
|
197
|
-
});
|
|
198
|
-
it('should handle complex transitive dependency chains', async () => {
|
|
199
|
-
const chain3Content = `
|
|
200
|
-
export const DEEP_VALUE = 'deep';
|
|
201
|
-
`;
|
|
202
|
-
const chain2Content = `
|
|
203
|
-
import { DEEP_VALUE } from './chain3.js';
|
|
204
|
-
export const MID_VALUE = DEEP_VALUE + '-mid';
|
|
205
|
-
`;
|
|
206
|
-
const chain1Content = `
|
|
207
|
-
import { MID_VALUE } from './chain2.js';
|
|
208
|
-
export const TOP_VALUE = MID_VALUE + '-top';
|
|
209
|
-
`;
|
|
210
|
-
const flowContent = `
|
|
211
|
-
import { narrative } from '../narrative.js';
|
|
212
|
-
import { TOP_VALUE } from './chain1.js';
|
|
213
|
-
|
|
214
|
-
narrative('TestFlow', () => {
|
|
215
|
-
const val = TOP_VALUE;
|
|
216
|
-
});
|
|
217
|
-
`;
|
|
218
|
-
await vfs.write('/test/chain3.ts', new TextEncoder().encode(chain3Content));
|
|
219
|
-
await vfs.write('/test/chain2.ts', new TextEncoder().encode(chain2Content));
|
|
220
|
-
await vfs.write('/test/chain1.ts', new TextEncoder().encode(chain1Content));
|
|
221
|
-
await vfs.write('/test/test.narrative.ts', new TextEncoder().encode(flowContent));
|
|
222
|
-
const result1 = await getNarratives({ vfs, root, pattern, fastFsScan: true, importMap });
|
|
223
|
-
expect(result1.vfsFiles.some((f) => f.includes('chain1'))).toBe(true);
|
|
224
|
-
expect(result1.vfsFiles.some((f) => f.includes('chain2'))).toBe(true);
|
|
225
|
-
expect(result1.vfsFiles.some((f) => f.includes('chain3'))).toBe(true);
|
|
226
|
-
const modifiedChain3Content = `
|
|
227
|
-
export const DEEP_VALUE = 'modified-deep';
|
|
228
|
-
`;
|
|
229
|
-
await vfs.write('/test/chain3.ts', new TextEncoder().encode(modifiedChain3Content));
|
|
230
|
-
const result2 = await getNarratives({ vfs, root, pattern, fastFsScan: true, importMap });
|
|
231
|
-
expect(result2.vfsFiles.length).toBe(result1.vfsFiles.length);
|
|
232
|
-
});
|
|
233
|
-
});
|
|
234
|
-
//# sourceMappingURL=getNarratives.cache.specs.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"getNarratives.cache.specs.js","sourceRoot":"","sources":["../../src/getNarratives.cache.specs.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"getNarratives.specs.d.ts","sourceRoot":"","sources":["../../src/getNarratives.specs.ts"],"names":[],"mappings":""}
|