@auto-engineer/narrative 0.16.0 → 0.17.1
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 +26 -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 +16 -3
- 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 +4 -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 +17 -3
- 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.test.json +2 -1
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export function toMessageKey(kind, name) {
|
|
2
|
+
return `${kind}:${name}`;
|
|
3
|
+
}
|
|
4
|
+
function isMessageKind(value) {
|
|
5
|
+
return value === 'command' || value === 'event' || value === 'state';
|
|
6
|
+
}
|
|
7
|
+
export function parseMessageKey(key) {
|
|
8
|
+
const colonIndex = key.indexOf(':');
|
|
9
|
+
if (colonIndex === -1) {
|
|
10
|
+
throw new Error(`Invalid message key format: ${key}`);
|
|
11
|
+
}
|
|
12
|
+
const kindStr = key.slice(0, colonIndex);
|
|
13
|
+
if (!isMessageKind(kindStr)) {
|
|
14
|
+
throw new Error(`Invalid message kind: ${kindStr}`);
|
|
15
|
+
}
|
|
16
|
+
const name = key.slice(colonIndex + 1);
|
|
17
|
+
return { kind: kindStr, name };
|
|
18
|
+
}
|
|
19
|
+
export function sortMessagesByKey(messages) {
|
|
20
|
+
return [...messages].sort((a, b) => {
|
|
21
|
+
const keyA = toMessageKey(a.kind, a.name);
|
|
22
|
+
const keyB = toMessageKey(b.kind, b.name);
|
|
23
|
+
return keyA.localeCompare(keyB);
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
export function sortFilesByPath(files) {
|
|
27
|
+
return [...files].sort((a, b) => a.path.localeCompare(b.path));
|
|
28
|
+
}
|
|
29
|
+
export function sortImportsBySource(imports) {
|
|
30
|
+
return [...imports]
|
|
31
|
+
.map((imp) => ({
|
|
32
|
+
...imp,
|
|
33
|
+
typeNames: [...imp.typeNames].sort((a, b) => a.localeCompare(b)),
|
|
34
|
+
}))
|
|
35
|
+
.sort((a, b) => a.fromPath.localeCompare(b.fromPath));
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=ordering.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ordering.js","sourceRoot":"","sources":["../../../../src/transformers/model-to-narrative/ordering.ts"],"names":[],"mappings":"AAKA,MAAM,UAAU,YAAY,CAAC,IAAiB,EAAE,IAAY;IAC1D,OAAO,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC;AAC3B,CAAC;AAED,SAAS,aAAa,CAAC,KAAa;IAClC,OAAO,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,OAAO,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,GAAW;IACzC,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACpC,IAAI,UAAU,KAAK,CAAC,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,+BAA+B,GAAG,EAAE,CAAC,CAAC;IACxD,CAAC;IACD,MAAM,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;IACzC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,yBAAyB,OAAO,EAAE,CAAC,CAAC;IACtD,CAAC;IACD,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;IACvC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAuB,QAAa;IACnE,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACjC,MAAM,IAAI,GAAG,YAAY,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QAC1C,MAAM,IAAI,GAAG,YAAY,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QAC1C,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,eAAe,CAA0B,KAAU;IACjE,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACjE,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,OAA4B;IAC9D,OAAO,CAAC,GAAG,OAAO,CAAC;SAChB,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACb,GAAG,GAAG;QACN,SAAS,EAAE,CAAC,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;KACjE,CAAC,CAAC;SACF,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC1D,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spec-traversal.d.ts","sourceRoot":"","sources":["../../../../src/transformers/model-to-narrative/spec-traversal.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,wBAAgB,gCAAgC,CAAC,UAAU,EAAE,SAAS,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,CAUrF"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
export function collectMessageKeysFromNarratives(narratives) {
|
|
2
|
+
const usedKeys = new Set();
|
|
3
|
+
for (const narrative of narratives) {
|
|
4
|
+
for (const slice of narrative.slices) {
|
|
5
|
+
collectMessageKeysFromSlice(slice, usedKeys);
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
return usedKeys;
|
|
9
|
+
}
|
|
10
|
+
function collectMessageKeysFromSlice(slice, usedKeys) {
|
|
11
|
+
if (slice.type !== 'command' && slice.type !== 'query' && slice.type !== 'react') {
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
const specs = slice.server?.specs;
|
|
15
|
+
if (!Array.isArray(specs)) {
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
for (const spec of specs) {
|
|
19
|
+
if (!spec.rules || !Array.isArray(spec.rules)) {
|
|
20
|
+
continue;
|
|
21
|
+
}
|
|
22
|
+
for (const rule of spec.rules) {
|
|
23
|
+
if (!rule.examples || !Array.isArray(rule.examples)) {
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
26
|
+
for (const example of rule.examples) {
|
|
27
|
+
if (!example.steps || !Array.isArray(example.steps)) {
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
30
|
+
for (const step of example.steps) {
|
|
31
|
+
collectMessageKeyFromStep(step, usedKeys);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
function collectMessageKeyFromStep(step, usedKeys) {
|
|
38
|
+
if (!('text' in step) || !step.text) {
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
const keyword = step.keyword;
|
|
42
|
+
if (keyword === 'Given' || keyword === 'And') {
|
|
43
|
+
usedKeys.add(`event:${step.text}`);
|
|
44
|
+
usedKeys.add(`state:${step.text}`);
|
|
45
|
+
}
|
|
46
|
+
else if (keyword === 'When') {
|
|
47
|
+
usedKeys.add(`command:${step.text}`);
|
|
48
|
+
}
|
|
49
|
+
else if (keyword === 'Then') {
|
|
50
|
+
usedKeys.add(`event:${step.text}`);
|
|
51
|
+
usedKeys.add(`state:${step.text}`);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=spec-traversal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spec-traversal.js","sourceRoot":"","sources":["../../../../src/transformers/model-to-narrative/spec-traversal.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,gCAAgC,CAAC,UAAuB;IACtE,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IAEnC,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,KAAK,MAAM,KAAK,IAAI,SAAS,CAAC,MAAM,EAAE,CAAC;YACrC,2BAA2B,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,2BAA2B,CAAC,KAAkC,EAAE,QAAqB;IAC5F,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QACjF,OAAO;IACT,CAAC;IAED,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC;IAClC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO;IACT,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9C,SAAS;QACX,CAAC;QAED,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC9B,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACpD,SAAS;YACX,CAAC;YAED,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACpC,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;oBACpD,SAAS;gBACX,CAAC;gBAED,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;oBACjC,yBAAyB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;gBAC5C,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,yBAAyB,CAAC,IAAyC,EAAE,QAAqB;IACjG,IAAI,CAAC,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACpC,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;IAC7B,IAAI,OAAO,KAAK,OAAO,IAAI,OAAO,KAAK,KAAK,EAAE,CAAC;QAC7C,QAAQ,CAAC,GAAG,CAAC,SAAS,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QACnC,QAAQ,CAAC,GAAG,CAAC,SAAS,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IACrC,CAAC;SAAM,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QAC9B,QAAQ,CAAC,GAAG,CAAC,WAAW,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IACvC,CAAC;SAAM,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QAC9B,QAAQ,CAAC,GAAG,CAAC,SAAS,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QACnC,QAAQ,CAAC,GAAG,CAAC,SAAS,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IACrC,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface GeneratedFile {
|
|
2
|
+
path: string;
|
|
3
|
+
code: string;
|
|
4
|
+
}
|
|
5
|
+
export interface GeneratedNarratives {
|
|
6
|
+
files: GeneratedFile[];
|
|
7
|
+
}
|
|
8
|
+
export interface CrossModuleImport {
|
|
9
|
+
fromPath: string;
|
|
10
|
+
typeNames: string[];
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/transformers/model-to-narrative/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,aAAa,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/transformers/model-to-narrative/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Model } from '../../index';
|
|
2
|
+
export interface ValidationError {
|
|
3
|
+
type: 'duplicate_id' | 'derived_id_mismatch' | 'narrative_unassigned' | 'narrative_multi_assigned' | 'message_multi_declared' | 'message_undeclared' | 'narrative_not_found';
|
|
4
|
+
message: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function validateModules(model: Model): ValidationError[];
|
|
7
|
+
export declare function throwOnValidationErrors(errors: ValidationError[]): void;
|
|
8
|
+
//# sourceMappingURL=validate-modules.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-modules.d.ts","sourceRoot":"","sources":["../../../../src/transformers/model-to-narrative/validate-modules.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAGzC,MAAM,WAAW,eAAe;IAC9B,IAAI,EACA,cAAc,GACd,qBAAqB,GACrB,sBAAsB,GACtB,0BAA0B,GAC1B,wBAAwB,GACxB,oBAAoB,GACpB,qBAAqB,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,KAAK,GAAG,eAAe,EAAE,CAoB/D;AAsHD,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,eAAe,EAAE,GAAG,IAAI,CAKvE"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { toMessageKey } from './ordering.js';
|
|
2
|
+
export function validateModules(model) {
|
|
3
|
+
const errors = [];
|
|
4
|
+
const modules = model.modules ?? [];
|
|
5
|
+
if (modules.length === 0) {
|
|
6
|
+
return errors;
|
|
7
|
+
}
|
|
8
|
+
errors.push(...validateUniqueModuleIds(modules));
|
|
9
|
+
errors.push(...validateDerivedModuleIds(modules));
|
|
10
|
+
const authoredModules = modules.filter((m) => !m.isDerived);
|
|
11
|
+
if (authoredModules.length === 0) {
|
|
12
|
+
return errors;
|
|
13
|
+
}
|
|
14
|
+
errors.push(...validateNarrativeAssignments(authoredModules, model));
|
|
15
|
+
errors.push(...validateMessageDeclarations(authoredModules, model));
|
|
16
|
+
return errors;
|
|
17
|
+
}
|
|
18
|
+
function validateUniqueModuleIds(modules) {
|
|
19
|
+
const errors = [];
|
|
20
|
+
const idCounts = new Map();
|
|
21
|
+
for (const module of modules) {
|
|
22
|
+
idCounts.set(module.id, (idCounts.get(module.id) ?? 0) + 1);
|
|
23
|
+
}
|
|
24
|
+
for (const [id, count] of idCounts) {
|
|
25
|
+
if (count > 1) {
|
|
26
|
+
errors.push({
|
|
27
|
+
type: 'duplicate_id',
|
|
28
|
+
message: `Module ID '${id}' is used by ${count} modules`,
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return errors;
|
|
33
|
+
}
|
|
34
|
+
function validateDerivedModuleIds(modules) {
|
|
35
|
+
const errors = [];
|
|
36
|
+
for (const module of modules) {
|
|
37
|
+
if (module.isDerived && module.id !== module.sourceFile) {
|
|
38
|
+
errors.push({
|
|
39
|
+
type: 'derived_id_mismatch',
|
|
40
|
+
message: `Derived module ID '${module.id}' must equal sourceFile '${module.sourceFile}'`,
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return errors;
|
|
45
|
+
}
|
|
46
|
+
function validateNarrativeAssignments(authoredModules, model) {
|
|
47
|
+
const errors = [];
|
|
48
|
+
const narrativeAssignments = new Map();
|
|
49
|
+
for (const module of authoredModules) {
|
|
50
|
+
for (const narrativeId of module.contains.narrativeIds) {
|
|
51
|
+
if (!narrativeAssignments.has(narrativeId)) {
|
|
52
|
+
narrativeAssignments.set(narrativeId, []);
|
|
53
|
+
}
|
|
54
|
+
narrativeAssignments.get(narrativeId).push(module.id);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
const modelNarrativeIds = new Set(model.narratives.map((n) => n.id).filter((id) => id !== undefined));
|
|
58
|
+
for (const [narrativeId, moduleIds] of narrativeAssignments) {
|
|
59
|
+
if (!modelNarrativeIds.has(narrativeId)) {
|
|
60
|
+
errors.push({
|
|
61
|
+
type: 'narrative_not_found',
|
|
62
|
+
message: `Narrative '${narrativeId}' referenced by module(s) [${moduleIds.join(', ')}] does not exist`,
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
if (moduleIds.length > 1) {
|
|
66
|
+
errors.push({
|
|
67
|
+
type: 'narrative_multi_assigned',
|
|
68
|
+
message: `Narrative '${narrativeId}' is assigned to multiple modules: [${moduleIds.join(', ')}]`,
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
const assignedNarrativeIds = new Set(narrativeAssignments.keys());
|
|
73
|
+
for (const narrative of model.narratives) {
|
|
74
|
+
if (narrative.id && !assignedNarrativeIds.has(narrative.id)) {
|
|
75
|
+
errors.push({
|
|
76
|
+
type: 'narrative_unassigned',
|
|
77
|
+
message: `Narrative '${narrative.id}' (${narrative.name}) is not assigned to any module`,
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return errors;
|
|
82
|
+
}
|
|
83
|
+
function validateMessageDeclarations(authoredModules, model) {
|
|
84
|
+
const errors = [];
|
|
85
|
+
const messageDeclarations = new Map();
|
|
86
|
+
for (const module of authoredModules) {
|
|
87
|
+
for (const msg of module.declares.messages) {
|
|
88
|
+
const key = toMessageKey(msg.kind, msg.name);
|
|
89
|
+
if (!messageDeclarations.has(key)) {
|
|
90
|
+
messageDeclarations.set(key, []);
|
|
91
|
+
}
|
|
92
|
+
messageDeclarations.get(key).push(module.id);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
for (const [msgKey, moduleIds] of messageDeclarations) {
|
|
96
|
+
if (moduleIds.length > 1) {
|
|
97
|
+
errors.push({
|
|
98
|
+
type: 'message_multi_declared',
|
|
99
|
+
message: `Message '${msgKey}' is declared by multiple modules: [${moduleIds.join(', ')}]`,
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
const declaredMessages = new Set(messageDeclarations.keys());
|
|
104
|
+
const modelMessageKeys = new Set(model.messages.map((m) => toMessageKey(m.type, m.name)));
|
|
105
|
+
for (const msgKey of modelMessageKeys) {
|
|
106
|
+
if (!declaredMessages.has(msgKey)) {
|
|
107
|
+
errors.push({
|
|
108
|
+
type: 'message_undeclared',
|
|
109
|
+
message: `Message '${msgKey}' exists in model but is not declared by any authored module`,
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
return errors;
|
|
114
|
+
}
|
|
115
|
+
export function throwOnValidationErrors(errors) {
|
|
116
|
+
if (errors.length > 0) {
|
|
117
|
+
const messages = errors.map((e) => ` - ${e.message}`).join('\n');
|
|
118
|
+
throw new Error(`Module validation failed:\n${messages}`);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=validate-modules.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-modules.js","sourceRoot":"","sources":["../../../../src/transformers/model-to-narrative/validate-modules.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assemble.d.ts","sourceRoot":"","sources":["../../../../src/transformers/narrative-to-model/assemble.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"assemble.d.ts","sourceRoot":"","sources":["../../../../src/transformers/narrative-to-model/assemble.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAW,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAG7D,wBAAgB,aAAa,CAAC,UAAU,EAAE,SAAS,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,YAAY,EAAE,OAAO,EAAE,GAAG,KAAK,CAW1G"}
|
|
@@ -1,9 +1,13 @@
|
|
|
1
|
+
import { deriveModules } from './derive-modules.js';
|
|
1
2
|
export function assembleSpecs(narratives, messages, integrations) {
|
|
3
|
+
const typedMessages = messages;
|
|
4
|
+
const modules = deriveModules(narratives, typedMessages);
|
|
2
5
|
return {
|
|
3
6
|
variant: 'specs',
|
|
4
7
|
narratives,
|
|
5
|
-
messages:
|
|
8
|
+
messages: typedMessages,
|
|
6
9
|
integrations: integrations,
|
|
10
|
+
modules,
|
|
7
11
|
};
|
|
8
12
|
}
|
|
9
13
|
//# sourceMappingURL=assemble.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assemble.js","sourceRoot":"","sources":["../../../../src/transformers/narrative-to-model/assemble.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"assemble.js","sourceRoot":"","sources":["../../../../src/transformers/narrative-to-model/assemble.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD,MAAM,UAAU,aAAa,CAAC,UAAuB,EAAE,QAAmB,EAAE,YAAuB;IACjG,MAAM,aAAa,GAAG,QAAqB,CAAC;IAC5C,MAAM,OAAO,GAAG,aAAa,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;IAEzD,OAAO;QACL,OAAO,EAAE,OAAgB;QACzB,UAAU;QACV,QAAQ,EAAE,aAAa;QACvB,YAAY,EAAE,YAAqC;QACnD,OAAO;KACR,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"derive-modules.d.ts","sourceRoot":"","sources":["../../../../src/transformers/narrative-to-model/derive-modules.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAI9D,wBAAgB,aAAa,CAAC,UAAU,EAAE,SAAS,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,MAAM,EAAE,CAiBpF"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
const DEFAULT_SOURCE_FILE = 'generated.narrative.ts';
|
|
2
|
+
export function deriveModules(narratives, messages) {
|
|
3
|
+
const bySourceFile = groupNarrativesBySourceFile(narratives);
|
|
4
|
+
return Array.from(bySourceFile.entries()).map(([sourceFile, narrs], index) => {
|
|
5
|
+
const narrativeIds = narrs.map((n, i) => n.id ?? `__derived_${index}_${i}_${n.name}`);
|
|
6
|
+
const messageRefs = messages
|
|
7
|
+
.map((m) => ({ kind: m.type, name: m.name }))
|
|
8
|
+
.sort((a, b) => `${a.kind}:${a.name}`.localeCompare(`${b.kind}:${b.name}`));
|
|
9
|
+
return {
|
|
10
|
+
id: sourceFile,
|
|
11
|
+
sourceFile,
|
|
12
|
+
isDerived: true,
|
|
13
|
+
contains: { narrativeIds },
|
|
14
|
+
declares: { messages: messageRefs },
|
|
15
|
+
};
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
function groupNarrativesBySourceFile(narratives) {
|
|
19
|
+
const groups = new Map();
|
|
20
|
+
for (const narrative of narratives) {
|
|
21
|
+
const sourceFile = narrative.sourceFile ?? DEFAULT_SOURCE_FILE;
|
|
22
|
+
if (!groups.has(sourceFile)) {
|
|
23
|
+
groups.set(sourceFile, []);
|
|
24
|
+
}
|
|
25
|
+
groups.get(sourceFile).push(narrative);
|
|
26
|
+
}
|
|
27
|
+
return groups;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=derive-modules.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"derive-modules.js","sourceRoot":"","sources":["../../../../src/transformers/narrative-to-model/derive-modules.ts"],"names":[],"mappings":"AAEA,MAAM,mBAAmB,GAAG,wBAAwB,CAAC;AAErD,MAAM,UAAU,aAAa,CAAC,UAAuB,EAAE,QAAmB;IACxE,MAAM,YAAY,GAAG,2BAA2B,CAAC,UAAU,CAAC,CAAC;IAE7D,OAAO,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,EAAE,KAAK,CAAC,EAAE,KAAK,EAAE,EAAE;QAC3E,MAAM,YAAY,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,aAAa,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACtF,MAAM,WAAW,GAAG,QAAQ;aACzB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;aAC5C,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAE9E,OAAO;YACL,EAAE,EAAE,UAAU;YACd,UAAU;YACV,SAAS,EAAE,IAAI;YACf,QAAQ,EAAE,EAAE,YAAY,EAAE;YAC1B,QAAQ,EAAE,EAAE,QAAQ,EAAE,WAAW,EAAE;SACpC,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,2BAA2B,CAAC,UAAuB;IAC1D,MAAM,MAAM,GAAG,IAAI,GAAG,EAAuB,CAAC;IAE9C,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,MAAM,UAAU,GAAG,SAAS,CAAC,UAAU,IAAI,mBAAmB,CAAC;QAC/D,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;YAC5B,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QAC7B,CAAC;QACD,MAAM,CAAC,GAAG,CAAC,UAAU,CAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC1C,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|