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,439 @@
1
+ /**
2
+ * Utilidades comunes de post-proceso de SVG.
3
+ *
4
+ * Todo SVG que sale de DocViz pasa por aqui para garantizar tres cosas:
5
+ * 1. dimensiones explicitas (si no, `<img src="...svg">` se rompe o se recorta);
6
+ * 2. un `<title>` accesible;
7
+ * 3. sanitizacion: sin scripts ni manejadores de eventos (seccion 12.7).
8
+ */
9
+ /**
10
+ * Elementos que pueden aparecer en un SVG de DocViz.
11
+ *
12
+ * Es una lista de permitidos, no de prohibidos. La version anterior enumeraba
13
+ * los manejadores de eventos conocidos y dejaba pasar todo lo demas: `onwheel`,
14
+ * `ontoggle`, `<animate attributeName="href" to="javascript:...">` y media
15
+ * docena mas de vectores sobrevivian. Con una lista de permitidos, lo que no
16
+ * se ha pensado se cae por defecto en lugar de colarse.
17
+ *
18
+ * El contenido de la lista sale de medir que emiten de verdad los seis motores
19
+ * sobre los 57 tipos del catalogo, mas el vocabulario SVG estandar que un
20
+ * bloque nativo puede usar legitimamente. Una prueba comprueba que sanear los
21
+ * 69 diagramas del catalogo no cambia ni un byte.
22
+ */
23
+ const ALLOWED_ELEMENTS = new Set([
24
+ // Estructura
25
+ 'svg', 'g', 'defs', 'symbol', 'use', 'switch', 'title', 'desc', 'style', 'a',
26
+ // Formas
27
+ 'path', 'rect', 'circle', 'ellipse', 'line', 'polyline', 'polygon',
28
+ // Texto
29
+ 'text', 'tspan', 'textpath',
30
+ // Pintura
31
+ 'marker', 'mask', 'clippath', 'pattern', 'lineargradient', 'radialgradient', 'stop',
32
+ // Filtros (los que emiten los motores)
33
+ 'filter', 'fedropshadow', 'fegaussianblur', 'feoffset', 'feblend', 'feflood',
34
+ 'fecomposite', 'femerge', 'femergenode', 'fecolormatrix',
35
+ // Etiquetas HTML dentro de foreignObject (Mermaid las usa)
36
+ 'foreignobject', 'div', 'span', 'p', 'br', 'b', 'i', 'em', 'strong', 'ul', 'ol', 'li',
37
+ ]);
38
+ /**
39
+ * Elementos que se eliminan con todo su contenido.
40
+ *
41
+ * Para el resto de elementos no permitidos se descarta solo la etiqueta y se
42
+ * conservan los hijos: un elemento desconocido suele ser un envoltorio, y
43
+ * tirarlo entero desfiguraria el dibujo. Estos no: su contenido *es* el peligro.
44
+ */
45
+ const DROP_WITH_CONTENT = new Set([
46
+ 'script', 'iframe', 'object', 'embed', 'applet', 'handler', 'audio', 'video',
47
+ 'base', 'meta', 'link', 'noscript',
48
+ ]);
49
+ /** Atributos admitidos por nombre exacto. */
50
+ const ALLOWED_ATTRS = new Set([
51
+ // Identidad y estructura
52
+ 'id', 'class', 'xmlns', 'xmlns:xlink', 'version', 'viewbox', 'preserveaspectratio',
53
+ 'width', 'height', 'x', 'y', 'x1', 'y1', 'x2', 'y2', 'cx', 'cy', 'r', 'rx', 'ry',
54
+ 'd', 'points', 'transform', 'transform-origin', 'overflow', 'display', 'visibility',
55
+ // Pintura
56
+ 'fill', 'fill-opacity', 'fill-rule', 'stroke', 'stroke-width', 'stroke-opacity',
57
+ 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin',
58
+ 'stroke-miterlimit', 'opacity', 'color', 'style',
59
+ // Texto
60
+ 'font-family', 'font-size', 'font-weight', 'font-style', 'text-anchor', 'dominant-baseline',
61
+ 'alignment-baseline', 'baseline-shift', 'letter-spacing', 'word-spacing', 'dx', 'dy',
62
+ 'textlength', 'lengthadjust', 'xml:space', 'lineheight', 'white-space',
63
+ // Marcadores, mascaras, gradientes y filtros
64
+ 'marker-start', 'marker-mid', 'marker-end', 'markerwidth', 'markerheight', 'markerunits',
65
+ 'refx', 'refy', 'orient', 'offset', 'stop-color', 'stop-opacity', 'gradientunits',
66
+ 'gradienttransform', 'spreadmethod', 'maskunits', 'clippathunits', 'clip-path', 'clip-rule',
67
+ 'mask', 'filter', 'filterunits', 'stddeviation', 'flood-color', 'flood-opacity', 'result', 'in',
68
+ 'patternunits', 'pointer-events', 'shape-rendering', 'text-rendering', 'vector-effect',
69
+ // Accesibilidad y trazabilidad
70
+ 'role', 'lang', 'xml:lang', 'requiredfeatures', 'requiredextensions', 'systemlanguage',
71
+ // Enlaces (el valor se valida aparte)
72
+ 'href', 'xlink:href', 'target', 'xlink:title',
73
+ // Metadatos que emiten los motores: `type` en `<style>`, el resto de PlantUML
74
+ // y del SVG estandar. Sin ellos el dibujo cambia, asi que estan medidos, no
75
+ // supuestos: salen de sanear los 69 diagramas del catalogo y ver que faltaba.
76
+ 'type', 'contentstyletype', 'zoomandpan', 'codeline',
77
+ ]);
78
+ /** Prefijos de atributo admitidos en bloque. */
79
+ const ALLOWED_ATTR_PREFIXES = ['data-', 'aria-'];
80
+ /** Esquemas de URL que no pueden aparecer en ningun atributo de enlace. */
81
+ const PELIGROSO_EN_URL = /^(?:javascript|vbscript|data|file|blob):/i;
82
+ /**
83
+ * Busca el fin de una etiqueta respetando las comillas.
84
+ *
85
+ * Un `>` dentro del valor de un atributo no cierra nada; cortar ahi es como se
86
+ * cuela la mitad de los saneadores basados en expresiones regulares.
87
+ */
88
+ function findTagEnd(svg, start) {
89
+ let quote;
90
+ for (let i = start + 1; i < svg.length; i += 1) {
91
+ const c = svg[i];
92
+ if (quote !== undefined) {
93
+ if (c === quote)
94
+ quote = undefined;
95
+ continue;
96
+ }
97
+ if (c === '"' || c === "'")
98
+ quote = c;
99
+ else if (c === '>')
100
+ return i;
101
+ }
102
+ return svg.length - 1;
103
+ }
104
+ /** Analiza una etiqueta ya delimitada, respetando comillas. */
105
+ function parseTag(raw) {
106
+ const m = /^<\s*(\/?)\s*([a-zA-Z][\w:.-]*)/.exec(raw);
107
+ if (m === null)
108
+ return undefined;
109
+ const closing = m[1] === '/';
110
+ const nombreBruto = m[2];
111
+ const selfClosing = /\/\s*>$/.test(raw);
112
+ const attrs = [];
113
+ const attrRe = /([:\w.-]+)(?:\s*=\s*(?:"([^"]*)"|'([^']*)'|([^\s"'>]+)))?/g;
114
+ attrRe.lastIndex = m[0].length;
115
+ let a;
116
+ while ((a = attrRe.exec(raw)) !== null) {
117
+ const bruto = a[1];
118
+ if (bruto === '/' || bruto === '')
119
+ continue;
120
+ const valor = a[2] ?? a[3] ?? a[4];
121
+ const quote = a[3] !== undefined ? "'" : '"';
122
+ attrs.push({ name: bruto.toLowerCase(), raw: bruto, ...(valor !== undefined ? { value: valor } : {}), quote });
123
+ }
124
+ return { name: nombreBruto.toLowerCase(), raw: nombreBruto, closing, selfClosing, attrs };
125
+ }
126
+ /** Resuelve entidades numericas y con nombre para poder ver el esquema real. */
127
+ function decodeEntities(value) {
128
+ return value
129
+ .replace(/&#x([0-9a-f]+);?/gi, (_m, hex) => String.fromCodePoint(Number.parseInt(hex, 16)))
130
+ .replace(/&#(\d+);?/g, (_m, dec) => String.fromCodePoint(Number.parseInt(dec, 10)))
131
+ .replace(/&(?:amp|colon|tab|newline|NewLine);?/gi, (m2) => (/amp/i.test(m2) ? '&' : /colon/i.test(m2) ? ':' : ''));
132
+ }
133
+ /** Un enlace solo puede apuntar a un fragmento, a una ruta relativa o a http(s). */
134
+ function urlSegura(valor) {
135
+ const limpio = decodeEntities(valor).replace(/[\s\u0000-\u001f]/g, '');
136
+ if (limpio === '')
137
+ return true;
138
+ if (PELIGROSO_EN_URL.test(limpio))
139
+ return false;
140
+ // Cualquier otro esquema explicito tampoco: no hay motivo para que un
141
+ // diagrama abra `tel:`, `ms-msdt:` ni nada por el estilo.
142
+ if (/^[a-z][a-z0-9+.-]*:/i.test(limpio))
143
+ return /^https?:/i.test(limpio);
144
+ return true;
145
+ }
146
+ /**
147
+ * CSS sin importaciones remotas ni URLs ejecutables.
148
+ *
149
+ * Vale tanto para el atributo `style` como para el contenido de un elemento
150
+ * `<style>`, que es CSS de verdad y por tanto puede traerse una hoja entera de
151
+ * otro sitio con `@import`.
152
+ */
153
+ function estiloSeguro(valor) {
154
+ return decodeEntities(valor)
155
+ .replace(/@import[^;]*;?/gi, '')
156
+ .replace(/expression\s*\(/gi, 'void(')
157
+ .replace(/behavior\s*:[^;]*;?/gi, '')
158
+ .replace(/url\(\s*['"]?\s*(?:javascript|vbscript|data|file|blob):[^)]*\)/gi, 'none');
159
+ }
160
+ /** Escapa `<` y `>` dentro del valor de un atributo. */
161
+ function valorSeguro(valor) {
162
+ return valor.includes('<') || valor.includes('>')
163
+ ? valor.replace(/</g, '&lt;').replace(/>/g, '&gt;')
164
+ : valor;
165
+ }
166
+ function attrPermitido(nombre) {
167
+ if (nombre.startsWith('on'))
168
+ return false;
169
+ if (ALLOWED_ATTRS.has(nombre))
170
+ return true;
171
+ return ALLOWED_ATTR_PREFIXES.some((p) => nombre.startsWith(p));
172
+ }
173
+ const URL_ATTRS = new Set(['href', 'xlink:href', 'src', 'xlink:href']);
174
+ /** Reconstruye una etiqueta permitida quedandose solo con lo que puede llevar. */
175
+ /**
176
+ * Reconstruye una etiqueta permitida quedandose solo con lo que puede llevar.
177
+ *
178
+ * Si no hubo nada que quitar devuelve la etiqueta **tal cual venia**. Reescribir
179
+ * cada etiqueta cambiaria los bytes de todos los diagramas —espacios, comillas,
180
+ * orden— e invalidaria el cache entero sin que el dibujo cambie en nada.
181
+ */
182
+ function rebuildTag(tag, bruto) {
183
+ if (tag.closing)
184
+ return bruto;
185
+ const partes = [tag.raw];
186
+ let intacta = true;
187
+ for (const attr of tag.attrs) {
188
+ if (!attrPermitido(attr.name)) {
189
+ intacta = false;
190
+ continue;
191
+ }
192
+ if (attr.value === undefined) {
193
+ partes.push(attr.raw);
194
+ continue;
195
+ }
196
+ if (URL_ATTRS.has(attr.name) && !urlSegura(attr.value)) {
197
+ intacta = false;
198
+ continue;
199
+ }
200
+ // Un `<` literal dentro de un atributo no es XML valido, y es lo que
201
+ // permite que un procesador posterior menos cuidadoso lo lea como etiqueta.
202
+ const limpio = valorSeguro(attr.name === 'style' ? estiloSeguro(attr.value) : attr.value);
203
+ if (limpio !== attr.value)
204
+ intacta = false;
205
+ partes.push(`${attr.raw}=${attr.quote}${limpio}${attr.quote}`);
206
+ }
207
+ if (intacta)
208
+ return bruto;
209
+ return `<${partes.join(' ')}${tag.selfClosing ? '/' : ''}>`;
210
+ }
211
+ /**
212
+ * Deja el SVG con solo los elementos y atributos permitidos.
213
+ *
214
+ * No intenta reparar un SVG mal formado: recorre las etiquetas respetando las
215
+ * comillas, y lo que no reconoce lo descarta.
216
+ */
217
+ export function sanitizeSvg(svg) {
218
+ const out = [];
219
+ let i = 0;
220
+ let saltandoHasta;
221
+ let dentroDeStyle = false;
222
+ while (i < svg.length) {
223
+ const abre = svg.indexOf('<', i);
224
+ if (abre === -1) {
225
+ if (saltandoHasta === undefined)
226
+ out.push(dentroDeStyle ? estiloSeguro(svg.slice(i)) : svg.slice(i));
227
+ break;
228
+ }
229
+ if (saltandoHasta === undefined) {
230
+ const texto = svg.slice(i, abre);
231
+ out.push(dentroDeStyle ? estiloSeguro(texto) : texto);
232
+ }
233
+ // Los comentarios se eliminan. No ejecutan nada por si mismos, pero un
234
+ // comentario mal cerrado es la via clasica de mXSS cuando el SVG se
235
+ // incrusta dentro de un HTML, y no aportan nada al dibujo.
236
+ if (svg.startsWith('<!--', abre)) {
237
+ const fin = svg.indexOf('-->', abre);
238
+ i = fin === -1 ? svg.length : fin + 3;
239
+ continue;
240
+ }
241
+ if (svg.startsWith('<?', abre) || svg.startsWith('<!', abre)) {
242
+ const fin = svg.indexOf('>', abre);
243
+ const bruto = svg.slice(abre, fin === -1 ? svg.length : fin + 1);
244
+ if (saltandoHasta === undefined)
245
+ out.push(bruto);
246
+ i = fin === -1 ? svg.length : fin + 1;
247
+ continue;
248
+ }
249
+ const cierre = findTagEnd(svg, abre);
250
+ const bruto = svg.slice(abre, cierre + 1);
251
+ const tag = parseTag(bruto);
252
+ i = cierre + 1;
253
+ if (tag === undefined)
254
+ continue;
255
+ if (saltandoHasta !== undefined) {
256
+ if (tag.closing && tag.name === saltandoHasta)
257
+ saltandoHasta = undefined;
258
+ continue;
259
+ }
260
+ if (DROP_WITH_CONTENT.has(tag.name)) {
261
+ if (!tag.closing && !tag.selfClosing)
262
+ saltandoHasta = tag.name;
263
+ continue;
264
+ }
265
+ if (!ALLOWED_ELEMENTS.has(tag.name))
266
+ continue;
267
+ if (tag.name === 'style' && !tag.selfClosing)
268
+ dentroDeStyle = !tag.closing;
269
+ out.push(rebuildTag(tag, bruto));
270
+ }
271
+ return out.join('');
272
+ }
273
+ function parseOpenSvgTag(svg) {
274
+ const match = /<svg\b[^>]*>/i.exec(svg);
275
+ if (match === null)
276
+ return undefined;
277
+ const raw = match[0];
278
+ const attrs = {};
279
+ const attrRe = /([:\w-]+)\s*=\s*(?:"([^"]*)"|'([^']*)')/g;
280
+ let m;
281
+ while ((m = attrRe.exec(raw)) !== null) {
282
+ attrs[m[1].toLowerCase()] = m[2] ?? m[3] ?? '';
283
+ }
284
+ return { raw, index: match.index, attrs };
285
+ }
286
+ function setAttr(tag, name, value) {
287
+ const re = new RegExp(`(\\s${name}\\s*=\\s*)(?:"[^"]*"|'[^']*')`, 'i');
288
+ if (re.test(tag))
289
+ return tag.replace(re, `$1"${value}"`);
290
+ return tag.replace(/^<svg\b/i, `<svg ${name}="${value}"`);
291
+ }
292
+ /**
293
+ * Longitud absoluta en pixeles, o `undefined` si no lo es.
294
+ *
295
+ * Es deliberadamente estricto: `parseFloat("100%")` devuelve 100, y aceptarlo
296
+ * dejaria los diagramas de Mermaid (que emite `width="100%"`) a 100 px de ancho.
297
+ */
298
+ function toPx(value) {
299
+ if (value === undefined)
300
+ return undefined;
301
+ const match = /^\s*(\d+(?:\.\d+)?)(px)?\s*$/i.exec(value);
302
+ if (match === null)
303
+ return undefined;
304
+ const n = Number.parseFloat(match[1]);
305
+ return Number.isFinite(n) && n > 0 ? n : undefined;
306
+ }
307
+ /**
308
+ * Garantiza `width`, `height` y `viewBox` numericos en el elemento raiz.
309
+ *
310
+ * Mermaid emite `width="100%"` sin `height`, lo que en un visor Markdown
311
+ * produce una imagen de altura cero. Aqui se deriva el tamano real del
312
+ * `viewBox` y se fija en pixeles.
313
+ */
314
+ export function normalizeSvgDimensions(svg) {
315
+ const tag = parseOpenSvgTag(svg);
316
+ if (tag === undefined)
317
+ return svg;
318
+ const viewBox = tag.attrs['viewbox'];
319
+ let width = toPx(tag.attrs['width']);
320
+ let height = toPx(tag.attrs['height']);
321
+ let vb;
322
+ if (viewBox !== undefined) {
323
+ const parts = viewBox.trim().split(/[\s,]+/).map(Number);
324
+ if (parts.length === 4 && parts.every((n) => Number.isFinite(n)))
325
+ vb = parts;
326
+ }
327
+ if (vb !== undefined) {
328
+ if (width === undefined)
329
+ width = vb[2];
330
+ if (height === undefined)
331
+ height = vb[3];
332
+ const ratio = vb[3] / vb[2];
333
+ // Si solo una dimension era porcentual, se recalcula la otra por proporcion.
334
+ if (toPx(tag.attrs['width']) === undefined && height !== undefined && ratio > 0) {
335
+ width = Math.round(height / ratio);
336
+ }
337
+ if (toPx(tag.attrs['height']) === undefined && width !== undefined) {
338
+ height = Math.round(width * ratio);
339
+ }
340
+ }
341
+ if (width === undefined || height === undefined)
342
+ return svg;
343
+ let newTag = setAttr(tag.raw, 'width', String(Math.round(width)));
344
+ newTag = setAttr(newTag, 'height', String(Math.round(height)));
345
+ if (vb === undefined) {
346
+ newTag = setAttr(newTag, 'viewBox', `0 0 ${Math.round(width)} ${Math.round(height)}`);
347
+ }
348
+ // `preserveAspectRatio="none"` (PlantUML) deforma el diagrama al escalarlo.
349
+ newTag = newTag.replace(/\spreserveAspectRatio\s*=\s*(["'])none\1/i, '');
350
+ return svg.slice(0, tag.index) + newTag + svg.slice(tag.index + tag.raw.length);
351
+ }
352
+ /**
353
+ * Renumera los identificadores internos del SVG en orden de aparicion.
354
+ *
355
+ * Vega mantiene un contador global de `clipPath` por proceso: el mismo grafico
356
+ * renderizado dos veces produce `clip1` y luego `clip2`, es decir bytes
357
+ * distintos para la misma entrada. Eso rompe el determinismo que exige el
358
+ * modelo de cache, asi que los ids se normalizan aqui para todos los motores.
359
+ *
360
+ * Se reescribe tanto el atributo `id` como toda referencia `#id`: Mermaid
361
+ * incrusta una hoja de estilos cuyos selectores estan acotados por el id del
362
+ * elemento raiz (`#mi-id .task { ... }`). Renombrar solo el atributo dejaria
363
+ * esos selectores sin destino y el diagrama saldria sin estilos, con los
364
+ * rectangulos en negro.
365
+ */
366
+ export function stabilizeSvgIds(svg, prefix = 'dv') {
367
+ const ids = [];
368
+ const seen = new Set();
369
+ for (const match of svg.matchAll(/\bid="([^"]+)"/g)) {
370
+ const id = match[1];
371
+ if (!seen.has(id)) {
372
+ seen.add(id);
373
+ ids.push(id);
374
+ }
375
+ }
376
+ if (ids.length === 0)
377
+ return svg;
378
+ const mapping = new Map();
379
+ ids.forEach((id, index) => mapping.set(id, `${prefix}${index + 1}`));
380
+ // Se reemplaza de los ids mas largos a los mas cortos para que un id que sea
381
+ // prefijo de otro no corrompa el reemplazo.
382
+ const ordered = [...mapping.entries()].sort((a, b) => b[0].length - a[0].length);
383
+ let out = svg;
384
+ for (const [from, to] of ordered) {
385
+ const escaped = from.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
386
+ out = out.replace(new RegExp(`\\bid="${escaped}"`, 'g'), `id="${to}"`);
387
+ // `#id` como token completo: cubre selectores CSS, `url(#id)` y `href="#id"`.
388
+ // El limite posterior evita que un id que sea prefijo de otro se corrompa.
389
+ out = out.replace(new RegExp(`#${escaped}(?![\\w-])`, 'g'), `#${to}`);
390
+ }
391
+ return out;
392
+ }
393
+ export function escapeXml(text) {
394
+ return text
395
+ .replace(/&/g, '&amp;')
396
+ .replace(/</g, '&lt;')
397
+ .replace(/>/g, '&gt;')
398
+ .replace(/"/g, '&quot;')
399
+ .replace(/'/g, '&apos;');
400
+ }
401
+ /** Inserta `<title>` como primer hijo del `<svg>` si aun no existe uno. */
402
+ export function injectTitle(svg, title) {
403
+ if (title === undefined || title.trim() === '')
404
+ return svg;
405
+ const tag = parseOpenSvgTag(svg);
406
+ if (tag === undefined)
407
+ return svg;
408
+ const after = tag.index + tag.raw.length;
409
+ const rest = svg.slice(after);
410
+ if (/^\s*<title\b/i.test(rest))
411
+ return svg;
412
+ return `${svg.slice(0, after)}<title>${escapeXml(title)}</title>${rest}`;
413
+ }
414
+ /** Asegura que exista la declaracion de namespace SVG. */
415
+ export function ensureNamespace(svg) {
416
+ const tag = parseOpenSvgTag(svg);
417
+ if (tag === undefined)
418
+ return svg;
419
+ if (tag.attrs['xmlns'] !== undefined)
420
+ return svg;
421
+ const newTag = tag.raw.replace(/^<svg\b/i, '<svg xmlns="http://www.w3.org/2000/svg"');
422
+ return svg.slice(0, tag.index) + newTag + svg.slice(tag.index + tag.raw.length);
423
+ }
424
+ /** Pipeline completo aplicado a todo SVG antes de escribirlo a disco. */
425
+ export function finalizeSvg(svg, title) {
426
+ let out = svg.replace(/^/, '').trim();
427
+ // PlantUML antepone un PI propio (`<?plantuml ...?>`) que confunde a algunos visores.
428
+ out = out.replace(/^<\?plantuml[^>]*\?>/i, '');
429
+ out = sanitizeSvg(out);
430
+ out = stabilizeSvgIds(out);
431
+ out = ensureNamespace(out);
432
+ out = normalizeSvgDimensions(out);
433
+ out = injectTitle(out, title);
434
+ if (!/^<\?xml/i.test(out)) {
435
+ out = `<?xml version="1.0" encoding="UTF-8" standalone="no"?>\n${out}`;
436
+ }
437
+ return `${out}\n`;
438
+ }
439
+ //# sourceMappingURL=svg-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"svg-utils.js","sourceRoot":"","sources":["../../src/renderers/svg-utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Renderer de arte ASCII (svgbob, WebAssembly local).
3
+ *
4
+ * Convierte un dibujo hecho con caracteres en un SVG limpio. Cubre el mismo
5
+ * terreno que GoAT o ditaa: esquemas que ya existen en un RFC, un README o un
6
+ * comentario de codigo y que conviene publicar legibles sin volver a dibujarlos.
7
+ */
8
+ import type { DiagramRenderer, OutputFormat, RenderOptions, RenderResult } from '../core/types.js';
9
+ import type { Theme } from '../themes/types.js';
10
+ export declare class SvgbobRenderer implements DiagramRenderer {
11
+ readonly type = "svgbob";
12
+ readonly defaultFormat: OutputFormat;
13
+ readonly supportedFormats: readonly OutputFormat[];
14
+ private modulePromise?;
15
+ private cachedVersion?;
16
+ private load;
17
+ version(): Promise<string>;
18
+ render(source: string, options: RenderOptions): Promise<RenderResult>;
19
+ }
20
+ /**
21
+ * svgbob incrusta su propia hoja de estilos en blanco y negro. Se sustituye por
22
+ * la del tema para que el dibujo no desentone con el resto de diagramas.
23
+ */
24
+ export declare function applyTheme(svg: string, theme: Theme): string;
25
+ export declare function createSvgbobRenderer(): DiagramRenderer;
26
+ //# sourceMappingURL=svgbob.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"svgbob.d.ts","sourceRoot":"","sources":["../../src/renderers/svgbob.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAGnG,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAOhD,qBAAa,cAAe,YAAW,eAAe;IACpD,QAAQ,CAAC,IAAI,YAAQ;IACrB,QAAQ,CAAC,aAAa,EAAE,YAAY,CAAS;IAC7C,QAAQ,CAAC,gBAAgB,0BAAa;IAEtC,OAAO,CAAC,aAAa,CAAC,CAAwB;IAC9C,OAAO,CAAC,aAAa,CAAC,CAAS;YAEjB,IAAI;IAOZ,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;IAM1B,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;CAgB5E;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,MAAM,CAe5D;AAED,wBAAgB,oBAAoB,IAAI,eAAe,CAEtD"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Renderer de arte ASCII (svgbob, WebAssembly local).
3
+ *
4
+ * Convierte un dibujo hecho con caracteres en un SVG limpio. Cubre el mismo
5
+ * terreno que GoAT o ditaa: esquemas que ya existen en un RFC, un README o un
6
+ * comentario de codigo y que conviene publicar legibles sin volver a dibujarlos.
7
+ */
8
+ import { RenderError } from '../core/errors.js';
9
+ import { packageVersion } from '../core/package-version.js';
10
+ import { assertFormat, asRenderError, svgResult } from './base.js';
11
+ const TYPE = 'svgbob';
12
+ const SUPPORTED = ['svg'];
13
+ export class SvgbobRenderer {
14
+ type = TYPE;
15
+ defaultFormat = 'svg';
16
+ supportedFormats = SUPPORTED;
17
+ modulePromise;
18
+ cachedVersion;
19
+ async load() {
20
+ // El paquete solo declara `module`, sin `main` ni `exports`: hay que
21
+ // apuntar al archivo, o Node busca un `index.js` que no existe.
22
+ this.modulePromise ??= import('svgbob-wasm/svgbob_wasm.js').then((m) => m);
23
+ return this.modulePromise;
24
+ }
25
+ async version() {
26
+ // El estilo lo aplica DocViz sobre la salida, asi que forma parte del hash.
27
+ this.cachedVersion ??= `svgbob-${packageVersion('svgbob-wasm')}+docviz-style-1`;
28
+ return this.cachedVersion;
29
+ }
30
+ async render(source, options) {
31
+ assertFormat(TYPE, options.format, SUPPORTED);
32
+ if (source.trim() === '')
33
+ throw new RenderError(TYPE, 'el dibujo esta vacio');
34
+ const svgbob = await this.load();
35
+ let svg;
36
+ try {
37
+ svg = svgbob.render(source);
38
+ }
39
+ catch (err) {
40
+ throw asRenderError(TYPE, err, 'svgbob no pudo interpretar el dibujo');
41
+ }
42
+ if (typeof svg !== 'string' || !svg.includes('<svg')) {
43
+ throw new RenderError(TYPE, 'svgbob no produjo un SVG valido');
44
+ }
45
+ return svgResult(TYPE, applyTheme(svg, options.theme), options);
46
+ }
47
+ }
48
+ /**
49
+ * svgbob incrusta su propia hoja de estilos en blanco y negro. Se sustituye por
50
+ * la del tema para que el dibujo no desentone con el resto de diagramas.
51
+ */
52
+ export function applyTheme(svg, theme) {
53
+ const style = [
54
+ `line, path, circle, rect, polygon { stroke: ${theme.palette.text}; stroke-width: 2; ` +
55
+ 'stroke-opacity: 1; fill-opacity: 1; stroke-linecap: round; stroke-linejoin: miter; }',
56
+ `text { fill: ${theme.palette.text}; font-family: ${theme.fontFamily}; font-size: 14px; }`,
57
+ `rect.backdrop { fill: ${theme.palette.background}; }`,
58
+ '.broken { stroke-dasharray: 8; }',
59
+ `.filled { fill: ${theme.palette.text}; }`,
60
+ '.bg_filled { fill: ' + theme.palette.surface + '; stroke-width: 1; }',
61
+ '.nofill { fill: ' + theme.palette.background + '; }',
62
+ '.end_marked_arrow { marker-end: url(#arrow); }',
63
+ '.start_marked_arrow { marker-start: url(#arrow); }',
64
+ ].join('\n');
65
+ return svg.replace(/<style[^>]*>[\s\S]*?<\/style>/i, `<style>\n${style}\n</style>`);
66
+ }
67
+ export function createSvgbobRenderer() {
68
+ return new SvgbobRenderer();
69
+ }
70
+ //# sourceMappingURL=svgbob.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"svgbob.js","sourceRoot":"","sources":["../../src/renderers/svgbob.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAGnE,MAAM,IAAI,GAAG,QAAQ,CAAC;AACtB,MAAM,SAAS,GAA4B,CAAC,KAAK,CAAC,CAAC;AAInD,MAAM,OAAO,cAAc;IAChB,IAAI,GAAG,IAAI,CAAC;IACZ,aAAa,GAAiB,KAAK,CAAC;IACpC,gBAAgB,GAAG,SAAS,CAAC;IAE9B,aAAa,CAAyB;IACtC,aAAa,CAAU;IAEvB,KAAK,CAAC,IAAI;QAChB,qEAAqE;QACrE,gEAAgE;QAChE,IAAI,CAAC,aAAa,KAAK,MAAM,CAAC,4BAA4B,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAA4B,CAAC,CAAC;QACtG,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,OAAO;QACX,4EAA4E;QAC5E,IAAI,CAAC,aAAa,KAAK,UAAU,cAAc,CAAC,aAAa,CAAC,iBAAiB,CAAC;QAChF,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,MAAc,EAAE,OAAsB;QACjD,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAC9C,IAAI,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE;YAAE,MAAM,IAAI,WAAW,CAAC,IAAI,EAAE,sBAAsB,CAAC,CAAC;QAE9E,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QACjC,IAAI,GAAW,CAAC;QAChB,IAAI,CAAC;YACH,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC9B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,aAAa,CAAC,IAAI,EAAE,GAAG,EAAE,sCAAsC,CAAC,CAAC;QACzE,CAAC;QACD,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YACrD,MAAM,IAAI,WAAW,CAAC,IAAI,EAAE,iCAAiC,CAAC,CAAC;QACjE,CAAC;QACD,OAAO,SAAS,CAAC,IAAI,EAAE,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;IAClE,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,GAAW,EAAE,KAAY;IAClD,MAAM,KAAK,GAAG;QACZ,+CAA+C,KAAK,CAAC,OAAO,CAAC,IAAI,qBAAqB;YACpF,sFAAsF;QACxF,gBAAgB,KAAK,CAAC,OAAO,CAAC,IAAI,kBAAkB,KAAK,CAAC,UAAU,sBAAsB;QAC1F,yBAAyB,KAAK,CAAC,OAAO,CAAC,UAAU,KAAK;QACtD,kCAAkC;QAClC,mBAAmB,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK;QAC1C,qBAAqB,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,GAAG,sBAAsB;QACtE,kBAAkB,GAAG,KAAK,CAAC,OAAO,CAAC,UAAU,GAAG,KAAK;QACrD,gDAAgD;QAChD,oDAAoD;KACrD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEb,OAAO,GAAG,CAAC,OAAO,CAAC,gCAAgC,EAAE,YAAY,KAAK,YAAY,CAAC,CAAC;AACtF,CAAC;AAED,MAAM,UAAU,oBAAoB;IAClC,OAAO,IAAI,cAAc,EAAE,CAAC;AAC9B,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Renderer Vega-Lite — compilacion y dibujo en proceso, sin navegador.
3
+ *
4
+ * `vega-lite` compila la especificacion a Vega y `vega` la dibuja a SVG con el
5
+ * renderer `none` (headless). El resultado es un SVG estatico: el Markdown
6
+ * final no depende de JavaScript (criterio de aceptacion de la seccion 26).
7
+ */
8
+ import type { DiagramRenderer, OutputFormat, RenderOptions, RenderResult } from '../core/types.js';
9
+ export declare class VegaLiteRenderer implements DiagramRenderer {
10
+ readonly type = "vega-lite";
11
+ readonly defaultFormat: OutputFormat;
12
+ readonly supportedFormats: readonly OutputFormat[];
13
+ private cachedVersion?;
14
+ version(): Promise<string>;
15
+ render(source: string, options: RenderOptions): Promise<RenderResult>;
16
+ }
17
+ export declare function createVegaLiteRenderer(): DiagramRenderer;
18
+ //# sourceMappingURL=vega-lite.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vega-lite.d.ts","sourceRoot":"","sources":["../../src/renderers/vega-lite.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAcnG,qBAAa,gBAAiB,YAAW,eAAe;IACtD,QAAQ,CAAC,IAAI,eAAQ;IACrB,QAAQ,CAAC,aAAa,EAAE,YAAY,CAAS;IAC7C,QAAQ,CAAC,gBAAgB,0BAAa;IAEtC,OAAO,CAAC,aAAa,CAAC,CAAS;IAEzB,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;IAM1B,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;CA8C5E;AA0BD,wBAAgB,sBAAsB,IAAI,eAAe,CAExD"}