docviz-builder 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.
Files changed (233) hide show
  1. package/AGENTS.md +371 -0
  2. package/LICENSE +21 -0
  3. package/README.md +837 -0
  4. package/bin/docviz-mcp.mjs +10 -0
  5. package/bin/docviz.mjs +11 -0
  6. package/dist/build/builder.d.ts +62 -0
  7. package/dist/build/builder.d.ts.map +1 -0
  8. package/dist/build/builder.js +337 -0
  9. package/dist/build/builder.js.map +1 -0
  10. package/dist/build/diff.d.ts +64 -0
  11. package/dist/build/diff.d.ts.map +1 -0
  12. package/dist/build/diff.js +156 -0
  13. package/dist/build/diff.js.map +1 -0
  14. package/dist/build/doctor.d.ts +39 -0
  15. package/dist/build/doctor.d.ts.map +1 -0
  16. package/dist/build/doctor.js +190 -0
  17. package/dist/build/doctor.js.map +1 -0
  18. package/dist/build/init.d.ts +28 -0
  19. package/dist/build/init.d.ts.map +1 -0
  20. package/dist/build/init.js +274 -0
  21. package/dist/build/init.js.map +1 -0
  22. package/dist/build/preview.d.ts +13 -0
  23. package/dist/build/preview.d.ts.map +1 -0
  24. package/dist/build/preview.js +277 -0
  25. package/dist/build/preview.js.map +1 -0
  26. package/dist/build/skill.d.ts +41 -0
  27. package/dist/build/skill.d.ts.map +1 -0
  28. package/dist/build/skill.js +63 -0
  29. package/dist/build/skill.js.map +1 -0
  30. package/dist/build/verify.d.ts +26 -0
  31. package/dist/build/verify.d.ts.map +1 -0
  32. package/dist/build/verify.js +99 -0
  33. package/dist/build/verify.js.map +1 -0
  34. package/dist/cli.d.ts +20 -0
  35. package/dist/cli.d.ts.map +1 -0
  36. package/dist/cli.js +427 -0
  37. package/dist/cli.js.map +1 -0
  38. package/dist/config/load.d.ts +32 -0
  39. package/dist/config/load.d.ts.map +1 -0
  40. package/dist/config/load.js +279 -0
  41. package/dist/config/load.js.map +1 -0
  42. package/dist/config/types.d.ts +89 -0
  43. package/dist/config/types.d.ts.map +1 -0
  44. package/dist/config/types.js +5 -0
  45. package/dist/config/types.js.map +1 -0
  46. package/dist/core/cache.d.ts +32 -0
  47. package/dist/core/cache.d.ts.map +1 -0
  48. package/dist/core/cache.js +69 -0
  49. package/dist/core/cache.js.map +1 -0
  50. package/dist/core/errors.d.ts +115 -0
  51. package/dist/core/errors.d.ts.map +1 -0
  52. package/dist/core/errors.js +164 -0
  53. package/dist/core/errors.js.map +1 -0
  54. package/dist/core/hash.d.ts +57 -0
  55. package/dist/core/hash.d.ts.map +1 -0
  56. package/dist/core/hash.js +0 -0
  57. package/dist/core/hash.js.map +1 -0
  58. package/dist/core/package-version.d.ts +9 -0
  59. package/dist/core/package-version.d.ts.map +1 -0
  60. package/dist/core/package-version.js +44 -0
  61. package/dist/core/package-version.js.map +1 -0
  62. package/dist/core/paths.d.ts +46 -0
  63. package/dist/core/paths.d.ts.map +1 -0
  64. package/dist/core/paths.js +105 -0
  65. package/dist/core/paths.js.map +1 -0
  66. package/dist/core/registry.d.ts +24 -0
  67. package/dist/core/registry.d.ts.map +1 -0
  68. package/dist/core/registry.js +72 -0
  69. package/dist/core/registry.js.map +1 -0
  70. package/dist/core/types.d.ts +78 -0
  71. package/dist/core/types.d.ts.map +1 -0
  72. package/dist/core/types.js +11 -0
  73. package/dist/core/types.js.map +1 -0
  74. package/dist/dsl/architecture.d.ts +15 -0
  75. package/dist/dsl/architecture.d.ts.map +1 -0
  76. package/dist/dsl/architecture.js +242 -0
  77. package/dist/dsl/architecture.js.map +1 -0
  78. package/dist/dsl/catalog.d.ts +62 -0
  79. package/dist/dsl/catalog.d.ts.map +1 -0
  80. package/dist/dsl/catalog.en.d.ts +18 -0
  81. package/dist/dsl/catalog.en.d.ts.map +1 -0
  82. package/dist/dsl/catalog.en.js +299 -0
  83. package/dist/dsl/catalog.en.js.map +1 -0
  84. package/dist/dsl/catalog.js +1082 -0
  85. package/dist/dsl/catalog.js.map +1 -0
  86. package/dist/dsl/chart.d.ts +14 -0
  87. package/dist/dsl/chart.d.ts.map +1 -0
  88. package/dist/dsl/chart.js +435 -0
  89. package/dist/dsl/chart.js.map +1 -0
  90. package/dist/dsl/compile.d.ts +31 -0
  91. package/dist/dsl/compile.d.ts.map +1 -0
  92. package/dist/dsl/compile.js +120 -0
  93. package/dist/dsl/compile.js.map +1 -0
  94. package/dist/dsl/diagram-bpmn.d.ts +13 -0
  95. package/dist/dsl/diagram-bpmn.d.ts.map +1 -0
  96. package/dist/dsl/diagram-bpmn.js +215 -0
  97. package/dist/dsl/diagram-bpmn.js.map +1 -0
  98. package/dist/dsl/diagram-product.d.ts +15 -0
  99. package/dist/dsl/diagram-product.d.ts.map +1 -0
  100. package/dist/dsl/diagram-product.js +291 -0
  101. package/dist/dsl/diagram-product.js.map +1 -0
  102. package/dist/dsl/diagram-technical.d.ts +28 -0
  103. package/dist/dsl/diagram-technical.d.ts.map +1 -0
  104. package/dist/dsl/diagram-technical.js +365 -0
  105. package/dist/dsl/diagram-technical.js.map +1 -0
  106. package/dist/dsl/diagram.d.ts +22 -0
  107. package/dist/dsl/diagram.d.ts.map +1 -0
  108. package/dist/dsl/diagram.js +542 -0
  109. package/dist/dsl/diagram.js.map +1 -0
  110. package/dist/dsl/fallbacks-d2.d.ts +27 -0
  111. package/dist/dsl/fallbacks-d2.d.ts.map +1 -0
  112. package/dist/dsl/fallbacks-d2.js +265 -0
  113. package/dist/dsl/fallbacks-d2.js.map +1 -0
  114. package/dist/dsl/fallbacks.d.ts +25 -0
  115. package/dist/dsl/fallbacks.d.ts.map +1 -0
  116. package/dist/dsl/fallbacks.js +264 -0
  117. package/dist/dsl/fallbacks.js.map +1 -0
  118. package/dist/dsl/fields.d.ts +93 -0
  119. package/dist/dsl/fields.d.ts.map +1 -0
  120. package/dist/dsl/fields.js +233 -0
  121. package/dist/dsl/fields.js.map +1 -0
  122. package/dist/dsl/index.d.ts +50 -0
  123. package/dist/dsl/index.d.ts.map +1 -0
  124. package/dist/dsl/index.js +114 -0
  125. package/dist/dsl/index.js.map +1 -0
  126. package/dist/dsl/util.d.ts +105 -0
  127. package/dist/dsl/util.d.ts.map +1 -0
  128. package/dist/dsl/util.js +261 -0
  129. package/dist/dsl/util.js.map +1 -0
  130. package/dist/index.d.ts +27 -0
  131. package/dist/index.d.ts.map +1 -0
  132. package/dist/index.js +21 -0
  133. package/dist/index.js.map +1 -0
  134. package/dist/markdown/scan.d.ts +73 -0
  135. package/dist/markdown/scan.d.ts.map +1 -0
  136. package/dist/markdown/scan.js +150 -0
  137. package/dist/markdown/scan.js.map +1 -0
  138. package/dist/markdown/transform.d.ts +28 -0
  139. package/dist/markdown/transform.d.ts.map +1 -0
  140. package/dist/markdown/transform.js +38 -0
  141. package/dist/markdown/transform.js.map +1 -0
  142. package/dist/mcp/server.d.ts +18 -0
  143. package/dist/mcp/server.d.ts.map +1 -0
  144. package/dist/mcp/server.js +118 -0
  145. package/dist/mcp/server.js.map +1 -0
  146. package/dist/mcp/tools.d.ts +118 -0
  147. package/dist/mcp/tools.d.ts.map +1 -0
  148. package/dist/mcp/tools.js +573 -0
  149. package/dist/mcp/tools.js.map +1 -0
  150. package/dist/renderers/base.d.ts +18 -0
  151. package/dist/renderers/base.d.ts.map +1 -0
  152. package/dist/renderers/base.js +59 -0
  153. package/dist/renderers/base.js.map +1 -0
  154. package/dist/renderers/bpmn.d.ts +68 -0
  155. package/dist/renderers/bpmn.d.ts.map +1 -0
  156. package/dist/renderers/bpmn.js +158 -0
  157. package/dist/renderers/bpmn.js.map +1 -0
  158. package/dist/renderers/browser.d.ts +30 -0
  159. package/dist/renderers/browser.d.ts.map +1 -0
  160. package/dist/renderers/browser.js +143 -0
  161. package/dist/renderers/browser.js.map +1 -0
  162. package/dist/renderers/color-scheme.d.ts +40 -0
  163. package/dist/renderers/color-scheme.d.ts.map +1 -0
  164. package/dist/renderers/color-scheme.js +122 -0
  165. package/dist/renderers/color-scheme.js.map +1 -0
  166. package/dist/renderers/d2.d.ts +37 -0
  167. package/dist/renderers/d2.d.ts.map +1 -0
  168. package/dist/renderers/d2.js +108 -0
  169. package/dist/renderers/d2.js.map +1 -0
  170. package/dist/renderers/graphviz.d.ts +33 -0
  171. package/dist/renderers/graphviz.d.ts.map +1 -0
  172. package/dist/renderers/graphviz.js +88 -0
  173. package/dist/renderers/graphviz.js.map +1 -0
  174. package/dist/renderers/in-page.d.ts +33 -0
  175. package/dist/renderers/in-page.d.ts.map +1 -0
  176. package/dist/renderers/in-page.js +76 -0
  177. package/dist/renderers/in-page.js.map +1 -0
  178. package/dist/renderers/index.d.ts +20 -0
  179. package/dist/renderers/index.d.ts.map +1 -0
  180. package/dist/renderers/index.js +94 -0
  181. package/dist/renderers/index.js.map +1 -0
  182. package/dist/renderers/kroki.d.ts +38 -0
  183. package/dist/renderers/kroki.d.ts.map +1 -0
  184. package/dist/renderers/kroki.js +151 -0
  185. package/dist/renderers/kroki.js.map +1 -0
  186. package/dist/renderers/likec4-svg.d.ts +82 -0
  187. package/dist/renderers/likec4-svg.d.ts.map +1 -0
  188. package/dist/renderers/likec4-svg.js +435 -0
  189. package/dist/renderers/likec4-svg.js.map +1 -0
  190. package/dist/renderers/likec4.d.ts +22 -0
  191. package/dist/renderers/likec4.d.ts.map +1 -0
  192. package/dist/renderers/likec4.js +77 -0
  193. package/dist/renderers/likec4.js.map +1 -0
  194. package/dist/renderers/mermaid.d.ts +64 -0
  195. package/dist/renderers/mermaid.d.ts.map +1 -0
  196. package/dist/renderers/mermaid.js +196 -0
  197. package/dist/renderers/mermaid.js.map +1 -0
  198. package/dist/renderers/plantuml.d.ts +56 -0
  199. package/dist/renderers/plantuml.d.ts.map +1 -0
  200. package/dist/renderers/plantuml.js +195 -0
  201. package/dist/renderers/plantuml.js.map +1 -0
  202. package/dist/renderers/svg-utils.d.ts +46 -0
  203. package/dist/renderers/svg-utils.d.ts.map +1 -0
  204. package/dist/renderers/svg-utils.js +439 -0
  205. package/dist/renderers/svg-utils.js.map +1 -0
  206. package/dist/renderers/svgbob.d.ts +26 -0
  207. package/dist/renderers/svgbob.d.ts.map +1 -0
  208. package/dist/renderers/svgbob.js +70 -0
  209. package/dist/renderers/svgbob.js.map +1 -0
  210. package/dist/renderers/vega-lite.d.ts +18 -0
  211. package/dist/renderers/vega-lite.d.ts.map +1 -0
  212. package/dist/renderers/vega-lite.js +94 -0
  213. package/dist/renderers/vega-lite.js.map +1 -0
  214. package/dist/themes/index.d.ts +17 -0
  215. package/dist/themes/index.d.ts.map +1 -0
  216. package/dist/themes/index.js +419 -0
  217. package/dist/themes/index.js.map +1 -0
  218. package/dist/themes/types.d.ts +99 -0
  219. package/dist/themes/types.d.ts.map +1 -0
  220. package/dist/themes/types.js +9 -0
  221. package/dist/themes/types.js.map +1 -0
  222. package/eval/casos.json +513 -0
  223. package/package.json +114 -0
  224. package/scripts/capture-preview.mjs +101 -0
  225. package/scripts/check-github.mjs +128 -0
  226. package/scripts/eval.d.mts +8 -0
  227. package/scripts/eval.mjs +284 -0
  228. package/scripts/fetch-plantuml.mjs +122 -0
  229. package/scripts/generate-catalog-doc.mjs +106 -0
  230. package/scripts/rasterize.mjs +68 -0
  231. package/scripts/sync-docs.mjs +158 -0
  232. package/skills/docviz/SKILL.md +111 -0
  233. package/vendor/.gitkeep +0 -0
