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,261 @@
1
+ /**
2
+ * Utilidades de validacion del DSL declarativo.
3
+ *
4
+ * Los mensajes son la interfaz real del DSL para un agente: deben decir que
5
+ * campo falla, que se esperaba y como se escribe bien.
6
+ */
7
+ import { DslValidationError, ERROR_CODES } from '../core/errors.js';
8
+ import { observarAnidado } from './fields.js';
9
+ /**
10
+ * Aborta la compilacion del bloque.
11
+ *
12
+ * El codigo es tan importante como el texto: un agente que reintenta necesita
13
+ * distinguir "falta un campo" de "el valor no vale" sin leer castellano.
14
+ */
15
+ export function fail(message, detail, code = ERROR_CODES.DSL) {
16
+ throw new DslValidationError(message, detail, code);
17
+ }
18
+ export function asRecord(value, field) {
19
+ if (value === null || typeof value !== 'object' || Array.isArray(value)) {
20
+ fail(`${field} debe ser un mapa`, `valor recibido: ${preview(value)}`, ERROR_CODES.DSL_FIELD_TYPE);
21
+ }
22
+ // Todo mapa anidado se entrega observado: es la unica forma de saber si el
23
+ // compilador llego a leer sus claves o si el autor escribio en el vacio.
24
+ return observarAnidado(value, field);
25
+ }
26
+ /**
27
+ * Texto obligatorio.
28
+ *
29
+ * Acepta numeros y booleanos porque YAML los convierte sin avisar: en
30
+ * `- name: 2025` el valor llega como numero, y rechazarlo obligaria al autor a
31
+ * entrecomillar cualquier etiqueta que parezca un dato.
32
+ */
33
+ export function requireString(record, key, field) {
34
+ const value = record[key];
35
+ if (typeof value === 'number' || typeof value === 'boolean')
36
+ return String(value);
37
+ if (typeof value !== 'string' || value.trim() === '') {
38
+ fail(`falta el campo obligatorio "${key}" en ${field}`, `valor recibido: ${preview(value)}`, ERROR_CODES.DSL_FIELD_MISSING);
39
+ }
40
+ return value.trim();
41
+ }
42
+ export function optionalString(record, key) {
43
+ const value = record[key];
44
+ if (value === undefined || value === null)
45
+ return undefined;
46
+ if (typeof value === 'number' || typeof value === 'boolean')
47
+ return String(value);
48
+ if (typeof value !== 'string')
49
+ return undefined;
50
+ const trimmed = value.trim();
51
+ return trimmed === '' ? undefined : trimmed;
52
+ }
53
+ export function optionalNumber(record, key, field) {
54
+ const value = record[key];
55
+ if (value === undefined || value === null)
56
+ return undefined;
57
+ const n = typeof value === 'number' ? value : Number(value);
58
+ if (!Number.isFinite(n)) {
59
+ fail(`${field}.${key} debe ser numerico`, `valor recibido: ${preview(value)}`, ERROR_CODES.DSL_FIELD_TYPE);
60
+ }
61
+ return n;
62
+ }
63
+ export function requireNumber(record, key, field) {
64
+ const n = optionalNumber(record, key, field);
65
+ if (n === undefined) {
66
+ fail(`falta el campo numerico obligatorio "${key}" en ${field}`, undefined, ERROR_CODES.DSL_FIELD_MISSING);
67
+ }
68
+ return n;
69
+ }
70
+ export function requireArray(value, field) {
71
+ if (!Array.isArray(value) || value.length === 0) {
72
+ fail(`${field} debe ser una lista con al menos un elemento`, `valor recibido: ${preview(value)}`, ERROR_CODES.DSL_FIELD_MISSING);
73
+ }
74
+ return value;
75
+ }
76
+ export function optionalArray(value, field) {
77
+ if (value === undefined || value === null)
78
+ return [];
79
+ if (!Array.isArray(value)) {
80
+ fail(`${field} debe ser una lista`, `valor recibido: ${preview(value)}`, ERROR_CODES.DSL_FIELD_TYPE);
81
+ }
82
+ return value;
83
+ }
84
+ /**
85
+ * Acepta `- Texto` o `- name: Texto` de forma indistinta.
86
+ *
87
+ * Los numeros se admiten porque YAML los convierte solo: en `quadrants: [1, 2]`
88
+ * el autor esta escribiendo etiquetas, no cantidades.
89
+ */
90
+ export function nameOf(item, field, key = 'name') {
91
+ if (typeof item === 'number' || typeof item === 'boolean')
92
+ return String(item);
93
+ if (typeof item === 'string') {
94
+ const t = item.trim();
95
+ if (t === '')
96
+ fail(`${field} contiene un elemento vacio`, undefined, ERROR_CODES.DSL_FIELD_MISSING);
97
+ return t;
98
+ }
99
+ const record = asRecord(item, field);
100
+ return requireString(record, key, field);
101
+ }
102
+ /**
103
+ * Normaliza `- Texto` y `- {name: Texto, ...}` a un mapa.
104
+ *
105
+ * Es el patron mas repetido del DSL: casi todas las listas admiten la forma
106
+ * corta. Centralizarlo evita que cada compilador olvide que YAML convierte
107
+ * `- 2025` en numero y rompa con una etiqueta perfectamente valida.
108
+ */
109
+ export function asNamedRecord(raw, field, key = 'name') {
110
+ if (typeof raw === 'string' || typeof raw === 'number' || typeof raw === 'boolean') {
111
+ return { [key]: String(raw) };
112
+ }
113
+ return asRecord(raw, field);
114
+ }
115
+ export function oneOf(value, allowed, field, fallback) {
116
+ if (value === undefined)
117
+ return fallback;
118
+ const normalized = value.trim().toLowerCase();
119
+ if (!allowed.includes(normalized)) {
120
+ fail(`${field} no admite el valor "${value}"`, `valores validos: ${allowed.join(', ')}`, ERROR_CODES.DSL_VALUE_NOT_ALLOWED);
121
+ }
122
+ return normalized;
123
+ }
124
+ function preview(value) {
125
+ const text = typeof value === 'string' ? value : JSON.stringify(value);
126
+ if (text === undefined)
127
+ return 'undefined';
128
+ return text.length > 120 ? `${text.slice(0, 117)}...` : text;
129
+ }
130
+ // --------------------------------------------------------------------------
131
+ // Generacion de identificadores y escapado por motor
132
+ // --------------------------------------------------------------------------
133
+ /**
134
+ * Generador de ids estables y seguros.
135
+ *
136
+ * Los motores destino se alimentan siempre de ids sinteticos (`n1`, `n2`, ...)
137
+ * y del texto original solo como etiqueta entrecomillada. Asi ningun caracter
138
+ * del documento puede alterar la sintaxis generada.
139
+ */
140
+ export class IdFactory {
141
+ prefix;
142
+ byKey = new Map();
143
+ counter = 0;
144
+ constructor(prefix = 'n') {
145
+ this.prefix = prefix;
146
+ }
147
+ id(key) {
148
+ const existing = this.byKey.get(key);
149
+ if (existing !== undefined)
150
+ return existing;
151
+ this.counter += 1;
152
+ const id = `${this.prefix}${this.counter}`;
153
+ this.byKey.set(key, id);
154
+ return id;
155
+ }
156
+ has(key) {
157
+ return this.byKey.has(key);
158
+ }
159
+ get(key) {
160
+ return this.byKey.get(key);
161
+ }
162
+ keys() {
163
+ return [...this.byKey.keys()];
164
+ }
165
+ }
166
+ /** Cadena entre comillas dobles para D2. */
167
+ export function d2Label(text) {
168
+ return JSON.stringify(text);
169
+ }
170
+ /** Cadena entre comillas simples para LikeC4. */
171
+ export function likec4Label(text) {
172
+ return `'${text.replace(/\\/g, '\\\\').replace(/'/g, "\\'").replace(/\n/g, ' ')}'`;
173
+ }
174
+ /** Etiqueta segura para Mermaid: entre comillas y sin comillas internas. */
175
+ export function mermaidLabel(text) {
176
+ return `"${text.replace(/"/g, "'").replace(/\n/g, ' ')}"`;
177
+ }
178
+ /** Texto seguro dentro de una etiqueta PlantUML de una sola linea. */
179
+ export function plantUmlText(text) {
180
+ return text.replace(/\n/g, '\\n');
181
+ }
182
+ /** Cadena entrecomillada para Graphviz DOT. */
183
+ export function dotLabel(text) {
184
+ return `"${text.replace(/\\/g, '\\\\').replace(/"/g, '\\"').replace(/\n/g, '\\n')}"`;
185
+ }
186
+ const EDGE_RE = /^\s*(.+?)\s*(<--|<-|-->|->|\.\.>|=>)\s*(.+?)\s*(?::\s*(.*))?$/;
187
+ const ARROW_IN_KEY = /(<--|<-|-->|->|\.\.>|=>)/;
188
+ /**
189
+ * Detecta el mapa de una sola entrada que YAML produce a partir de
190
+ * `- Origen -> Destino: etiqueta`.
191
+ */
192
+ export function asArrowShorthand(item) {
193
+ if (item === null || typeof item !== 'object' || Array.isArray(item))
194
+ return undefined;
195
+ const entries = Object.entries(item);
196
+ if (entries.length !== 1)
197
+ return undefined;
198
+ const [key, value] = entries[0];
199
+ if (!ARROW_IN_KEY.test(key))
200
+ return undefined;
201
+ // `from`/`to` explicitos nunca llevan flecha en la clave: no hay ambiguedad.
202
+ if (value !== null && typeof value === 'object')
203
+ return undefined;
204
+ const label = value === null || value === undefined ? undefined : String(value).trim();
205
+ return label === undefined || label === '' ? { expression: key } : { expression: key, label };
206
+ }
207
+ export function parseEdgeExpression(expression, field) {
208
+ const match = EDGE_RE.exec(expression);
209
+ if (match === null) {
210
+ fail(`no se entiende la relacion "${expression}" en ${field}`, 'formato esperado: "Origen -> Destino: etiqueta"');
211
+ }
212
+ const left = match[1].trim();
213
+ const arrow = match[2];
214
+ const right = match[3].trim();
215
+ const label = match[4]?.trim();
216
+ const reversed = arrow === '<-' || arrow === '<--';
217
+ const dashed = arrow === '-->' || arrow === '<--' || arrow === '..>';
218
+ const edge = {
219
+ from: reversed ? right : left,
220
+ to: reversed ? left : right,
221
+ dashed,
222
+ };
223
+ if (label !== undefined && label !== '')
224
+ edge.label = label;
225
+ return edge;
226
+ }
227
+ /**
228
+ * Normaliza un item de relacion.
229
+ *
230
+ * Admite tres formas:
231
+ *
232
+ * - Usuario -> API: Login (YAML lo entrega como mapa de una entrada)
233
+ * - "Usuario -> API" (cadena)
234
+ * - {from: Usuario, to: API} (mapa explicito)
235
+ *
236
+ * La primera es la que escribe cualquiera de forma natural, pero YAML la
237
+ * interpreta como `{ "Usuario -> API": "Login" }` por culpa de los dos puntos.
238
+ * Se reconoce ese caso en lugar de exigir comillas.
239
+ */
240
+ export function toEdge(item, field) {
241
+ if (typeof item === 'string')
242
+ return parseEdgeExpression(item, field);
243
+ const shorthand = asArrowShorthand(item);
244
+ if (shorthand !== undefined) {
245
+ const edge = parseEdgeExpression(shorthand.expression, field);
246
+ if (shorthand.label !== undefined)
247
+ edge.label = shorthand.label;
248
+ return edge;
249
+ }
250
+ const record = asRecord(item, field);
251
+ const edge = {
252
+ from: requireString(record, 'from', field),
253
+ to: requireString(record, 'to', field),
254
+ dashed: record['style'] === 'dashed' || record['dashed'] === true,
255
+ };
256
+ const label = optionalString(record, 'label') ?? optionalString(record, 'text');
257
+ if (label !== undefined)
258
+ edge.label = label;
259
+ return edge;
260
+ }
261
+ //# sourceMappingURL=util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.js","sourceRoot":"","sources":["../../src/dsl/util.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * API publica de DocViz Builder.
3
+ */
4
+ export type { DiagramRenderer, RenderOptions, RenderResult, DiagramBlock, RenderedAsset, BuildStats, OutputFormat, } from './core/types.js';
5
+ export { MIME_TYPES } from './core/types.js';
6
+ export { DocVizError, BuildFailedError, ConfigError, DslValidationError, PathSecurityError, RenderError, UnknownRendererError, } from './core/errors.js';
7
+ export { RendererRegistry } from './core/registry.js';
8
+ export { AssetCache, DEFAULT_CACHE_DIR } from './core/cache.js';
9
+ export { fullHash, shortHash, fingerprint, stableStringify, HashRegistry, DEFAULT_HASH_LENGTH, MIN_HASH_LENGTH, MAX_HASH_LENGTH, } from './core/hash.js';
10
+ export { slugify, assetFileName, assertInside, assertRelativeDir, relativeAssetPath, ensureAssetsDir, toPosix, } from './core/paths.js';
11
+ export { scanDocument, parseMarkdown, parseMeta } from './markdown/scan.js';
12
+ export { applyReplacements, imageMarkdown, escapeAltText } from './markdown/transform.js';
13
+ export { THEMES, getTheme, themeNames, themeFingerprint } from './themes/index.js';
14
+ export type { Theme, ThemePalette } from './themes/types.js';
15
+ export { buildRegistry } from './renderers/index.js';
16
+ export { finalizeSvg, sanitizeSvg, normalizeSvgDimensions } from './renderers/svg-utils.js';
17
+ export { renderLikeC4View } from './renderers/likec4-svg.js';
18
+ export { compileDsl, compileArchitecture, dslCatalog, dslCatalogDetailed, diagramTypeNames, chartTypeNames, findType, typeNames, TYPE_CATALOG, isDslLanguage, DSL_LANGUAGES, } from './dsl/index.js';
19
+ export type { TypeSpec, DslLang } from './dsl/index.js';
20
+ export { build, check, collectMarkdown } from './build/builder.js';
21
+ export type { BuildOptions, BuildResult, CheckResult } from './build/builder.js';
22
+ export { verify } from './build/verify.js';
23
+ export type { VerifyResult, VerifyIssue } from './build/verify.js';
24
+ export { startPreview } from './build/preview.js';
25
+ export { loadConfig, defaultConfig, mergeConfig, findConfigFile, resolveFromRoot } from './config/load.js';
26
+ export type { DocVizConfig, RenderersConfig, RendererBackend } from './config/types.js';
27
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,YAAY,EACV,eAAe,EACf,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,UAAU,EACV,YAAY,GACb,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,WAAW,EACX,kBAAkB,EAClB,iBAAiB,EACjB,WAAW,EACX,oBAAoB,GACrB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAChE,OAAO,EACL,QAAQ,EACR,SAAS,EACT,WAAW,EACX,eAAe,EACf,YAAY,EACZ,mBAAmB,EACnB,eAAe,EACf,eAAe,GAChB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,OAAO,EACP,aAAa,EACb,YAAY,EACZ,iBAAiB,EACjB,iBAAiB,EACjB,eAAe,EACf,OAAO,GACR,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC5E,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAE1F,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACnF,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAE7D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAC5F,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAE7D,OAAO,EACL,UAAU,EACV,mBAAmB,EACnB,UAAU,EACV,kBAAkB,EAClB,gBAAgB,EAChB,cAAc,EACd,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,aAAa,EACb,aAAa,GACd,MAAM,gBAAgB,CAAC;AACxB,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAExD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACnE,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjF,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,WAAW,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAC3G,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,21 @@
1
+ /**
2
+ * API publica de DocViz Builder.
3
+ */
4
+ export { MIME_TYPES } from './core/types.js';
5
+ export { DocVizError, BuildFailedError, ConfigError, DslValidationError, PathSecurityError, RenderError, UnknownRendererError, } from './core/errors.js';
6
+ export { RendererRegistry } from './core/registry.js';
7
+ export { AssetCache, DEFAULT_CACHE_DIR } from './core/cache.js';
8
+ export { fullHash, shortHash, fingerprint, stableStringify, HashRegistry, DEFAULT_HASH_LENGTH, MIN_HASH_LENGTH, MAX_HASH_LENGTH, } from './core/hash.js';
9
+ export { slugify, assetFileName, assertInside, assertRelativeDir, relativeAssetPath, ensureAssetsDir, toPosix, } from './core/paths.js';
10
+ export { scanDocument, parseMarkdown, parseMeta } from './markdown/scan.js';
11
+ export { applyReplacements, imageMarkdown, escapeAltText } from './markdown/transform.js';
12
+ export { THEMES, getTheme, themeNames, themeFingerprint } from './themes/index.js';
13
+ export { buildRegistry } from './renderers/index.js';
14
+ export { finalizeSvg, sanitizeSvg, normalizeSvgDimensions } from './renderers/svg-utils.js';
15
+ export { renderLikeC4View } from './renderers/likec4-svg.js';
16
+ export { compileDsl, compileArchitecture, dslCatalog, dslCatalogDetailed, diagramTypeNames, chartTypeNames, findType, typeNames, TYPE_CATALOG, isDslLanguage, DSL_LANGUAGES, } from './dsl/index.js';
17
+ export { build, check, collectMarkdown } from './build/builder.js';
18
+ export { verify } from './build/verify.js';
19
+ export { startPreview } from './build/preview.js';
20
+ export { loadConfig, defaultConfig, mergeConfig, findConfigFile, resolveFromRoot } from './config/load.js';
21
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAWH,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,WAAW,EACX,kBAAkB,EAClB,iBAAiB,EACjB,WAAW,EACX,oBAAoB,GACrB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAChE,OAAO,EACL,QAAQ,EACR,SAAS,EACT,WAAW,EACX,eAAe,EACf,YAAY,EACZ,mBAAmB,EACnB,eAAe,EACf,eAAe,GAChB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,OAAO,EACP,aAAa,EACb,YAAY,EACZ,iBAAiB,EACjB,iBAAiB,EACjB,eAAe,EACf,OAAO,GACR,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC5E,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAE1F,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAGnF,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAC5F,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAE7D,OAAO,EACL,UAAU,EACV,mBAAmB,EACnB,UAAU,EACV,kBAAkB,EAClB,gBAAgB,EAChB,cAAc,EACd,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,aAAa,EACb,aAAa,GACd,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAEnE,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAE3C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,WAAW,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * Deteccion de bloques declarativos dentro de un documento Markdown.
3
+ *
4
+ * El analisis se hace con `unified` + `remark` sobre el AST (mdast), no con
5
+ * expresiones regulares (seccion 13). Las regex que aparecen aqui operan sobre
6
+ * el `meta` de una valla ya identificada por el parser, no sobre el documento.
7
+ */
8
+ import type { Root } from 'mdast';
9
+ import type { DiagramBlock, OutputFormat } from '../core/types.js';
10
+ export interface CompiledBlock {
11
+ rendererType: string;
12
+ source: string;
13
+ title?: string;
14
+ /** Campos declarados que el compilador no uso. */
15
+ warnings?: ReadonlyArray<{
16
+ code: string;
17
+ field: string;
18
+ message: string;
19
+ }>;
20
+ }
21
+ export interface ScanContext {
22
+ /** Devuelve el tipo canonico de renderer para un lenguaje, o `undefined`. */
23
+ resolveLanguage(lang: string): string | undefined;
24
+ /** Compila el DSL de alto nivel. Solo se invoca para lenguajes de DSL. */
25
+ compileDsl?(lang: string, source: string): CompiledBlock;
26
+ /** Lenguajes de DSL de alto nivel (`diagram`, `chart`, `architecture`). */
27
+ dslLanguages: readonly string[];
28
+ }
29
+ /** Bloque que no se pudo compilar, con la linea en la que empieza su valla. */
30
+ export interface ScanIssue {
31
+ line: number;
32
+ lang: string;
33
+ error: unknown;
34
+ }
35
+ /** Aviso localizado: el bloque compila, pero parte de lo escrito no se dibuja. */
36
+ export interface ScanWarning {
37
+ line: number;
38
+ lang: string;
39
+ code: string;
40
+ field: string;
41
+ message: string;
42
+ }
43
+ export interface ScanResult {
44
+ tree: Root;
45
+ blocks: DiagramBlock[];
46
+ /**
47
+ * Errores de compilacion del DSL, uno por bloque.
48
+ *
49
+ * El escaneo no aborta al primero: un documento con tres bloques rotos debe
50
+ * reportar los tres, o corregirlos cuesta tres builds completos.
51
+ */
52
+ errors: ScanIssue[];
53
+ warnings: ScanWarning[];
54
+ }
55
+ export declare function parseMarkdown(text: string): Root;
56
+ /**
57
+ * Recorre el documento y devuelve los bloques compilables en orden de aparicion.
58
+ *
59
+ * Los bloques cuyo lenguaje no esta registrado (`typescript`, `bash`, `json`,
60
+ * vallas sin lenguaje) se dejan intactos: no aparecen en el resultado.
61
+ */
62
+ export declare function scanDocument(text: string, context: ScanContext): ScanResult;
63
+ export interface FenceMeta {
64
+ title?: string;
65
+ format?: OutputFormat;
66
+ }
67
+ /**
68
+ * Opciones escritas junto al lenguaje de la valla:
69
+ *
70
+ * ```plantuml title="Flujo de autenticacion" format=svg
71
+ */
72
+ export declare function parseMeta(meta: string | undefined): FenceMeta;
73
+ //# sourceMappingURL=scan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../src/markdown/scan.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAQH,OAAO,KAAK,EAAiB,IAAI,EAAE,MAAM,OAAO,CAAC;AACjD,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEnE,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kDAAkD;IAClD,QAAQ,CAAC,EAAE,aAAa,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC5E;AAED,MAAM,WAAW,WAAW;IAC1B,6EAA6E;IAC7E,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IAClD,0EAA0E;IAC1E,UAAU,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,aAAa,CAAC;IACzD,2EAA2E;IAC3E,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;CACjC;AAED,+EAA+E;AAC/E,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,kFAAkF;AAClF,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,IAAI,CAAC;IACX,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB;;;;;OAKG;IACH,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,QAAQ,EAAE,WAAW,EAAE,CAAC;CACzB;AAOD,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAEhD;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,UAAU,CA+E3E;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAa7D"}
@@ -0,0 +1,150 @@
1
+ /**
2
+ * Deteccion de bloques declarativos dentro de un documento Markdown.
3
+ *
4
+ * El analisis se hace con `unified` + `remark` sobre el AST (mdast), no con
5
+ * expresiones regulares (seccion 13). Las regex que aparecen aqui operan sobre
6
+ * el `meta` de una valla ya identificada por el parser, no sobre el documento.
7
+ */
8
+ import remarkFrontmatter from 'remark-frontmatter';
9
+ import remarkGfm from 'remark-gfm';
10
+ import remarkParse from 'remark-parse';
11
+ import { unified } from 'unified';
12
+ import { visit } from 'unist-util-visit';
13
+ import { toString as mdastToString } from 'mdast-util-to-string';
14
+ const processor = unified()
15
+ .use(remarkParse)
16
+ .use(remarkFrontmatter, ['yaml', 'toml'])
17
+ .use(remarkGfm);
18
+ export function parseMarkdown(text) {
19
+ return processor.parse(text);
20
+ }
21
+ /**
22
+ * Recorre el documento y devuelve los bloques compilables en orden de aparicion.
23
+ *
24
+ * Los bloques cuyo lenguaje no esta registrado (`typescript`, `bash`, `json`,
25
+ * vallas sin lenguaje) se dejan intactos: no aparecen en el resultado.
26
+ */
27
+ export function scanDocument(text, context) {
28
+ const tree = parseMarkdown(text);
29
+ const blocks = [];
30
+ const errors = [];
31
+ const warnings = [];
32
+ // Encabezados con su offset, para deducir el titulo del diagrama siguiente.
33
+ const headings = [];
34
+ visit(tree, 'heading', (node) => {
35
+ const offset = node.position?.start.offset;
36
+ if (offset === undefined)
37
+ return;
38
+ const value = mdastToString(node).trim();
39
+ if (value !== '')
40
+ headings.push({ offset, text: value });
41
+ });
42
+ visit(tree, 'code', (node) => {
43
+ const lang = (node.lang ?? '').trim().toLowerCase();
44
+ if (lang === '')
45
+ return;
46
+ const start = node.position?.start.offset;
47
+ const end = node.position?.end.offset;
48
+ const line = node.position?.start.line;
49
+ if (start === undefined || end === undefined || line === undefined)
50
+ return;
51
+ const isDsl = context.dslLanguages.includes(lang);
52
+ const rendererFromLang = context.resolveLanguage(lang);
53
+ if (!isDsl && rendererFromLang === undefined)
54
+ return;
55
+ const meta = parseMeta(node.meta ?? undefined);
56
+ const rawSource = node.value;
57
+ let rendererType;
58
+ let source;
59
+ let dslTitle;
60
+ if (isDsl) {
61
+ if (context.compileDsl === undefined)
62
+ return;
63
+ let compiled;
64
+ try {
65
+ compiled = context.compileDsl(lang, rawSource);
66
+ }
67
+ catch (err) {
68
+ errors.push({ line, lang, error: err });
69
+ return;
70
+ }
71
+ rendererType = compiled.rendererType;
72
+ source = compiled.source;
73
+ dslTitle = compiled.title;
74
+ for (const w of compiled.warnings ?? []) {
75
+ warnings.push({ line, lang, code: w.code, field: w.field, message: w.message });
76
+ }
77
+ }
78
+ else {
79
+ rendererType = rendererFromLang;
80
+ source = rawSource;
81
+ }
82
+ const title = meta.title ??
83
+ dslTitle ??
84
+ nearestHeading(headings, start) ??
85
+ defaultTitle(lang);
86
+ const block = {
87
+ lang,
88
+ rendererType,
89
+ source,
90
+ rawSource,
91
+ title,
92
+ start,
93
+ end,
94
+ line,
95
+ };
96
+ if (meta.format !== undefined)
97
+ block.requestedFormat = meta.format;
98
+ blocks.push(block);
99
+ });
100
+ blocks.sort((a, b) => a.start - b.start);
101
+ errors.sort((a, b) => a.line - b.line);
102
+ warnings.sort((a, b) => a.line - b.line);
103
+ return { tree, blocks, errors, warnings };
104
+ }
105
+ /**
106
+ * Opciones escritas junto al lenguaje de la valla:
107
+ *
108
+ * ```plantuml title="Flujo de autenticacion" format=svg
109
+ */
110
+ export function parseMeta(meta) {
111
+ const out = {};
112
+ if (meta === undefined || meta.trim() === '')
113
+ return out;
114
+ const attrRe = /(\w[\w-]*)\s*=\s*(?:"([^"]*)"|'([^']*)'|([^\s]+))/g;
115
+ let m;
116
+ while ((m = attrRe.exec(meta)) !== null) {
117
+ const key = m[1].toLowerCase();
118
+ const value = m[2] ?? m[3] ?? m[4] ?? '';
119
+ if (key === 'title' || key === 'alt')
120
+ out.title = value;
121
+ else if (key === 'format' && (value === 'svg' || value === 'png'))
122
+ out.format = value;
123
+ }
124
+ return out;
125
+ }
126
+ function nearestHeading(headings, offset) {
127
+ let best;
128
+ for (const h of headings) {
129
+ if (h.offset < offset)
130
+ best = h.text;
131
+ else
132
+ break;
133
+ }
134
+ return best;
135
+ }
136
+ function defaultTitle(lang) {
137
+ const names = {
138
+ plantuml: 'Diagrama UML',
139
+ mermaid: 'Diagrama de flujo',
140
+ d2: 'Diagrama',
141
+ graphviz: 'Grafo de dependencias',
142
+ 'vega-lite': 'Grafico',
143
+ likec4: 'Arquitectura',
144
+ diagram: 'Diagrama',
145
+ chart: 'Grafico',
146
+ architecture: 'Arquitectura',
147
+ };
148
+ return names[lang] ?? 'Diagrama';
149
+ }
150
+ //# sourceMappingURL=scan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan.js","sourceRoot":"","sources":["../../src/markdown/scan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Sustitucion de bloques por imagenes Markdown.
3
+ *
4
+ * El reemplazo es quirurgico: se usan los desplazamientos que da el AST para
5
+ * cortar exactamente la valla de codigo y nada mas. Volver a serializar todo el
6
+ * documento con `remark-stringify` normalizaria comillas, vinetas y saltos, y
7
+ * el criterio de aceptacion exige mantener intacto el resto del Markdown.
8
+ */
9
+ import type { DiagramBlock } from '../core/types.js';
10
+ export interface Replacement {
11
+ block: DiagramBlock;
12
+ /** Ruta relativa del recurso, ya calculada respecto al documento. */
13
+ assetPath: string;
14
+ }
15
+ /** Escapa el texto alternativo para que no rompa la sintaxis de imagen. */
16
+ export declare function escapeAltText(text: string): string;
17
+ /**
18
+ * Escapa la ruta. Las rutas generadas son slugs ASCII, pero un espacio o un
19
+ * parentesis en un `assetsDir` configurado a mano romperia el enlace.
20
+ */
21
+ export declare function encodeAssetPath(assetPath: string): string;
22
+ export declare function imageMarkdown(alt: string, assetPath: string): string;
23
+ /**
24
+ * Aplica los reemplazos de atras hacia adelante para que los desplazamientos
25
+ * de los bloques anteriores sigan siendo validos.
26
+ */
27
+ export declare function applyReplacements(source: string, replacements: readonly Replacement[]): string;
28
+ //# sourceMappingURL=transform.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transform.d.ts","sourceRoot":"","sources":["../../src/markdown/transform.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAErD,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,YAAY,CAAC;IACpB,qEAAqE;IACrE,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,2EAA2E;AAC3E,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAElD;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAGzD;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAEpE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,SAAS,WAAW,EAAE,GAAG,MAAM,CAQ9F"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Sustitucion de bloques por imagenes Markdown.
3
+ *
4
+ * El reemplazo es quirurgico: se usan los desplazamientos que da el AST para
5
+ * cortar exactamente la valla de codigo y nada mas. Volver a serializar todo el
6
+ * documento con `remark-stringify` normalizaria comillas, vinetas y saltos, y
7
+ * el criterio de aceptacion exige mantener intacto el resto del Markdown.
8
+ */
9
+ /** Escapa el texto alternativo para que no rompa la sintaxis de imagen. */
10
+ export function escapeAltText(text) {
11
+ return text.replace(/\\/g, '\\\\').replace(/\[/g, '\\[').replace(/\]/g, '\\]');
12
+ }
13
+ /**
14
+ * Escapa la ruta. Las rutas generadas son slugs ASCII, pero un espacio o un
15
+ * parentesis en un `assetsDir` configurado a mano romperia el enlace.
16
+ */
17
+ export function encodeAssetPath(assetPath) {
18
+ if (/[\s()<>]/.test(assetPath))
19
+ return `<${assetPath.replace(/[<>]/g, '')}>`;
20
+ return assetPath;
21
+ }
22
+ export function imageMarkdown(alt, assetPath) {
23
+ return `![${escapeAltText(alt)}](${encodeAssetPath(assetPath)})`;
24
+ }
25
+ /**
26
+ * Aplica los reemplazos de atras hacia adelante para que los desplazamientos
27
+ * de los bloques anteriores sigan siendo validos.
28
+ */
29
+ export function applyReplacements(source, replacements) {
30
+ const ordered = [...replacements].sort((a, b) => b.block.start - a.block.start);
31
+ let out = source;
32
+ for (const { block, assetPath } of ordered) {
33
+ const image = imageMarkdown(block.title, assetPath);
34
+ out = out.slice(0, block.start) + image + out.slice(block.end);
35
+ }
36
+ return out;
37
+ }
38
+ //# sourceMappingURL=transform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transform.js","sourceRoot":"","sources":["../../src/markdown/transform.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAUH,2EAA2E;AAC3E,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AACjF,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,SAAiB;IAC/C,IAAI,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC;QAAE,OAAO,IAAI,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,CAAC;IAC7E,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,GAAW,EAAE,SAAiB;IAC1D,OAAO,KAAK,aAAa,CAAC,GAAG,CAAC,KAAK,eAAe,CAAC,SAAS,CAAC,GAAG,CAAC;AACnE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAc,EAAE,YAAoC;IACpF,MAAM,OAAO,GAAG,CAAC,GAAG,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAChF,IAAI,GAAG,GAAG,MAAM,CAAC;IACjB,KAAK,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,OAAO,EAAE,CAAC;QAC3C,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QACpD,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACjE,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}