@metaobjectsdev/docs-site 0.15.8-rc.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.
Files changed (104) hide show
  1. package/LICENSE +189 -0
  2. package/README.md +62 -0
  3. package/assets/site.css +13 -0
  4. package/assets/site.js +25 -0
  5. package/dist/badges.d.ts +14 -0
  6. package/dist/badges.d.ts.map +1 -0
  7. package/dist/badges.js +21 -0
  8. package/dist/badges.js.map +1 -0
  9. package/dist/builders/extras.d.ts +23 -0
  10. package/dist/builders/extras.d.ts.map +1 -0
  11. package/dist/builders/extras.js +70 -0
  12. package/dist/builders/extras.js.map +1 -0
  13. package/dist/builders/index-data.d.ts +52 -0
  14. package/dist/builders/index-data.d.ts.map +1 -0
  15. package/dist/builders/index-data.js +115 -0
  16. package/dist/builders/index-data.js.map +1 -0
  17. package/dist/builders/object-data.d.ts +97 -0
  18. package/dist/builders/object-data.d.ts.map +1 -0
  19. package/dist/builders/object-data.js +336 -0
  20. package/dist/builders/object-data.js.map +1 -0
  21. package/dist/builders/output-data.d.ts +26 -0
  22. package/dist/builders/output-data.d.ts.map +1 -0
  23. package/dist/builders/output-data.js +35 -0
  24. package/dist/builders/output-data.js.map +1 -0
  25. package/dist/builders/package-data.d.ts +48 -0
  26. package/dist/builders/package-data.d.ts.map +1 -0
  27. package/dist/builders/package-data.js +142 -0
  28. package/dist/builders/package-data.js.map +1 -0
  29. package/dist/builders/prompt-data.d.ts +31 -0
  30. package/dist/builders/prompt-data.d.ts.map +1 -0
  31. package/dist/builders/prompt-data.js +68 -0
  32. package/dist/builders/prompt-data.js.map +1 -0
  33. package/dist/coverage.d.ts +19 -0
  34. package/dist/coverage.d.ts.map +1 -0
  35. package/dist/coverage.js +26 -0
  36. package/dist/coverage.js.map +1 -0
  37. package/dist/index.d.ts +4 -0
  38. package/dist/index.d.ts.map +1 -0
  39. package/dist/index.js +3 -0
  40. package/dist/index.js.map +1 -0
  41. package/dist/link-check.d.ts +2 -0
  42. package/dist/link-check.d.ts.map +1 -0
  43. package/dist/link-check.js +30 -0
  44. package/dist/link-check.js.map +1 -0
  45. package/dist/link-graph.d.ts +54 -0
  46. package/dist/link-graph.d.ts.map +1 -0
  47. package/dist/link-graph.js +198 -0
  48. package/dist/link-graph.js.map +1 -0
  49. package/dist/load.d.ts +11 -0
  50. package/dist/load.d.ts.map +1 -0
  51. package/dist/load.js +40 -0
  52. package/dist/load.js.map +1 -0
  53. package/dist/mermaid.d.ts +56 -0
  54. package/dist/mermaid.d.ts.map +1 -0
  55. package/dist/mermaid.js +136 -0
  56. package/dist/mermaid.js.map +1 -0
  57. package/dist/mustache-highlight.d.ts +10 -0
  58. package/dist/mustache-highlight.d.ts.map +1 -0
  59. package/dist/mustache-highlight.js +55 -0
  60. package/dist/mustache-highlight.js.map +1 -0
  61. package/dist/package-docs.d.ts +12 -0
  62. package/dist/package-docs.d.ts.map +1 -0
  63. package/dist/package-docs.js +34 -0
  64. package/dist/package-docs.js.map +1 -0
  65. package/dist/scaffold.d.ts +7 -0
  66. package/dist/scaffold.d.ts.map +1 -0
  67. package/dist/scaffold.js +24 -0
  68. package/dist/scaffold.js.map +1 -0
  69. package/dist/site.d.ts +23 -0
  70. package/dist/site.d.ts.map +1 -0
  71. package/dist/site.js +219 -0
  72. package/dist/site.js.map +1 -0
  73. package/dist/yaml-comments.d.ts +6 -0
  74. package/dist/yaml-comments.d.ts.map +1 -0
  75. package/dist/yaml-comments.js +49 -0
  76. package/dist/yaml-comments.js.map +1 -0
  77. package/package.json +45 -0
  78. package/src/badges.ts +26 -0
  79. package/src/builders/extras.ts +61 -0
  80. package/src/builders/index-data.ts +95 -0
  81. package/src/builders/object-data.ts +261 -0
  82. package/src/builders/output-data.ts +35 -0
  83. package/src/builders/package-data.ts +134 -0
  84. package/src/builders/prompt-data.ts +61 -0
  85. package/src/coverage.ts +29 -0
  86. package/src/index.ts +3 -0
  87. package/src/link-check.ts +24 -0
  88. package/src/link-graph.ts +204 -0
  89. package/src/load.ts +47 -0
  90. package/src/mermaid.ts +142 -0
  91. package/src/mustache-highlight.ts +43 -0
  92. package/src/package-docs.ts +33 -0
  93. package/src/scaffold.ts +26 -0
  94. package/src/site.ts +289 -0
  95. package/src/yaml-comments.ts +33 -0
  96. package/templates/chrome-foot.mustache +17 -0
  97. package/templates/chrome-head.mustache +21 -0
  98. package/templates/coverage.html.mustache +24 -0
  99. package/templates/enums.html.mustache +14 -0
  100. package/templates/index.html.mustache +54 -0
  101. package/templates/object.html.mustache +46 -0
  102. package/templates/output.html.mustache +16 -0
  103. package/templates/package.html.mustache +43 -0
  104. package/templates/prompt.html.mustache +28 -0
