wabachi 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +84 -0
- package/dist/architecture/canon/authority.d.ts +35 -0
- package/dist/architecture/canon/authority.js +76 -0
- package/dist/architecture/canon/authority.js.map +1 -0
- package/dist/architecture/canon/boundaries.d.ts +31 -0
- package/dist/architecture/canon/boundaries.js +73 -0
- package/dist/architecture/canon/boundaries.js.map +1 -0
- package/dist/architecture/canon/codec.d.ts +10 -0
- package/dist/architecture/canon/codec.js +516 -0
- package/dist/architecture/canon/codec.js.map +1 -0
- package/dist/architecture/canon/constraints.d.ts +60 -0
- package/dist/architecture/canon/constraints.js +116 -0
- package/dist/architecture/canon/constraints.js.map +1 -0
- package/dist/architecture/canon/decisions.d.ts +62 -0
- package/dist/architecture/canon/decisions.js +192 -0
- package/dist/architecture/canon/decisions.js.map +1 -0
- package/dist/architecture/canon/deployment.d.ts +89 -0
- package/dist/architecture/canon/deployment.js +156 -0
- package/dist/architecture/canon/deployment.js.map +1 -0
- package/dist/architecture/canon/document.d.ts +60 -0
- package/dist/architecture/canon/document.js +106 -0
- package/dist/architecture/canon/document.js.map +1 -0
- package/dist/architecture/canon/elements.d.ts +21 -0
- package/dist/architecture/canon/elements.js +87 -0
- package/dist/architecture/canon/elements.js.map +1 -0
- package/dist/architecture/canon/flows.d.ts +37 -0
- package/dist/architecture/canon/flows.js +82 -0
- package/dist/architecture/canon/flows.js.map +1 -0
- package/dist/architecture/canon/identity.d.ts +45 -0
- package/dist/architecture/canon/identity.js +83 -0
- package/dist/architecture/canon/identity.js.map +1 -0
- package/dist/architecture/canon/relationships.d.ts +48 -0
- package/dist/architecture/canon/relationships.js +181 -0
- package/dist/architecture/canon/relationships.js.map +1 -0
- package/dist/architecture/canon/repository-mappings.d.ts +51 -0
- package/dist/architecture/canon/repository-mappings.js +134 -0
- package/dist/architecture/canon/repository-mappings.js.map +1 -0
- package/dist/architecture/canon/responsibilities.d.ts +40 -0
- package/dist/architecture/canon/responsibilities.js +89 -0
- package/dist/architecture/canon/responsibilities.js.map +1 -0
- package/dist/architecture/canon/validate.d.ts +14 -0
- package/dist/architecture/canon/validate.js +389 -0
- package/dist/architecture/canon/validate.js.map +1 -0
- package/dist/architecture/canon/views.d.ts +101 -0
- package/dist/architecture/canon/views.js +182 -0
- package/dist/architecture/canon/views.js.map +1 -0
- package/dist/architecture/cli.d.ts +2 -0
- package/dist/architecture/cli.js +158 -0
- package/dist/architecture/cli.js.map +1 -0
- package/dist/architecture/documentation/html.d.ts +3 -0
- package/dist/architecture/documentation/html.js +143 -0
- package/dist/architecture/documentation/html.js.map +1 -0
- package/dist/architecture/documentation/model.d.ts +46 -0
- package/dist/architecture/documentation/model.js +13 -0
- package/dist/architecture/documentation/model.js.map +1 -0
- package/dist/architecture/documentation/project.d.ts +4 -0
- package/dist/architecture/documentation/project.js +166 -0
- package/dist/architecture/documentation/project.js.map +1 -0
- package/dist/architecture/documentation/site.d.ts +43 -0
- package/dist/architecture/documentation/site.js +147 -0
- package/dist/architecture/documentation/site.js.map +1 -0
- package/dist/architecture/projection/structurizr-export.d.ts +65 -0
- package/dist/architecture/projection/structurizr-export.js +136 -0
- package/dist/architecture/projection/structurizr-export.js.map +1 -0
- package/dist/architecture/projection/structurizr.d.ts +34 -0
- package/dist/architecture/projection/structurizr.js +667 -0
- package/dist/architecture/projection/structurizr.js.map +1 -0
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +143 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/runtime/correlation.d.ts +143 -0
- package/dist/runtime/correlation.js +919 -0
- package/dist/runtime/correlation.js.map +1 -0
- package/dist/runtime/facts.d.ts +138 -0
- package/dist/runtime/facts.js +614 -0
- package/dist/runtime/facts.js.map +1 -0
- package/dist/runtime/fixtureProvider.d.ts +10 -0
- package/dist/runtime/fixtureProvider.js +30 -0
- package/dist/runtime/fixtureProvider.js.map +1 -0
- package/dist/runtime/graftProvider.d.ts +8 -0
- package/dist/runtime/graftProvider.js +107 -0
- package/dist/runtime/graftProvider.js.map +1 -0
- package/dist/runtime/graftWiring.d.ts +30 -0
- package/dist/runtime/graftWiring.js +3 -0
- package/dist/runtime/graftWiring.js.map +1 -0
- package/dist/runtime/manifest.d.ts +17 -0
- package/dist/runtime/manifest.js +39 -0
- package/dist/runtime/manifest.js.map +1 -0
- package/dist/runtime/matrix.d.ts +337 -0
- package/dist/runtime/matrix.js +1485 -0
- package/dist/runtime/matrix.js.map +1 -0
- package/dist/runtime/observation.d.ts +36 -0
- package/dist/runtime/observation.js +3 -0
- package/dist/runtime/observation.js.map +1 -0
- package/dist/runtime/provider.d.ts +34 -0
- package/dist/runtime/provider.js +2 -0
- package/dist/runtime/provider.js.map +1 -0
- package/dist/runtime/repository.d.ts +20 -0
- package/dist/runtime/repository.js +55 -0
- package/dist/runtime/repository.js.map +1 -0
- package/dist/runtime/run.d.ts +21 -0
- package/dist/runtime/run.js +80 -0
- package/dist/runtime/run.js.map +1 -0
- package/dist/runtime/scipProvider.d.ts +11 -0
- package/dist/runtime/scipProvider.js +126 -0
- package/dist/runtime/scipProvider.js.map +1 -0
- package/dist/runtime/typescriptProvider.d.ts +10 -0
- package/dist/runtime/typescriptProvider.js +289 -0
- package/dist/runtime/typescriptProvider.js.map +1 -0
- package/dist/runtime/workflow.d.ts +30 -0
- package/dist/runtime/workflow.js +153 -0
- package/dist/runtime/workflow.js.map +1 -0
- package/package.json +72 -0
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
import { normalizeIdentityId } from "./identity.js";
|
|
2
|
+
export const VIEW_KINDS = ["structural", "dynamic", "deployment"];
|
|
3
|
+
export const VIEW_REFERENCE_KINDS = [
|
|
4
|
+
"element",
|
|
5
|
+
"relationship",
|
|
6
|
+
"flow",
|
|
7
|
+
"runtime-environment",
|
|
8
|
+
"deployment-node",
|
|
9
|
+
"deployment-instance",
|
|
10
|
+
"infrastructure-reference",
|
|
11
|
+
];
|
|
12
|
+
function assertRecord(value, label) {
|
|
13
|
+
if (value === null || typeof value !== "object" || Array.isArray(value)) {
|
|
14
|
+
throw new TypeError(`${label} must be an object`);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
function normalizeText(value, label) {
|
|
18
|
+
if (typeof value !== "string") {
|
|
19
|
+
throw new TypeError(`${label} must be a string`);
|
|
20
|
+
}
|
|
21
|
+
const normalized = value.normalize("NFC").trim();
|
|
22
|
+
if (normalized.length === 0 || /[\p{Cc}\p{Cf}\p{Cs}]/u.test(normalized)) {
|
|
23
|
+
throw new TypeError(`${label} is malformed`);
|
|
24
|
+
}
|
|
25
|
+
return normalized;
|
|
26
|
+
}
|
|
27
|
+
function compareOrdinal(left, right) {
|
|
28
|
+
if (left < right)
|
|
29
|
+
return -1;
|
|
30
|
+
if (left > right)
|
|
31
|
+
return 1;
|
|
32
|
+
return 0;
|
|
33
|
+
}
|
|
34
|
+
function readViewKind(value) {
|
|
35
|
+
if (typeof value !== "string" || !VIEW_KINDS.includes(value)) {
|
|
36
|
+
throw new TypeError(`view kind is unsupported: ${String(value)}`);
|
|
37
|
+
}
|
|
38
|
+
return value;
|
|
39
|
+
}
|
|
40
|
+
function normalizeOrder(value) {
|
|
41
|
+
if (value === undefined)
|
|
42
|
+
return undefined;
|
|
43
|
+
if (typeof value !== "number" || !Number.isFinite(value)) {
|
|
44
|
+
throw new TypeError("view order must be a finite number");
|
|
45
|
+
}
|
|
46
|
+
return Object.is(value, -0) ? 0 : value;
|
|
47
|
+
}
|
|
48
|
+
function readReferenceKind(value) {
|
|
49
|
+
if (typeof value !== "string" || !VIEW_REFERENCE_KINDS.includes(value)) {
|
|
50
|
+
throw new TypeError(`view reference kind is unsupported: ${String(value)}`);
|
|
51
|
+
}
|
|
52
|
+
return value;
|
|
53
|
+
}
|
|
54
|
+
function normalizeReference(input) {
|
|
55
|
+
assertRecord(input, "view reference");
|
|
56
|
+
const kind = readReferenceKind(input.kind);
|
|
57
|
+
const id = normalizeIdentityId(input.id);
|
|
58
|
+
return Object.freeze({ kind, id });
|
|
59
|
+
}
|
|
60
|
+
function referenceKey(reference) {
|
|
61
|
+
return `${reference.kind}\u0000${reference.id}`;
|
|
62
|
+
}
|
|
63
|
+
function compareReferences(left, right) {
|
|
64
|
+
return compareOrdinal(referenceKey(left), referenceKey(right));
|
|
65
|
+
}
|
|
66
|
+
function normalizeReferenceList(value, label) {
|
|
67
|
+
if (value === undefined)
|
|
68
|
+
return Object.freeze([]);
|
|
69
|
+
if (!Array.isArray(value)) {
|
|
70
|
+
throw new TypeError(`view scope ${label} must be an array`);
|
|
71
|
+
}
|
|
72
|
+
const references = value.map(normalizeReference);
|
|
73
|
+
const seen = new Set();
|
|
74
|
+
for (const reference of references) {
|
|
75
|
+
const key = referenceKey(reference);
|
|
76
|
+
if (seen.has(key)) {
|
|
77
|
+
throw new Error(`duplicate view ${label} reference: ${reference.kind} ${reference.id}`);
|
|
78
|
+
}
|
|
79
|
+
seen.add(key);
|
|
80
|
+
}
|
|
81
|
+
references.sort(compareReferences);
|
|
82
|
+
return Object.freeze(references);
|
|
83
|
+
}
|
|
84
|
+
function normalizeScope(input) {
|
|
85
|
+
assertRecord(input, "view scope");
|
|
86
|
+
const include = normalizeReferenceList(input.include, "include");
|
|
87
|
+
const exclude = normalizeReferenceList(input.exclude, "exclude");
|
|
88
|
+
const included = new Set(include.map(referenceKey));
|
|
89
|
+
for (const reference of exclude) {
|
|
90
|
+
if (included.has(referenceKey(reference))) {
|
|
91
|
+
throw new Error(`view reference cannot be both included and excluded: ${reference.kind} ${reference.id}`);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return Object.freeze({ include, exclude });
|
|
95
|
+
}
|
|
96
|
+
function normalizePresentation(value) {
|
|
97
|
+
if (value === undefined)
|
|
98
|
+
return undefined;
|
|
99
|
+
assertRecord(value, "view presentation");
|
|
100
|
+
const layout = value.layout === undefined ? undefined : normalizeText(value.layout, "view presentation layout");
|
|
101
|
+
const direction = value.direction === undefined ? undefined : normalizeText(value.direction, "view presentation direction");
|
|
102
|
+
const grouping = value.grouping === undefined ? undefined : normalizeText(value.grouping, "view presentation grouping");
|
|
103
|
+
if (layout === undefined && direction === undefined && grouping === undefined) {
|
|
104
|
+
return Object.freeze({});
|
|
105
|
+
}
|
|
106
|
+
return Object.freeze({
|
|
107
|
+
...(layout === undefined ? {} : { layout }),
|
|
108
|
+
...(direction === undefined ? {} : { direction }),
|
|
109
|
+
...(grouping === undefined ? {} : { grouping }),
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
function normalizeView(input) {
|
|
113
|
+
assertRecord(input, "view");
|
|
114
|
+
const key = normalizeIdentityId(input.key);
|
|
115
|
+
const kind = readViewKind(input.kind);
|
|
116
|
+
const scope = normalizeScope(input.scope);
|
|
117
|
+
const order = normalizeOrder(input.order);
|
|
118
|
+
const title = input.title === undefined ? undefined : normalizeText(input.title, "view title");
|
|
119
|
+
const presentation = normalizePresentation(input.presentation);
|
|
120
|
+
return Object.freeze({
|
|
121
|
+
key,
|
|
122
|
+
kind,
|
|
123
|
+
scope,
|
|
124
|
+
...(order === undefined ? {} : { order }),
|
|
125
|
+
...(title === undefined ? {} : { title }),
|
|
126
|
+
...(presentation === undefined ? {} : { presentation }),
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
export function createView(input) {
|
|
130
|
+
return normalizeView(input);
|
|
131
|
+
}
|
|
132
|
+
export function createStructuralView(input) {
|
|
133
|
+
const view = normalizeView(input);
|
|
134
|
+
if (view.kind !== "structural") {
|
|
135
|
+
throw new TypeError("view kind must be structural");
|
|
136
|
+
}
|
|
137
|
+
return view;
|
|
138
|
+
}
|
|
139
|
+
export function createDynamicView(input) {
|
|
140
|
+
const view = normalizeView(input);
|
|
141
|
+
if (view.kind !== "dynamic") {
|
|
142
|
+
throw new TypeError("view kind must be dynamic");
|
|
143
|
+
}
|
|
144
|
+
return view;
|
|
145
|
+
}
|
|
146
|
+
export function createDeploymentView(input) {
|
|
147
|
+
const view = normalizeView(input);
|
|
148
|
+
if (view.kind !== "deployment") {
|
|
149
|
+
throw new TypeError("view kind must be deployment");
|
|
150
|
+
}
|
|
151
|
+
return view;
|
|
152
|
+
}
|
|
153
|
+
function compareViews(left, right) {
|
|
154
|
+
if (left.order !== undefined || right.order !== undefined) {
|
|
155
|
+
if (left.order === undefined)
|
|
156
|
+
return 1;
|
|
157
|
+
if (right.order === undefined)
|
|
158
|
+
return -1;
|
|
159
|
+
const order = left.order - right.order;
|
|
160
|
+
if (order !== 0)
|
|
161
|
+
return order;
|
|
162
|
+
}
|
|
163
|
+
return compareOrdinal(left.key, right.key);
|
|
164
|
+
}
|
|
165
|
+
/** Normalize view identity order without resolving references into architecture facts. */
|
|
166
|
+
export function normalizeViews(inputs) {
|
|
167
|
+
if (!Array.isArray(inputs)) {
|
|
168
|
+
throw new TypeError("views must be an array");
|
|
169
|
+
}
|
|
170
|
+
const views = inputs.map(normalizeView);
|
|
171
|
+
const seen = new Set();
|
|
172
|
+
for (const view of views) {
|
|
173
|
+
if (seen.has(view.key)) {
|
|
174
|
+
throw new Error(`duplicate view key: ${view.key}`);
|
|
175
|
+
}
|
|
176
|
+
seen.add(view.key);
|
|
177
|
+
}
|
|
178
|
+
views.sort(compareViews);
|
|
179
|
+
return Object.freeze(views);
|
|
180
|
+
}
|
|
181
|
+
export const createViews = normalizeViews;
|
|
182
|
+
//# sourceMappingURL=views.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"views.js","sourceRoot":"","sources":["../../../src/architecture/canon/views.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { parseCanonicalArchitectureDocument } from "./canon/codec.js";
|
|
4
|
+
import { projectArchitectureDocument } from "./documentation/project.js";
|
|
5
|
+
import { ArchitectureSiteError, buildArchitectureSite } from "./documentation/site.js";
|
|
6
|
+
import { projectArchitectureDocumentToStructurizr } from "./projection/structurizr.js";
|
|
7
|
+
const DEFAULT_STRUCTURIZR_COMMAND = "structurizr";
|
|
8
|
+
const MAX_DIAGNOSTIC_LENGTH = 240;
|
|
9
|
+
function usage(command) {
|
|
10
|
+
if (command === "validate")
|
|
11
|
+
return "usage: PACKAGE_NAME architecture validate <file> [--json]";
|
|
12
|
+
if (command === "render") {
|
|
13
|
+
return "usage: PACKAGE_NAME architecture render <file> --out <dir> [--structurizr-command <executable-path>] [--json]";
|
|
14
|
+
}
|
|
15
|
+
return "usage: PACKAGE_NAME architecture <validate|render> ...";
|
|
16
|
+
}
|
|
17
|
+
function bounded(value) {
|
|
18
|
+
const message = value.replace(/\s+/gu, " ").trim();
|
|
19
|
+
if (message.length <= MAX_DIAGNOSTIC_LENGTH)
|
|
20
|
+
return message;
|
|
21
|
+
return `${message.slice(0, MAX_DIAGNOSTIC_LENGTH - 1)}…`;
|
|
22
|
+
}
|
|
23
|
+
function errorMessage(error) {
|
|
24
|
+
return bounded(error instanceof Error ? error.message : String(error));
|
|
25
|
+
}
|
|
26
|
+
function parseArguments(args) {
|
|
27
|
+
const command = args[0];
|
|
28
|
+
const json = args.includes("--json");
|
|
29
|
+
if (command !== "validate" && command !== "render") {
|
|
30
|
+
return { ok: false, json, message: usage() };
|
|
31
|
+
}
|
|
32
|
+
let file;
|
|
33
|
+
let outputRoot;
|
|
34
|
+
let structurizrCommand;
|
|
35
|
+
for (let index = 1; index < args.length; index += 1) {
|
|
36
|
+
const argument = args[index];
|
|
37
|
+
if (argument === "--json")
|
|
38
|
+
continue;
|
|
39
|
+
if (argument === "--out") {
|
|
40
|
+
const value = args[index + 1];
|
|
41
|
+
if (value === undefined || value.startsWith("--")) {
|
|
42
|
+
return { ok: false, json, message: "--out requires a directory" };
|
|
43
|
+
}
|
|
44
|
+
if (outputRoot !== undefined)
|
|
45
|
+
return { ok: false, json, message: "--out may be provided only once" };
|
|
46
|
+
outputRoot = value;
|
|
47
|
+
index += 1;
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
if (argument === "--structurizr-command") {
|
|
51
|
+
const value = args[index + 1];
|
|
52
|
+
if (value === undefined || value.startsWith("--")) {
|
|
53
|
+
return { ok: false, json, message: "--structurizr-command requires an executable path" };
|
|
54
|
+
}
|
|
55
|
+
if (structurizrCommand !== undefined) {
|
|
56
|
+
return { ok: false, json, message: "--structurizr-command may be provided only once" };
|
|
57
|
+
}
|
|
58
|
+
structurizrCommand = value;
|
|
59
|
+
index += 1;
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
if (argument.startsWith("--"))
|
|
63
|
+
return { ok: false, json, message: `unknown option: ${argument}` };
|
|
64
|
+
if (file !== undefined)
|
|
65
|
+
return { ok: false, json, message: "architecture commands accept one explicit file" };
|
|
66
|
+
file = argument;
|
|
67
|
+
}
|
|
68
|
+
if (file === undefined)
|
|
69
|
+
return { ok: false, json, message: usage(command) };
|
|
70
|
+
if (command === "validate" && (outputRoot !== undefined || structurizrCommand !== undefined)) {
|
|
71
|
+
return { ok: false, json, message: "validate does not accept render options" };
|
|
72
|
+
}
|
|
73
|
+
if (command === "render" && outputRoot === undefined) {
|
|
74
|
+
return { ok: false, json, message: "render requires --out <dir>" };
|
|
75
|
+
}
|
|
76
|
+
return { ok: true, value: { command, file, outputRoot, structurizrCommand, json } };
|
|
77
|
+
}
|
|
78
|
+
function writeFailure(command, json, diagnostic) {
|
|
79
|
+
const result = {
|
|
80
|
+
ok: false,
|
|
81
|
+
command: `architecture ${command}`,
|
|
82
|
+
diagnostics: [{ code: bounded(diagnostic.code), message: bounded(diagnostic.message) }],
|
|
83
|
+
};
|
|
84
|
+
if (json) {
|
|
85
|
+
console.log(JSON.stringify(result));
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
console.error(`${result.command}: ${result.diagnostics[0]?.message ?? "command failed"}`);
|
|
89
|
+
}
|
|
90
|
+
return 1;
|
|
91
|
+
}
|
|
92
|
+
function writeUsageFailure(json, message) {
|
|
93
|
+
const diagnostic = { code: "invalid-arguments", message: bounded(message) };
|
|
94
|
+
if (json) {
|
|
95
|
+
console.log(JSON.stringify({ ok: false, command: "architecture", diagnostics: [diagnostic] }));
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
console.error(diagnostic.message);
|
|
99
|
+
}
|
|
100
|
+
return 1;
|
|
101
|
+
}
|
|
102
|
+
/** Adapt the public architecture CLI to the existing Canon and projection APIs. */
|
|
103
|
+
export async function runArchitectureCli(args) {
|
|
104
|
+
const parsed = parseArguments(args);
|
|
105
|
+
if (!parsed.ok)
|
|
106
|
+
return writeUsageFailure(parsed.json, parsed.message);
|
|
107
|
+
const { command, file, json } = parsed.value;
|
|
108
|
+
let document;
|
|
109
|
+
try {
|
|
110
|
+
document = parseCanonicalArchitectureDocument(await readFile(file, "utf8"));
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
return writeFailure(command, json, { code: "invalid-canon", message: errorMessage(error) });
|
|
114
|
+
}
|
|
115
|
+
if (command === "validate") {
|
|
116
|
+
if (json) {
|
|
117
|
+
console.log(JSON.stringify({ ok: true, command: "architecture validate", file }));
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
console.log(`valid Architecture Canon: ${file}`);
|
|
121
|
+
}
|
|
122
|
+
return 0;
|
|
123
|
+
}
|
|
124
|
+
try {
|
|
125
|
+
const documentation = projectArchitectureDocument(document);
|
|
126
|
+
const structurizr = projectArchitectureDocumentToStructurizr(document);
|
|
127
|
+
const result = await buildArchitectureSite({
|
|
128
|
+
outputRoot: path.resolve(parsed.value.outputRoot),
|
|
129
|
+
documentation,
|
|
130
|
+
structurizr,
|
|
131
|
+
launcher: { executable: parsed.value.structurizrCommand ?? DEFAULT_STRUCTURIZR_COMMAND },
|
|
132
|
+
});
|
|
133
|
+
if (!result.complete) {
|
|
134
|
+
return writeFailure(command, json, {
|
|
135
|
+
code: "export-failed",
|
|
136
|
+
message: result.export.diagnostic?.message ?? "Structurizr static export failed",
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
if (json) {
|
|
140
|
+
console.log(JSON.stringify({
|
|
141
|
+
ok: true,
|
|
142
|
+
command: "architecture render",
|
|
143
|
+
file,
|
|
144
|
+
outputRoot: result.outputRoot,
|
|
145
|
+
projectionLosses: result.losses.length,
|
|
146
|
+
}));
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
console.log(`rendered architecture site: ${result.outputRoot}`);
|
|
150
|
+
}
|
|
151
|
+
return 0;
|
|
152
|
+
}
|
|
153
|
+
catch (error) {
|
|
154
|
+
const code = error instanceof ArchitectureSiteError ? error.code : "render-failed";
|
|
155
|
+
return writeFailure(command, json, { code, message: errorMessage(error) });
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/architecture/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,kCAAkC,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAAE,2BAA2B,EAAE,MAAM,4BAA4B,CAAC;AACzE,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AACvF,OAAO,EAAE,wCAAwC,EAAE,MAAM,6BAA6B,CAAC;AAEvF,MAAM,2BAA2B,GAAG,aAAa,CAAC;AAClD,MAAM,qBAAqB,GAAG,GAAG,CAAC;AAiBlC,SAAS,KAAK,CAAC,OAA6B;IAC1C,IAAI,OAAO,KAAK,UAAU;QAAE,OAAO,2DAA2D,CAAC;IAC/F,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;QACzB,OAAO,+GAA+G,CAAC;IACzH,CAAC;IACD,OAAO,wDAAwD,CAAC;AAClE,CAAC;AAED,SAAS,OAAO,CAAC,KAAa;IAC5B,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACnD,IAAI,OAAO,CAAC,MAAM,IAAI,qBAAqB;QAAE,OAAO,OAAO,CAAC;IAC5D,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,qBAAqB,GAAG,CAAC,CAAC,GAAG,CAAC;AAC3D,CAAC;AAED,SAAS,YAAY,CAAC,KAAc;IAClC,OAAO,OAAO,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;AACzE,CAAC;AAED,SAAS,cAAc,CACrB,IAAuB;IAIvB,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACxB,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACrC,IAAI,OAAO,KAAK,UAAU,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;QACnD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC;IAC/C,CAAC;IAED,IAAI,IAAwB,CAAC;IAC7B,IAAI,UAA8B,CAAC;IACnC,IAAI,kBAAsC,CAAC;IAE3C,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACpD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7B,IAAI,QAAQ,KAAK,QAAQ;YAAE,SAAS;QAEpC,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;YACzB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;YAC9B,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;gBAClD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,4BAA4B,EAAE,CAAC;YACpE,CAAC;YACD,IAAI,UAAU,KAAK,SAAS;gBAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,iCAAiC,EAAE,CAAC;YACrG,UAAU,GAAG,KAAK,CAAC;YACnB,KAAK,IAAI,CAAC,CAAC;YACX,SAAS;QACX,CAAC;QAED,IAAI,QAAQ,KAAK,uBAAuB,EAAE,CAAC;YACzC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;YAC9B,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;gBAClD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,mDAAmD,EAAE,CAAC;YAC3F,CAAC;YACD,IAAI,kBAAkB,KAAK,SAAS,EAAE,CAAC;gBACrC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,iDAAiD,EAAE,CAAC;YACzF,CAAC;YACD,kBAAkB,GAAG,KAAK,CAAC;YAC3B,KAAK,IAAI,CAAC,CAAC;YACX,SAAS;QACX,CAAC;QAED,IAAI,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,mBAAmB,QAAQ,EAAE,EAAE,CAAC;QAClG,IAAI,IAAI,KAAK,SAAS;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,gDAAgD,EAAE,CAAC;QAC9G,IAAI,GAAG,QAAQ,CAAC;IAClB,CAAC;IAED,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;IAC5E,IAAI,OAAO,KAAK,UAAU,IAAI,CAAC,UAAU,KAAK,SAAS,IAAI,kBAAkB,KAAK,SAAS,CAAC,EAAE,CAAC;QAC7F,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,yCAAyC,EAAE,CAAC;IACjF,CAAC;IACD,IAAI,OAAO,KAAK,QAAQ,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QACrD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,6BAA6B,EAAE,CAAC;IACrE,CAAC;IAED,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,kBAAkB,EAAE,IAAI,EAAE,EAAE,CAAC;AACtF,CAAC;AAED,SAAS,YAAY,CAAC,OAA4B,EAAE,IAAa,EAAE,UAAkC;IACnG,MAAM,MAAM,GAAG;QACb,EAAE,EAAE,KAAK;QACT,OAAO,EAAE,gBAAgB,OAAO,EAAE;QAClC,WAAW,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;KACxF,CAAC;IACF,IAAI,IAAI,EAAE,CAAC;QACT,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;IACtC,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,OAAO,KAAK,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,OAAO,IAAI,gBAAgB,EAAE,CAAC,CAAC;IAC5F,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAa,EAAE,OAAe;IACvD,MAAM,UAAU,GAAG,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;IAC5E,IAAI,IAAI,EAAE,CAAC;QACT,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;IACjG,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IACpC,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,mFAAmF;AACnF,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,IAAuB;IAC9D,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IACpC,IAAI,CAAC,MAAM,CAAC,EAAE;QAAE,OAAO,iBAAiB,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IAEtE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC;IAC7C,IAAI,QAAQ,CAAC;IACb,IAAI,CAAC;QACH,QAAQ,GAAG,kCAAkC,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IAC9E,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,YAAY,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC9F,CAAC;IAED,IAAI,OAAO,KAAK,UAAU,EAAE,CAAC;QAC3B,IAAI,IAAI,EAAE,CAAC;YACT,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,uBAAuB,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QACpF,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,6BAA6B,IAAI,EAAE,CAAC,CAAC;QACnD,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,CAAC;QACH,MAAM,aAAa,GAAG,2BAA2B,CAAC,QAAQ,CAAC,CAAC;QAC5D,MAAM,WAAW,GAAG,wCAAwC,CAAC,QAAQ,CAAC,CAAC;QACvE,MAAM,MAAM,GAAG,MAAM,qBAAqB,CAAC;YACzC,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAoB,CAAC;YAC3D,aAAa;YACb,WAAW;YACX,QAAQ,EAAE,EAAE,UAAU,EAAE,MAAM,CAAC,KAAK,CAAC,kBAAkB,IAAI,2BAA2B,EAAE;SACzF,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;YACrB,OAAO,YAAY,CAAC,OAAO,EAAE,IAAI,EAAE;gBACjC,IAAI,EAAE,eAAe;gBACrB,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,OAAO,IAAI,kCAAkC;aACjF,CAAC,CAAC;QACL,CAAC;QAED,IAAI,IAAI,EAAE,CAAC;YACT,OAAO,CAAC,GAAG,CACT,IAAI,CAAC,SAAS,CAAC;gBACb,EAAE,EAAE,IAAI;gBACR,OAAO,EAAE,qBAAqB;gBAC9B,IAAI;gBACJ,UAAU,EAAE,MAAM,CAAC,UAAU;gBAC7B,gBAAgB,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM;aACvC,CAAC,CACH,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,+BAA+B,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;QAClE,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,GAAG,KAAK,YAAY,qBAAqB,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC;QACnF,OAAO,YAAY,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC7E,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
const HTML_ESCAPE_PATTERN = /[&<>"']/g;
|
|
2
|
+
const HTML_ESCAPES = {
|
|
3
|
+
"&": "&",
|
|
4
|
+
"<": "<",
|
|
5
|
+
">": ">",
|
|
6
|
+
'"': """,
|
|
7
|
+
"'": "'",
|
|
8
|
+
};
|
|
9
|
+
const STYLE = `<style>
|
|
10
|
+
:root { font-family: system-ui, sans-serif; color: #202124; background: #fff; }
|
|
11
|
+
body { max-width: 72rem; margin: 0 auto; padding: 2rem; line-height: 1.5; }
|
|
12
|
+
nav, main { margin-block: 2rem; }
|
|
13
|
+
nav ul, nav ol { padding-inline-start: 1.5rem; }
|
|
14
|
+
section { margin-block: 2rem; }
|
|
15
|
+
article { border: 1px solid #d8dbe0; padding: 1rem; margin-block: 1rem; }
|
|
16
|
+
dl { display: grid; gap: 0.5rem; }
|
|
17
|
+
dl > div { display: grid; grid-template-columns: minmax(8rem, max-content) 1fr; gap: 1rem; }
|
|
18
|
+
dt { font-weight: 600; }
|
|
19
|
+
dd { margin: 0; overflow-wrap: anywhere; }
|
|
20
|
+
.documentation-value, .documentation-array, .documentation-object { overflow-wrap: anywhere; }
|
|
21
|
+
.documentation-anchors { display: flex; flex-wrap: wrap; gap: 0.75rem; }
|
|
22
|
+
</style>`;
|
|
23
|
+
function escapeHtml(value) {
|
|
24
|
+
return value.replace(HTML_ESCAPE_PATTERN, (character) => HTML_ESCAPES[character] ?? character);
|
|
25
|
+
}
|
|
26
|
+
function encodeIdPart(value) {
|
|
27
|
+
try {
|
|
28
|
+
return encodeURIComponent(value);
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
return Array.from(value, (character) => character.codePointAt(0)?.toString(16) ?? "0").join("-");
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
function htmlId(prefix, ...parts) {
|
|
35
|
+
return [prefix, ...parts.map(encodeIdPart)].join("-");
|
|
36
|
+
}
|
|
37
|
+
function canonAnchorId(canonId) {
|
|
38
|
+
return htmlId("canon", canonId);
|
|
39
|
+
}
|
|
40
|
+
function sectionId(section) {
|
|
41
|
+
return htmlId("section", section);
|
|
42
|
+
}
|
|
43
|
+
function groupId(section, group) {
|
|
44
|
+
return htmlId("group", section, group);
|
|
45
|
+
}
|
|
46
|
+
function renderPrimitive(value) {
|
|
47
|
+
return `<span class="documentation-value">${escapeHtml(String(value))}</span>`;
|
|
48
|
+
}
|
|
49
|
+
function renderValue(value) {
|
|
50
|
+
if (value === null || typeof value !== "object") {
|
|
51
|
+
return renderPrimitive(value);
|
|
52
|
+
}
|
|
53
|
+
if (Array.isArray(value)) {
|
|
54
|
+
return `<ol class="documentation-array">${value.map((item) => `<li>${renderValue(item)}</li>`).join("")}</ol>`;
|
|
55
|
+
}
|
|
56
|
+
const fields = Object.entries(value).sort(([left], [right]) => {
|
|
57
|
+
if (left < right)
|
|
58
|
+
return -1;
|
|
59
|
+
if (left > right)
|
|
60
|
+
return 1;
|
|
61
|
+
return 0;
|
|
62
|
+
});
|
|
63
|
+
if (fields.length === 0)
|
|
64
|
+
return `<span class="documentation-object">{}</span>`;
|
|
65
|
+
return `<dl class="documentation-object">${fields
|
|
66
|
+
.map(([key, fieldValue]) => `<div><dt>${escapeHtml(key)}</dt><dd>${renderValue(fieldValue)}</dd></div>`)
|
|
67
|
+
.join("")}</dl>`;
|
|
68
|
+
}
|
|
69
|
+
function renderNavigationItem(item) {
|
|
70
|
+
const groups = item.groupKeys
|
|
71
|
+
.map((group) => `<li><a href="#${escapeHtml(groupId(item.section, group))}">${escapeHtml(group)}</a></li>`)
|
|
72
|
+
.join("");
|
|
73
|
+
return `<li><a href="#${escapeHtml(sectionId(item.section))}">${escapeHtml(item.section)}</a><ul>${groups}</ul></li>`;
|
|
74
|
+
}
|
|
75
|
+
function renderNavigation(navigation) {
|
|
76
|
+
return `<nav aria-label="documentation"><ol>${navigation.map(renderNavigationItem).join("")}</ol></nav>`;
|
|
77
|
+
}
|
|
78
|
+
function renderCanonReference(anchor) {
|
|
79
|
+
const id = canonAnchorId(anchor.canonId);
|
|
80
|
+
return `<a href="#${escapeHtml(id)}">${escapeHtml(anchor.canonId)}</a>`;
|
|
81
|
+
}
|
|
82
|
+
function renderEntryAnchors(anchors, anchoredCanonIds) {
|
|
83
|
+
return anchors
|
|
84
|
+
.map((anchor) => {
|
|
85
|
+
const id = canonAnchorId(anchor.canonId);
|
|
86
|
+
const marker = anchoredCanonIds.has(anchor.canonId)
|
|
87
|
+
? ""
|
|
88
|
+
: `<span id="${escapeHtml(id)}" aria-hidden="true"></span>`;
|
|
89
|
+
anchoredCanonIds.add(anchor.canonId);
|
|
90
|
+
return `${marker}${renderCanonReference(anchor)}`;
|
|
91
|
+
})
|
|
92
|
+
.join(" ");
|
|
93
|
+
}
|
|
94
|
+
function renderEntry(entry, anchoredCanonIds) {
|
|
95
|
+
const anchors = renderEntryAnchors(entry.anchors, anchoredCanonIds);
|
|
96
|
+
return `<article>
|
|
97
|
+
<h4>${escapeHtml(entry.key)}</h4>
|
|
98
|
+
<p class="documentation-anchors">${anchors}</p>
|
|
99
|
+
<div class="documentation-data">${renderValue(entry.data)}</div>
|
|
100
|
+
</article>`;
|
|
101
|
+
}
|
|
102
|
+
function renderGroup(section, group, anchoredCanonIds) {
|
|
103
|
+
return `<section id="${escapeHtml(groupId(section.key, group.key))}">
|
|
104
|
+
<h3>${escapeHtml(group.key)}</h3>
|
|
105
|
+
<ol>${group.entries.map((entry) => renderEntry(entry, anchoredCanonIds)).join("")}</ol>
|
|
106
|
+
</section>`;
|
|
107
|
+
}
|
|
108
|
+
function renderSection(section, anchoredCanonIds) {
|
|
109
|
+
return `<section id="${escapeHtml(sectionId(section.key))}">
|
|
110
|
+
<h2>${escapeHtml(section.key)}</h2>
|
|
111
|
+
${section.groups.map((group) => renderGroup(section, group, anchoredCanonIds)).join("\n")}
|
|
112
|
+
</section>`;
|
|
113
|
+
}
|
|
114
|
+
/** Render the documentation projection as deterministic, safe static HTML. */
|
|
115
|
+
export function renderDocumentationHtml(model) {
|
|
116
|
+
const rootId = canonAnchorId(model.root.canonId);
|
|
117
|
+
const anchoredCanonIds = new Set([model.root.canonId]);
|
|
118
|
+
const metadata = `<dl>
|
|
119
|
+
<div><dt>canonVersion</dt><dd>${renderPrimitive(model.canonVersion)}</dd></div>
|
|
120
|
+
<div><dt>documentId</dt><dd>${renderPrimitive(model.documentId)}</dd></div>
|
|
121
|
+
<div><dt>root</dt><dd>${renderCanonReference(model.root)}</dd></div>
|
|
122
|
+
</dl>`;
|
|
123
|
+
return `<!doctype html>
|
|
124
|
+
<html lang="en">
|
|
125
|
+
<head>
|
|
126
|
+
<meta charset="utf-8">
|
|
127
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
128
|
+
<title>${escapeHtml(model.documentId)}</title>
|
|
129
|
+
${STYLE}
|
|
130
|
+
</head>
|
|
131
|
+
<body>
|
|
132
|
+
<header id="${escapeHtml(rootId)}">
|
|
133
|
+
<h1>${escapeHtml(model.documentId)}</h1>
|
|
134
|
+
${metadata}
|
|
135
|
+
</header>
|
|
136
|
+
${renderNavigation(model.navigation)}
|
|
137
|
+
<main id="documentation">
|
|
138
|
+
${model.sections.map((section) => renderSection(section, anchoredCanonIds)).join("\n")}
|
|
139
|
+
</main>
|
|
140
|
+
</body>
|
|
141
|
+
</html>`;
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=html.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"html.js","sourceRoot":"","sources":["../../../src/architecture/documentation/html.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { ArchitectureDecision, ArchitectureReference, ArchitectureReferenceAttachment } from "../canon/decisions.js";
|
|
2
|
+
import type { AuthorityFact, OwnershipFact } from "../canon/authority.js";
|
|
3
|
+
import type { Boundary } from "../canon/boundaries.js";
|
|
4
|
+
import type { ArchitectureConstraint } from "../canon/constraints.js";
|
|
5
|
+
import type { DeploymentInstance, DeploymentMapping, DeploymentNode, InfrastructureReference, RuntimeEnvironment } from "../canon/deployment.js";
|
|
6
|
+
import type { ElementRecord } from "../canon/elements.js";
|
|
7
|
+
import type { Flow } from "../canon/flows.js";
|
|
8
|
+
import type { InterfaceRecord, RelationshipRecord } from "../canon/relationships.js";
|
|
9
|
+
import type { RepositoryMapping } from "../canon/repository-mappings.js";
|
|
10
|
+
import type { ResponsibilityFact } from "../canon/responsibilities.js";
|
|
11
|
+
import type { ViewSpec } from "../canon/views.js";
|
|
12
|
+
import type { CanonVersion, DocumentId } from "../canon/identity.js";
|
|
13
|
+
export declare const DOCUMENTATION_SECTION_ORDER: readonly ["structure", "responsibility", "authority", "constraints", "flows", "deployment", "mappings", "decisions", "references", "views"];
|
|
14
|
+
export type DocumentationSectionKey = (typeof DOCUMENTATION_SECTION_ORDER)[number];
|
|
15
|
+
/** A stable reference to an identity owned by the Architecture Canon. */
|
|
16
|
+
export interface DocumentationAnchor {
|
|
17
|
+
readonly canonId: string;
|
|
18
|
+
}
|
|
19
|
+
/** Canon data retained by the renderer-neutral projection. */
|
|
20
|
+
export type DocumentationData = ElementRecord | InterfaceRecord | RelationshipRecord | Boundary | ResponsibilityFact | AuthorityFact | OwnershipFact | ArchitectureConstraint | Flow | RuntimeEnvironment | DeploymentNode | DeploymentInstance | InfrastructureReference | DeploymentMapping | RepositoryMapping | ArchitectureDecision | ArchitectureReference | ArchitectureReferenceAttachment | ViewSpec;
|
|
21
|
+
export interface DocumentationEntry<TData extends DocumentationData = DocumentationData> {
|
|
22
|
+
/** A deterministic projection key. It is not an additional architecture identity. */
|
|
23
|
+
readonly key: string;
|
|
24
|
+
readonly anchors: readonly DocumentationAnchor[];
|
|
25
|
+
readonly data: TData;
|
|
26
|
+
}
|
|
27
|
+
export interface DocumentationGroup {
|
|
28
|
+
/** A fixed Canon field/group name, not architecture prose. */
|
|
29
|
+
readonly key: string;
|
|
30
|
+
readonly entries: readonly DocumentationEntry[];
|
|
31
|
+
}
|
|
32
|
+
export interface DocumentationSection {
|
|
33
|
+
readonly key: DocumentationSectionKey;
|
|
34
|
+
readonly groups: readonly DocumentationGroup[];
|
|
35
|
+
}
|
|
36
|
+
export interface DocumentationNavigationItem {
|
|
37
|
+
readonly section: DocumentationSectionKey;
|
|
38
|
+
readonly groupKeys: readonly string[];
|
|
39
|
+
}
|
|
40
|
+
export interface DocumentationModel {
|
|
41
|
+
readonly canonVersion: CanonVersion;
|
|
42
|
+
readonly documentId: DocumentId;
|
|
43
|
+
readonly root: DocumentationAnchor;
|
|
44
|
+
readonly navigation: readonly DocumentationNavigationItem[];
|
|
45
|
+
readonly sections: readonly DocumentationSection[];
|
|
46
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model.js","sourceRoot":"","sources":["../../../src/architecture/documentation/model.ts"],"names":[],"mappings":"AAuBA,MAAM,CAAC,MAAM,2BAA2B,GAAG;IACzC,WAAW;IACX,gBAAgB;IAChB,WAAW;IACX,aAAa;IACb,OAAO;IACP,YAAY;IACZ,UAAU;IACV,WAAW;IACX,YAAY;IACZ,OAAO;CACC,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { ArchitectureDocumentV1 } from "../canon/document.js";
|
|
2
|
+
import type { DocumentationModel } from "./model.js";
|
|
3
|
+
/** Project a validated Architecture Canon into renderer-neutral documentation data. */
|
|
4
|
+
export declare function projectArchitectureDocument(document: ArchitectureDocumentV1): DocumentationModel;
|