@genvidtech/c3-domain-manager 0.0.1 → 0.6.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 (70) hide show
  1. package/LICENSE +18 -0
  2. package/README.md +195 -29
  3. package/dist/adapters/locations.d.ts +22 -0
  4. package/dist/adapters/locations.d.ts.map +1 -0
  5. package/dist/adapters/locations.js +42 -0
  6. package/dist/adapters/locations.js.map +1 -0
  7. package/dist/cli.d.ts +3 -0
  8. package/dist/cli.d.ts.map +1 -0
  9. package/dist/cli.js +99 -0
  10. package/dist/cli.js.map +1 -0
  11. package/dist/domain/classification.d.ts +8 -0
  12. package/dist/domain/classification.d.ts.map +1 -0
  13. package/dist/domain/classification.js +66 -0
  14. package/dist/domain/classification.js.map +1 -0
  15. package/dist/domain/contextMap.d.ts +8 -0
  16. package/dist/domain/contextMap.d.ts.map +1 -0
  17. package/dist/domain/contextMap.js +168 -0
  18. package/dist/domain/contextMap.js.map +1 -0
  19. package/dist/domain/domainAnalysis.d.ts +25 -0
  20. package/dist/domain/domainAnalysis.d.ts.map +1 -0
  21. package/dist/domain/domainAnalysis.js +136 -0
  22. package/dist/domain/domainAnalysis.js.map +1 -0
  23. package/dist/domain/domainGenerator.d.ts +33 -0
  24. package/dist/domain/domainGenerator.d.ts.map +1 -0
  25. package/dist/domain/domainGenerator.js +307 -0
  26. package/dist/domain/domainGenerator.js.map +1 -0
  27. package/dist/domain/editorValidation.d.ts +19 -0
  28. package/dist/domain/editorValidation.d.ts.map +1 -0
  29. package/dist/domain/editorValidation.js +40 -0
  30. package/dist/domain/editorValidation.js.map +1 -0
  31. package/dist/domain/formatting.d.ts +16 -0
  32. package/dist/domain/formatting.d.ts.map +1 -0
  33. package/dist/domain/formatting.js +414 -0
  34. package/dist/domain/formatting.js.map +1 -0
  35. package/dist/domain/glossary.d.ts +20 -0
  36. package/dist/domain/glossary.d.ts.map +1 -0
  37. package/dist/domain/glossary.js +62 -0
  38. package/dist/domain/glossary.js.map +1 -0
  39. package/dist/domain/health.d.ts +14 -0
  40. package/dist/domain/health.d.ts.map +1 -0
  41. package/dist/domain/health.js +21 -0
  42. package/dist/domain/health.js.map +1 -0
  43. package/dist/domain/relationships.d.ts +13 -0
  44. package/dist/domain/relationships.d.ts.map +1 -0
  45. package/dist/domain/relationships.js +74 -0
  46. package/dist/domain/relationships.js.map +1 -0
  47. package/dist/domain/types.d.ts +290 -0
  48. package/dist/domain/types.d.ts.map +1 -0
  49. package/dist/domain/types.js +29 -0
  50. package/dist/domain/types.js.map +1 -0
  51. package/dist/index.d.ts +11 -0
  52. package/dist/index.d.ts.map +1 -0
  53. package/dist/index.js +12 -0
  54. package/dist/index.js.map +1 -0
  55. package/dist/mcp/server.d.ts +3 -0
  56. package/dist/mcp/server.d.ts.map +1 -0
  57. package/dist/mcp/server.js +519 -0
  58. package/dist/mcp/server.js.map +1 -0
  59. package/docs/TOC.md +27 -0
  60. package/docs/decisions/0001-adopt-c3source-extractors.md +67 -0
  61. package/docs/decisions/0002-configurable-locations-adapters-seam.md +72 -0
  62. package/docs/decisions/0003-adopt-loadprojectconfig-schema-first.md +73 -0
  63. package/docs/decisions/0004-adopt-mcp-utils-0.4.0-helpers.md +74 -0
  64. package/docs/decisions/0005-validateforeditor-read-side-diagnostic.md +65 -0
  65. package/docs/decisions/0006-event-variable-reference-coupling.md +77 -0
  66. package/docs/decisions/0007-project-dir-resolverootfolder.md +72 -0
  67. package/docs/decisions/0008-adopt-openproject-option-a.md +74 -0
  68. package/docs/domain-architecture.md +242 -0
  69. package/docs/releasing.md +122 -0
  70. package/package.json +79 -8
