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,94 @@
1
+ /**
2
+ * Construccion del registro de renderers a partir de la configuracion.
3
+ *
4
+ * Es el unico lugar del proyecto donde se decide que motor atiende cada
5
+ * lenguaje. Anadir un renderer nuevo se reduce a registrar una entrada mas.
6
+ */
7
+ import path from 'node:path';
8
+ import { RendererRegistry } from '../core/registry.js';
9
+ import { createD2Renderer } from './d2.js';
10
+ import { createGraphvizRenderer } from './graphviz.js';
11
+ import { createKrokiRenderer, krokiSupports } from './kroki.js';
12
+ import { createLikeC4Renderer } from './likec4.js';
13
+ import { createMermaidRenderer } from './mermaid.js';
14
+ import { createPlantUmlRenderer } from './plantuml.js';
15
+ import { createVegaLiteRenderer } from './vega-lite.js';
16
+ import { createSvgbobRenderer } from './svgbob.js';
17
+ import { createBpmnRenderer } from './bpmn.js';
18
+ export { RendererRegistry } from '../core/registry.js';
19
+ /** Alias de lenguaje aceptados en la valla de codigo Markdown. */
20
+ const ALIASES = {
21
+ plantuml: ['puml', 'uml'],
22
+ mermaid: ['mmd'],
23
+ d2: [],
24
+ graphviz: ['dot'],
25
+ 'vega-lite': ['vegalite', 'vl'],
26
+ likec4: ['c4'],
27
+ svgbob: ['ascii-art'],
28
+ bpmn: [],
29
+ };
30
+ export function buildRegistry(config) {
31
+ const registry = new RendererRegistry();
32
+ const r = config.renderers;
33
+ const resolve = (engine) => engine.backend ?? r.backend;
34
+ const withKroki = (type, local, engine) => {
35
+ if (resolve(engine) === 'kroki' && krokiSupports(type)) {
36
+ return createKrokiRenderer(type, r.kroki);
37
+ }
38
+ return local();
39
+ };
40
+ if (r.plantuml.enabled) {
41
+ registry.register('plantuml', withKroki('plantuml', () => createPlantUmlRenderer({
42
+ jarPath: r.plantuml.jar !== undefined ? path.resolve(config.rootDir, r.plantuml.jar) : undefined,
43
+ javaPath: r.plantuml.java,
44
+ maxHeap: r.plantuml.maxHeap,
45
+ }), r.plantuml), ALIASES['plantuml']);
46
+ }
47
+ if (r.mermaid.enabled) {
48
+ registry.register('mermaid', withKroki('mermaid', () => createMermaidRenderer({
49
+ browserPath: r.mermaid.browserPath,
50
+ ...(r.noSandbox !== undefined ? { noSandbox: r.noSandbox } : {}),
51
+ }), r.mermaid), ALIASES['mermaid']);
52
+ }
53
+ if (r.d2.enabled) {
54
+ registry.register('d2', withKroki('d2', () => createD2Renderer({ layout: r.d2.layout }), r.d2), ALIASES['d2']);
55
+ }
56
+ if (r.graphviz.enabled) {
57
+ registry.register('graphviz', withKroki('graphviz', () => createGraphvizRenderer({ engine: r.graphviz.engine }), r.graphviz), ALIASES['graphviz']);
58
+ }
59
+ if (r.vegaLite.enabled) {
60
+ registry.register('vega-lite', withKroki('vega-lite', () => createVegaLiteRenderer(), r.vegaLite), ALIASES['vega-lite']);
61
+ }
62
+ // LikeC4 es un renderer especializado; Kroki no lo cubre.
63
+ if (r.likec4.enabled) {
64
+ registry.register('likec4', createLikeC4Renderer(), ALIASES['likec4']);
65
+ }
66
+ // C4 dibujado con PlantUML: respaldo de LikeC4, sin dependencias adicionales.
67
+ if (r.plantuml.enabled) {
68
+ registry.register('plantuml-c4', createPlantUmlRenderer({
69
+ jarPath: r.plantuml.jar !== undefined ? path.resolve(config.rootDir, r.plantuml.jar) : undefined,
70
+ javaPath: r.plantuml.java,
71
+ maxHeap: r.plantuml.maxHeap,
72
+ }));
73
+ }
74
+ if (r.svgbob.enabled) {
75
+ registry.register('svgbob', createSvgbobRenderer(), ALIASES['svgbob']);
76
+ }
77
+ if (r.bpmn.enabled) {
78
+ registry.register('bpmn', createBpmnRenderer({
79
+ browserPath: r.bpmn.browserPath,
80
+ ...(r.noSandbox !== undefined ? { noSandbox: r.noSandbox } : {}),
81
+ }), ALIASES['bpmn']);
82
+ }
83
+ return registry;
84
+ }
85
+ export { createD2Renderer } from './d2.js';
86
+ export { createGraphvizRenderer } from './graphviz.js';
87
+ export { createKrokiRenderer, assertSafeKrokiUrl } from './kroki.js';
88
+ export { createLikeC4Renderer } from './likec4.js';
89
+ export { createMermaidRenderer } from './mermaid.js';
90
+ export { createPlantUmlRenderer } from './plantuml.js';
91
+ export { createVegaLiteRenderer } from './vega-lite.js';
92
+ export { createSvgbobRenderer } from './svgbob.js';
93
+ export { createBpmnRenderer } from './bpmn.js';
94
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/renderers/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Backend Kroki (opcional).
3
+ *
4
+ * Alternativa a los motores locales para quien ya opere un Kroki self-hosted.
5
+ * No es el modo por defecto y, salvo autorizacion explicita, rechaza cualquier
6
+ * host que no sea local: la documentacion tratada puede ser confidencial y
7
+ * enviarla a un servicio publico esta prohibido (seccion 12, puntos 1 y 2).
8
+ */
9
+ import { type DiagramRenderer, type OutputFormat, type RenderOptions, type RenderResult } from '../core/types.js';
10
+ export interface KrokiOptions {
11
+ url: string;
12
+ /** Permite apuntar a un host no local (Kroki corporativo en la intranet). */
13
+ allowRemoteHost?: boolean;
14
+ /** Autoriza explicitamente el servicio publico kroki.io. Desaconsejado. */
15
+ allowPublicService?: boolean;
16
+ headers?: Readonly<Record<string, string>>;
17
+ }
18
+ /**
19
+ * Verifica que la URL apunte a una instancia propia.
20
+ * Lanza `ConfigError` en el arranque, no en mitad del build.
21
+ */
22
+ export declare function assertSafeKrokiUrl(rawUrl: string, options: KrokiOptions): URL;
23
+ export declare class KrokiRenderer implements DiagramRenderer {
24
+ readonly type: string;
25
+ readonly defaultFormat: OutputFormat;
26
+ readonly supportedFormats: readonly OutputFormat[];
27
+ private readonly url;
28
+ private readonly krokiPath;
29
+ private readonly headers;
30
+ private cachedVersion?;
31
+ constructor(type: string, options: KrokiOptions);
32
+ version(): Promise<string>;
33
+ render(source: string, options: RenderOptions): Promise<RenderResult>;
34
+ private applyTheme;
35
+ }
36
+ export declare function createKrokiRenderer(type: string, options: KrokiOptions): DiagramRenderer;
37
+ export declare function krokiSupports(type: string): boolean;
38
+ //# sourceMappingURL=kroki.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kroki.d.ts","sourceRoot":"","sources":["../../src/renderers/kroki.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAEL,KAAK,eAAe,EACpB,KAAK,YAAY,EACjB,KAAK,aAAa,EAClB,KAAK,YAAY,EAClB,MAAM,kBAAkB,CAAC;AAgB1B,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,6EAA6E;IAC7E,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,2EAA2E;IAC3E,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CAC5C;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,GAAG,CAwB7E;AAED,qBAAa,aAAc,YAAW,eAAe;IACnD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,aAAa,EAAE,YAAY,CAAC;IACrC,QAAQ,CAAC,gBAAgB,EAAE,SAAS,YAAY,EAAE,CAAC;IAEnD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAM;IAC1B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmC;IAC3D,OAAO,CAAC,aAAa,CAAC,CAAS;gBAEnB,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY;IAgBzC,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;IAc1B,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;IAyC3E,OAAO,CAAC,UAAU;CA6BnB;AAMD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,eAAe,CAExF;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEnD"}
@@ -0,0 +1,151 @@
1
+ /**
2
+ * Backend Kroki (opcional).
3
+ *
4
+ * Alternativa a los motores locales para quien ya opere un Kroki self-hosted.
5
+ * No es el modo por defecto y, salvo autorizacion explicita, rechaza cualquier
6
+ * host que no sea local: la documentacion tratada puede ser confidencial y
7
+ * enviarla a un servicio publico esta prohibido (seccion 12, puntos 1 y 2).
8
+ */
9
+ import { ConfigError, RenderError } from '../core/errors.js';
10
+ import { MIME_TYPES, } from '../core/types.js';
11
+ import { assertFormat, enforceSize, svgResult } from './base.js';
12
+ import { applyTheme as applyGraphvizTheme } from './graphviz.js';
13
+ /** Correspondencia entre el tipo de DocViz y la ruta de la API de Kroki. */
14
+ const KROKI_PATHS = {
15
+ plantuml: 'plantuml',
16
+ mermaid: 'mermaid',
17
+ d2: 'd2',
18
+ graphviz: 'graphviz',
19
+ 'vega-lite': 'vegalite',
20
+ };
21
+ const PUBLIC_HOSTS = new Set(['kroki.io', 'www.kroki.io']);
22
+ const LOCAL_HOSTS = new Set(['localhost', '127.0.0.1', '::1', '0.0.0.0', 'kroki']);
23
+ /**
24
+ * Verifica que la URL apunte a una instancia propia.
25
+ * Lanza `ConfigError` en el arranque, no en mitad del build.
26
+ */
27
+ export function assertSafeKrokiUrl(rawUrl, options) {
28
+ let url;
29
+ try {
30
+ url = new URL(rawUrl);
31
+ }
32
+ catch {
33
+ throw new ConfigError(`renderers.kroki.url no es una URL valida: ${rawUrl}`);
34
+ }
35
+ if (url.protocol !== 'http:' && url.protocol !== 'https:') {
36
+ throw new ConfigError(`renderers.kroki.url debe usar http o https, no ${url.protocol}`);
37
+ }
38
+ if (PUBLIC_HOSTS.has(url.hostname) && options.allowPublicService !== true) {
39
+ throw new ConfigError('el servicio publico kroki.io esta bloqueado por defecto', 'la documentacion puede ser confidencial; despliega Kroki self-hosted o activa renderers.kroki.allowPublicService de forma explicita');
40
+ }
41
+ const isLocal = LOCAL_HOSTS.has(url.hostname) || url.hostname.endsWith('.local');
42
+ if (!isLocal && options.allowRemoteHost !== true && options.allowPublicService !== true) {
43
+ throw new ConfigError(`renderers.kroki.url apunta a un host remoto (${url.hostname})`, 'activa renderers.kroki.allowRemoteHost si ese host es tu instancia self-hosted');
44
+ }
45
+ return url;
46
+ }
47
+ export class KrokiRenderer {
48
+ type;
49
+ defaultFormat;
50
+ supportedFormats;
51
+ url;
52
+ krokiPath;
53
+ headers;
54
+ cachedVersion;
55
+ constructor(type, options) {
56
+ const krokiPath = KROKI_PATHS[type];
57
+ if (krokiPath === undefined) {
58
+ throw new ConfigError(`Kroki no puede renderizar el tipo "${type}"`, `tipos soportados via Kroki: ${Object.keys(KROKI_PATHS).join(', ')}`);
59
+ }
60
+ this.type = type;
61
+ this.krokiPath = krokiPath;
62
+ this.url = assertSafeKrokiUrl(options.url, options);
63
+ this.headers = options.headers ?? {};
64
+ this.defaultFormat = 'svg';
65
+ this.supportedFormats = type === 'plantuml' ? ['svg', 'png'] : ['svg'];
66
+ }
67
+ async version() {
68
+ if (this.cachedVersion !== undefined)
69
+ return this.cachedVersion;
70
+ // Kroki expone su version en /health; si no responde, se usa el host como
71
+ // discriminante para que el hash siga siendo estable y reproducible.
72
+ try {
73
+ const res = await fetch(new URL('/health', this.url), { signal: AbortSignal.timeout(5_000) });
74
+ const body = (await res.json());
75
+ this.cachedVersion = `kroki-${body.version ?? 'desconocida'}-${this.type}`;
76
+ }
77
+ catch {
78
+ this.cachedVersion = `kroki-${this.url.host}-${this.type}`;
79
+ }
80
+ return this.cachedVersion;
81
+ }
82
+ async render(source, options) {
83
+ assertFormat(this.type, options.format, this.supportedFormats);
84
+ // El tema se aplica antes de salir del proceso: Kroki recibe el diagrama ya
85
+ // tematizado, igual que lo recibiria el motor local.
86
+ const payload = this.applyTheme(source, options);
87
+ const endpoint = new URL(`${trimSlash(this.url.pathname)}/${this.krokiPath}/${options.format}`, this.url);
88
+ let res;
89
+ try {
90
+ res = await fetch(endpoint, {
91
+ method: 'POST',
92
+ headers: { 'content-type': 'text/plain; charset=utf-8', ...this.headers },
93
+ body: payload,
94
+ signal: AbortSignal.timeout(options.timeoutMs),
95
+ });
96
+ }
97
+ catch (err) {
98
+ throw new RenderError(this.type, `no se pudo contactar con Kroki en ${endpoint.href}`, err instanceof Error ? err.message : String(err));
99
+ }
100
+ if (!res.ok) {
101
+ const detail = await res.text().catch(() => '');
102
+ throw new RenderError(this.type, `Kroki respondio ${res.status} ${res.statusText}`, detail.slice(0, 2_000));
103
+ }
104
+ const buffer = Buffer.from(await res.arrayBuffer());
105
+ if (options.format === 'png') {
106
+ enforceSize(this.type, buffer, options.maxOutputBytes);
107
+ return { format: 'png', content: buffer, mimeType: MIME_TYPES.png };
108
+ }
109
+ return svgResult(this.type, buffer.toString('utf8'), options);
110
+ }
111
+ applyTheme(source, options) {
112
+ const { theme } = options;
113
+ switch (this.type) {
114
+ case 'plantuml': {
115
+ const trimmed = source.trim();
116
+ const skin = theme.plantuml.skinparams.join('\n');
117
+ const open = /^@start[a-z]+\b.*$/im.exec(trimmed);
118
+ if (open === null)
119
+ return `@startuml\n${skin}\n${trimmed}\n@enduml`;
120
+ const at = open.index + open[0].length;
121
+ return `${trimmed.slice(0, at)}\n${skin}\n${trimmed.slice(at)}`;
122
+ }
123
+ case 'graphviz':
124
+ return applyGraphvizTheme(source, theme);
125
+ case 'vega-lite': {
126
+ const spec = JSON.parse(source);
127
+ return JSON.stringify({
128
+ width: theme.vegaLite.width,
129
+ height: theme.vegaLite.height,
130
+ ...spec,
131
+ config: { ...theme.vegaLite.config, ...(spec['config'] ?? {}) },
132
+ });
133
+ }
134
+ case 'mermaid':
135
+ case 'd2':
136
+ default:
137
+ // Kroki no admite configuracion de tema por peticion para estos motores.
138
+ return source;
139
+ }
140
+ }
141
+ }
142
+ function trimSlash(p) {
143
+ return p.replace(/\/+$/, '');
144
+ }
145
+ export function createKrokiRenderer(type, options) {
146
+ return new KrokiRenderer(type, options);
147
+ }
148
+ export function krokiSupports(type) {
149
+ return type in KROKI_PATHS;
150
+ }
151
+ //# sourceMappingURL=kroki.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kroki.js","sourceRoot":"","sources":["../../src/renderers/kroki.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Emisor SVG propio para vistas LikeC4.
3
+ *
4
+ * LikeC4 calcula el layout (posiciones, tamanos y curvas Bezier de cada
5
+ * relacion) mediante Graphviz; lo que no ofrece es un dibujado a SVG sin
6
+ * navegador. Este modulo toma la vista ya distribuida y la dibuja, de forma que
7
+ * el renderer LikeC4 sea tan offline como los demas y respete el tema del
8
+ * proyecto.
9
+ */
10
+ import type { Theme } from '../themes/types.js';
11
+ export interface LikeC4Point {
12
+ 0: number;
13
+ 1: number;
14
+ }
15
+ export interface LikeC4Node {
16
+ id: string;
17
+ parent: string | null;
18
+ level: number;
19
+ children: string[];
20
+ title: string;
21
+ description?: string | {
22
+ txt?: string;
23
+ } | null;
24
+ technology?: string | null;
25
+ shape?: string;
26
+ color?: string;
27
+ kind?: string;
28
+ x: number;
29
+ y: number;
30
+ width: number;
31
+ height: number;
32
+ style?: {
33
+ opacity?: number;
34
+ size?: string;
35
+ border?: string;
36
+ };
37
+ }
38
+ export interface LikeC4Edge {
39
+ id: string;
40
+ source: string;
41
+ target: string;
42
+ label?: string | null;
43
+ points: Array<[number, number]>;
44
+ labelBBox?: {
45
+ x: number;
46
+ y: number;
47
+ width: number;
48
+ height: number;
49
+ } | null;
50
+ color?: string;
51
+ line?: 'solid' | 'dashed' | 'dotted' | string;
52
+ head?: string;
53
+ tail?: string;
54
+ }
55
+ export interface LikeC4View {
56
+ id: string;
57
+ title?: string | null;
58
+ description?: unknown;
59
+ bounds: {
60
+ x: number;
61
+ y: number;
62
+ width: number;
63
+ height: number;
64
+ };
65
+ nodes: LikeC4Node[];
66
+ edges: LikeC4Edge[];
67
+ }
68
+ export declare function renderLikeC4View(view: LikeC4View, theme: Theme): string;
69
+ /** Ajuste de linea por palabras con truncado con elipsis al llegar al maximo. */
70
+ export declare function wrap(text: string, maxWidth: number, size: number, maxLines: number): string[];
71
+ /**
72
+ * Elige texto claro u oscuro segun la luminancia del relleno (WCAG).
73
+ *
74
+ * Devuelve neutros absolutos, no tokens de la paleta: el criterio es el
75
+ * contraste contra ese relleno concreto, y el relleno ya cambia entre el modo
76
+ * claro y el oscuro. Usar `primaryText` seria un error de significado —ese token
77
+ * es "texto sobre el color primario", que en la paleta oscura es oscuro.
78
+ */
79
+ export declare function contrastText(fill: string, palette: Theme['palette']): string;
80
+ /** Compone `fg` sobre `bg` con la opacidad dada y devuelve un color opaco. */
81
+ export declare function blend(fg: string, bg: string, alpha: number): string;
82
+ //# sourceMappingURL=likec4-svg.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"likec4-svg.d.ts","sourceRoot":"","sources":["../../src/renderers/likec4-svg.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAGhD,MAAM,WAAW,WAAW;IAC1B,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,GAAG;QAAE,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAC/C,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC9D;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAChC,SAAS,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAC3E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC9C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,MAAM,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAChE,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,KAAK,EAAE,UAAU,EAAE,CAAC;CACrB;AAuDD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,GAAG,MAAM,CA+BvE;AAiVD,iFAAiF;AACjF,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAwB7F;AAiBD;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC,GAAG,MAAM,CAS5E;AAED,8EAA8E;AAC9E,wBAAgB,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAMnE"}