@@ -0,0 +1,198 @@
1
+ import { deriveM2MFields, stripPackage } from "@metaobjectsdev/metadata";
2
+ import { treeOf } from "./load";
3
+ export function pkgOf(node) {
4
+ return (node.package ?? node.fileDefaultPackage ?? "");
5
+ }
6
+ export function fqnOf(node) {
7
+ const p = pkgOf(node);
8
+ return p ? `${p}::${node.name}` : node.name;
9
+ }
10
+ export class LinkGraph {
11
+ _nodes = new Map();
12
+ _from = new Map();
13
+ _to = new Map();
14
+ _extBy = new Map();
15
+ _origins = new Map();
16
+ constructor(model) {
17
+ for (const o of model.root.ownChildren()) {
18
+ let kind;
19
+ if (o.type === "object")
20
+ kind = "object";
21
+ else if (o.type === "template")
22
+ kind = o.subType === "prompt" ? "prompt" : "output";
23
+ if (!kind)
24
+ continue;
25
+ const pkg = pkgOf(o);
26
+ const pkgPath = pkg.split("::").join("/");
27
+ this._nodes.set(fqnOf(o), {
28
+ kind, name: o.name, pkg, pkgPath,
29
+ href: `${pkgPath}/${o.name}.html`, node: o, tree: treeOf(o, model),
30
+ });
31
+ }
32
+ const addRef = (r) => {
33
+ (this._from.get(r.from) ?? this._from.set(r.from, []).get(r.from)).push(r);
34
+ (this._to.get(r.to) ?? this._to.set(r.to, []).get(r.to)).push(r);
35
+ };
36
+ const resolveRef = (raw, ctxPkg) => {
37
+ const cand = raw.includes("::") ? raw : `${ctxPkg}::${raw}`;
38
+ return this._nodes.has(cand) ? cand : (this._nodes.has(raw) ? raw : undefined);
39
+ };
40
+ // M:N through-junction edge. Derives the junction FK fields via the metadata
41
+ // SSOT (deriveM2MFields) — hetero, directed (@sourceRefField), or symmetric
42
+ // (@symmetric). On a derivation failure (ambiguous self-join) the edge is
43
+ // SKIPPED — generation never fails.
44
+ const addM2mEdge = (from, to, rel, obj, ctxPkg, onDelete, subtype) => {
45
+ const through = rel.through ? (resolveRef(rel.through, ctxPkg) ?? rel.through) : undefined;
46
+ let sourceJoinField, targetJoinField;
47
+ try {
48
+ const f = deriveM2MFields(rel, obj, model.root);
49
+ sourceJoinField = f.sourceField;
50
+ targetJoinField = f.targetField;
51
+ }
52
+ catch {
53
+ return; // ambiguous junction — skip the logical edge (the two FK edges still show)
54
+ }
55
+ addRef({ from, to, via: rel.name, kind: "relationship", cardinality: "many", through, sourceJoinField, targetJoinField, symmetric: rel.symmetric, onDelete, subtype });
56
+ };
57
+ for (const dn of this._nodes.values()) {
58
+ const fqn = fqnOf(dn.node);
59
+ if (dn.kind === "object") {
60
+ for (const f of dn.node.childrenOfType("field")) {
61
+ const ref = f.attr("objectRef");
62
+ if (typeof ref === "string") {
63
+ const to = resolveRef(ref, dn.pkg);
64
+ if (to)
65
+ addRef({ from: fqn, to, via: f.name, kind: "field" });
66
+ }
67
+ }
68
+ // dn.node is typed MetaData; the enclosing dn.kind === "object" guard
69
+ // guarantees it is a MetaObject at runtime. The `unknown` bridge is needed
70
+ // because MetaData does not structurally narrow to MetaObject for tsc.
71
+ const obj = dn.node;
72
+ // Relationship edges FIRST, so we can suppress the bare FK edge a belongs-to
73
+ // relationship supersedes. Dedupe is keyed by `${targetFqn}::${fkField}`
74
+ // (a string, robust to node-instance identity) — the FK loop skips any
75
+ // reference whose (target, first-field) a belongs-to relationship covered.
76
+ const coveredFk = new Set();
77
+ for (const rel of obj.relationships()) {
78
+ const objectRef = rel.objectRef;
79
+ if (typeof objectRef !== "string")
80
+ continue;
81
+ const to = resolveRef(objectRef, dn.pkg);
82
+ if (!to)
83
+ continue;
84
+ const cardinality = rel.cardinality === "many" ? "many" : rel.cardinality === "one" ? "one" : undefined;
85
+ const onDelete = rel.onDelete;
86
+ const subtype = rel.subType;
87
+ if (cardinality === "many" && rel.through !== undefined) {
88
+ addM2mEdge(fqn, to, rel, obj, dn.pkg, onDelete, subtype); // Task 3 helper
89
+ continue;
90
+ }
91
+ // belongs-to (1:N, one) — find the matching identity.reference to dedupe (mirrors
92
+ // relation-resolver: first reference whose target matches, package-stripped).
93
+ const target = stripPackage(objectRef);
94
+ const match = obj.referenceIdentities().find((r) => stripPackage(r.targetEntity ?? "") === target);
95
+ const fkField = match?.fields?.[0];
96
+ if (fkField)
97
+ coveredFk.add(`${to}::${fkField}`);
98
+ addRef({ from: fqn, to, via: rel.name, kind: "relationship", cardinality, onDelete, subtype });
99
+ }
100
+ for (const id of dn.node.childrenOfType("identity")) {
101
+ if (id.subType !== "reference")
102
+ continue;
103
+ const ref = id.attr("references");
104
+ if (typeof ref === "string") {
105
+ const to = resolveRef(ref, dn.pkg);
106
+ if (to) {
107
+ const fieldsValue = id.attr("fields") ?? id.name;
108
+ const firstField = Array.isArray(fieldsValue) ? String(fieldsValue[0] ?? "") : String(fieldsValue);
109
+ if (coveredFk.has(`${to}::${firstField}`))
110
+ continue; // superseded by a relationship edge
111
+ const via = Array.isArray(fieldsValue) ? fieldsValue.join(", ") : String(fieldsValue);
112
+ addRef({ from: fqn, to, via, kind: "fk" });
113
+ }
114
+ }
115
+ }
116
+ for (const f of dn.node.childrenOfType("field")) {
117
+ for (const org of f.childrenOfType("origin")) {
118
+ const from = String(org.attr("from") ?? ""), via = String(org.attr("via") ?? "");
119
+ (this._origins.get(fqn) ?? this._origins.set(fqn, []).get(fqn)).push({ field: f.name, from, via });
120
+ // connect a projection to its source object so it is not orphaned on diagrams:
121
+ // `from` is "pkg::Entity.field" — strip the trailing ".field" to get the source object ref.
122
+ const dot = from.lastIndexOf(".");
123
+ const srcRef = dot > 0 ? from.slice(0, dot) : "";
124
+ const to = srcRef ? resolveRef(srcRef, dn.pkg) : undefined;
125
+ if (to && to !== fqn)
126
+ addRef({ from: fqn, to, via: `${f.name} (origin)`, kind: "origin" });
127
+ }
128
+ }
129
+ const sup = dn.node.superResolved;
130
+ if (sup) {
131
+ const supFqn = fqnOf(sup);
132
+ addRef({ from: fqn, to: supFqn, via: "extends", kind: "extends" });
133
+ (this._extBy.get(supFqn) ?? this._extBy.set(supFqn, []).get(supFqn)).push(dn);
134
+ }
135
+ }
136
+ else {
137
+ const p = dn.node.attr("payloadRef");
138
+ if (typeof p === "string") {
139
+ const to = resolveRef(p, dn.pkg);
140
+ if (to)
141
+ addRef({ from: fqn, to, via: "payloadRef", kind: "payload" });
142
+ }
143
+ }
144
+ }
145
+ }
146
+ nodes() { return [...this._nodes.values()]; }
147
+ byFqn(fqn) { return this._nodes.get(fqn); }
148
+ refsFrom(fqn) { return this._from.get(fqn) ?? []; }
149
+ refsTo(fqn) { return this._to.get(fqn) ?? []; }
150
+ degree(fqn) {
151
+ const n = (rs) => rs.filter((r) => r.kind !== "extends").length;
152
+ return n(this.refsFrom(fqn)) + n(this.refsTo(fqn));
153
+ }
154
+ extendedBy(fqn) { return this._extBy.get(fqn) ?? []; }
155
+ originsOf(fqn) { return this._origins.get(fqn) ?? []; }
156
+ ancestors(fqn) {
157
+ const out = [];
158
+ const start = this._nodes.get(fqn);
159
+ if (!start)
160
+ return out;
161
+ for (let s = start.node.superResolved; s; s = s.superResolved) {
162
+ const t = this._nodes.get(fqnOf(s));
163
+ if (!t)
164
+ break;
165
+ out.push(t);
166
+ }
167
+ return out;
168
+ }
169
+ relationshipsOf(fqn) {
170
+ return this.refsFrom(fqn).filter((r) => r.kind === "relationship")
171
+ .map((r) => ({ name: r.via, toFqn: r.to, cardinality: r.cardinality ?? "" }))
172
+ .sort((a, b) => a.name.localeCompare(b.name));
173
+ }
174
+ relHref(fromHref, toHref) {
175
+ const fromParts = fromHref.split("/");
176
+ const toParts = toHref.split("/");
177
+ // Remove the filename from fromHref to get the directory
178
+ fromParts.pop();
179
+ // Find the common prefix length
180
+ // Note: toParts.length - 1 excludes the filename segment, comparing only directories
181
+ let commonLen = 0;
182
+ for (let i = 0; i < Math.min(fromParts.length, toParts.length - 1); i++) {
183
+ if (fromParts[i] === toParts[i]) {
184
+ commonLen++;
185
+ }
186
+ else {
187
+ break;
188
+ }
189
+ }
190
+ // Calculate levels to go up
191
+ const up = fromParts.length - commonLen;
192
+ // Get the remaining path from the common ancestor
193
+ const remaining = toParts.slice(commonLen).join("/");
194
+ // Construct the relative path
195
+ return up > 0 ? "../".repeat(up) + remaining : remaining;
196
+ }
197
+ }
198
+ //# sourceMappingURL=link-graph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"link-graph.js","sourceRoot":"","sources":["../src/link-graph.ts"],"names":[],"mappings":"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"}
package/dist/load.d.ts ADDED
@@ -0,0 +1,11 @@
1
+ import type { MetaData, MetaRoot } from "@metaobjectsdev/metadata";
2
+ export interface LoadedModel {
3
+ root: MetaRoot;
4
+ warnings: string[];
5
+ sourceDirs: string[];
6
+ }
7
+ /** Load N metadata source dirs into ONE root via a staging dir of symlinks. */
8
+ export declare function loadModel(sourceDirs: string[]): Promise<LoadedModel>;
9
+ /** Which top-level source dir a node came from (first file path segment of its source envelope). */
10
+ export declare function treeOf(node: MetaData, model: LoadedModel): string;
11
+ //# sourceMappingURL=load.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load.d.ts","sourceRoot":"","sources":["../src/load.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAEnE,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,QAAQ,CAAC;IACf,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,+EAA+E;AAC/E,wBAAsB,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC,CAyB1E;AAED,oGAAoG;AACpG,wBAAgB,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,GAAG,MAAM,CAKjE"}
package/dist/load.js ADDED
@@ -0,0 +1,40 @@
1
+ import { mkdtempSync, rmSync, symlinkSync } from "node:fs";
2
+ import { tmpdir } from "node:os";
3
+ import { basename, join, resolve } from "node:path";
4
+ import { MetaDataLoader, composeRegistry, coreTypesProvider, dbProvider, docProvider, promptProvider, uiProvider } from "@metaobjectsdev/metadata";
5
+ /** Load N metadata source dirs into ONE root via a staging dir of symlinks. */
6
+ export async function loadModel(sourceDirs) {
7
+ const staging = mkdtempSync(join(tmpdir(), "metadocs-"));
8
+ try {
9
+ const usedBasenames = new Set();
10
+ for (const dir of sourceDirs) {
11
+ const baseName = basename(dir);
12
+ if (usedBasenames.has(baseName)) {
13
+ throw new Error(`duplicate source dir basename: ${baseName}`);
14
+ }
15
+ usedBasenames.add(baseName);
16
+ symlinkSync(resolve(dir), join(staging, baseName));
17
+ }
18
+ const registry = composeRegistry([coreTypesProvider, dbProvider, docProvider, promptProvider, uiProvider]);
19
+ const result = await MetaDataLoader.fromDirectory(staging, { registry, strict: false });
20
+ if (result.errors.length > 0) {
21
+ throw new Error(`metadata load failed:\n${result.errors.map((e) => String(e)).join("\n")}`);
22
+ }
23
+ return {
24
+ root: result.root,
25
+ warnings: result.warnings.map((w) => w.message),
26
+ sourceDirs: sourceDirs.map((d) => basename(resolve(d))),
27
+ };
28
+ }
29
+ finally {
30
+ rmSync(staging, { recursive: true, force: true });
31
+ }
32
+ }
33
+ /** Which top-level source dir a node came from (first file path segment of its source envelope). */
34
+ export function treeOf(node, model) {
35
+ const src = node.source;
36
+ const f = src.files?.[0] ?? "";
37
+ const seg = f.replace(/\\/g, "/").split("/")[0] ?? "";
38
+ return model.sourceDirs.includes(seg) ? seg : (model.sourceDirs[0] ?? "");
39
+ }
40
+ //# sourceMappingURL=load.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load.js","sourceRoot":"","sources":["../src/load.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ export interface ErEdge {
2
+ parent: string;
3
+ child: string;
4
+ label: string;
5
+ cardinality?: "one" | "many" | undefined;
6
+ }
7
+ export declare const THEME_INIT: string;
8
+ export declare function packageFlowchart(edges: {
9
+ from: string;
10
+ to: string;
11
+ n: number;
12
+ }[], counts: Map<string, number>): string;
13
+ export declare function inheritanceTree(rows: {
14
+ name: string;
15
+ level: number;
16
+ self?: boolean;
17
+ }[]): string;
18
+ export declare const RICH_MAX = 8;
19
+ export declare function domainColor(pkg: string): {
20
+ fill: string;
21
+ stroke: string;
22
+ text: string;
23
+ };
24
+ export interface ErAttr {
25
+ type: string;
26
+ name: string;
27
+ key: "PK" | "FK" | "UK" | "";
28
+ note: string;
29
+ }
30
+ export interface ErNode {
31
+ name: string;
32
+ pkg: string;
33
+ role: "focal" | "view" | "external" | "normal";
34
+ kind?: string;
35
+ attrs: ErAttr[];
36
+ more: number;
37
+ }
38
+ export declare function erDiagramRich(nodes: ErNode[], edges: ErEdge[]): string;
39
+ export declare function flowchartDomain(nodes: {
40
+ name: string;
41
+ pkg: string;
42
+ kind?: string;
43
+ }[], edges: {
44
+ from: string;
45
+ to: string;
46
+ label?: string;
47
+ style?: "dashed" | undefined;
48
+ }[]): {
49
+ mermaid: string;
50
+ legend: {
51
+ pkg: string;
52
+ fill: string;
53
+ stroke: string;
54
+ }[];
55
+ };
56
+ //# sourceMappingURL=mermaid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mermaid.d.ts","sourceRoot":"","sources":["../src/mermaid.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,MAAM;IAAG,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,SAAS,CAAC;CAAE;AAInH,eAAO,MAAM,UAAU,QAIK,CAAC;AAO7B,wBAAgB,gBAAgB,CAAC,KAAK,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAOtH;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,EAAE,GAAG,MAAM,CAgB/F;AAGD,eAAO,MAAM,QAAQ,IAAI,CAAC;AAiB1B,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAKvF;AAGD,MAAM,WAAW,MAAM;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,EAAE,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;CAAE;AACnG,MAAM,WAAW,MAAM;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,UAAU,GAAG,QAAQ,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;CAAE;AAMpJ,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAsBtE;AAWD,wBAAgB,eAAe,CAC7B,KAAK,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,EACrD,KAAK,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAA;CAAE,EAAE,GAClF;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;CAAE,CA8B9E"}
@@ -0,0 +1,136 @@
1
+ // base theme is the only theme that honors custom themeVariables; the built-in `dark`
2
+ // theme renders attribute-bearing ERDs unreadably. Surfaces match the site's dark palette.
3
+ export const THEME_INIT = `%%{init: {'theme':'base','themeVariables':{'darkMode':true,'background':'#0b1220',` +
4
+ `'primaryColor':'#1e2a3a','primaryTextColor':'#cbd5e1','primaryBorderColor':'#4a7fa5',` +
5
+ `'lineColor':'#64748b','secondaryColor':'#1a2535','tertiaryColor':'#0f1826',` +
6
+ `'fontSize':'13px'}}}%%\n`;
7
+ const safe = (s) => s.replace(/"/g, "'");
8
+ const nodeId = (s) => s.replace(/[^a-zA-Z0-9_]/g, "_");
9
+ const edgeSort = (a, b) => a.parent.localeCompare(b.parent) || a.child.localeCompare(b.child) || a.label.localeCompare(b.label);
10
+ export function packageFlowchart(edges, counts) {
11
+ const lines = [THEME_INIT + "flowchart LR"];
12
+ const used = new Set(edges.flatMap((e) => [e.from, e.to]));
13
+ for (const p of [...used].sort())
14
+ lines.push(` ${p}["${safe(p)} · ${counts.get(p) ?? 0}"]`);
15
+ for (const e of [...edges].sort((a, b) => a.from.localeCompare(b.from) || a.to.localeCompare(b.to)))
16
+ lines.push(` ${e.from} -->|${e.n}| ${e.to}`);
17
+ return lines.join("\n");
18
+ }
19
+ export function inheritanceTree(rows) {
20
+ const lines = [THEME_INIT + "flowchart TD"];
21
+ const ordered = [...rows].sort((a, b) => a.level - b.level || a.name.localeCompare(b.name));
22
+ for (const r of ordered)
23
+ lines.push(` ${nodeId(r.name)}["${safe(r.name)}"]${r.self ? ":::self" : ""}`);
24
+ // connect each node to the alphabetically-first node one level below it whose ancestor it is:
25
+ // for a simple chain+children, link consecutive levels deterministically.
26
+ const byLevel = new Map();
27
+ for (const r of ordered)
28
+ (byLevel.get(r.level) ?? byLevel.set(r.level, []).get(r.level)).push(nodeId(r.name));
29
+ const levels = [...byLevel.keys()].sort((a, b) => a - b);
30
+ for (let i = 1; i < levels.length; i++) {
31
+ const parents = byLevel.get(levels[i - 1]);
32
+ const parent = parents[parents.length - 1]; // the chain node at the shallower level
33
+ for (const child of byLevel.get(levels[i]).sort())
34
+ lines.push(` ${parent} --> ${child}`);
35
+ }
36
+ lines.push(" classDef self fill:#1e3a5f,stroke:#60a5fa,color:#e2e8f0,font-weight:bold");
37
+ return lines.join("\n");
38
+ }
39
+ // ---- v2 diagram system: domain palette + rich/simple emitters ----
40
+ export const RICH_MAX = 8;
41
+ const ROLE_STROKE = { focal: "#60a5fa", view: "#2dd4bf", external: "#334155", normal: "#3b5170" };
42
+ // Deterministic domain palette — a fixed set of dark-surface color slots. Every
43
+ // package's leaf name hashes into a slot, so the same package always renders the
44
+ // same color, with no hardcoded domain→color vocabulary baked in.
45
+ const PALETTE = [
46
+ { fill: "#1e3a5f", stroke: "#60a5fa", text: "#93c5fd" },
47
+ { fill: "#3b2f1e", stroke: "#fbbf24", text: "#fde68a" },
48
+ { fill: "#3f2d5c", stroke: "#a78bfa", text: "#ede9fe" },
49
+ { fill: "#3f1f2e", stroke: "#fb7185", text: "#fecdd3" },
50
+ { fill: "#14342b", stroke: "#34d399", text: "#a7f3d0" },
51
+ { fill: "#1f2937", stroke: "#94a3b8", text: "#e2e8f0" },
52
+ { fill: "#2a2440", stroke: "#818cf8", text: "#e0e7ff" },
53
+ { fill: "#1a2e35", stroke: "#22d3ee", text: "#cffafe" },
54
+ { fill: "#332018", stroke: "#fb923c", text: "#fed7aa" },
55
+ { fill: "#1c2431", stroke: "#64748b", text: "#cbd5e1" },
56
+ ];
57
+ export function domainColor(pkg) {
58
+ const leaf = pkg.split("::").pop() ?? pkg;
59
+ // stable slot: hash the leaf name deterministically into the palette
60
+ let h = 0;
61
+ for (let i = 0; i < leaf.length; i++)
62
+ h = (h * 31 + leaf.charCodeAt(i)) >>> 0;
63
+ return PALETTE[h % PALETTE.length];
64
+ }
65
+ const cls = (pkg) => `d_${(pkg.split("::").pop() ?? pkg).replace(/[^a-zA-Z0-9]/g, "_")}`;
66
+ // erDiagram can't vary box shape, so KIND is encoded as a border dash + a glyph prefix in the box title.
67
+ const KIND_DASH = { value: ",stroke-dasharray:5 3", projection: ",stroke-dasharray:2 2" };
68
+ const KIND_GLYPH = { entity: "▭", value: "⬭", projection: "▱" };
69
+ const kindGlyph = (kind) => KIND_GLYPH[kind ?? ""] ?? "▭";
70
+ export function erDiagramRich(nodes, edges) {
71
+ const lines = [THEME_INIT + "erDiagram"];
72
+ for (const n of [...nodes].sort((a, b) => a.name.localeCompare(b.name))) {
73
+ lines.push(` ${nodeId(n.name)}["${kindGlyph(n.kind)} ${safe(n.name)}"] {`);
74
+ for (const a of n.attrs) {
75
+ const keyPart = a.key ? ` ${a.key}` : "";
76
+ lines.push(` ${a.type} ${a.name}${keyPart} "${safe(a.note)}"`);
77
+ }
78
+ if (n.more > 0)
79
+ lines.push(` _ plus "+${n.more} more"`);
80
+ lines.push(" }");
81
+ }
82
+ for (const e of [...edges].sort(edgeSort)) {
83
+ const conn = e.cardinality === "many" ? "}o--o{" : "||--o{";
84
+ lines.push(` ${nodeId(e.parent)} ${conn} ${nodeId(e.child)} : "${safe(e.label)}"`);
85
+ }
86
+ // one classDef per entity: fill = domain, stroke = role
87
+ for (const n of [...nodes].sort((a, b) => a.name.localeCompare(b.name))) {
88
+ const dc = domainColor(n.pkg);
89
+ lines.push(` ${nodeId(n.name)}:::c_${nodeId(n.name)}`);
90
+ lines.push(` classDef c_${nodeId(n.name)} fill:${dc.fill},stroke:${ROLE_STROKE[n.role]},color:#cbd5e1${KIND_DASH[n.kind ?? ""] ?? ""}`);
91
+ }
92
+ return lines.join("\n");
93
+ }
94
+ // node shape encodes object KIND: entity = rectangle, value object = stadium (rounded ends),
95
+ // projection/view = parallelogram. Domain is the fill color; kind is the silhouette.
96
+ function shapeDecl(id, label, kind) {
97
+ const l = `"${label}"`;
98
+ if (kind === "value")
99
+ return `${id}([${l}])`;
100
+ if (kind === "projection")
101
+ return `${id}[/${l}/]`;
102
+ return `${id}[${l}]`; // entity / default
103
+ }
104
+ export function flowchartDomain(nodes, edges) {
105
+ const lines = [THEME_INIT + "flowchart LR"];
106
+ const kindByName = new Map(nodes.map((n) => [n.name, n.kind]));
107
+ // collect all node names (from node list + edge endpoints), deduplicate, declare with explicit labels
108
+ const allNodeNames = new Set([
109
+ ...nodes.map((n) => n.name),
110
+ ...edges.flatMap((e) => [e.from, e.to]),
111
+ ]);
112
+ for (const name of [...allNodeNames].sort())
113
+ lines.push(` ${shapeDecl(nodeId(name), safe(name), kindByName.get(name))}`);
114
+ // edge labels must not contain flowchart-breaking chars (parens, pipes, brackets, braces)
115
+ const edgeLabel = (s) => s.replace(/["|(){}\[\]]/g, "").replace(/\s+/g, " ").trim();
116
+ for (const e of [...edges].sort((a, b) => a.from.localeCompare(b.from) || a.to.localeCompare(b.to))) {
117
+ const lbl = e.label ? edgeLabel(e.label) : "";
118
+ const arrow = e.style === "dashed" ? "-.->" : "-->";
119
+ lines.push(lbl ? ` ${nodeId(e.from)} ${arrow}|${lbl}| ${nodeId(e.to)}` : ` ${nodeId(e.from)} ${arrow} ${nodeId(e.to)}`);
120
+ }
121
+ // group node names by domain class, assign, and emit one classDef per used domain
122
+ const byCls = new Map();
123
+ for (const n of [...nodes].sort((a, b) => a.name.localeCompare(b.name))) {
124
+ const c = cls(n.pkg);
125
+ (byCls.get(c) ?? byCls.set(c, { pkg: n.pkg, ids: [] }).get(c)).ids.push(nodeId(n.name));
126
+ }
127
+ for (const [c, g] of [...byCls.entries()].sort(([a], [b]) => a.localeCompare(b))) {
128
+ const dc = domainColor(g.pkg);
129
+ lines.push(` class ${g.ids.sort().join(",")} ${c}`);
130
+ lines.push(` classDef ${c} fill:${dc.fill},stroke:${dc.stroke},color:${dc.text}`);
131
+ }
132
+ const legend = [...new Map(nodes.map((n) => [n.pkg, n.pkg])).keys()].sort()
133
+ .map((pkg) => ({ pkg, fill: domainColor(pkg).fill, stroke: domainColor(pkg).stroke }));
134
+ return { mermaid: lines.join("\n"), legend };
135
+ }
136
+ //# sourceMappingURL=mermaid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mermaid.js","sourceRoot":"","sources":["../src/mermaid.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export interface HighlightResult {
2
+ html: string;
3
+ toc: {
4
+ name: string;
5
+ anchor: string;
6
+ }[];
7
+ refs: string[];
8
+ }
9
+ export declare function highlightMustache(src: string, resolveHref: (p: string) => string | undefined): HighlightResult;
10
+ //# sourceMappingURL=mustache-highlight.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mustache-highlight.d.ts","sourceRoot":"","sources":["../src/mustache-highlight.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAC;CAAE;AAI3G,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,GAAG,eAAe,CAsC9G"}
@@ -0,0 +1,55 @@
1
+ const esc = (s) => s.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;");
2
+ export function highlightMustache(src, resolveHref) {
3
+ let out = "";
4
+ const toc = [];
5
+ const refs = [];
6
+ let depth = 0;
7
+ let i = 0;
8
+ while (i < src.length) {
9
+ const open = src.indexOf("{{", i);
10
+ if (open === -1) {
11
+ out += esc(src.slice(i));
12
+ break;
13
+ }
14
+ out += esc(src.slice(i, open));
15
+ const triple = src.startsWith("{{{", open);
16
+ const close = src.indexOf(triple ? "}}}" : "}}", open);
17
+ if (close === -1) {
18
+ out += esc(src.slice(open));
19
+ break;
20
+ }
21
+ const end = close + (triple ? 3 : 2);
22
+ const rawTok = src.slice(open, end);
23
+ const inner = src.slice(open + (triple ? 3 : 2), close).trim();
24
+ const sigil = triple ? "{" : inner[0] ?? "";
25
+ const name = triple ? inner : inner.replace(/^[#^\/>!&]\s*/, "");
26
+ const span = (cls, extra = "") => `<span class="${cls}"${extra}>${esc(rawTok)}</span>`;
27
+ if (!triple && sigil === "!")
28
+ out += span("mu-com");
29
+ else if (!triple && sigil === ">")
30
+ out += span("mu-par");
31
+ else if (!triple && (sigil === "#" || sigil === "^")) {
32
+ refs.push(name);
33
+ const href = resolveHref(name);
34
+ if (depth === 0 && sigil === "#") {
35
+ toc.push({ name, anchor: `sec-${name}` });
36
+ }
37
+ const idAttr = depth === 0 && sigil === "#" ? ` id="sec-${esc(name)}"` : "";
38
+ out += href ? `<a href="${esc(href)}" class="mu-sec"${idAttr}>${esc(rawTok)}</a>` : span("mu-sec mu-unresolved", idAttr);
39
+ depth++;
40
+ }
41
+ else if (!triple && sigil === "/") {
42
+ depth = Math.max(0, depth - 1);
43
+ out += span("mu-sec");
44
+ }
45
+ else {
46
+ refs.push(name);
47
+ const cls = triple || sigil === "&" ? "mu-raw" : "mu-var";
48
+ const href = resolveHref(name);
49
+ out += href ? `<a href="${esc(href)}" class="${cls}">${esc(rawTok)}</a>` : span(`${cls} mu-unresolved`);
50
+ }
51
+ i = end;
52
+ }
53
+ return { html: out, toc, refs };
54
+ }
55
+ //# sourceMappingURL=mustache-highlight.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mustache-highlight.js","sourceRoot":"","sources":["../src/mustache-highlight.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { LinkGraph } from "./link-graph";
2
+ export interface PackageDoc {
3
+ title: string;
4
+ description: string;
5
+ }
6
+ export declare function harvestPackageDocs(sourceDirs: string[]): Map<string, PackageDoc>;
7
+ export declare function keyEntities(pkg: string, g: LinkGraph, n?: number): {
8
+ name: string;
9
+ href: string;
10
+ inbound: number;
11
+ }[];
12
+ //# sourceMappingURL=package-docs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-docs.d.ts","sourceRoot":"","sources":["../src/package-docs.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAS,MAAM,cAAc,CAAC;AAEhD,MAAM,WAAW,UAAU;IAAG,KAAK,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;CAAE;AAEnE,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAiBhF;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,SAAI,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,EAAE,CAM/G"}
@@ -0,0 +1,34 @@
1
+ import { readdirSync, readFileSync, statSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { parse } from "yaml";
4
+ import { LinkGraph, fqnOf } from "./link-graph";
5
+ export function harvestPackageDocs(sourceDirs) {
6
+ const out = new Map();
7
+ const walk = (d) => {
8
+ for (const e of readdirSync(d)) {
9
+ const p = join(d, e);
10
+ if (statSync(p).isDirectory())
11
+ walk(p);
12
+ else if (e === "_package.yaml") {
13
+ try {
14
+ const y = parse(readFileSync(p, "utf8"));
15
+ const m = y?.metadata;
16
+ if (m?.package)
17
+ out.set(m.package, { title: String(m.title ?? ""), description: String(m.description ?? "") });
18
+ }
19
+ catch { /* malformed _package.yaml is skipped; coverage/anomalies surface it elsewhere */ }
20
+ }
21
+ }
22
+ };
23
+ for (const d of sourceDirs)
24
+ walk(d);
25
+ return out;
26
+ }
27
+ export function keyEntities(pkg, g, n = 4) {
28
+ return g.nodes()
29
+ .filter((dn) => dn.kind === "object" && dn.pkg === pkg && !dn.node.isAbstract)
30
+ .map((dn) => ({ name: dn.name, href: dn.href, inbound: g.refsTo(fqnOf(dn.node)).filter((r) => r.kind !== "extends").length }))
31
+ .sort((a, b) => b.inbound - a.inbound || a.name.localeCompare(b.name))
32
+ .slice(0, n);
33
+ }
34
+ //# sourceMappingURL=package-docs.js.map