@documentation-robotics/cli 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/PYTHON_CLI_PARITY.md +265 -0
- package/PYTHON_CLI_STRUCTURE_UPDATE.md +246 -0
- package/README.md +926 -0
- package/biome.json +42 -0
- package/bunfig.toml +3 -0
- package/dist/ai/claude-client.js +71 -0
- package/dist/ai/claude-client.js.map +7 -0
- package/dist/ai/context-provider.js +129 -0
- package/dist/ai/context-provider.js.map +7 -0
- package/dist/ai/tools.js +231 -0
- package/dist/ai/tools.js.map +7 -0
- package/dist/cli.js +224 -0
- package/dist/cli.js.map +7 -0
- package/dist/commands/add.js +51 -0
- package/dist/commands/add.js.map +7 -0
- package/dist/commands/changeset.js +174 -0
- package/dist/commands/changeset.js.map +7 -0
- package/dist/commands/chat.js +111 -0
- package/dist/commands/chat.js.map +7 -0
- package/dist/commands/conformance.js +132 -0
- package/dist/commands/conformance.js.map +7 -0
- package/dist/commands/delete.js +31 -0
- package/dist/commands/delete.js.map +7 -0
- package/dist/commands/element.js +28 -0
- package/dist/commands/element.js.map +7 -0
- package/dist/commands/export.js +65 -0
- package/dist/commands/export.js.map +7 -0
- package/dist/commands/info.js +40 -0
- package/dist/commands/info.js.map +7 -0
- package/dist/commands/init.js +45 -0
- package/dist/commands/init.js.map +7 -0
- package/dist/commands/list.js +32 -0
- package/dist/commands/list.js.map +7 -0
- package/dist/commands/migrate.js +36 -0
- package/dist/commands/migrate.js.map +7 -0
- package/dist/commands/project.js +74 -0
- package/dist/commands/project.js.map +7 -0
- package/dist/commands/relationship.js +118 -0
- package/dist/commands/relationship.js.map +7 -0
- package/dist/commands/search.js +48 -0
- package/dist/commands/search.js.map +7 -0
- package/dist/commands/show.js +38 -0
- package/dist/commands/show.js.map +7 -0
- package/dist/commands/trace.js +60 -0
- package/dist/commands/trace.js.map +7 -0
- package/dist/commands/update.js +37 -0
- package/dist/commands/update.js.map +7 -0
- package/dist/commands/upgrade.js +152 -0
- package/dist/commands/upgrade.js.map +7 -0
- package/dist/commands/validate.js +71 -0
- package/dist/commands/validate.js.map +7 -0
- package/dist/commands/version.js +20 -0
- package/dist/commands/version.js.map +7 -0
- package/dist/commands/visualize.js +51 -0
- package/dist/commands/visualize.js.map +7 -0
- package/dist/core/active-changeset.js +52 -0
- package/dist/core/active-changeset.js.map +7 -0
- package/dist/core/changeset.js +244 -0
- package/dist/core/changeset.js.map +7 -0
- package/dist/core/dependency-tracker.js +322 -0
- package/dist/core/dependency-tracker.js.map +7 -0
- package/dist/core/element.js +65 -0
- package/dist/core/element.js.map +7 -0
- package/dist/core/layer.js +75 -0
- package/dist/core/layer.js.map +7 -0
- package/dist/core/manifest.js +57 -0
- package/dist/core/manifest.js.map +7 -0
- package/dist/core/migration-registry.js +131 -0
- package/dist/core/migration-registry.js.map +7 -0
- package/dist/core/model.js +455 -0
- package/dist/core/model.js.map +7 -0
- package/dist/core/projection-engine.js +288 -0
- package/dist/core/projection-engine.js.map +7 -0
- package/dist/core/reference-registry.js +188 -0
- package/dist/core/reference-registry.js.map +7 -0
- package/dist/core/relationship-registry.js +114 -0
- package/dist/core/relationship-registry.js.map +7 -0
- package/dist/core/relationships.js +78 -0
- package/dist/core/relationships.js.map +7 -0
- package/dist/export/archimate-exporter.js +111 -0
- package/dist/export/archimate-exporter.js.map +7 -0
- package/dist/export/export-manager.js +63 -0
- package/dist/export/export-manager.js.map +7 -0
- package/dist/export/graphml-exporter.js +39 -0
- package/dist/export/graphml-exporter.js.map +7 -0
- package/dist/export/index.js +17 -0
- package/dist/export/index.js.map +7 -0
- package/dist/export/json-schema-exporter.js +60 -0
- package/dist/export/json-schema-exporter.js.map +7 -0
- package/dist/export/markdown-exporter.js +99 -0
- package/dist/export/markdown-exporter.js.map +7 -0
- package/dist/export/openapi-exporter.js +85 -0
- package/dist/export/openapi-exporter.js.map +7 -0
- package/dist/export/plantuml-exporter.js +60 -0
- package/dist/export/plantuml-exporter.js.map +7 -0
- package/dist/export/types.js +36 -0
- package/dist/export/types.js.map +7 -0
- package/dist/schemas/bundled/01-motivation-layer.schema.json +942 -0
- package/dist/schemas/bundled/02-business-layer.schema.json +1293 -0
- package/dist/schemas/bundled/03-security-layer.schema.json +2177 -0
- package/dist/schemas/bundled/04-application-layer.schema.json +1328 -0
- package/dist/schemas/bundled/05-technology-layer.schema.json +1465 -0
- package/dist/schemas/bundled/06-api-layer.schema.json +1743 -0
- package/dist/schemas/bundled/07-data-model-layer.schema.json +1253 -0
- package/dist/schemas/bundled/08-datastore-layer.schema.json +892 -0
- package/dist/schemas/bundled/09-ux-layer.schema.json +1506 -0
- package/dist/schemas/bundled/10-navigation-layer.schema.json +843 -0
- package/dist/schemas/bundled/11-apm-observability-layer.schema.json +1430 -0
- package/dist/schemas/bundled/12-testing-layer.schema.json +1091 -0
- package/dist/schemas/bundled/common/layer-extensions.schema.json +266 -0
- package/dist/schemas/bundled/common/predicates.schema.json +493 -0
- package/dist/schemas/bundled/common/relationships.schema.json +791 -0
- package/dist/schemas/bundled/common/source-references.schema.json +71 -0
- package/dist/schemas/bundled/link-registry.json +1839 -0
- package/dist/schemas/bundled/link-registry.schema.json +339 -0
- package/dist/schemas/bundled/relationship-catalog.json +1302 -0
- package/dist/schemas/bundled/relationship-type.schema.json +221 -0
- package/dist/server/server.js +1207 -0
- package/dist/server/server.js.map +7 -0
- package/dist/server/telemetry-middleware.js +24 -0
- package/dist/server/telemetry-middleware.js.map +7 -0
- package/dist/telemetry/console-interceptor.js +34 -0
- package/dist/telemetry/console-interceptor.js.map +7 -0
- package/dist/telemetry/index.js +54 -0
- package/dist/telemetry/index.js.map +7 -0
- package/dist/telemetry/resilient-exporter.js +41 -0
- package/dist/telemetry/resilient-exporter.js.map +7 -0
- package/dist/telemetry/resilient-log-exporter.js +41 -0
- package/dist/telemetry/resilient-log-exporter.js.map +7 -0
- package/dist/telemetry/test-instrumentation.js +32 -0
- package/dist/telemetry/test-instrumentation.js.map +7 -0
- package/dist/types/index.js +1 -0
- package/dist/types/index.js.map +7 -0
- package/dist/utils/element-utils.js +11 -0
- package/dist/utils/element-utils.js.map +7 -0
- package/dist/utils/errors.js +105 -0
- package/dist/utils/errors.js.map +7 -0
- package/dist/utils/file-io.js +69 -0
- package/dist/utils/file-io.js.map +7 -0
- package/dist/utils/globals.js +28 -0
- package/dist/utils/globals.js.map +7 -0
- package/dist/utils/model-path.js +22 -0
- package/dist/utils/model-path.js.map +7 -0
- package/dist/utils/project-paths.js +45 -0
- package/dist/utils/project-paths.js.map +7 -0
- package/dist/utils/spec-installer.js +85 -0
- package/dist/utils/spec-installer.js.map +7 -0
- package/dist/utils/spec-version.js +33 -0
- package/dist/utils/spec-version.js.map +7 -0
- package/dist/validators/index.js +15 -0
- package/dist/validators/index.js.map +7 -0
- package/dist/validators/naming-validator.js +82 -0
- package/dist/validators/naming-validator.js.map +7 -0
- package/dist/validators/reference-validator.js +106 -0
- package/dist/validators/reference-validator.js.map +7 -0
- package/dist/validators/schema-validator.js +148 -0
- package/dist/validators/schema-validator.js.map +7 -0
- package/dist/validators/semantic-validator.js +80 -0
- package/dist/validators/semantic-validator.js.map +7 -0
- package/dist/validators/types.js +48 -0
- package/dist/validators/types.js.map +7 -0
- package/dist/validators/validator.js +67 -0
- package/dist/validators/validator.js.map +7 -0
- package/docs/TEST-INSTRUMENTATION.md +405 -0
- package/docs/telemetry.md +427 -0
- package/package.json +70 -0
- package/test-debug.js +33 -0
- package/test-special.mjs +46 -0
- package/test_runner.ts +7 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/export/markdown-exporter.ts"],
|
|
4
|
+
"sourcesContent": ["import type { Model } from \"../core/model.js\";\nimport type { Exporter, ExportOptions } from \"./types.js\";\nimport { ALL_LAYERS } from \"./types.js\";\n\n/**\n * Markdown Exporter - generates comprehensive markdown documentation\n * Supports all 12 layers\n */\nexport class MarkdownExporter implements Exporter {\n name = \"Markdown\";\n supportedLayers = ALL_LAYERS;\n\n private readonly layerDescriptions: Record<string, string> = {\n motivation:\n \"Goals, requirements, drivers, and strategic outcomes of the architecture.\",\n business:\n \"Business processes, functions, roles, and services.\",\n security:\n \"Authentication, authorization, security threats, and controls.\",\n application:\n \"Application components, services, and interactions.\",\n technology:\n \"Infrastructure, platforms, systems, and technology components.\",\n api: \"REST APIs, operations, endpoints, and API integrations.\",\n \"data-model\":\n \"Data entities, relationships, and data structure definitions.\",\n \"data-store\":\n \"Databases, data stores, and persistence mechanisms.\",\n ux: \"User interface components, screens, and user experience elements.\",\n navigation:\n \"Application routing, navigation flows, and page structures.\",\n apm: \"Observability, monitoring, metrics, logging, and tracing.\",\n testing:\n \"Test strategies, test cases, test data, and test coverage.\",\n };\n\n async export(model: Model, options: ExportOptions = {}): Promise<string> {\n const lines: string[] = [];\n\n // Document header\n lines.push(`# ${this.escapeMarkdown(model.manifest.name)}`);\n lines.push(\"\");\n\n if (model.manifest.description) {\n lines.push(`${model.manifest.description}`);\n lines.push(\"\");\n }\n\n // Model metadata\n lines.push(\"## Model Information\");\n lines.push(\"\");\n lines.push(\n `| Property | Value |`\n );\n lines.push(`| -------- | ----- |`);\n lines.push(\n `| Version | ${model.manifest.version || \"1.0.0\"} |`\n );\n if (model.manifest.author) {\n lines.push(\n `| Author | ${this.escapeMarkdown(model.manifest.author)} |`\n );\n }\n if (model.manifest.created) {\n lines.push(\n `| Created | ${model.manifest.created} |`\n );\n }\n if (model.manifest.modified) {\n lines.push(\n `| Modified | ${model.manifest.modified} |`\n );\n }\n lines.push(\"\");\n\n const layersToExport = options.layers || this.supportedLayers;\n\n // Generate documentation for each layer\n for (const layerName of layersToExport) {\n const layer = await model.getLayer(layerName);\n if (!layer) continue;\n\n const elements = Array.from(layer.listElements());\n if (elements.length === 0) continue;\n\n lines.push(`## Layer: ${this.formatLayerName(layerName)}`);\n lines.push(\"\");\n\n const description = this.layerDescriptions[layerName];\n if (description) {\n lines.push(`*${description}*`);\n lines.push(\"\");\n }\n\n lines.push(`### Elements (${elements.length})`);\n lines.push(\"\");\n\n // Element table\n lines.push(\n `| ID | Name | Type | Description |`\n );\n lines.push(\n `| -- | ---- | ---- | ----------- |`\n );\n\n for (const element of elements) {\n const id = this.escapeMarkdown(element.id);\n const name = this.escapeMarkdown(element.name);\n const type = this.escapeMarkdown(element.type);\n const desc = element.description\n ? this.escapeMarkdown(element.description).substring(0, 100)\n : \"\";\n\n lines.push(`| \\`${id}\\` | ${name} | ${type} | ${desc} |`);\n }\n\n lines.push(\"\");\n\n // Element details\n lines.push(`### Element Details`);\n lines.push(\"\");\n\n for (const element of elements) {\n lines.push(\n `#### ${this.escapeMarkdown(element.name)} (\\`${element.id}\\`)`\n );\n lines.push(\"\");\n\n if (element.description) {\n lines.push(`${element.description}`);\n lines.push(\"\");\n }\n\n lines.push(\"**Type:** \" + element.type);\n lines.push(\"\");\n\n // Properties\n if (Object.keys(element.properties).length > 0) {\n lines.push(\"**Properties:**\");\n lines.push(\"\");\n lines.push(\n `| Property | Value |`\n );\n lines.push(\n `| -------- | ----- |`\n );\n\n for (const [key, value] of Object.entries(element.properties)) {\n const displayValue = this.valueToMarkdown(value);\n lines.push(\n `| \\`${key}\\` | ${displayValue} |`\n );\n }\n lines.push(\"\");\n }\n\n // References\n if (element.references.length > 0) {\n lines.push(\"**Cross-Layer References:**\");\n lines.push(\"\");\n\n for (const ref of element.references) {\n const refDesc = ref.description\n ? ` - ${this.escapeMarkdown(ref.description)}`\n : \"\";\n lines.push(\n `- **${ref.type}**: \\`${ref.target}\\`${refDesc}`\n );\n }\n lines.push(\"\");\n }\n\n // Relationships\n if (element.relationships.length > 0) {\n lines.push(\"**Relationships:**\");\n lines.push(\"\");\n\n for (const rel of element.relationships) {\n lines.push(\n `- **${rel.predicate}**: \\`${rel.target}\\``\n );\n }\n lines.push(\"\");\n }\n }\n\n // Layer summary\n lines.push(`### Layer Summary`);\n lines.push(\"\");\n lines.push(\n `- **Total Elements:** ${elements.length}`\n );\n\n const refCount = elements.reduce(\n (sum, e) => sum + e.references.length,\n 0\n );\n const relCount = elements.reduce(\n (sum, e) => sum + e.relationships.length,\n 0\n );\n\n lines.push(\n `- **Cross-Layer References:** ${refCount}`\n );\n lines.push(\n `- **Relationships:** ${relCount}`\n );\n\n lines.push(\"\");\n lines.push(\"---\");\n lines.push(\"\");\n }\n\n // Architecture Summary\n lines.push(\"## Architecture Summary\");\n lines.push(\"\");\n\n let totalElements = 0;\n let totalReferences = 0;\n let totalRelationships = 0;\n\n for (const layerName of layersToExport) {\n const layer = await model.getLayer(layerName);\n if (!layer) continue;\n\n for (const element of layer.listElements()) {\n totalElements++;\n totalReferences += element.references.length;\n totalRelationships += element.relationships.length;\n }\n }\n\n lines.push(\n `| Metric | Count |`\n );\n lines.push(\n `| ------ | ----- |`\n );\n lines.push(\n `| Total Elements | ${totalElements} |`\n );\n lines.push(\n `| Cross-Layer References | ${totalReferences} |`\n );\n lines.push(\n `| Relationships | ${totalRelationships} |`\n );\n lines.push(\"\");\n\n return lines.join(\"\\n\");\n }\n\n /**\n * Escape markdown special characters\n */\n private escapeMarkdown(str: string): string {\n return str\n .replace(/\\\\/g, \"\\\\\\\\\")\n .replace(/\\|/g, \"\\\\|\")\n .replace(/\\*/g, \"\\\\*\")\n .replace(/\\[/g, \"\\\\[\")\n .replace(/\\]/g, \"\\\\]\")\n .replace(/\\{/g, \"\\\\{\")\n .replace(/\\}/g, \"\\\\}\");\n }\n\n /**\n * Format layer name for display\n */\n private formatLayerName(name: string): string {\n return name\n .split(\"-\")\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\" \");\n }\n\n /**\n * Convert value to markdown representation\n */\n private valueToMarkdown(value: unknown): string {\n if (typeof value === \"string\") return this.escapeMarkdown(value);\n if (typeof value === \"number\") return String(value);\n if (typeof value === \"boolean\") return String(value);\n if (Array.isArray(value)) {\n return `[${value.map((v) => this.valueToMarkdown(v)).join(\", \")}]`;\n }\n if (value && typeof value === \"object\") {\n return `\\`${this.escapeMarkdown(JSON.stringify(value))}\\``;\n }\n return String(value);\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
class OpenAPIExporter {
|
|
2
|
+
name = "OpenAPI";
|
|
3
|
+
supportedLayers = ["api"];
|
|
4
|
+
async export(model, _options = {}) {
|
|
5
|
+
const layer = await model.getLayer("api");
|
|
6
|
+
if (!layer)
|
|
7
|
+
throw new Error("No API layer found in model");
|
|
8
|
+
const spec = {
|
|
9
|
+
openapi: "3.0.0",
|
|
10
|
+
info: {
|
|
11
|
+
title: model.manifest.name,
|
|
12
|
+
version: model.manifest.version || "1.0.0"
|
|
13
|
+
},
|
|
14
|
+
paths: {},
|
|
15
|
+
components: {
|
|
16
|
+
schemas: {},
|
|
17
|
+
responses: {},
|
|
18
|
+
parameters: {},
|
|
19
|
+
requestBodies: {},
|
|
20
|
+
headers: {},
|
|
21
|
+
securitySchemes: {}
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
model.manifest.description && (spec.info.description = model.manifest.description);
|
|
25
|
+
const pathGroups = /* @__PURE__ */ new Map();
|
|
26
|
+
for (const element of layer.listElements())
|
|
27
|
+
if (element.type === "endpoint") {
|
|
28
|
+
const path = element.getProperty("path") || "/", method = (element.getProperty("method") || "get").toLowerCase();
|
|
29
|
+
pathGroups.has(path) || pathGroups.set(path, []), pathGroups.get(path).push({ method, element });
|
|
30
|
+
}
|
|
31
|
+
for (const [path, endpoints] of pathGroups) {
|
|
32
|
+
const pathItem = {};
|
|
33
|
+
for (const { method, element } of endpoints) {
|
|
34
|
+
const operation = {
|
|
35
|
+
summary: element.name,
|
|
36
|
+
operationId: element.id,
|
|
37
|
+
responses: element.getProperty("responses") || {
|
|
38
|
+
200: {
|
|
39
|
+
description: "Successful response"
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
element.description && (operation.description = element.description);
|
|
44
|
+
const tags = element.getProperty("tags");
|
|
45
|
+
tags && (operation.tags = tags);
|
|
46
|
+
const parameters = element.getProperty("parameters");
|
|
47
|
+
parameters && (operation.parameters = parameters);
|
|
48
|
+
const requestBody = element.getProperty("requestBody");
|
|
49
|
+
requestBody && (operation.requestBody = requestBody);
|
|
50
|
+
const security = element.getProperty("security");
|
|
51
|
+
security && (operation.security = security);
|
|
52
|
+
const deprecated = element.getProperty("deprecated");
|
|
53
|
+
deprecated && (operation.deprecated = deprecated), pathItem[method] = operation;
|
|
54
|
+
}
|
|
55
|
+
spec.paths[path] = pathItem;
|
|
56
|
+
}
|
|
57
|
+
for (const element of layer.listElements())
|
|
58
|
+
if (element.type === "schema") {
|
|
59
|
+
const schemaName = element.getProperty("schemaName") || element.id, schema = element.getProperty("schema");
|
|
60
|
+
schema && (spec.components.schemas[schemaName] = schema);
|
|
61
|
+
}
|
|
62
|
+
for (const element of layer.listElements())
|
|
63
|
+
if (element.type === "security-scheme") {
|
|
64
|
+
const schemeName = element.name, schemeType = element.getProperty("type");
|
|
65
|
+
if (schemeType) {
|
|
66
|
+
const scheme = {
|
|
67
|
+
type: schemeType
|
|
68
|
+
}, schemeProp = element.getProperty("scheme");
|
|
69
|
+
schemeProp && (scheme.scheme = schemeProp);
|
|
70
|
+
const bearerFormat = element.getProperty("bearerFormat");
|
|
71
|
+
bearerFormat && (scheme.bearerFormat = bearerFormat);
|
|
72
|
+
const flows = element.getProperty("flows");
|
|
73
|
+
flows && (scheme.flows = flows);
|
|
74
|
+
const openIdConnectUrl = element.getProperty("openIdConnectUrl");
|
|
75
|
+
openIdConnectUrl && (scheme.openIdConnectUrl = openIdConnectUrl), element.description && (scheme.description = element.description), spec.components.securitySchemes[schemeName] = scheme;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
const components = spec.components;
|
|
79
|
+
return components.schemas && Object.keys(components.schemas).length === 0 && delete components.schemas, components.responses && Object.keys(components.responses).length === 0 && delete components.responses, components.parameters && Object.keys(components.parameters).length === 0 && delete components.parameters, components.requestBodies && Object.keys(components.requestBodies).length === 0 && delete components.requestBodies, components.headers && Object.keys(components.headers).length === 0 && delete components.headers, components.securitySchemes && Object.keys(components.securitySchemes).length === 0 && delete components.securitySchemes, Object.keys(components).length === 0 && delete spec.components, JSON.stringify(spec, null, 2);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
export {
|
|
83
|
+
OpenAPIExporter
|
|
84
|
+
};
|
|
85
|
+
//# sourceMappingURL=openapi-exporter.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/export/openapi-exporter.ts"],
|
|
4
|
+
"sourcesContent": ["import type { Model } from \"../core/model.js\";\nimport type { Exporter, ExportOptions } from \"./types.js\";\n\ninterface OpenAPISpec {\n openapi: string;\n info: {\n title: string;\n version: string;\n description?: string;\n };\n paths: Record<string, unknown>;\n components: {\n schemas?: Record<string, unknown>;\n responses?: Record<string, unknown>;\n parameters?: Record<string, unknown>;\n requestBodies?: Record<string, unknown>;\n headers?: Record<string, unknown>;\n securitySchemes?: Record<string, unknown>;\n };\n servers?: Array<{ url: string; description?: string }>;\n tags?: Array<{ name: string; description?: string }>;\n externalDocs?: { url: string; description?: string };\n security?: unknown[];\n}\n\n/**\n * OpenAPI 3.0 Exporter for layer 6 (API)\n */\nexport class OpenAPIExporter implements Exporter {\n name = \"OpenAPI\";\n supportedLayers = [\"api\"];\n\n async export(model: Model, _options: ExportOptions = {}): Promise<string> {\n const layer = await model.getLayer(\"api\");\n if (!layer) {\n throw new Error(\"No API layer found in model\");\n }\n\n // Note: _options is not used for OpenAPI exporter as it only supports the api layer\n // The parameter is kept for interface consistency with other exporters\n\n const spec: OpenAPISpec = {\n openapi: \"3.0.0\",\n info: {\n title: model.manifest.name,\n version: model.manifest.version || \"1.0.0\",\n },\n paths: {},\n components: {\n schemas: {},\n responses: {},\n parameters: {},\n requestBodies: {},\n headers: {},\n securitySchemes: {},\n },\n };\n\n if (model.manifest.description) {\n spec.info.description = model.manifest.description;\n }\n\n // Group endpoints by path\n const pathGroups = new Map<string, Array<{ method: string; element: any }>>();\n\n for (const element of layer.listElements()) {\n if (element.type === \"endpoint\") {\n const path = element.getProperty<string>(\"path\") || \"/\";\n const method = (element.getProperty<string>(\"method\") || \"get\").toLowerCase();\n\n if (!pathGroups.has(path)) {\n pathGroups.set(path, []);\n }\n pathGroups.get(path)!.push({ method, element });\n }\n }\n\n // Build paths section\n for (const [path, endpoints] of pathGroups) {\n const pathItem: Record<string, unknown> = {};\n\n for (const { method, element } of endpoints) {\n const operation: Record<string, unknown> = {\n summary: element.name,\n operationId: element.id,\n responses: element.getProperty(\"responses\") || {\n \"200\": {\n description: \"Successful response\",\n },\n },\n };\n\n if (element.description) {\n operation.description = element.description;\n }\n\n const tags = element.getProperty(\"tags\");\n if (tags) {\n operation.tags = tags;\n }\n\n const parameters = element.getProperty(\"parameters\");\n if (parameters) {\n operation.parameters = parameters;\n }\n\n const requestBody = element.getProperty(\"requestBody\");\n if (requestBody) {\n operation.requestBody = requestBody;\n }\n\n const security = element.getProperty(\"security\");\n if (security) {\n operation.security = security;\n }\n\n const deprecated = element.getProperty(\"deprecated\");\n if (deprecated) {\n operation.deprecated = deprecated;\n }\n\n pathItem[method] = operation;\n }\n\n (spec.paths as Record<string, unknown>)[path] = pathItem;\n }\n\n // Collect all schema definitions from elements\n for (const element of layer.listElements()) {\n if (element.type === \"schema\") {\n const schemaName = element.getProperty<string>(\"schemaName\") || element.id;\n const schema = element.getProperty(\"schema\");\n if (schema) {\n spec.components.schemas![schemaName] = schema;\n }\n }\n }\n\n // Collect security schemes if defined\n for (const element of layer.listElements()) {\n if (element.type === \"security-scheme\") {\n const schemeName = element.name;\n const schemeType = element.getProperty<string>(\"type\");\n if (schemeType) {\n const scheme: Record<string, unknown> = {\n type: schemeType,\n };\n\n const schemeProp = element.getProperty(\"scheme\");\n if (schemeProp) {\n scheme.scheme = schemeProp;\n }\n\n const bearerFormat = element.getProperty(\"bearerFormat\");\n if (bearerFormat) {\n scheme.bearerFormat = bearerFormat;\n }\n\n const flows = element.getProperty(\"flows\");\n if (flows) {\n scheme.flows = flows;\n }\n\n const openIdConnectUrl = element.getProperty(\"openIdConnectUrl\");\n if (openIdConnectUrl) {\n scheme.openIdConnectUrl = openIdConnectUrl;\n }\n\n if (element.description) {\n scheme.description = element.description;\n }\n\n spec.components.securitySchemes![schemeName] = scheme;\n }\n }\n }\n\n // Add servers if defined in manifest (would be stored separately)\n // For now, servers would need to be added via layer properties\n // This could be extended in the future\n\n // Remove empty component sections\n const components = spec.components;\n if (components.schemas && Object.keys(components.schemas).length === 0) {\n delete components.schemas;\n }\n if (components.responses && Object.keys(components.responses).length === 0) {\n delete components.responses;\n }\n if (components.parameters && Object.keys(components.parameters).length === 0) {\n delete components.parameters;\n }\n if (components.requestBodies && Object.keys(components.requestBodies).length === 0) {\n delete components.requestBodies;\n }\n if (components.headers && Object.keys(components.headers).length === 0) {\n delete components.headers;\n }\n if (components.securitySchemes && Object.keys(components.securitySchemes).length === 0) {\n delete components.securitySchemes;\n }\n if (Object.keys(components).length === 0) {\n delete (spec as Partial<OpenAPISpec>).components;\n }\n\n return JSON.stringify(spec, null, 2);\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { ALL_LAYERS, LAYER_COLORS } from "./types.js";
|
|
2
|
+
class PlantUMLExporter {
|
|
3
|
+
name = "PlantUML";
|
|
4
|
+
supportedLayers = ALL_LAYERS;
|
|
5
|
+
async export(model, options = {}) {
|
|
6
|
+
const lines = [];
|
|
7
|
+
lines.push("@startuml"), lines.push(`title "${this.escapeQuotes(model.manifest.name)}"`), lines.push(""), model.manifest.description && (lines.push(`note top : "${this.escapeQuotes(model.manifest.description)}"`), lines.push(""));
|
|
8
|
+
const layersToExport = options.layers || this.supportedLayers, elementsByLayer = /* @__PURE__ */ new Map();
|
|
9
|
+
for (const layerName of layersToExport) {
|
|
10
|
+
const layer = await model.getLayer(layerName);
|
|
11
|
+
if (!layer)
|
|
12
|
+
continue;
|
|
13
|
+
const layerElements = [];
|
|
14
|
+
for (const element of layer.listElements())
|
|
15
|
+
layerElements.push({
|
|
16
|
+
id: element.id,
|
|
17
|
+
name: element.name,
|
|
18
|
+
type: element.type
|
|
19
|
+
});
|
|
20
|
+
elementsByLayer.set(layerName, layerElements);
|
|
21
|
+
}
|
|
22
|
+
for (const layerName of layersToExport) {
|
|
23
|
+
const elements = elementsByLayer.get(layerName);
|
|
24
|
+
if (!elements || elements.length === 0)
|
|
25
|
+
continue;
|
|
26
|
+
const color = LAYER_COLORS[layerName] || "FFFFFF";
|
|
27
|
+
lines.push(`package "${layerName}" #${color} {`);
|
|
28
|
+
for (const { id, name } of elements)
|
|
29
|
+
lines.push(` component "${this.escapeQuotes(name)}" as ${id}`);
|
|
30
|
+
lines.push("}"), lines.push("");
|
|
31
|
+
}
|
|
32
|
+
for (const layerName of layersToExport) {
|
|
33
|
+
const layer = await model.getLayer(layerName);
|
|
34
|
+
if (layer)
|
|
35
|
+
for (const element of layer.listElements()) {
|
|
36
|
+
for (const ref of element.references) {
|
|
37
|
+
const refType = ref.type || "references";
|
|
38
|
+
lines.push(`${element.id} --> ${ref.target} : ${this.escapeQuotes(refType)}`);
|
|
39
|
+
}
|
|
40
|
+
for (const rel of element.relationships) {
|
|
41
|
+
const predicate = rel.predicate || "relates-to";
|
|
42
|
+
lines.push(`${element.id} ..> ${rel.target} : ${this.escapeQuotes(predicate)}`);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return lines.push(""), lines.push("@enduml"), lines.join(`
|
|
47
|
+
`) + `
|
|
48
|
+
`;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Escape quotes for PlantUML syntax
|
|
52
|
+
*/
|
|
53
|
+
escapeQuotes(str) {
|
|
54
|
+
return str.replace(/"/g, '\\"');
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
export {
|
|
58
|
+
PlantUMLExporter
|
|
59
|
+
};
|
|
60
|
+
//# sourceMappingURL=plantuml-exporter.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/export/plantuml-exporter.ts"],
|
|
4
|
+
"sourcesContent": ["import type { Model } from \"../core/model.js\";\nimport type { Exporter, ExportOptions } from \"./types.js\";\nimport { ALL_LAYERS, LAYER_COLORS } from \"./types.js\";\n\n/**\n * PlantUML Exporter - generates PlantUML syntax for diagram visualization\n * Supports all 12 layers\n */\nexport class PlantUMLExporter implements Exporter {\n name = \"PlantUML\";\n supportedLayers = ALL_LAYERS;\n\n async export(model: Model, options: ExportOptions = {}): Promise<string> {\n const lines: string[] = [];\n\n lines.push(\"@startuml\");\n lines.push(`title \"${this.escapeQuotes(model.manifest.name)}\"`);\n lines.push(\"\");\n\n if (model.manifest.description) {\n lines.push(`note top : \"${this.escapeQuotes(model.manifest.description)}\"`);\n lines.push(\"\");\n }\n\n const layersToExport = options.layers || this.supportedLayers;\n const elementsByLayer = new Map<string, Array<{ id: string; name: string; type: string }>>();\n\n // Collect elements by layer\n for (const layerName of layersToExport) {\n const layer = await model.getLayer(layerName);\n if (!layer) continue;\n\n const layerElements: Array<{ id: string; name: string; type: string }> = [];\n for (const element of layer.listElements()) {\n layerElements.push({\n id: element.id,\n name: element.name,\n type: element.type,\n });\n }\n elementsByLayer.set(layerName, layerElements);\n }\n\n // Create packages for each layer\n for (const layerName of layersToExport) {\n const elements = elementsByLayer.get(layerName);\n if (!elements || elements.length === 0) continue;\n\n const color = LAYER_COLORS[layerName] || \"FFFFFF\";\n lines.push(`package \"${layerName}\" #${color} {`);\n\n for (const { id, name } of elements) {\n lines.push(` component \"${this.escapeQuotes(name)}\" as ${id}`);\n }\n\n lines.push(\"}\");\n lines.push(\"\");\n }\n\n // Add relationships\n for (const layerName of layersToExport) {\n const layer = await model.getLayer(layerName);\n if (!layer) continue;\n\n for (const element of layer.listElements()) {\n // Cross-layer references\n for (const ref of element.references) {\n const refType = ref.type || \"references\";\n lines.push(\n `${element.id} --> ${ref.target} : ${this.escapeQuotes(refType)}`\n );\n }\n\n // Intra-layer relationships\n for (const rel of element.relationships) {\n const predicate = rel.predicate || \"relates-to\";\n lines.push(\n `${element.id} ..> ${rel.target} : ${this.escapeQuotes(predicate)}`\n );\n }\n }\n }\n\n lines.push(\"\");\n lines.push(\"@enduml\");\n\n return lines.join(\"\\n\") + \"\\n\";\n }\n\n /**\n * Escape quotes for PlantUML syntax\n */\n private escapeQuotes(str: string): string {\n // Escape double quotes within strings for PlantUML\n return str.replace(/\"/g, '\\\\\"');\n }\n}\n"],
|
|
5
|
+
"mappings": "AAEA,SAAS,YAAY,oBAAoB;AAMnC,MAAO,iBAAgB;EAC3B,OAAO;EACP,kBAAkB;EAElB,MAAM,OAAO,OAAc,UAAyB,CAAA,GAAE;AACpD,UAAM,QAAkB,CAAA;AAExB,UAAM,KAAK,WAAW,GACtB,MAAM,KAAK,UAAU,KAAK,aAAa,MAAM,SAAS,IAAI,CAAC,GAAG,GAC9D,MAAM,KAAK,EAAE,GAET,MAAM,SAAS,gBACjB,MAAM,KAAK,eAAe,KAAK,aAAa,MAAM,SAAS,WAAW,CAAC,GAAG,GAC1E,MAAM,KAAK,EAAE;AAGf,UAAM,iBAAiB,QAAQ,UAAU,KAAK,iBACxC,kBAAkB,oBAAI,IAAG;AAG/B,eAAW,aAAa,gBAAgB;AACtC,YAAM,QAAQ,MAAM,MAAM,SAAS,SAAS;AAC5C,UAAI,CAAC;AAAO;AAEZ,YAAM,gBAAmE,CAAA;AACzE,iBAAW,WAAW,MAAM,aAAY;AACtC,sBAAc,KAAK;UACjB,IAAI,QAAQ;UACZ,MAAM,QAAQ;UACd,MAAM,QAAQ;SACf;AAEH,sBAAgB,IAAI,WAAW,aAAa;IAC9C;AAGA,eAAW,aAAa,gBAAgB;AACtC,YAAM,WAAW,gBAAgB,IAAI,SAAS;AAC9C,UAAI,CAAC,YAAY,SAAS,WAAW;AAAG;AAExC,YAAM,QAAQ,aAAa,SAAS,KAAK;AACzC,YAAM,KAAK,YAAY,SAAS,MAAM,KAAK,IAAI;AAE/C,iBAAW,EAAE,IAAI,KAAI,KAAM;AACzB,cAAM,KAAK,gBAAgB,KAAK,aAAa,IAAI,CAAC,QAAQ,EAAE,EAAE;AAGhE,YAAM,KAAK,GAAG,GACd,MAAM,KAAK,EAAE;IACf;AAGA,eAAW,aAAa,gBAAgB;AACtC,YAAM,QAAQ,MAAM,MAAM,SAAS,SAAS;AAC5C,UAAK;AAEL,mBAAW,WAAW,MAAM,aAAY,GAAI;AAE1C,qBAAW,OAAO,QAAQ,YAAY;AACpC,kBAAM,UAAU,IAAI,QAAQ;AAC5B,kBAAM,KACJ,GAAG,QAAQ,EAAE,QAAQ,IAAI,MAAM,MAAM,KAAK,aAAa,OAAO,CAAC,EAAE;UAErE;AAGA,qBAAW,OAAO,QAAQ,eAAe;AACvC,kBAAM,YAAY,IAAI,aAAa;AACnC,kBAAM,KACJ,GAAG,QAAQ,EAAE,QAAQ,IAAI,MAAM,MAAM,KAAK,aAAa,SAAS,CAAC,EAAE;UAEvE;QACF;IACF;AAEA,iBAAM,KAAK,EAAE,GACb,MAAM,KAAK,SAAS,GAEb,MAAM,KAAK;CAAI,IAAI;;EAC5B;;;;EAKQ,aAAa,KAAW;AAE9B,WAAO,IAAI,QAAQ,MAAM,KAAK;EAChC;;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
const LAYER_COLORS = {
|
|
2
|
+
motivation: "FFE4E1",
|
|
3
|
+
business: "E6F3FF",
|
|
4
|
+
security: "FFE6E6",
|
|
5
|
+
application: "E6FFE6",
|
|
6
|
+
technology: "FFFFE6",
|
|
7
|
+
api: "F0E6FF",
|
|
8
|
+
"data-model": "E6F0FF",
|
|
9
|
+
"data-store": "FFE6F0",
|
|
10
|
+
ux: "FFCCCC",
|
|
11
|
+
navigation: "CCFFCC",
|
|
12
|
+
apm: "CCFFFF",
|
|
13
|
+
testing: "FFCCFF"
|
|
14
|
+
}, ALL_LAYERS = [
|
|
15
|
+
"motivation",
|
|
16
|
+
"business",
|
|
17
|
+
"security",
|
|
18
|
+
"application",
|
|
19
|
+
"technology",
|
|
20
|
+
"api",
|
|
21
|
+
"data-model",
|
|
22
|
+
"data-store",
|
|
23
|
+
"ux",
|
|
24
|
+
"navigation",
|
|
25
|
+
"apm",
|
|
26
|
+
"testing"
|
|
27
|
+
];
|
|
28
|
+
function escapeXml(str) {
|
|
29
|
+
return str.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """).replace(/'/g, "'");
|
|
30
|
+
}
|
|
31
|
+
export {
|
|
32
|
+
ALL_LAYERS,
|
|
33
|
+
LAYER_COLORS,
|
|
34
|
+
escapeXml
|
|
35
|
+
};
|
|
36
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/export/types.ts"],
|
|
4
|
+
"sourcesContent": ["import type { Model } from \"../core/model.js\";\n\n/**\n * Options for export operations\n */\nexport interface ExportOptions {\n layers?: string[];\n outputPath?: string;\n format?: string;\n}\n\n/**\n * Interface for format-specific exporters\n */\nexport interface Exporter {\n /** Display name of the exporter */\n name: string;\n\n /** Layers this exporter supports */\n supportedLayers: string[];\n\n /**\n * Export model or subset to the format\n */\n export(model: Model, options: ExportOptions): Promise<string>;\n}\n\n/**\n * Metadata about a registered export format\n */\nexport interface ExportFormatInfo {\n format: string;\n name: string;\n description: string;\n supportedLayers: string[];\n mimeType: string;\n}\n\n/**\n * Shared layer colors for consistent visualization across exporters\n * Note: Color values do NOT include '#' prefix - exporters add it as needed\n */\nexport const LAYER_COLORS: Record<string, string> = {\n motivation: \"FFE4E1\",\n business: \"E6F3FF\",\n security: \"FFE6E6\",\n application: \"E6FFE6\",\n technology: \"FFFFE6\",\n api: \"F0E6FF\",\n \"data-model\": \"E6F0FF\",\n \"data-store\": \"FFE6F0\",\n ux: \"FFCCCC\",\n navigation: \"CCFFCC\",\n apm: \"CCFFFF\",\n testing: \"FFCCFF\",\n};\n\n/**\n * All 12 supported layers\n */\nexport const ALL_LAYERS: string[] = [\n \"motivation\",\n \"business\",\n \"security\",\n \"application\",\n \"technology\",\n \"api\",\n \"data-model\",\n \"data-store\",\n \"ux\",\n \"navigation\",\n \"apm\",\n \"testing\",\n];\n\n/**\n * Escape XML special characters\n */\nexport function escapeXml(str: string): string {\n return str\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\");\n}\n"],
|
|
5
|
+
"mappings": "AA0CO,MAAM,eAAuC;EAClD,YAAY;EACZ,UAAU;EACV,UAAU;EACV,aAAa;EACb,YAAY;EACZ,KAAK;EACL,cAAc;EACd,cAAc;EACd,IAAI;EACJ,YAAY;EACZ,KAAK;EACL,SAAS;GAME,aAAuB;EAClC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAMI,SAAU,UAAU,KAAW;AACnC,SAAO,IACJ,QAAQ,MAAM,OAAO,EACrB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,QAAQ,EACtB,QAAQ,MAAM,QAAQ;AAC3B;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|