@@ -0,0 +1,265 @@
1
+ /**
2
+ * Respaldos hacia D2 para los tipos que dependen de PlantUML.
3
+ *
4
+ * D2 va embebido como WebAssembly: no necesita Java ni navegador, asi que
5
+ * **esta siempre disponible**. Eso lo convierte en el respaldo con mas valor
6
+ * que se puede declarar: un respaldo hacia Mermaid solo ayuda a quien tenga un
7
+ * Chromium, mientras que este salva el tipo en cualquier maquina.
8
+ *
9
+ * El dibujo no sale igual —D2 no es PlantUML— y por eso siguen siendo respaldos
10
+ * y no la opcion preferida. Pero un diagrama con otro aspecto es infinitamente
11
+ * mejor que un build que se cae.
12
+ */
13
+ import { asNamedRecord, asRecord, d2Label, IdFactory, nameOf, optionalArray, optionalString, requireArray, requireString, toEdge, } from './util.js';
14
+ /** `sequence` con D2, que tiene diagramas de secuencia propios. */
15
+ export function d2Sequence(doc) {
16
+ const participants = requireArray(doc['participants'], 'diagram.participants');
17
+ const flow = requireArray(doc['flow'] ?? doc['messages'], 'diagram.flow');
18
+ const ids = new IdFactory('p');
19
+ const lines = ['shape: sequence_diagram', ''];
20
+ for (const raw of participants) {
21
+ const name = nameOf(raw, 'diagram.participants');
22
+ lines.push(`${ids.id(name)}: ${d2Label(name)}`);
23
+ }
24
+ for (const raw of flow) {
25
+ const edge = toEdge(raw, 'diagram.flow');
26
+ for (const endpoint of [edge.from, edge.to]) {
27
+ if (!ids.has(endpoint))
28
+ lines.push(`${ids.id(endpoint)}: ${d2Label(endpoint)}`);
29
+ }
30
+ const style = edge.dashed ? ' {style.stroke-dash: 4}' : '';
31
+ const label = edge.label !== undefined ? `: ${d2Label(edge.label)}` : '';
32
+ lines.push(`${ids.get(edge.from)} -> ${ids.get(edge.to)}${label}${style}`);
33
+ }
34
+ return lines.join('\n');
35
+ }
36
+ /** `class` con D2, que tiene forma de clase con atributos y metodos. */
37
+ export function d2Class(doc) {
38
+ const classes = requireArray(doc['classes'] ?? doc['entities'], 'diagram.classes');
39
+ const relations = optionalArray(doc['relations'], 'diagram.relations');
40
+ const ids = new IdFactory('c');
41
+ const lines = [];
42
+ for (const raw of classes) {
43
+ const record = asNamedRecord(raw, 'diagram.classes');
44
+ const name = requireString(record, 'name', 'diagram.classes');
45
+ const id = ids.id(name);
46
+ lines.push(`${id}: ${d2Label(name)} {`, ' shape: class');
47
+ for (const attr of optionalArray(record['attributes'], 'diagram.classes.attributes')) {
48
+ lines.push(` ${sanear(String(attr))}: ""`);
49
+ }
50
+ for (const method of optionalArray(record['methods'], 'diagram.classes.methods')) {
51
+ lines.push(` ${sanear(String(method))}(): ""`);
52
+ }
53
+ lines.push('}');
54
+ }
55
+ for (const raw of relations) {
56
+ const record = asRecord(raw, 'diagram.relations');
57
+ const from = requireString(record, 'from', 'diagram.relations');
58
+ const to = requireString(record, 'to', 'diagram.relations');
59
+ const tipo = optionalString(record, 'type');
60
+ if (!ids.has(from))
61
+ lines.push(`${ids.id(from)}: ${d2Label(from)}`);
62
+ if (!ids.has(to))
63
+ lines.push(`${ids.id(to)}: ${d2Label(to)}`);
64
+ const etiqueta = tipo !== undefined ? `: ${d2Label(tipo)}` : '';
65
+ lines.push(`${ids.get(from)} -> ${ids.get(to)}${etiqueta}`);
66
+ }
67
+ return lines.join('\n');
68
+ }
69
+ /** `state` con D2: nodos y transiciones, con el inicial y los finales marcados. */
70
+ export function d2State(doc) {
71
+ const states = requireArray(doc['states'], 'diagram.states');
72
+ const transitions = requireArray(doc['transitions'], 'diagram.transitions');
73
+ const initial = optionalString(doc, 'initial');
74
+ const finals = optionalArray(doc['finals'], 'diagram.finals').map((f) => String(f));
75
+ const ids = new IdFactory('s');
76
+ const lines = ['direction: right', ''];
77
+ for (const raw of states) {
78
+ const name = nameOf(raw, 'diagram.states');
79
+ const id = ids.id(name);
80
+ const esFinal = finals.includes(name);
81
+ lines.push(`${id}: ${d2Label(name)}${esFinal ? ' {style.double-border: true}' : ''}`);
82
+ }
83
+ if (initial !== undefined) {
84
+ lines.push('inicio: "" {shape: circle; style.fill: "#000"; width: 20; height: 20}');
85
+ if (!ids.has(initial))
86
+ lines.push(`${ids.id(initial)}: ${d2Label(initial)}`);
87
+ lines.push(`inicio -> ${ids.get(initial)}`);
88
+ }
89
+ for (const raw of transitions) {
90
+ const edge = toEdge(raw, 'diagram.transitions');
91
+ for (const endpoint of [edge.from, edge.to]) {
92
+ if (!ids.has(endpoint))
93
+ lines.push(`${ids.id(endpoint)}: ${d2Label(endpoint)}`);
94
+ }
95
+ const label = edge.label !== undefined ? `: ${d2Label(edge.label)}` : '';
96
+ lines.push(`${ids.get(edge.from)} -> ${ids.get(edge.to)}${label}`);
97
+ }
98
+ return lines.join('\n');
99
+ }
100
+ /** `component` con D2: cada grupo es un contenedor. */
101
+ export function d2Component(doc) {
102
+ const groups = optionalArray(doc['groups'], 'diagram.groups');
103
+ const sueltos = optionalArray(doc['components'], 'diagram.components');
104
+ const relations = optionalArray(doc['relations'], 'diagram.relations');
105
+ if (groups.length === 0 && sueltos.length === 0) {
106
+ return d2Sueltos(relations, 'diagram.relations');
107
+ }
108
+ const ids = new IdFactory('k');
109
+ const lines = [];
110
+ for (const raw of groups) {
111
+ const record = asNamedRecord(raw, 'diagram.groups');
112
+ const name = requireString(record, 'name', 'diagram.groups');
113
+ const grupo = ids.id(`grupo:${name}`);
114
+ lines.push(`${grupo}: ${d2Label(name)} {`);
115
+ for (const comp of optionalArray(record['components'], 'diagram.groups.components')) {
116
+ const nombre = nameOf(comp, 'diagram.groups.components');
117
+ lines.push(` ${ids.id(nombre)}: ${d2Label(nombre)}`);
118
+ }
119
+ lines.push('}');
120
+ }
121
+ for (const comp of sueltos) {
122
+ const nombre = nameOf(comp, 'diagram.components');
123
+ lines.push(`${ids.id(nombre)}: ${d2Label(nombre)}`);
124
+ }
125
+ for (const raw of relations) {
126
+ const edge = toEdge(raw, 'diagram.relations');
127
+ const from = rutaDe(ids, edge.from, lines);
128
+ const to = rutaDe(ids, edge.to, lines);
129
+ const label = edge.label !== undefined ? `: ${d2Label(edge.label)}` : '';
130
+ lines.push(`${from} -> ${to}${label}`);
131
+ }
132
+ return lines.join('\n');
133
+ }
134
+ /** `deployment` con D2: los nodos que contienen artefactos son contenedores. */
135
+ export function d2Deployment(doc) {
136
+ const nodes = requireArray(doc['nodes'], 'diagram.nodes');
137
+ const relations = optionalArray(doc['relations'], 'diagram.relations');
138
+ const ids = new IdFactory('d');
139
+ const lines = [];
140
+ for (const raw of nodes) {
141
+ const record = asNamedRecord(raw, 'diagram.nodes');
142
+ const name = requireString(record, 'name', 'diagram.nodes');
143
+ const kind = optionalString(record, 'kind') ?? 'node';
144
+ const contiene = optionalArray(record['contains'], 'diagram.nodes.contains');
145
+ const id = ids.id(name);
146
+ const forma = kind === 'database' ? ' {shape: cylinder}' : '';
147
+ if (contiene.length === 0) {
148
+ lines.push(`${id}: ${d2Label(name)}${forma}`);
149
+ continue;
150
+ }
151
+ lines.push(`${id}: ${d2Label(name)} {`);
152
+ for (const artefacto of contiene) {
153
+ const nombre = nameOf(artefacto, 'diagram.nodes.contains');
154
+ lines.push(` ${ids.id(nombre)}: ${d2Label(nombre)}`);
155
+ }
156
+ lines.push('}');
157
+ }
158
+ for (const raw of relations) {
159
+ const edge = toEdge(raw, 'diagram.relations');
160
+ const from = rutaDe(ids, edge.from, lines);
161
+ const to = rutaDe(ids, edge.to, lines);
162
+ const label = edge.label !== undefined ? `: ${d2Label(edge.label)}` : '';
163
+ lines.push(`${from} -> ${to}${label}`);
164
+ }
165
+ return lines.join('\n');
166
+ }
167
+ /** `use-case` con D2: el sistema es un contenedor y los actores quedan fuera. */
168
+ export function d2UseCase(doc) {
169
+ const actors = requireArray(doc['actors'], 'diagram.actors');
170
+ const casos = requireArray(doc['useCases'] ?? doc['cases'], 'diagram.useCases');
171
+ const system = optionalString(doc, 'system');
172
+ const ids = new IdFactory('u');
173
+ const lines = [];
174
+ for (const raw of actors) {
175
+ const name = nameOf(raw, 'diagram.actors');
176
+ lines.push(`${ids.id(name)}: ${d2Label(name)} {shape: person}`);
177
+ }
178
+ const contenedor = system === undefined ? undefined : ids.id(`sistema:${system}`);
179
+ if (contenedor !== undefined)
180
+ lines.push(`${contenedor}: ${d2Label(system)} {`);
181
+ const sangria = contenedor === undefined ? '' : ' ';
182
+ for (const raw of casos) {
183
+ const record = asNamedRecord(raw, 'diagram.useCases');
184
+ const name = requireString(record, 'name', 'diagram.useCases');
185
+ lines.push(`${sangria}${ids.id(name)}: ${d2Label(name)} {shape: oval}`);
186
+ }
187
+ if (contenedor !== undefined)
188
+ lines.push('}');
189
+ for (const raw of casos) {
190
+ const record = asNamedRecord(raw, 'diagram.useCases');
191
+ const name = requireString(record, 'name', 'diagram.useCases');
192
+ const destino = contenedor === undefined ? ids.get(name) : `${contenedor}.${ids.get(name)}`;
193
+ for (const actor of optionalArray(record['actors'], 'diagram.useCases.actors')) {
194
+ const nombre = nameOf(actor, 'diagram.useCases.actors');
195
+ if (!ids.has(nombre))
196
+ lines.push(`${ids.id(nombre)}: ${d2Label(nombre)} {shape: person}`);
197
+ lines.push(`${ids.get(nombre)} -> ${destino}`);
198
+ }
199
+ }
200
+ return lines.join('\n');
201
+ }
202
+ /** `wbs` con D2: el mismo arbol que dibujan los tipos estrategicos. */
203
+ export function d2Wbs(doc) {
204
+ const root = requireString(doc, 'root', 'diagram');
205
+ const branches = requireArray(doc['branches'], 'diagram.branches');
206
+ const ids = new IdFactory('w');
207
+ const lines = ['direction: down', '', `${ids.id(root)}: ${d2Label(root)}`];
208
+ for (const raw of branches) {
209
+ const record = asNamedRecord(raw, 'diagram.branches');
210
+ const name = requireString(record, 'name', 'diagram.branches');
211
+ lines.push(`${ids.id(name)}: ${d2Label(name)}`, `${ids.get(root)} -> ${ids.get(name)}`);
212
+ for (const hijo of optionalArray(record['children'], 'diagram.branches.children')) {
213
+ const nombre = nameOf(hijo, 'diagram.branches.children');
214
+ lines.push(`${ids.id(nombre)}: ${d2Label(nombre)}`, `${ids.get(name)} -> ${ids.get(nombre)}`);
215
+ }
216
+ }
217
+ return lines.join('\n');
218
+ }
219
+ // --------------------------------------------------------------------------
220
+ /** Identificador valido en D2 a partir de un texto cualquiera. */
221
+ function sanear(texto) {
222
+ const limpio = texto.replace(/[^\w]+/g, '_').replace(/^_+|_+$/g, '');
223
+ return limpio === '' ? 'x' : limpio;
224
+ }
225
+ /**
226
+ * Ruta de un nodo dentro de su contenedor.
227
+ *
228
+ * D2 referencia lo anidado con `contenedor.hijo`. Se busca la linea donde se
229
+ * declaro para saber si estaba sangrado, en lugar de mantener un mapa aparte
230
+ * que habria que sincronizar.
231
+ */
232
+ function rutaDe(ids, nombre, lines) {
233
+ if (!ids.has(nombre)) {
234
+ lines.push(`${ids.id(nombre)}: ${d2Label(nombre)}`);
235
+ return ids.get(nombre);
236
+ }
237
+ const id = ids.get(nombre);
238
+ let contenedor;
239
+ for (const linea of lines) {
240
+ const abre = /^(\w+): .* \{$/.exec(linea);
241
+ if (abre !== null)
242
+ contenedor = abre[1];
243
+ else if (linea === '}')
244
+ contenedor = undefined;
245
+ else if (linea.startsWith(` ${id}:`))
246
+ return contenedor === undefined ? id : `${contenedor}.${id}`;
247
+ }
248
+ return id;
249
+ }
250
+ /** Cuando solo hay relaciones, el diagrama es el grafo que describen. */
251
+ function d2Sueltos(relations, field) {
252
+ const ids = new IdFactory('k');
253
+ const lines = [];
254
+ for (const raw of relations) {
255
+ const edge = toEdge(raw, field);
256
+ for (const endpoint of [edge.from, edge.to]) {
257
+ if (!ids.has(endpoint))
258
+ lines.push(`${ids.id(endpoint)}: ${d2Label(endpoint)}`);
259
+ }
260
+ const label = edge.label !== undefined ? `: ${d2Label(edge.label)}` : '';
261
+ lines.push(`${ids.get(edge.from)} -> ${ids.get(edge.to)}${label}`);
262
+ }
263
+ return lines.join('\n');
264
+ }
265
+ //# sourceMappingURL=fallbacks-d2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fallbacks-d2.js","sourceRoot":"","sources":["../../src/dsl/fallbacks-d2.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Compiladores alternativos.
3
+ *
4
+ * Un tipo declara un motor preferido y, cuando existe, uno de respaldo. El
5
+ * respaldo no es el mismo texto enviado a otro sitio: cada motor tiene su propio
6
+ * lenguaje, asi que hay que compilar de nuevo. Por eso solo se declaran
7
+ * alternativas para las que existe realmente un compilador.
8
+ *
9
+ * Sirve para dos cosas: compilar en una maquina sin navegador o sin Java, y no
10
+ * quedar atado a un motor concreto si alguno deja de convenir.
11
+ */
12
+ /** `erd` con Mermaid, cuando PlantUML no esta disponible. */
13
+ export declare function mermaidErd(doc: Record<string, unknown>): string;
14
+ /** `flow` con D2, cuando no hay navegador para Mermaid. */
15
+ export declare function d2Flow(doc: Record<string, unknown>): string;
16
+ /** `timeline` con Mermaid, cuando se prefiere su cronologia a la rejilla de D2. */
17
+ export declare function mermaidTimeline(doc: Record<string, unknown>): string;
18
+ /**
19
+ * Compila el bloque `architecture` a C4-PlantUML.
20
+ *
21
+ * La biblioteca viaja dentro del jar de PlantUML, asi que este camino no
22
+ * necesita ni LikeC4 ni conexion a la red.
23
+ */
24
+ export declare function architectureC4(doc: Record<string, unknown>): string;
25
+ //# sourceMappingURL=fallbacks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fallbacks.d.ts","sourceRoot":"","sources":["../../src/dsl/fallbacks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAkBH,6DAA6D;AAC7D,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CA2D/D;AAWD,2DAA2D;AAC3D,wBAAgB,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CA6B3D;AAED,mFAAmF;AACnF,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAepE;AAmCD;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CA0GnE"}
@@ -0,0 +1,264 @@
1
+ /**
2
+ * Compiladores alternativos.
3
+ *
4
+ * Un tipo declara un motor preferido y, cuando existe, uno de respaldo. El
5
+ * respaldo no es el mismo texto enviado a otro sitio: cada motor tiene su propio
6
+ * lenguaje, asi que hay que compilar de nuevo. Por eso solo se declaran
7
+ * alternativas para las que existe realmente un compilador.
8
+ *
9
+ * Sirve para dos cosas: compilar en una maquina sin navegador o sin Java, y no
10
+ * quedar atado a un motor concreto si alguno deja de convenir.
11
+ */
12
+ import { fail } from './util.js';
13
+ import { asArrowShorthand, asNamedRecord, asRecord, d2Label, IdFactory, nameOf, oneOf, optionalArray, optionalString, requireArray, requireString, toEdge, } from './util.js';
14
+ /** `erd` con Mermaid, cuando PlantUML no esta disponible. */
15
+ export function mermaidErd(doc) {
16
+ const entities = requireArray(doc['entities'] ?? doc['entidades'], 'diagram.entities');
17
+ const relations = optionalArray(doc['relations'], 'diagram.relations');
18
+ const declared = new Map();
19
+ const lines = ['erDiagram'];
20
+ for (const raw of entities) {
21
+ const record = asNamedRecord(raw, 'diagram.entities', 'name');
22
+ const name = requireString(record, 'name', 'diagram.entities');
23
+ const id = mermaidEntityId(name);
24
+ declared.set(name, id);
25
+ const fields = optionalArray(record['fields'] ?? record['campos'], 'diagram.entities[].fields');
26
+ if (fields.length === 0) {
27
+ lines.push(` ${id}`);
28
+ continue;
29
+ }
30
+ lines.push(` ${id} {`);
31
+ for (const rawField of fields) {
32
+ const field = asNamedRecord(rawField, 'diagram.entities[].fields', 'name');
33
+ const fieldName = requireString(field, 'name', 'diagram.entities[].fields');
34
+ // Mermaid exige `tipo nombre`, en ese orden y sin espacios internos.
35
+ const type = (optionalString(field, 'type') ?? 'string').replace(/\s+/g, '_');
36
+ const key = field['key'] === true || field['pk'] === true ? ' PK' : '';
37
+ lines.push(` ${type} ${fieldName.replace(/\s+/g, '_')}${key}`);
38
+ }
39
+ lines.push(' }');
40
+ }
41
+ const CARDINALITY = {
42
+ 'one-to-one': '||--||',
43
+ 'one-to-many': '||--o{',
44
+ 'many-to-one': '}o--||',
45
+ 'many-to-many': '}o--o{',
46
+ 'uno-a-uno': '||--||',
47
+ 'uno-a-muchos': '||--o{',
48
+ 'muchos-a-uno': '}o--||',
49
+ 'muchos-a-muchos': '}o--o{',
50
+ };
51
+ for (const raw of relations) {
52
+ const record = typeof raw === 'string' ? undefined : asRecord(raw, 'diagram.relations');
53
+ const edge = toEdge(raw, 'diagram.relations');
54
+ const from = declared.get(edge.from);
55
+ const to = declared.get(edge.to);
56
+ if (from === undefined || to === undefined) {
57
+ fail(`"${from === undefined ? edge.from : edge.to}" no esta declarado en entities`, `entidades declaradas: ${[...declared.keys()].join(', ')}`);
58
+ }
59
+ const kind = record !== undefined ? (optionalString(record, 'cardinality') ?? 'one-to-many') : 'one-to-many';
60
+ const arrow = CARDINALITY[kind.toLowerCase()];
61
+ if (arrow === undefined) {
62
+ fail(`la cardinalidad "${kind}" no existe`, `cardinalidades validas: ${Object.keys(CARDINALITY).join(', ')}`);
63
+ }
64
+ lines.push(` ${from} ${arrow} ${to} : "${(edge.label ?? 'relacionado').replace(/"/g, "'")}"`);
65
+ }
66
+ return lines.join('\n');
67
+ }
68
+ function mermaidEntityId(name) {
69
+ return name
70
+ .normalize('NFD')
71
+ .replace(/[̀-ͯ]/g, '')
72
+ .replace(/[^A-Za-z0-9_]+/g, '_')
73
+ .replace(/^_+|_+$/g, '')
74
+ .toUpperCase();
75
+ }
76
+ /** `flow` con D2, cuando no hay navegador para Mermaid. */
77
+ export function d2Flow(doc) {
78
+ const edges = requireArray(doc['flow'] ?? doc['edges'], 'diagram.flow');
79
+ const declared = optionalArray(doc['nodes'], 'diagram.nodes');
80
+ const direction = oneOf(optionalString(doc, 'direction'), ['lr', 'tb', 'rl', 'bt', 'td'], 'diagram.direction', 'lr');
81
+ const d2Direction = { lr: 'right', rl: 'left', tb: 'down', td: 'down', bt: 'up' }[direction];
82
+ const ids = new IdFactory('n');
83
+ const lines = [`direction: ${d2Direction}`, ''];
84
+ for (const raw of declared) {
85
+ const name = nameOf(raw, 'diagram.nodes');
86
+ lines.push(`${ids.id(name)}: ${d2Label(name)}`);
87
+ }
88
+ for (const raw of edges) {
89
+ const edge = toEdge(raw, 'diagram.flow');
90
+ for (const endpoint of [edge.from, edge.to]) {
91
+ if (!ids.has(endpoint))
92
+ lines.push(`${ids.id(endpoint)}: ${d2Label(endpoint)}`);
93
+ }
94
+ const style = edge.dashed ? ' {style.stroke-dash: 4}' : '';
95
+ lines.push(`${ids.get(edge.from)} -> ${ids.get(edge.to)}${edge.label !== undefined ? `: ${d2Label(edge.label)}` : ''}${style}`);
96
+ }
97
+ return lines.join('\n');
98
+ }
99
+ /** `timeline` con Mermaid, cuando se prefiere su cronologia a la rejilla de D2. */
100
+ export function mermaidTimeline(doc) {
101
+ const phases = requireArray(doc['phases'] ?? doc['milestones'], 'diagram.phases');
102
+ const lines = ['timeline'];
103
+ const title = optionalString(doc, 'title');
104
+ if (title !== undefined)
105
+ lines.push(` title ${title.replace(/[:]/g, ' ')}`);
106
+ for (const raw of phases) {
107
+ const phase = asNamedRecord(raw, 'diagram.phases', 'name');
108
+ const name = requireString(phase, 'name', 'diagram.phases').replace(/[:]/g, ' ');
109
+ const items = optionalArray(phase['items'], 'diagram.phases[].items').map((i) => nameOf(i, 'diagram.phases[].items').replace(/[:]/g, ' '));
110
+ lines.push(items.length === 0 ? ` ${name}` : ` ${name} : ${items.join(' : ')}`);
111
+ }
112
+ return lines.join('\n');
113
+ }
114
+ /** `mindmap` con Mermaid es el preferido; este es el de PlantUML, ya en su modulo. */
115
+ // --------------------------------------------------------------------------
116
+ // C4 con PlantUML: respaldo de LikeC4
117
+ // --------------------------------------------------------------------------
118
+ /** Clase de elemento del DSL -> macro de C4-PlantUML. */
119
+ const C4_MACROS = {
120
+ person: 'Person',
121
+ actor: 'Person',
122
+ system: 'System',
123
+ 'external-system': 'System_Ext',
124
+ container: 'Container',
125
+ component: 'Component',
126
+ database: 'ContainerDb',
127
+ queue: 'ContainerQueue',
128
+ storage: 'ContainerDb',
129
+ browser: 'Container',
130
+ mobile: 'Container',
131
+ service: 'Container',
132
+ };
133
+ /** Vista C4 -> archivo de la biblioteca estandar que la define. */
134
+ const C4_LIBRARY = {
135
+ 'c4-context': 'C4_Context',
136
+ context: 'C4_Context',
137
+ 'c4-container': 'C4_Container',
138
+ container: 'C4_Container',
139
+ 'c4-component': 'C4_Component',
140
+ 'component-view': 'C4_Component',
141
+ 'c4-deployment': 'C4_Deployment',
142
+ };
143
+ /**
144
+ * Compila el bloque `architecture` a C4-PlantUML.
145
+ *
146
+ * La biblioteca viaja dentro del jar de PlantUML, asi que este camino no
147
+ * necesita ni LikeC4 ni conexion a la red.
148
+ */
149
+ export function architectureC4(doc) {
150
+ const type = (optionalString(doc, 'type') ?? 'c4-context').toLowerCase();
151
+ const library = C4_LIBRARY[type] ?? 'C4_Container';
152
+ const rawElements = requireArray(doc['elements'] ?? doc['nodes'], 'architecture.elements');
153
+ const rawRelations = optionalArray(doc['relations'] ?? doc['relationships'], 'architecture.relations');
154
+ const title = optionalString(doc, 'title');
155
+ const byId = new Map();
156
+ const byName = new Map();
157
+ const order = [];
158
+ for (const raw of rawElements) {
159
+ const record = asRecord(raw, 'architecture.elements');
160
+ const name = requireString(record, 'name', 'architecture.elements');
161
+ const kind = (optionalString(record, 'kind') ?? 'system').toLowerCase();
162
+ const macro = C4_MACROS[kind];
163
+ if (macro === undefined) {
164
+ fail(`la clase de elemento "${kind}" no existe`, `clases validas: ${Object.keys(C4_MACROS).join(', ')}`);
165
+ }
166
+ const id = c4Id(optionalString(record, 'id') ?? name, byId);
167
+ const element = { id, macro, name, children: [] };
168
+ const description = optionalString(record, 'description');
169
+ if (description !== undefined)
170
+ element.description = description;
171
+ const technology = optionalString(record, 'technology') ?? optionalString(record, 'tech');
172
+ if (technology !== undefined)
173
+ element.technology = technology;
174
+ const parent = optionalString(record, 'parent');
175
+ if (parent !== undefined)
176
+ element.parent = parent;
177
+ byId.set(id, element);
178
+ byName.set(name, element);
179
+ order.push(element);
180
+ }
181
+ const roots = [];
182
+ for (const element of order) {
183
+ if (element.parent === undefined) {
184
+ roots.push(element);
185
+ continue;
186
+ }
187
+ const parent = byId.get(element.parent) ?? byName.get(element.parent);
188
+ if (parent === undefined) {
189
+ fail(`el elemento padre "${element.parent}" de "${element.name}" no existe`, `elementos declarados: ${order.map((e) => e.name).join(', ')}`);
190
+ }
191
+ parent.children.push(element);
192
+ }
193
+ const lines = ['@startuml', `!include <C4/${library}>`];
194
+ if (title !== undefined)
195
+ lines.push(`title ${title}`);
196
+ const emit = (element, indent) => {
197
+ const args = [element.id, quote(element.name)];
198
+ // Las macros de contenedor llevan la tecnologia antes de la descripcion.
199
+ if (element.macro.startsWith('Container') || element.macro === 'Component') {
200
+ args.push(quote(element.technology ?? ''));
201
+ }
202
+ if (element.description !== undefined)
203
+ args.push(quote(element.description));
204
+ if (element.children.length === 0) {
205
+ lines.push(`${indent}${element.macro}(${args.join(', ')})`);
206
+ return;
207
+ }
208
+ // Un elemento con hijos se dibuja como frontera del sistema.
209
+ lines.push(`${indent}System_Boundary(${element.id}, ${quote(element.name)}) {`);
210
+ for (const child of element.children)
211
+ emit(child, `${indent} `);
212
+ lines.push(`${indent}}`);
213
+ };
214
+ for (const root of roots)
215
+ emit(root, '');
216
+ for (const raw of rawRelations) {
217
+ // `- A -> B: usa` llega como cadena o, si YAML vio los dos puntos, como
218
+ // mapa de una entrada; ambas equivalen a la forma explicita.
219
+ const relation = typeof raw === 'string' || asArrowShorthand(raw) !== undefined
220
+ ? relationFromEdge(raw)
221
+ : asRecord(raw, 'architecture.relations');
222
+ const fromName = requireString(relation, 'from', 'architecture.relations');
223
+ const toName = requireString(relation, 'to', 'architecture.relations');
224
+ const from = byId.get(fromName) ?? byName.get(fromName);
225
+ const to = byId.get(toName) ?? byName.get(toName);
226
+ if (from === undefined || to === undefined) {
227
+ fail(`"${from === undefined ? fromName : toName}" no corresponde a ningun elemento declarado`, `elementos declarados: ${order.map((e) => e.name).join(', ')}`);
228
+ }
229
+ const label = optionalString(relation, 'label') ?? optionalString(relation, 'text') ?? '';
230
+ const technology = optionalString(relation, 'technology') ?? optionalString(relation, 'tech');
231
+ const args = [from.id, to.id, quote(label)];
232
+ if (technology !== undefined)
233
+ args.push(quote(technology));
234
+ lines.push(`Rel(${args.join(', ')})`);
235
+ }
236
+ lines.push('@enduml');
237
+ return lines.join('\n');
238
+ }
239
+ function relationFromEdge(raw) {
240
+ const edge = toEdge(raw, 'architecture.relations');
241
+ const record = { from: edge.from, to: edge.to };
242
+ if (edge.label !== undefined)
243
+ record['label'] = edge.label;
244
+ return record;
245
+ }
246
+ function quote(text) {
247
+ return `"${text.replace(/"/g, "'").replace(/\n/g, ' ')}"`;
248
+ }
249
+ function c4Id(raw, existing) {
250
+ let id = raw
251
+ .normalize('NFD')
252
+ .replace(/[̀-ͯ]/g, '')
253
+ .replace(/[^A-Za-z0-9_]+/g, '_')
254
+ .replace(/^_+|_+$/g, '');
255
+ if (id === '' || /^[0-9]/.test(id))
256
+ id = `e_${id}`;
257
+ if (!existing.has(id))
258
+ return id;
259
+ let n = 2;
260
+ while (existing.has(`${id}_${n}`))
261
+ n += 1;
262
+ return `${id}_${n}`;
263
+ }
264
+ //# sourceMappingURL=fallbacks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fallbacks.js","sourceRoot":"","sources":["../../src/dsl/fallbacks.ts"],"names":[],"mappings":"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"}