@@ -0,0 +1,307 @@
1
+ import * as fs from "node:fs";
2
+ import path from "node:path";
3
+ import { openProject, extractFunctions, extractIncludes, visitEvents, hasConditions, hasActions, getEventVarReferenceName, } from "@genvidtech/c3source";
4
+ import { classifyFile } from "./classification.js";
5
+ import { formatDomainIndex as formatDomainIndexPage, formatDomainPage } from "./formatting.js";
6
+ import { DomainConfigSchema } from "./types.js";
7
+ import { loadProjectConfig, isMcpError } from "@genvidtech/mcp-utils";
8
+ /** Format function parameters as "name: type, name2: type2". */
9
+ function formatParams(params) {
10
+ return params.map((p) => `${p.name}: ${p.type}`).join(", ");
11
+ }
12
+ /**
13
+ * Map c3source's typed `ExtractedFunction` list for a sheet onto our `FunctionDef`
14
+ * shape: format params to a string, stamp the source sheet, and surface the
15
+ * custom-ACE `objectClass`/`aceName` that `formatting.ts` renders.
16
+ */
17
+ export function extractFunctionDefs(sheet, sheetName) {
18
+ return extractFunctions(sheet).map((f) => ({
19
+ name: f.name,
20
+ params: formatParams(f.params),
21
+ returnType: f.returnType,
22
+ sourceSheet: sheetName,
23
+ objectClass: f.objectClass,
24
+ aceName: f.kind === "custom-ace" ? f.name : undefined,
25
+ }));
26
+ }
27
+ /**
28
+ * Top-level (sheet-root ≈ global-scope) event-variable declaration names for a sheet.
29
+ * Only root-level `variable` events are indexed — cross-sheet references in C3 require
30
+ * global variables, so root-level declarations are the global-scope approximation.
31
+ */
32
+ export function extractEventVarDecls(sheet) {
33
+ return sheet.events
34
+ .filter((e) => e.eventType === "variable")
35
+ .map((e) => e.name);
36
+ }
37
+ /**
38
+ * Deduped event-variable names referenced by System ACEs anywhere in a sheet's event tree.
39
+ * Walks every condition and action via `visitEvents`, applying c3source's
40
+ * `getEventVarReferenceName` (which gates on `objectClass === "System"`).
41
+ */
42
+ export function extractEventVarRefs(sheet) {
43
+ const names = new Set();
44
+ visitEvents(sheet.events, (event) => {
45
+ if (hasConditions(event)) {
46
+ for (const cond of event.conditions) {
47
+ const name = getEventVarReferenceName(cond);
48
+ if (name !== null)
49
+ names.add(name);
50
+ }
51
+ }
52
+ if (hasActions(event)) {
53
+ for (const action of event.actions) {
54
+ const name = getEventVarReferenceName(action);
55
+ if (name !== null)
56
+ names.add(name);
57
+ }
58
+ }
59
+ });
60
+ return [...names];
61
+ }
62
+ export async function loadConfig(projectRoot, fileName) {
63
+ const cfg = await loadProjectConfig(projectRoot, fileName, DomainConfigSchema);
64
+ if (isMcpError(cfg)) {
65
+ const text = cfg.content?.map((c) => ("text" in c ? c.text : "")).join("\n") ?? "config load failed";
66
+ throw new Error(text);
67
+ }
68
+ return cfg;
69
+ }
70
+ /** Directories that are structural layers, not domain-relevant. Recurse into them. */
71
+ const LAYER_DIRS = ["shared", "c3-runtime"];
72
+ export function findScriptEntries(scriptsDir) {
73
+ const entries = [];
74
+ function scanDir(dir, prefix) {
75
+ const names = fs.readdirSync(dir).sort();
76
+ for (const name of names) {
77
+ const fullPath = path.join(dir, name);
78
+ const stats = fs.statSync(fullPath);
79
+ if (stats.isDirectory()) {
80
+ if (LAYER_DIRS.includes(name)) {
81
+ // Recurse into layer dirs — enumerate their children instead
82
+ scanDir(fullPath, `${prefix}${name}/`);
83
+ }
84
+ else {
85
+ entries.push({ relativePath: `scripts/${prefix}${name}/`, isDirectory: true });
86
+ }
87
+ }
88
+ else if (stats.isFile() && name.endsWith(".ts")) {
89
+ entries.push({ relativePath: `scripts/${prefix}${name}`, isDirectory: false });
90
+ }
91
+ }
92
+ }
93
+ scanDir(scriptsDir, "");
94
+ return entries;
95
+ }
96
+ export function computeDomainData(rootDir, config, log = () => { }) {
97
+ // Find all files
98
+ const project = openProject(rootDir);
99
+ const eventSheetPaths = project.findAllEventSheets();
100
+ const layoutPaths = project.findAllLayouts();
101
+ const scriptEntries = findScriptEntries(project.scriptsDir);
102
+ log(`Found ${eventSheetPaths.length} eventSheets, ${layoutPaths.length} layouts, ${scriptEntries.length} script entries.`);
103
+ // Classify all files
104
+ const domainDataMap = new Map();
105
+ const unclassified = [];
106
+ // Initialize domain data for all configured domains
107
+ for (const [name, def] of Object.entries(config.domains)) {
108
+ domainDataMap.set(name, {
109
+ name,
110
+ description: def.description,
111
+ eventSheets: [],
112
+ layouts: [],
113
+ scripts: [],
114
+ functions: [],
115
+ includesFrom: new Map(),
116
+ includedBy: new Map(),
117
+ referencesFrom: new Map(),
118
+ referencedBy: new Map(),
119
+ strategy: def.strategy,
120
+ });
121
+ }
122
+ // Initialize domain data for shared subdomains
123
+ if (config.sharedSubdomains) {
124
+ for (const [name, def] of Object.entries(config.sharedSubdomains)) {
125
+ domainDataMap.set(name, {
126
+ name,
127
+ description: def.description,
128
+ eventSheets: [],
129
+ layouts: [],
130
+ scripts: [],
131
+ functions: [],
132
+ includesFrom: new Map(),
133
+ includedBy: new Map(),
134
+ referencesFrom: new Map(),
135
+ referencedBy: new Map(),
136
+ isSharedSubdomain: true,
137
+ strategy: def.strategy,
138
+ });
139
+ }
140
+ }
141
+ // Classify and parse eventSheets
142
+ const sheetDomainLookup = new Map(); // sheetName → domainName
143
+ const rawIncludes = new Map(); // domainName → raw include sheet names
144
+ const varDeclIndex = new Map(); // variable name → set of declaring domains
145
+ const rawRefs = new Map(); // domainName → referenced variable names (raw)
146
+ for (const sheetPath of eventSheetPaths) {
147
+ const relPath = path.relative(rootDir, sheetPath).replace(/\\/g, "/");
148
+ const domain = classifyFile(relPath, "eventSheet", config);
149
+ if (!domain) {
150
+ unclassified.push(relPath);
151
+ log(` Unclassified: ${relPath}`);
152
+ continue;
153
+ }
154
+ const domainData = domainDataMap.get(domain);
155
+ // Determine directory within eventSheets/
156
+ const innerPath = relPath.replace(/^eventSheets\//, "");
157
+ const dirParts = innerPath.split("/");
158
+ const directory = dirParts.length > 1 ? dirParts.slice(0, -1).join("/") : "";
159
+ domainData.eventSheets.push({ path: relPath, directory });
160
+ // Parse eventSheet for includes and functions
161
+ const content = fs.readFileSync(sheetPath, "utf-8");
162
+ const sheet = JSON.parse(content);
163
+ const sheetName = innerPath.replace(/\.json$/, "");
164
+ sheetDomainLookup.set(sheet.name, domain);
165
+ // Extract functions
166
+ const funcs = extractFunctionDefs(sheet, sheetName);
167
+ domainData.functions.push(...funcs);
168
+ // Extract includes (will be resolved to cross-domain deps later)
169
+ const includes = extractIncludes(sheet).map((r) => r.includeSheet);
170
+ if (includes.length > 0) {
171
+ const existing = rawIncludes.get(domain) ?? [];
172
+ existing.push(...includes);
173
+ rawIncludes.set(domain, existing);
174
+ }
175
+ // Index top-level variable declarations: variable name → declaring domains
176
+ for (const varName of extractEventVarDecls(sheet)) {
177
+ if (!varDeclIndex.has(varName))
178
+ varDeclIndex.set(varName, new Set());
179
+ varDeclIndex.get(varName).add(domain);
180
+ }
181
+ // Accumulate event-variable references for cross-domain resolution later
182
+ const refs = extractEventVarRefs(sheet);
183
+ if (refs.length > 0) {
184
+ const existing = rawRefs.get(domain) ?? [];
185
+ existing.push(...refs);
186
+ rawRefs.set(domain, existing);
187
+ }
188
+ }
189
+ // Classify layouts
190
+ for (const layoutPath of layoutPaths) {
191
+ const relPath = path.relative(rootDir, layoutPath).replace(/\\/g, "/");
192
+ const domain = classifyFile(relPath, "layout", config);
193
+ if (!domain) {
194
+ unclassified.push(relPath);
195
+ log(` Unclassified: ${relPath}`);
196
+ continue;
197
+ }
198
+ const domainData = domainDataMap.get(domain);
199
+ // Read layout to get eventSheet reference
200
+ const content = fs.readFileSync(layoutPath, "utf-8");
201
+ const layout = JSON.parse(content);
202
+ const eventSheet = layout.eventSheet || "";
203
+ const eventSheetDomain = eventSheet ? (sheetDomainLookup.get(eventSheet) ?? "") : "";
204
+ domainData.layouts.push({ path: relPath, eventSheet, eventSheetDomain });
205
+ }
206
+ // Classify scripts
207
+ for (const entry of scriptEntries) {
208
+ const lookupPath = entry.isDirectory
209
+ ? entry.relativePath.replace(/\/$/, "")
210
+ : entry.relativePath;
211
+ const domain = classifyFile(lookupPath, "script", config);
212
+ if (domain) {
213
+ domainDataMap.get(domain).scripts.push({ path: entry.relativePath, isDirectory: entry.isDirectory });
214
+ }
215
+ else {
216
+ unclassified.push(entry.relativePath);
217
+ log(` Unclassified: ${entry.relativePath}`);
218
+ }
219
+ }
220
+ // Resolve cross-domain dependencies from includes
221
+ for (const [domainName, domainData] of domainDataMap) {
222
+ const raw = rawIncludes.get(domainName) ?? [];
223
+ for (const includedSheetName of raw) {
224
+ const targetDomain = sheetDomainLookup.get(includedSheetName);
225
+ if (targetDomain && targetDomain !== domainName) {
226
+ // Add to includesFrom
227
+ if (!domainData.includesFrom.has(targetDomain)) {
228
+ domainData.includesFrom.set(targetDomain, []);
229
+ }
230
+ const list = domainData.includesFrom.get(targetDomain);
231
+ if (!list.includes(includedSheetName)) {
232
+ list.push(includedSheetName);
233
+ }
234
+ // Add to target's includedBy
235
+ const targetData = domainDataMap.get(targetDomain);
236
+ if (targetData) {
237
+ if (!targetData.includedBy.has(domainName)) {
238
+ targetData.includedBy.set(domainName, []);
239
+ }
240
+ const targetList = targetData.includedBy.get(domainName);
241
+ if (!targetList.includes(includedSheetName)) {
242
+ targetList.push(includedSheetName);
243
+ }
244
+ }
245
+ }
246
+ }
247
+ }
248
+ // Resolve cross-domain dependencies from event-variable references.
249
+ // A reference resolves to EVERY domain that declares a top-level variable of that
250
+ // name (attribute-to-all on collision); same-domain and unresolved names are skipped.
251
+ for (const [domainName, domainData] of domainDataMap) {
252
+ const refs = rawRefs.get(domainName) ?? [];
253
+ for (const varName of refs) {
254
+ const declaringDomains = varDeclIndex.get(varName);
255
+ if (!declaringDomains)
256
+ continue; // unresolved — no global declaration
257
+ for (const targetDomain of declaringDomains) {
258
+ if (targetDomain === domainName)
259
+ continue; // same-domain — not cross-domain
260
+ // referencesFrom: domainName → targetDomain (var names)
261
+ if (!domainData.referencesFrom.has(targetDomain))
262
+ domainData.referencesFrom.set(targetDomain, []);
263
+ const out = domainData.referencesFrom.get(targetDomain);
264
+ if (!out.includes(varName))
265
+ out.push(varName);
266
+ // referencedBy on the target
267
+ const targetData = domainDataMap.get(targetDomain);
268
+ if (targetData) {
269
+ if (!targetData.referencedBy.has(domainName))
270
+ targetData.referencedBy.set(domainName, []);
271
+ const inc = targetData.referencedBy.get(domainName);
272
+ if (!inc.includes(varName))
273
+ inc.push(varName);
274
+ }
275
+ }
276
+ }
277
+ }
278
+ // Sort domains by name for consistent output
279
+ const domains = Array.from(domainDataMap.values()).sort((a, b) => a.name.localeCompare(b.name));
280
+ return { domains, unclassified };
281
+ }
282
+ export async function generateDomainIndex(rootDir, outDir, projectRoot, fileName, log = console.log) {
283
+ const config = await loadConfig(projectRoot, fileName);
284
+ const domainIndexDir = path.join(outDir, "domain-index");
285
+ const { domains, unclassified } = computeDomainData(rootDir, config, log);
286
+ // Clean domain-index/ directory
287
+ fs.rmSync(domainIndexDir, { recursive: true, force: true });
288
+ fs.mkdirSync(domainIndexDir, { recursive: true });
289
+ // Generate master index
290
+ const indexContent = formatDomainIndexPage(domains, unclassified);
291
+ fs.writeFileSync(path.join(domainIndexDir, "index.md"), indexContent);
292
+ // Generate per-domain pages
293
+ for (const domain of domains) {
294
+ const pageContent = formatDomainPage(domain);
295
+ // Sanitize domain name for filename (e.g., "Watch/Story" → "Watch-Story")
296
+ const safeFileName = domain.name.replace(/\//g, "-");
297
+ fs.writeFileSync(path.join(domainIndexDir, `${safeFileName}.md`), pageContent);
298
+ }
299
+ log(`Generated domain index with ${domains.length} domains in ${domainIndexDir}`);
300
+ if (unclassified.length > 0) {
301
+ log(` ${unclassified.length} unclassified files!`);
302
+ }
303
+ else {
304
+ log(" All files classified.");
305
+ }
306
+ }
307
+ //# sourceMappingURL=domainGenerator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"domainGenerator.js","sourceRoot":"","sources":["../../src/domain/domainGenerator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { EditorValidationIssue } from "@genvidtech/c3source";
2
+ import type { Logger } from "@genvidtech/mcp-utils";
3
+ import type { DomainConfig } from "./types.js";
4
+ export interface EditorStrictnessSheetReport {
5
+ /** Relative POSIX path, e.g. "eventSheets/Login/LoginEvents.json". */
6
+ sheet: string;
7
+ /** Owning domain name from classifyFile, or "(unclassified)". */
8
+ domain: string;
9
+ /** Issues from c3source's validateForEditor for this sheet. */
10
+ issues: EditorValidationIssue[];
11
+ }
12
+ export interface EditorStrictnessReport {
13
+ /** Only sheets that HAVE at least one issue, sorted by sheet path. */
14
+ sheets: EditorStrictnessSheetReport[];
15
+ totalIssues: number;
16
+ }
17
+ export declare function validateEditorStrictness(rootDir: string, config: DomainConfig, log?: Logger): EditorStrictnessReport;
18
+ export declare function formatEditorStrictnessReport(report: EditorStrictnessReport): string;
19
+ //# sourceMappingURL=editorValidation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"editorValidation.d.ts","sourceRoot":"","sources":["../../src/domain/editorValidation.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAc,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC9E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAEpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,MAAM,WAAW,2BAA2B;IAC1C,sEAAsE;IACtE,KAAK,EAAE,MAAM,CAAC;IACd,iEAAiE;IACjE,MAAM,EAAE,MAAM,CAAC;IACf,+DAA+D;IAC/D,MAAM,EAAE,qBAAqB,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,sBAAsB;IACrC,sEAAsE;IACtE,MAAM,EAAE,2BAA2B,EAAE,CAAC;IACtC,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,YAAY,EACpB,GAAG,GAAE,MAAiB,GACrB,sBAAsB,CA4BxB;AAED,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,sBAAsB,GAAG,MAAM,CAenF"}
@@ -0,0 +1,40 @@
1
+ import * as fs from "node:fs";
2
+ import * as path from "node:path";
3
+ import { openProject, validateForEditor } from "@genvidtech/c3source";
4
+ import { classifyFile } from "./classification.js";
5
+ export function validateEditorStrictness(rootDir, config, log = () => { }) {
6
+ const project = openProject(rootDir);
7
+ if (!project.hasEventSheets()) {
8
+ log(`editorValidation: eventSheets/ dir not found at ${project.eventSheetsDir}, skipping.`);
9
+ return { sheets: [], totalIssues: 0 };
10
+ }
11
+ const sheetPaths = project.findAllEventSheets();
12
+ const results = [];
13
+ for (const sheetPath of sheetPaths) {
14
+ const relPath = path.relative(rootDir, sheetPath).replace(/\\/g, "/");
15
+ const domainName = classifyFile(relPath, "eventSheet", config) ?? "(unclassified)";
16
+ const content = fs.readFileSync(sheetPath, "utf-8");
17
+ const sheet = JSON.parse(content);
18
+ const issues = validateForEditor(sheet);
19
+ if (issues.length > 0) {
20
+ results.push({ sheet: relPath, domain: domainName, issues });
21
+ }
22
+ }
23
+ results.sort((a, b) => a.sheet.localeCompare(b.sheet));
24
+ const totalIssues = results.reduce((sum, r) => sum + r.issues.length, 0);
25
+ return { sheets: results, totalIssues };
26
+ }
27
+ export function formatEditorStrictnessReport(report) {
28
+ if (report.totalIssues === 0) {
29
+ return "No editor-strictness issues found.";
30
+ }
31
+ const lines = [`${report.totalIssues} editor-strictness issue(s) found:`, ""];
32
+ for (const sheetReport of report.sheets) {
33
+ lines.push(`${sheetReport.sheet} [${sheetReport.domain}]`);
34
+ for (const issue of sheetReport.issues) {
35
+ lines.push(` [${issue.rule}] ${issue.path}: ${issue.message}`);
36
+ }
37
+ }
38
+ return lines.join("\n");
39
+ }
40
+ //# sourceMappingURL=editorValidation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"editorValidation.js","sourceRoot":"","sources":["../../src/domain/editorValidation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAGtE,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAkBnD,MAAM,UAAU,wBAAwB,CACtC,OAAe,EACf,MAAoB,EACpB,MAAc,GAAG,EAAE,GAAE,CAAC;IAEtB,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IACrC,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC;QAC9B,GAAG,CAAC,mDAAmD,OAAO,CAAC,cAAc,aAAa,CAAC,CAAC;QAC5F,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC;IACxC,CAAC;IACD,MAAM,UAAU,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAEhD,MAAM,OAAO,GAAkC,EAAE,CAAC;IAElD,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QACtE,MAAM,UAAU,GAAG,YAAY,CAAC,OAAO,EAAE,YAAY,EAAE,MAAM,CAAC,IAAI,gBAAgB,CAAC;QAEnF,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QACpD,MAAM,KAAK,GAAe,IAAI,CAAC,KAAK,CAAC,OAAO,CAAe,CAAC;QAE5D,MAAM,MAAM,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;QACxC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IAEvD,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAEzE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,MAA8B;IACzE,IAAI,MAAM,CAAC,WAAW,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO,oCAAoC,CAAC;IAC9C,CAAC;IAED,MAAM,KAAK,GAAa,CAAC,GAAG,MAAM,CAAC,WAAW,oCAAoC,EAAE,EAAE,CAAC,CAAC;IAExF,KAAK,MAAM,WAAW,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QACxC,KAAK,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,KAAK,KAAK,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC;QAC3D,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,MAAM,EAAE,CAAC;YACvC,KAAK,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAClE,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { DomainConfig, DomainData } from "./types.js";
2
+ /**
3
+ * Format the domain index page (master overview of all domains).
4
+ */
5
+ export declare function formatDomainIndex(domains: DomainData[], unclassified: string[]): string;
6
+ /**
7
+ * Format a single domain's detail page.
8
+ */
9
+ export declare function formatDomainPage(domain: DomainData): string;
10
+ export type DomainConfigSection = "domains" | "sharedSubdomains" | "overrides" | "all";
11
+ /**
12
+ * Format a DomainConfig into human-readable text.
13
+ * When section is "all", all three sections are concatenated with blank line separators.
14
+ */
15
+ export declare function formatDomainConfig(config: DomainConfig, section?: DomainConfigSection): string;
16
+ //# sourceMappingURL=formatting.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatting.d.ts","sourceRoot":"","sources":["../../src/domain/formatting.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAe,MAAM,YAAY,CAAC;AAIxE;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,MAAM,CAmHvF;AA6DD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CA8B3D;AA8GD,MAAM,MAAM,mBAAmB,GAAG,SAAS,GAAG,kBAAkB,GAAG,WAAW,GAAG,KAAK,CAAC;AAEvF;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,GAAE,mBAA2B,GAAG,MAAM,CAYrG"}