@sdd-method/sdd-cli 3.0.0 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (126) hide show
  1. package/dist/index.d.ts.map +1 -1
  2. package/dist/index.js +4 -0
  3. package/dist/index.js.map +1 -1
  4. package/dist/lib/catalogue/aggregate.d.ts.map +1 -1
  5. package/dist/lib/catalogue/aggregate.js +2 -0
  6. package/dist/lib/catalogue/aggregate.js.map +1 -1
  7. package/dist/lib/catalogue/build.d.ts +3 -1
  8. package/dist/lib/catalogue/build.d.ts.map +1 -1
  9. package/dist/lib/catalogue/build.js +33 -2
  10. package/dist/lib/catalogue/build.js.map +1 -1
  11. package/dist/lib/catalogue/builders/adr-governs.d.ts +4 -0
  12. package/dist/lib/catalogue/builders/adr-governs.d.ts.map +1 -0
  13. package/dist/lib/catalogue/builders/adr-governs.js +39 -0
  14. package/dist/lib/catalogue/builders/adr-governs.js.map +1 -0
  15. package/dist/lib/catalogue/builders/adrs.d.ts +2 -0
  16. package/dist/lib/catalogue/builders/adrs.d.ts.map +1 -1
  17. package/dist/lib/catalogue/builders/adrs.js +11 -0
  18. package/dist/lib/catalogue/builders/adrs.js.map +1 -1
  19. package/dist/lib/catalogue/builders/contract-revisions.d.ts +12 -0
  20. package/dist/lib/catalogue/builders/contract-revisions.d.ts.map +1 -0
  21. package/dist/lib/catalogue/builders/contract-revisions.js +126 -0
  22. package/dist/lib/catalogue/builders/contract-revisions.js.map +1 -0
  23. package/dist/lib/catalogue/builders/data-model.d.ts +73 -0
  24. package/dist/lib/catalogue/builders/data-model.d.ts.map +1 -0
  25. package/dist/lib/catalogue/builders/data-model.js +316 -0
  26. package/dist/lib/catalogue/builders/data-model.js.map +1 -0
  27. package/dist/lib/catalogue/builders/entities-mermaid.d.ts.map +1 -1
  28. package/dist/lib/catalogue/builders/entities-mermaid.js +18 -85
  29. package/dist/lib/catalogue/builders/entities-mermaid.js.map +1 -1
  30. package/dist/lib/catalogue/builders/integration-components.js +49 -5
  31. package/dist/lib/catalogue/builders/integration-components.js.map +1 -1
  32. package/dist/lib/catalogue/builders/quality-scores.d.ts.map +1 -1
  33. package/dist/lib/catalogue/builders/quality-scores.js +17 -0
  34. package/dist/lib/catalogue/builders/quality-scores.js.map +1 -1
  35. package/dist/lib/catalogue/builders/requirements.d.ts +7 -1
  36. package/dist/lib/catalogue/builders/requirements.d.ts.map +1 -1
  37. package/dist/lib/catalogue/builders/requirements.js +132 -23
  38. package/dist/lib/catalogue/builders/requirements.js.map +1 -1
  39. package/dist/lib/catalogue/canonical-schema.yaml +767 -17
  40. package/dist/lib/catalogue/retired-catalogues.d.ts +6 -0
  41. package/dist/lib/catalogue/retired-catalogues.d.ts.map +1 -0
  42. package/dist/lib/catalogue/retired-catalogues.js +25 -0
  43. package/dist/lib/catalogue/retired-catalogues.js.map +1 -0
  44. package/dist/lib/catalogue/rubric-coverage-map.yaml +90 -2
  45. package/dist/lib/catalogue/schema-compat.d.ts +1 -1
  46. package/dist/lib/catalogue/schema-compat.js +1 -1
  47. package/dist/lib/catalogue/schema-loader.d.ts +6 -0
  48. package/dist/lib/catalogue/schema-loader.d.ts.map +1 -1
  49. package/dist/lib/catalogue/schema-loader.js +3 -0
  50. package/dist/lib/catalogue/schema-loader.js.map +1 -1
  51. package/dist/lib/catalogue/staleness-verdicts.d.ts.map +1 -1
  52. package/dist/lib/catalogue/staleness-verdicts.js +75 -6
  53. package/dist/lib/catalogue/staleness-verdicts.js.map +1 -1
  54. package/dist/lib/metamodel/roundtrip-gate.d.ts.map +1 -1
  55. package/dist/lib/metamodel/roundtrip-gate.js +3 -0
  56. package/dist/lib/metamodel/roundtrip-gate.js.map +1 -1
  57. package/dist/lib/metamodel/schema-projection.d.ts +6 -0
  58. package/dist/lib/metamodel/schema-projection.d.ts.map +1 -1
  59. package/dist/lib/metamodel/schema-projection.js +27 -1
  60. package/dist/lib/metamodel/schema-projection.js.map +1 -1
  61. package/dist/lib/structure/apply.d.ts +8 -0
  62. package/dist/lib/structure/apply.d.ts.map +1 -0
  63. package/dist/lib/structure/apply.js +71 -0
  64. package/dist/lib/structure/apply.js.map +1 -0
  65. package/dist/lib/structure/archive.d.ts +21 -0
  66. package/dist/lib/structure/archive.d.ts.map +1 -0
  67. package/dist/lib/structure/archive.js +318 -0
  68. package/dist/lib/structure/archive.js.map +1 -0
  69. package/dist/lib/structure/catalogue.d.ts +33 -0
  70. package/dist/lib/structure/catalogue.d.ts.map +1 -0
  71. package/dist/lib/structure/catalogue.js +183 -0
  72. package/dist/lib/structure/catalogue.js.map +1 -0
  73. package/dist/lib/structure/compose.d.ts +30 -0
  74. package/dist/lib/structure/compose.d.ts.map +1 -0
  75. package/dist/lib/structure/compose.js +174 -0
  76. package/dist/lib/structure/compose.js.map +1 -0
  77. package/dist/lib/structure/effects.d.ts +16 -0
  78. package/dist/lib/structure/effects.d.ts.map +1 -0
  79. package/dist/lib/structure/effects.js +36 -0
  80. package/dist/lib/structure/effects.js.map +1 -0
  81. package/dist/lib/structure/extract.d.ts +19 -0
  82. package/dist/lib/structure/extract.d.ts.map +1 -0
  83. package/dist/lib/structure/extract.js +123 -0
  84. package/dist/lib/structure/extract.js.map +1 -0
  85. package/dist/lib/structure/model.d.ts +57 -0
  86. package/dist/lib/structure/model.d.ts.map +1 -0
  87. package/dist/lib/structure/model.js +212 -0
  88. package/dist/lib/structure/model.js.map +1 -0
  89. package/dist/lib/structure/render.d.ts +11 -0
  90. package/dist/lib/structure/render.d.ts.map +1 -0
  91. package/dist/lib/structure/render.js +242 -0
  92. package/dist/lib/structure/render.js.map +1 -0
  93. package/dist/lib/structure/view.d.ts +36 -0
  94. package/dist/lib/structure/view.d.ts.map +1 -0
  95. package/dist/lib/structure/view.js +301 -0
  96. package/dist/lib/structure/view.js.map +1 -0
  97. package/dist/lib/validate/agreement-evidence.d.ts +8 -2
  98. package/dist/lib/validate/agreement-evidence.d.ts.map +1 -1
  99. package/dist/lib/validate/agreement-evidence.js +20 -8
  100. package/dist/lib/validate/agreement-evidence.js.map +1 -1
  101. package/dist/lib/validate/behaviour-store.d.ts +5 -0
  102. package/dist/lib/validate/behaviour-store.d.ts.map +1 -1
  103. package/dist/lib/validate/behaviour-store.js +54 -13
  104. package/dist/lib/validate/behaviour-store.js.map +1 -1
  105. package/dist/lib/validate/dispatch.d.ts.map +1 -1
  106. package/dist/lib/validate/dispatch.js +7 -0
  107. package/dist/lib/validate/dispatch.js.map +1 -1
  108. package/dist/lib/validate/structural-model.d.ts +11 -0
  109. package/dist/lib/validate/structural-model.d.ts.map +1 -0
  110. package/dist/lib/validate/structural-model.js +265 -0
  111. package/dist/lib/validate/structural-model.js.map +1 -0
  112. package/dist/maintain-version.json +2 -2
  113. package/dist/verbs/change.d.ts +3 -0
  114. package/dist/verbs/change.d.ts.map +1 -0
  115. package/dist/verbs/change.js +15 -0
  116. package/dist/verbs/change.js.map +1 -0
  117. package/dist/verbs/structure.d.ts +10 -0
  118. package/dist/verbs/structure.d.ts.map +1 -0
  119. package/dist/verbs/structure.js +124 -0
  120. package/dist/verbs/structure.js.map +1 -0
  121. package/dist/verify-version.json +2 -2
  122. package/package.json +1 -1
  123. package/scripts/author-version.json +2 -2
  124. package/scripts/build-persona-package.mjs +5 -0
  125. package/scripts/maintain-version.json +2 -2
  126. package/scripts/verify-version.json +2 -2
@@ -0,0 +1,126 @@
1
+ // contract_revisions: a contract version's content revisions, by digest (M-ADR 0230 §4.2, Proposed; schema 6.0.0).
2
+ // active the contract file's current content (deprecated where the contract is)
3
+ // agreed a revision an agreed open change agrees (agreement record 1.2.0, contracts[].agrees)
4
+ // retired a revision an archived change agreed that the file no longer holds
5
+ // An archived change that agreed the current content is the active revision's change. A compatible amendment is a
6
+ // new revision at the same path, so an agreed revision and the active one coexist.
7
+ //
8
+ // A record names a contract by the file in its own repository (`file:`, or a `files:` list), which the catalogue holds
9
+ // under the SDD's mount of that repository; so a record's file matches the contract whose spec_path ends with it, and
10
+ // a file matching no contract, or several, is a finding and produces no row. `relies_on` and `agrees` are a digest
11
+ // beside `file:`, or a map from each file to its digest beside `files:`. A `relies_on` that no longer matches the
12
+ // file's content is reported: the change relies on a revision that has moved, and is re-agreed.
13
+ import { createHash } from "node:crypto";
14
+ import { readdir, readFile } from "node:fs/promises";
15
+ import { join } from "node:path";
16
+ import { parse as parseYaml } from "yaml";
17
+ const AGREEMENTS = join("docs", "agreements");
18
+ const DIGEST = /^sha256:[0-9a-f]{64}$/;
19
+ export function contentDigest(bytes) {
20
+ return `sha256:${createHash("sha256").update(bytes).digest("hex")}`;
21
+ }
22
+ const revisionId = (contract, digest) => `${contract}@${digest.slice("sha256:".length, "sha256:".length + 12)}`;
23
+ /** Each (file, relies_on, agrees) a record's contracts list pins. */
24
+ function pins(record, where, findings) {
25
+ const r = record?.agreement_record;
26
+ if (!Array.isArray(r?.contracts))
27
+ return [];
28
+ const out = [];
29
+ for (const [i, raw] of r.contracts.entries()) {
30
+ const c = raw;
31
+ if (!c)
32
+ continue;
33
+ const files = typeof c["file"] === "string" ? [c["file"]] : Array.isArray(c["files"]) ? c["files"].map(String) : [];
34
+ const digestFor = (key, file) => {
35
+ const v = c[key];
36
+ if (v === undefined)
37
+ return undefined;
38
+ const d = typeof v === "string" && typeof c["file"] === "string" ? v : typeof v === "object" && v !== null ? v[file] : undefined;
39
+ if (d === undefined)
40
+ return undefined;
41
+ if (typeof d !== "string" || !DIGEST.test(d)) {
42
+ findings.add("convention", `${where}: contracts[${i}].${key} for ${file} is not a sha256:<64 hex> digest`);
43
+ return undefined;
44
+ }
45
+ return d;
46
+ };
47
+ for (const file of files) {
48
+ const reliesOn = digestFor("relies_on", file);
49
+ const agrees = digestFor("agrees", file);
50
+ if (reliesOn || agrees)
51
+ out.push({ file, ...(reliesOn ? { reliesOn } : {}), ...(agrees ? { agrees } : {}) });
52
+ }
53
+ }
54
+ return out;
55
+ }
56
+ export async function buildContractRevisions(inputs) {
57
+ const { sddPath, findings } = inputs;
58
+ const rows = new Map();
59
+ const current = new Map(); // contract id -> current digest
60
+ for (const c of inputs.contracts) {
61
+ const path = String(c["spec_path"] ?? "");
62
+ if (path === "")
63
+ continue;
64
+ const bytes = await readFile(join(sddPath, path)).catch(() => null);
65
+ if (bytes === null)
66
+ continue;
67
+ const id = String(c["id"]);
68
+ const digest = contentDigest(bytes);
69
+ current.set(id, digest);
70
+ const rid = revisionId(id, digest);
71
+ rows.set(rid, { id: rid, contract_id: id, digest, state: c["status"] === "deprecated" ? "deprecated" : "active", sunset_date: "", change_id: "", source_sdd_id: "", platform_sdd_id: "" });
72
+ }
73
+ const byFile = (file) => inputs.contracts.filter((c) => String(c["spec_path"] ?? "").endsWith(`/${file}`) || c["spec_path"] === file).map((c) => String(c["id"]));
74
+ let names = [];
75
+ try {
76
+ names = (await readdir(join(sddPath, AGREEMENTS))).filter((n) => n.endsWith(".yaml")).sort();
77
+ }
78
+ catch {
79
+ names = [];
80
+ }
81
+ for (const name of names) {
82
+ const change = name.slice(0, -".yaml".length);
83
+ const where = join(AGREEMENTS, name);
84
+ let doc;
85
+ try {
86
+ doc = parseYaml(await readFile(join(sddPath, where), "utf8"));
87
+ }
88
+ catch {
89
+ continue; // the behaviour-store check reports an unparseable record
90
+ }
91
+ const changeRows = inputs.changes.filter((c) => c["name"] === change);
92
+ const archived = changeRows.find((c) => c["status"] === "archived");
93
+ const open = changeRows.find((c) => c["status"] !== "archived");
94
+ const state = archived ? "archived" : open?.["status"] === "agreed" ? "agreed" : "other";
95
+ if (state === "other")
96
+ continue;
97
+ const changeId = String((archived ?? open)["id"]);
98
+ for (const p of pins(doc, where, findings)) {
99
+ const matches = byFile(p.file);
100
+ if (matches.length !== 1) {
101
+ findings.add("convention", `${where}: contract file ${p.file} matches ${matches.length === 0 ? "no catalogued contract" : `${matches.length} catalogued contracts (${matches.join(", ")})`}; no revision row`);
102
+ continue;
103
+ }
104
+ const contract = matches[0];
105
+ const now = current.get(contract);
106
+ if (state === "agreed" && p.reliesOn && now && p.reliesOn !== now) {
107
+ findings.add("divergence", `${where}: relies on revision ${p.reliesOn.slice(0, 19)}… of ${contract}, which has moved to ${now.slice(0, 19)}…; the change relies on a revision no longer published, so it is re-agreed (M-ADR 0230 §4.2, Proposed)`);
108
+ }
109
+ if (!p.agrees)
110
+ continue;
111
+ const rid = revisionId(contract, p.agrees);
112
+ const existing = rows.get(rid);
113
+ if (p.agrees === now) {
114
+ if (existing && state === "archived")
115
+ rows.set(rid, { ...existing, change_id: changeId });
116
+ continue;
117
+ }
118
+ if (state === "agreed")
119
+ rows.set(rid, { id: rid, contract_id: contract, digest: p.agrees, state: "agreed", sunset_date: "", change_id: changeId, source_sdd_id: "", platform_sdd_id: "" });
120
+ else if (!existing)
121
+ rows.set(rid, { id: rid, contract_id: contract, digest: p.agrees, state: "retired", sunset_date: "", change_id: changeId, source_sdd_id: "", platform_sdd_id: "" });
122
+ }
123
+ }
124
+ return [...rows.values()].sort((a, b) => String(a["id"]).localeCompare(String(b["id"])));
125
+ }
126
+ //# sourceMappingURL=contract-revisions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract-revisions.js","sourceRoot":"","sources":["../../../../src/lib/catalogue/builders/contract-revisions.ts"],"names":[],"mappings":"AAAA,mHAAmH;AACnH,uFAAuF;AACvF,qGAAqG;AACrG,mFAAmF;AACnF,kHAAkH;AAClH,mFAAmF;AACnF,EAAE;AACF,uHAAuH;AACvH,sHAAsH;AACtH,mHAAmH;AACnH,kHAAkH;AAClH,gGAAgG;AAChG,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AAI1C,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;AAC9C,MAAM,MAAM,GAAG,uBAAuB,CAAC;AAUvC,MAAM,UAAU,aAAa,CAAC,KAAsB;IAClD,OAAO,UAAU,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;AACtE,CAAC;AAED,MAAM,UAAU,GAAG,CAAC,QAAgB,EAAE,MAAc,EAAE,EAAE,CAAC,GAAG,QAAQ,IAAI,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,GAAG,EAAE,CAAC,EAAE,CAAC;AAQhI,qEAAqE;AACrE,SAAS,IAAI,CAAC,MAAe,EAAE,KAAa,EAAE,QAAqB;IACjE,MAAM,CAAC,GAAI,MAAgE,EAAE,gBAAgB,CAAC;IAC9F,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,SAAS,CAAC;QAAE,OAAO,EAAE,CAAC;IAC5C,MAAM,GAAG,GAAU,EAAE,CAAC;IACtB,KAAK,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,IAAK,CAAE,CAAC,SAAuB,CAAC,OAAO,EAAE,EAAE,CAAC;QAC7D,MAAM,CAAC,GAAG,GAAqC,CAAC;QAChD,IAAI,CAAC,CAAC;YAAE,SAAS;QACjB,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAW,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC,OAAO,CAAe,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7I,MAAM,SAAS,GAAG,CAAC,GAA2B,EAAE,IAAY,EAAsB,EAAE;YAClF,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;YACjB,IAAI,CAAC,KAAK,SAAS;gBAAE,OAAO,SAAS,CAAC;YACtC,MAAM,CAAC,GAAG,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,CAAE,CAA6B,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAC9J,IAAI,CAAC,KAAK,SAAS;gBAAE,OAAO,SAAS,CAAC;YACtC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC7C,QAAQ,CAAC,GAAG,CAAC,YAAY,EAAE,GAAG,KAAK,eAAe,CAAC,KAAK,GAAG,QAAQ,IAAI,kCAAkC,CAAC,CAAC;gBAC3G,OAAO,SAAS,CAAC;YACnB,CAAC;YACD,OAAO,CAAC,CAAC;QACX,CAAC,CAAC;QACF,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,QAAQ,GAAG,SAAS,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;YAC9C,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YACzC,IAAI,QAAQ,IAAI,MAAM;gBAAE,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAC/G,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,MAA+B;IAC1E,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC;IACrC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAwB,CAAC;IAC7C,MAAM,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC,CAAC,gCAAgC;IAC3E,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QACjC,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;QAC1C,IAAI,IAAI,KAAK,EAAE;YAAE,SAAS;QAC1B,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QACpE,IAAI,KAAK,KAAK,IAAI;YAAE,SAAS;QAC7B,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAC3B,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QACxB,MAAM,GAAG,GAAG,UAAU,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QACnC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE,eAAe,EAAE,EAAE,EAAE,CAAC,CAAC;IAC7L,CAAC;IACD,MAAM,MAAM,GAAG,CAAC,IAAY,EAAY,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAEpL,IAAI,KAAK,GAAa,EAAE,CAAC;IACzB,IAAI,CAAC;QACH,KAAK,GAAG,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC/F,CAAC;IAAC,MAAM,CAAC;QACP,KAAK,GAAG,EAAE,CAAC;IACb,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QACrC,IAAI,GAAY,CAAC;QACjB,IAAI,CAAC;YACH,GAAG,GAAG,SAAS,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;QAChE,CAAC;QAAC,MAAM,CAAC;YACP,SAAS,CAAC,0DAA0D;QACtE,CAAC;QACD,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,MAAM,CAAC,CAAC;QACtE,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,UAAU,CAAC,CAAC;QACpE,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,UAAU,CAAC,CAAC;QAChE,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC;QACzF,IAAI,KAAK,KAAK,OAAO;YAAE,SAAS;QAChC,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,QAAQ,IAAI,IAAI,CAAE,CAAC,IAAI,CAAC,CAAC,CAAC;QACnD,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,QAAQ,CAAC,EAAE,CAAC;YAC3C,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAC/B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACzB,QAAQ,CAAC,GAAG,CAAC,YAAY,EAAE,GAAG,KAAK,mBAAmB,CAAC,CAAC,IAAI,YAAY,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,0BAA0B,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,mBAAmB,CAAC,CAAC;gBAC/M,SAAS;YACX,CAAC;YACD,MAAM,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAE,CAAC;YAC7B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAClC,IAAI,KAAK,KAAK,QAAQ,IAAI,CAAC,CAAC,QAAQ,IAAI,GAAG,IAAI,CAAC,CAAC,QAAQ,KAAK,GAAG,EAAE,CAAC;gBAClE,QAAQ,CAAC,GAAG,CAAC,YAAY,EAAE,GAAG,KAAK,wBAAwB,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,QAAQ,wBAAwB,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,wGAAwG,CAAC,CAAC;YACtP,CAAC;YACD,IAAI,CAAC,CAAC,CAAC,MAAM;gBAAE,SAAS;YACxB,MAAM,GAAG,GAAG,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;YAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC/B,IAAI,CAAC,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBACrB,IAAI,QAAQ,IAAI,KAAK,KAAK,UAAU;oBAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,GAAG,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC;gBAC1F,SAAS;YACX,CAAC;YACD,IAAI,KAAK,KAAK,QAAQ;gBAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,EAAE,EAAE,EAAE,eAAe,EAAE,EAAE,EAAE,CAAC,CAAC;iBACtL,IAAI,CAAC,QAAQ;gBAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,EAAE,EAAE,EAAE,eAAe,EAAE,EAAE,EAAE,CAAC,CAAC;QAC1L,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3F,CAAC"}
@@ -0,0 +1,73 @@
1
+ import type { CatalogueRow } from "../csv-writer.js";
2
+ import type { FindingsLog } from "../findings.js";
3
+ export type EndCardinality = "exactly-one" | "zero-or-one" | "one-or-more" | "zero-or-more";
4
+ export interface ParsedAttribute {
5
+ readonly name: string;
6
+ readonly type: string;
7
+ readonly primaryKey: boolean;
8
+ readonly unique: boolean;
9
+ readonly foreignKey: boolean;
10
+ /** true, false, or undefined where the model does not say. */
11
+ readonly nullable: boolean | undefined;
12
+ readonly description: string;
13
+ }
14
+ export interface ParsedEntity {
15
+ readonly name: string;
16
+ readonly attributes: readonly ParsedAttribute[];
17
+ /** Lines of the entity's block that are not blank or comments: the catalogue's `columns=N`. */
18
+ readonly columnCount: number;
19
+ }
20
+ export interface ParsedRelationship {
21
+ /** The entities as the model names them. */
22
+ readonly from: string;
23
+ readonly to: string;
24
+ readonly name: string;
25
+ readonly fromCardinality: EndCardinality;
26
+ readonly toCardinality: EndCardinality;
27
+ readonly fromRole: string;
28
+ readonly toRole: string;
29
+ /** A role's @card, stated as a cardinality invariant on the relationship (TypeQL only). */
30
+ readonly roleCards: readonly string[];
31
+ }
32
+ export interface ParsedDataModel {
33
+ readonly entities: readonly ParsedEntity[];
34
+ readonly relationships: readonly ParsedRelationship[];
35
+ /** What the parser read and could not hold, each located. */
36
+ readonly unread: readonly string[];
37
+ /** An entity block left open at the end of the file. */
38
+ readonly unclosed: string | null;
39
+ }
40
+ /** Parse every erDiagram fence of a Mermaid data-model file. `where` locates what is reported. */
41
+ export declare function parseMermaidDataModel(text: string, where: string): ParsedDataModel;
42
+ /** Parse a TypeQL data model in the documented subset. A file outside the subset is refused whole, located. */
43
+ export declare function parseTypeqlDataModel(text: string, where: string): ParsedDataModel | {
44
+ readonly refused: string;
45
+ };
46
+ export interface DataModelSource {
47
+ /** The domain_models row's id. */
48
+ readonly id: string;
49
+ readonly domainId: string;
50
+ readonly docPath: string;
51
+ readonly parsed: ParsedDataModel;
52
+ }
53
+ /**
54
+ * Read and parse each domain model a domain_models row names. A missing file contributes nothing (the domain-models
55
+ * builder reports it); a TypeQL file outside the subset contributes nothing (the entities builder reports it).
56
+ */
57
+ export declare function readDataModelSources(sddPath: string, models: ReadonlyArray<{
58
+ readonly id: string;
59
+ readonly domainId: string;
60
+ readonly docPath: string;
61
+ }>): Promise<DataModelSource[]>;
62
+ export interface DataModelElements {
63
+ readonly entityAttributes: CatalogueRow[];
64
+ readonly entityRelationships: CatalogueRow[];
65
+ readonly domainInvariants: CatalogueRow[];
66
+ }
67
+ /**
68
+ * The attribute, relationship and invariant rows of every parsed model, against the entities catalogue as built. An
69
+ * entity this build did not catalogue contributes nothing; a relationship names an entity of its own domain, else the
70
+ * one entity of that name in another, else it is reported.
71
+ */
72
+ export declare function buildDataModelElements(sources: readonly DataModelSource[], entities: readonly CatalogueRow[], findings: FindingsLog): DataModelElements;
73
+ //# sourceMappingURL=data-model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-model.d.ts","sourceRoot":"","sources":["../../../../src/lib/catalogue/builders/data-model.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,316 @@
1
+ // A domain model's content, parsed whole (M-ADR 0230 §4.3, §4.11 proof 7, Proposed; schema 6.0.0). One parser per
2
+ // notation, shared by every reader of the file: the entities builder takes its entities from here, and this module
3
+ // builds entity_attributes, entity_relationships and domain_invariants from the same parse.
4
+ //
5
+ // Mermaid ER (`data-model.mermaid.md`, every ```mermaid fence opening with erDiagram):
6
+ // ENTITY { an entity block; ENTITY { type a; type b } on one line is one too
7
+ // type name [PK|FK|UK|PK_FK[, ...]] ["comment"]
8
+ // }
9
+ // A <end>--<end> B : label a relationship; each end marker || |o o| }| |{ }o o{ is one of four cardinalities;
10
+ // `..` (non-identifying) is read as `--`, and reported
11
+ // TypeQL, in the documented subset (M-ADR 0210 §4.2, `data-model.tql`), through the fail-closed parseTypes:
12
+ // an entity's owned attributes (@key, @card), and each binary relation as a relationship between its two roles'
13
+ // players, roles kept. The subset admits no participation cardinality, so both ends are zero-or-more, and a role's
14
+ // own @card is a cardinality invariant on the relationship.
15
+ // The keys become invariants: a primary key (PK, @key) is one unique invariant over its attributes, which are not
16
+ // nullable; a UK is a unique invariant over its attribute. What a parser reads and cannot hold is an `extraction`
17
+ // finding, never a silent skip.
18
+ import { readFile } from "node:fs/promises";
19
+ import { join } from "node:path";
20
+ import { ParseError, parseTypes } from "../../metamodel/tql-subset-parser.js";
21
+ import { entitySlug } from "./entity-slug.js";
22
+ const RE_MERMAID_OPEN = /^```\s*mermaid\s*$/i;
23
+ const RE_FENCE_CLOSE = /^```\s*$/;
24
+ const RE_COMMENT = /^\s*%%/;
25
+ const RE_ENTITY_OPEN = /^\s*([A-Za-z_][A-Za-z0-9_]*)\s*\{\s*$/;
26
+ const RE_ENTITY_INLINE = /^\s*([A-Za-z_][A-Za-z0-9_]*)\s*\{(.*)\}\s*$/;
27
+ const RE_ATTRIBUTE = /^\s*([A-Za-z_][\w[\]~(),.<>-]*)\s+([A-Za-z_*][\w.-]*)\s*((?:PK_FK|PK|FK|UK)(?:\s*,\s*(?:PK_FK|PK|FK|UK))*)?\s*(?:"([^"]*)")?\s*$/;
28
+ const RE_RELATIONSHIP = /^\s*([A-Za-z_][\w-]*)\s+(\|\||\|o|o\||\}\||\}o)(--|\.\.)(\|\||o\||\|o|\|\{|o\{)\s+([A-Za-z_][\w-]*)\s*:\s*(.+?)\s*$/;
29
+ const RE_BARE_ENTITY = /^\s*[A-Za-z_][\w-]*\s*$/;
30
+ const MERMAID_KEYWORDS = new Set(["erdiagram", "subgraph", "classdef", "style", "class"]);
31
+ const END = {
32
+ "||": "exactly-one",
33
+ "|o": "zero-or-one",
34
+ "o|": "zero-or-one",
35
+ "}|": "one-or-more",
36
+ "|{": "one-or-more",
37
+ "}o": "zero-or-more",
38
+ "o{": "zero-or-more",
39
+ };
40
+ function mermaidAttribute(text) {
41
+ const m = RE_ATTRIBUTE.exec(text);
42
+ if (!m)
43
+ return null;
44
+ const keys = new Set((m[3] ?? "").split(",").map((k) => k.trim()).flatMap((k) => (k === "PK_FK" ? ["PK", "FK"] : k === "" ? [] : [k])));
45
+ const description = m[4] ?? "";
46
+ const primaryKey = keys.has("PK");
47
+ const nullable = primaryKey ? false : /^nullable\b/i.test(description.trim()) ? true : undefined;
48
+ return { name: m[2].replace(/^\*/, ""), type: m[1], primaryKey, unique: keys.has("UK"), foreignKey: keys.has("FK"), nullable, description };
49
+ }
50
+ /** Parse every erDiagram fence of a Mermaid data-model file. `where` locates what is reported. */
51
+ export function parseMermaidDataModel(text, where) {
52
+ const lines = text.split(/\r?\n/);
53
+ const entities = [];
54
+ const relationships = [];
55
+ const unread = [];
56
+ const seen = new Set();
57
+ let inMermaid = false;
58
+ let isEr = false;
59
+ let firstKeywordSeen = false;
60
+ let open = null;
61
+ const close = (e) => {
62
+ const slug = entitySlug(e.name);
63
+ if (seen.has(slug))
64
+ return; // a later block naming the entity again: the first declaration stands
65
+ seen.add(slug);
66
+ entities.push(e);
67
+ };
68
+ for (let i = 0; i < lines.length; i++) {
69
+ const raw = lines[i] ?? "";
70
+ const at = `${where}:${i + 1}`;
71
+ if (!inMermaid) {
72
+ if (RE_MERMAID_OPEN.test(raw)) {
73
+ inMermaid = true;
74
+ isEr = false;
75
+ firstKeywordSeen = false;
76
+ }
77
+ continue;
78
+ }
79
+ if (RE_FENCE_CLOSE.test(raw)) {
80
+ inMermaid = false;
81
+ open = null; // a block the fence cut off is dropped, as the entities builder always has
82
+ continue;
83
+ }
84
+ const stripped = raw.trim();
85
+ if (!firstKeywordSeen && stripped !== "" && !RE_COMMENT.test(raw)) {
86
+ firstKeywordSeen = true;
87
+ isEr = stripped.toLowerCase().startsWith("erdiagram");
88
+ continue;
89
+ }
90
+ if (!isEr || stripped === "" || RE_COMMENT.test(raw))
91
+ continue;
92
+ if (open) {
93
+ if (stripped.startsWith("}")) {
94
+ close(open);
95
+ open = null;
96
+ continue;
97
+ }
98
+ open.columnCount++;
99
+ const a = mermaidAttribute(raw);
100
+ if (a)
101
+ open.attributes.push(a);
102
+ else
103
+ unread.push(`${at}: an attribute line of ${open.name} not understood: ${JSON.stringify(stripped)}`);
104
+ continue;
105
+ }
106
+ const rel = RE_RELATIONSHIP.exec(raw);
107
+ if (rel) {
108
+ if (rel[3] === "..")
109
+ unread.push(`${at}: a non-identifying relationship (..), read as identifying: ${JSON.stringify(stripped)}`);
110
+ relationships.push({
111
+ from: rel[1],
112
+ to: rel[5],
113
+ name: rel[6].replace(/^"(.*)"$/, "$1").trim(),
114
+ fromCardinality: END[rel[2]],
115
+ toCardinality: END[rel[4]],
116
+ fromRole: "",
117
+ toRole: "",
118
+ roleCards: [],
119
+ });
120
+ continue;
121
+ }
122
+ const inline = RE_ENTITY_INLINE.exec(raw);
123
+ if (inline && !MERMAID_KEYWORDS.has(inline[1].toLowerCase())) {
124
+ const parts = inline[2].split(";").map((p) => p.trim()).filter((p) => p !== "");
125
+ const attributes = [];
126
+ for (const p of parts) {
127
+ const a = mermaidAttribute(p);
128
+ if (a)
129
+ attributes.push(a);
130
+ else
131
+ unread.push(`${at}: an attribute of ${inline[1]} not understood: ${JSON.stringify(p)}`);
132
+ }
133
+ close({ name: inline[1], attributes, columnCount: parts.length });
134
+ continue;
135
+ }
136
+ const m = RE_ENTITY_OPEN.exec(raw);
137
+ if (m && !MERMAID_KEYWORDS.has(m[1].toLowerCase())) {
138
+ open = { name: m[1], attributes: [], columnCount: 0 };
139
+ continue;
140
+ }
141
+ if (RE_BARE_ENTITY.test(raw) && !MERMAID_KEYWORDS.has(stripped.toLowerCase())) {
142
+ unread.push(`${at}: an entity named without a block (${stripped}); it is catalogued only where a block declares it`);
143
+ continue;
144
+ }
145
+ unread.push(`${at}: a line not understood: ${JSON.stringify(stripped)}`);
146
+ }
147
+ return { entities, relationships, unread, unclosed: open?.name ?? null };
148
+ }
149
+ /** Parse a TypeQL data model in the documented subset. A file outside the subset is refused whole, located. */
150
+ export function parseTypeqlDataModel(text, where) {
151
+ let t;
152
+ try {
153
+ t = parseTypes(text, where, { singlePlayer: false });
154
+ }
155
+ catch (e) {
156
+ if (e instanceof ParseError)
157
+ return { refused: e.message };
158
+ throw e;
159
+ }
160
+ const unread = [];
161
+ const entities = [];
162
+ for (const [label, d] of t.entities) {
163
+ const attributes = [];
164
+ for (const [attr, ann] of d.owns) {
165
+ if (ann.multi)
166
+ unread.push(`${where}: ${label} owns ${attr} @card(0..), a multi-valued attribute; the model holds one value per attribute`);
167
+ attributes.push({
168
+ name: attr,
169
+ type: t.attrs.get(attr) ?? "",
170
+ primaryKey: ann.key,
171
+ unique: false,
172
+ foreignKey: false,
173
+ // TypeDB's default for an ownership is @card(0..1)
174
+ nullable: ann.key || ann.required ? false : true,
175
+ description: "",
176
+ });
177
+ }
178
+ entities.push({ name: label, attributes, columnCount: attributes.length });
179
+ }
180
+ const relationships = [];
181
+ for (const [label, d] of t.relations) {
182
+ const roles = [...d.relates.keys()];
183
+ if (d.owns.size > 0)
184
+ unread.push(`${where}: relation ${label} owns attributes (${[...d.owns.keys()].join(", ")}); the model holds no attributes on a relationship`);
185
+ if (roles.length !== 2) {
186
+ unread.push(`${where}: relation ${label} relates ${roles.length} role(s); the model holds binary relationships only`);
187
+ continue;
188
+ }
189
+ const [a, b] = roles;
190
+ const playersOf = (role) => (t.playersAll.get(`${label}:${role}`) ?? []).filter((p) => {
191
+ if (t.entities.has(p))
192
+ return true;
193
+ unread.push(`${where}: relation ${p} plays ${label}:${role}; the model relates entities only`);
194
+ return false;
195
+ });
196
+ const cards = [...d.relates].flatMap(([role, ann]) => ann.required ? [`each ${label} relates exactly one ${role}`] : ann.optional ? [`each ${label} relates at most one ${role}`] : []);
197
+ for (const from of playersOf(a)) {
198
+ for (const to of playersOf(b)) {
199
+ relationships.push({ from, to, name: label, fromCardinality: "zero-or-more", toCardinality: "zero-or-more", fromRole: a, toRole: b, roleCards: cards });
200
+ }
201
+ }
202
+ }
203
+ return { entities, relationships, unread, unclosed: null };
204
+ }
205
+ /**
206
+ * Read and parse each domain model a domain_models row names. A missing file contributes nothing (the domain-models
207
+ * builder reports it); a TypeQL file outside the subset contributes nothing (the entities builder reports it).
208
+ */
209
+ export async function readDataModelSources(sddPath, models) {
210
+ const out = [];
211
+ for (const m of models) {
212
+ const tql = m.docPath.endsWith(".tql");
213
+ if (!tql && !m.docPath.endsWith(".mermaid.md"))
214
+ continue;
215
+ const text = await readFile(m.docPath.startsWith("/") ? m.docPath : join(sddPath, m.docPath), "utf8").catch(() => null);
216
+ if (text === null)
217
+ continue;
218
+ const parsed = tql ? parseTypeqlDataModel(text, m.docPath) : parseMermaidDataModel(text, m.docPath);
219
+ if ("refused" in parsed)
220
+ continue; // the entities builder reports the refusal
221
+ out.push({ ...m, parsed });
222
+ }
223
+ return out;
224
+ }
225
+ /**
226
+ * The attribute, relationship and invariant rows of every parsed model, against the entities catalogue as built. An
227
+ * entity this build did not catalogue contributes nothing; a relationship names an entity of its own domain, else the
228
+ * one entity of that name in another, else it is reported.
229
+ */
230
+ export function buildDataModelElements(sources, entities, findings) {
231
+ const attributes = [];
232
+ const relationships = [];
233
+ const invariants = [];
234
+ const entityIds = new Set(entities.map((e) => String(e["id"])));
235
+ const bySlug = new Map();
236
+ for (const e of entities) {
237
+ const id = String(e["id"]);
238
+ const domain = String(e["domain_id"] ?? "");
239
+ if (domain === "" || !id.startsWith(`${domain}-`))
240
+ continue;
241
+ const slug = id.slice(domain.length + 1);
242
+ bySlug.set(slug, [...(bySlug.get(slug) ?? []), id]);
243
+ }
244
+ const resolve = (domainId, name) => {
245
+ const own = `${domainId}-${entitySlug(name)}`;
246
+ if (entityIds.has(own))
247
+ return own;
248
+ const elsewhere = bySlug.get(entitySlug(name)) ?? [];
249
+ return elsewhere.length === 1 ? elsewhere[0] : null;
250
+ };
251
+ const seenAttr = new Set();
252
+ const seenRel = new Set();
253
+ for (const s of sources) {
254
+ for (const u of s.parsed.unread)
255
+ findings.add("extraction", u, "warn", s.docPath);
256
+ for (const e of s.parsed.entities) {
257
+ const entityId = `${s.domainId}-${entitySlug(e.name)}`;
258
+ if (!entityIds.has(entityId))
259
+ continue;
260
+ const pk = [];
261
+ for (const a of e.attributes) {
262
+ const id = `${entityId}__${entitySlug(a.name) || a.name.toLowerCase()}`;
263
+ if (seenAttr.has(id)) {
264
+ findings.add("extraction", `${s.docPath}: ${e.name}.${a.name} is stated twice; the first stands`, "warn", s.docPath);
265
+ continue;
266
+ }
267
+ seenAttr.add(id);
268
+ attributes.push({
269
+ id,
270
+ entity_id: entityId,
271
+ name: a.name,
272
+ type: a.type,
273
+ nullable: a.nullable,
274
+ foreign_key: a.foreignKey ? true : undefined,
275
+ description: a.description,
276
+ });
277
+ if (a.primaryKey)
278
+ pk.push(id);
279
+ if (a.unique)
280
+ invariants.push({ id: `${id}__unique`, entity_id: entityId, kind: "unique", attribute_ids: id, statement: `${a.name} is unique among ${e.name} (UK)` });
281
+ }
282
+ if (pk.length > 0) {
283
+ const names = e.attributes.filter((a) => a.primaryKey).map((a) => a.name);
284
+ invariants.push({ id: `${entityId}__primary-key`, entity_id: entityId, kind: "unique", attribute_ids: pk.join(";"), statement: `${names.join(" and ")} identif${names.length === 1 ? "ies" : "y"} each ${e.name} (primary key)` });
285
+ }
286
+ }
287
+ for (const r of s.parsed.relationships) {
288
+ const from = resolve(s.domainId, r.from);
289
+ const to = resolve(s.domainId, r.to);
290
+ if (from === null || to === null) {
291
+ const missing = [from === null ? r.from : null, to === null ? r.to : null].filter((x) => x !== null).join(" and ");
292
+ findings.add("extraction", `${s.docPath}: the relationship ${r.from} ${r.name} ${r.to} names ${missing}, which no catalogued entity matches (in its domain, or once elsewhere); not catalogued`, "warn", s.docPath);
293
+ continue;
294
+ }
295
+ const id = `${from}__${entitySlug(r.name) || "related"}__${to}`;
296
+ if (seenRel.has(id)) {
297
+ findings.add("extraction", `${s.docPath}: the relationship ${r.from} ${r.name} ${r.to} is stated twice; the first stands`, "warn", s.docPath);
298
+ continue;
299
+ }
300
+ seenRel.add(id);
301
+ relationships.push({
302
+ id,
303
+ from_entity_id: from,
304
+ to_entity_id: to,
305
+ name: r.name,
306
+ from_cardinality: r.fromCardinality,
307
+ to_cardinality: r.toCardinality,
308
+ from_role: r.fromRole,
309
+ to_role: r.toRole,
310
+ });
311
+ r.roleCards.forEach((statement, i) => invariants.push({ id: `${id}__cardinality-${i + 1}`, entity_id: from, kind: "cardinality", relationship_id: id, statement }));
312
+ }
313
+ }
314
+ return { entityAttributes: attributes, entityRelationships: relationships, domainInvariants: invariants };
315
+ }
316
+ //# sourceMappingURL=data-model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-model.js","sourceRoot":"","sources":["../../../../src/lib/catalogue/builders/data-model.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"entities-mermaid.d.ts","sourceRoot":"","sources":["../../../../src/lib/catalogue/builders/entities-mermaid.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAYlD,MAAM,WAAW,gBAAgB;IAC/B,8BAA8B;IAC9B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;IAC/B,QAAQ,CAAC,YAAY,EAAE,SAAS,gBAAgB,EAAE,CAAC;IACnD,QAAQ,CAAC,gBAAgB,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CAChD;AASD,wBAAsB,wBAAwB,CAC5C,MAAM,EAAE,qBAAqB,GAC5B,OAAO,CAAC,YAAY,EAAE,CAAC,CAwDzB"}
1
+ {"version":3,"file":"entities-mermaid.d.ts","sourceRoot":"","sources":["../../../../src/lib/catalogue/builders/entities-mermaid.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAKlD,MAAM,WAAW,gBAAgB;IAC/B,8BAA8B;IAC9B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;IAC/B,QAAQ,CAAC,YAAY,EAAE,SAAS,gBAAgB,EAAE,CAAC;IACnD,QAAQ,CAAC,gBAAgB,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CAChD;AASD,wBAAsB,wBAAwB,CAC5C,MAAM,EAAE,qBAAqB,GAC5B,OAAO,CAAC,YAAY,EAAE,CAAC,CAwDzB"}