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,10 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Servidor MCP de DocViz sobre stdio.
4
+ *
5
+ * Registrar en un cliente MCP:
6
+ * { "command": "node", "args": ["<ruta>/bin/docviz-mcp.mjs"], "cwd": "<proyecto>" }
7
+ */
8
+ import { main } from '../dist/mcp/server.js';
9
+
10
+ await main();
package/bin/docviz.mjs ADDED
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Punto de entrada de la CLI.
4
+ *
5
+ * Se fuerza la salida explicita del proceso: el modulo WASM de D2 y el servicio
6
+ * de lenguaje de LikeC4 dejan handles vivos que impedirian terminar.
7
+ */
8
+ import { run } from '../dist/cli.js';
9
+
10
+ const code = await run(process.argv);
11
+ process.exit(code);
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Orquestador del build.
3
+ *
4
+ * Recorre los documentos fuente, resuelve cada bloque declarativo, renderiza
5
+ * (o reutiliza del cache) y escribe el Markdown compilado junto a sus recursos.
6
+ */
7
+ import { DocVizError } from '../core/errors.js';
8
+ import type { BuildStats, RenderedAsset } from '../core/types.js';
9
+ import type { DocVizConfig } from '../config/types.js';
10
+ export interface BuildOptions {
11
+ /** Borra el directorio de salida antes de compilar. */
12
+ clean?: boolean;
13
+ /** Continua tras un error de render en lugar de abortar. No es el defecto. */
14
+ continueOnError?: boolean;
15
+ verbose?: boolean;
16
+ /** Receptor de mensajes de progreso. */
17
+ onLog?: (message: string) => void;
18
+ }
19
+ /** Aviso localizado que no impide compilar. */
20
+ export interface BuildWarning {
21
+ file: string;
22
+ line: number;
23
+ lang: string;
24
+ code: string;
25
+ field: string;
26
+ message: string;
27
+ }
28
+ export interface BuildResult {
29
+ stats: BuildStats;
30
+ documents: Array<{
31
+ source: string;
32
+ output: string;
33
+ blocks: number;
34
+ }>;
35
+ assets: RenderedAsset[];
36
+ errors: DocVizError[];
37
+ warnings: BuildWarning[];
38
+ }
39
+ export interface CheckResult {
40
+ documents: number;
41
+ blocks: number;
42
+ /** Bloques de DSL que no llegaron a compilar. */
43
+ invalidBlocks: number;
44
+ errors: DocVizError[];
45
+ warnings: BuildWarning[];
46
+ findings: Array<{
47
+ file: string;
48
+ line: number;
49
+ lang: string;
50
+ rendererType: string;
51
+ title: string;
52
+ }>;
53
+ }
54
+ /**
55
+ * Comprueba que todos los bloques sean interpretables: lenguaje registrado,
56
+ * DSL valido y renderer disponible. No dibuja nada, por lo que es rapido y
57
+ * sirve como compuerta previa al build.
58
+ */
59
+ export declare function check(config: DocVizConfig): Promise<CheckResult>;
60
+ export declare function build(config: DocVizConfig, options?: BuildOptions): Promise<BuildResult>;
61
+ export declare function collectMarkdown(dir: string): Promise<string[]>;
62
+ //# sourceMappingURL=builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../src/build/builder.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,EAAoB,WAAW,EAA4B,MAAM,mBAAmB,CAAC;AAU5F,OAAO,KAAK,EAAE,UAAU,EAA8B,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAQ9F,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,MAAM,WAAW,YAAY;IAC3B,uDAAuD;IACvD,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,8EAA8E;IAC9E,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,wCAAwC;IACxC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC;AAED,+CAA+C;AAC/C,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,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,WAAW;IAC1B,KAAK,EAAE,UAAU,CAAC;IAClB,SAAS,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACrE,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,QAAQ,EAAE,YAAY,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,iDAAiD;IACjD,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,QAAQ,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACpG;AASD;;;;GAIG;AACH,wBAAsB,KAAK,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,CAiEtE;AAMD,wBAAsB,KAAK,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,WAAW,CAAC,CAyKlG;AA0GD,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAMpE"}
@@ -0,0 +1,337 @@
1
+ /**
2
+ * Orquestador del build.
3
+ *
4
+ * Recorre los documentos fuente, resuelve cada bloque declarativo, renderiza
5
+ * (o reutiliza del cache) y escribe el Markdown compilado junto a sus recursos.
6
+ */
7
+ import { copyFile, mkdir, readFile, readdir, rm, writeFile } from 'node:fs/promises';
8
+ import path from 'node:path';
9
+ import { AssetCache } from '../core/cache.js';
10
+ import { BuildFailedError, DocVizError, ERROR_CODES, RenderError } from '../core/errors.js';
11
+ import { fullHash, HashRegistry, shortHash } from '../core/hash.js';
12
+ import { assertInside, displayPath, ensureAssetsDir, relativeAssetPath, assetFileName, toPosix, } from '../core/paths.js';
13
+ import { buildRegistry } from '../renderers/index.js';
14
+ import { compileDsl, DSL_LANGUAGES } from '../dsl/index.js';
15
+ import { scanDocument } from '../markdown/scan.js';
16
+ import { applyReplacements } from '../markdown/transform.js';
17
+ import { getTheme, themeFingerprint } from '../themes/index.js';
18
+ import { resolveFromRoot } from '../config/load.js';
19
+ const MARKDOWN_EXTENSIONS = new Set(['.md', '.markdown']);
20
+ const IGNORED_DIRS = new Set(['node_modules', '.git', '.docviz-cache']);
21
+ // --------------------------------------------------------------------------
22
+ // check: validacion estructural sin renderizar
23
+ // --------------------------------------------------------------------------
24
+ /**
25
+ * Comprueba que todos los bloques sean interpretables: lenguaje registrado,
26
+ * DSL valido y renderer disponible. No dibuja nada, por lo que es rapido y
27
+ * sirve como compuerta previa al build.
28
+ */
29
+ export async function check(config) {
30
+ const sourceDir = resolveFromRoot(config, config.source);
31
+ const registry = buildRegistry(config);
32
+ const files = await collectMarkdown(sourceDir);
33
+ const errors = [];
34
+ const warnings = [];
35
+ const findings = [];
36
+ let blocks = 0;
37
+ let invalidBlocks = 0;
38
+ for (const file of files) {
39
+ const relative = displayPath(config.rootDir, file);
40
+ const text = await readFile(file, 'utf8');
41
+ let scanned;
42
+ try {
43
+ scanned = scanBlocks(text, registry);
44
+ }
45
+ catch (err) {
46
+ errors.push(toDocVizError(err, { file: relative }));
47
+ continue;
48
+ }
49
+ // Cada bloque invalido se reporta con su linea: el escaneo ya no se detiene
50
+ // en el primero, asi que una sola pasada los enumera todos.
51
+ for (const issue of scanned.errors) {
52
+ invalidBlocks += 1;
53
+ errors.push(toDocVizError(issue.error, { file: relative, line: issue.line }));
54
+ }
55
+ warnings.push(...scanned.warnings.map((w) => ({ file: relative, ...w })));
56
+ for (const block of scanned.blocks) {
57
+ blocks += 1;
58
+ if (!registry.has(block.rendererType)) {
59
+ errors.push(new DocVizError(`no hay renderer disponible para "${block.rendererType}"`, { file: relative, line: block.line, renderer: block.rendererType }, `renderers habilitados: ${registry.types().join(', ')}`, ERROR_CODES.RENDERER_UNAVAILABLE));
60
+ continue;
61
+ }
62
+ const renderer = registry.get(block.rendererType);
63
+ const format = resolveFormat(block, config, renderer.defaultFormat);
64
+ if (!renderer.supportedFormats.includes(format)) {
65
+ errors.push(new DocVizError(`el renderer ${block.rendererType} no puede producir ${format}`, { file: relative, line: block.line, renderer: block.rendererType }, `formatos soportados: ${renderer.supportedFormats.join(', ')}`, ERROR_CODES.FORMAT_UNSUPPORTED));
66
+ continue;
67
+ }
68
+ findings.push({
69
+ file: relative,
70
+ line: block.line,
71
+ lang: block.lang,
72
+ rendererType: block.rendererType,
73
+ title: block.title,
74
+ });
75
+ }
76
+ }
77
+ await registry.disposeAll().catch(() => undefined);
78
+ return { documents: files.length, blocks, invalidBlocks, errors, warnings, findings };
79
+ }
80
+ // --------------------------------------------------------------------------
81
+ // build
82
+ // --------------------------------------------------------------------------
83
+ export async function build(config, options = {}) {
84
+ const log = options.onLog ?? (() => undefined);
85
+ const sourceDir = resolveFromRoot(config, config.source);
86
+ const outputDir = resolveFromRoot(config, config.output);
87
+ if (path.resolve(sourceDir) === path.resolve(outputDir)) {
88
+ throw new DocVizError('el directorio de salida no puede ser el mismo que el de origen', {}, `origen y salida apuntan a ${sourceDir}`);
89
+ }
90
+ if (options.clean === true) {
91
+ await rm(outputDir, { recursive: true, force: true });
92
+ log(`limpieza: se elimino ${toPosix(path.relative(config.rootDir, outputDir))}`);
93
+ }
94
+ const theme = getTheme(config.theme.name);
95
+ const fingerprintValue = themeFingerprint(theme);
96
+ const registry = buildRegistry(config);
97
+ const cache = new AssetCache(resolveFromRoot(config, config.cache.dir), config.cache.enabled);
98
+ const assetsDir = await ensureAssetsDir(outputDir, config.assetsDir);
99
+ const hashes = new HashRegistry();
100
+ const files = await collectMarkdown(sourceDir);
101
+ const result = {
102
+ stats: { documents: 0, blocks: 0, generated: 0, cacheHits: 0 },
103
+ documents: [],
104
+ assets: [],
105
+ errors: [],
106
+ warnings: [],
107
+ };
108
+ try {
109
+ const documentos = [];
110
+ for (const file of files) {
111
+ const relativeSource = displayPath(config.rootDir, file);
112
+ const text = await readFile(file, 'utf8');
113
+ let scanned;
114
+ try {
115
+ scanned = scanBlocks(text, registry);
116
+ }
117
+ catch (err) {
118
+ result.errors.push(toDocVizError(err, { file: relativeSource }));
119
+ continue;
120
+ }
121
+ // Un bloque que no compila no cancela el resto del documento: se reporta
122
+ // con su linea y los demas siguen dibujandose.
123
+ for (const issue of scanned.errors) {
124
+ result.errors.push(toDocVizError(issue.error, { file: relativeSource, line: issue.line }));
125
+ }
126
+ result.warnings.push(...scanned.warnings.map((w) => ({ file: relativeSource, ...w })));
127
+ documentos.push({
128
+ file,
129
+ relativeSource,
130
+ outputPath: assertInside(outputDir, path.relative(sourceDir, file)),
131
+ text,
132
+ blocks: scanned.blocks,
133
+ replacements: [],
134
+ });
135
+ result.stats.blocks += scanned.blocks.length;
136
+ }
137
+ // Cada motor atiende sus diagramas de uno en uno: una JVM por render, una
138
+ // instancia WebAssembly y un navegador compartido no admiten reentrada. Lo
139
+ // que se solapa son motores distintos entre si.
140
+ const porMotor = new Map();
141
+ for (const doc of documentos) {
142
+ for (const block of doc.blocks) {
143
+ const cola = porMotor.get(block.rendererType) ?? [];
144
+ cola.push({ doc, block });
145
+ porMotor.set(block.rendererType, cola);
146
+ }
147
+ }
148
+ const fallos = [];
149
+ await Promise.all([...porMotor.values()].map(async (cola) => {
150
+ for (const { doc, block } of cola) {
151
+ try {
152
+ const asset = await renderBlock({
153
+ block,
154
+ config,
155
+ registry,
156
+ cache,
157
+ hashes,
158
+ assetsDir,
159
+ themeName: config.theme.name,
160
+ themeFingerprintValue: fingerprintValue,
161
+ theme,
162
+ });
163
+ result.assets.push(asset);
164
+ if (asset.fromCache)
165
+ result.stats.cacheHits += 1;
166
+ else
167
+ result.stats.generated += 1;
168
+ doc.replacements.push({
169
+ block,
170
+ assetPath: relativeAssetPath(path.dirname(doc.outputPath), asset.absolutePath),
171
+ });
172
+ if (options.verbose === true) {
173
+ log(` ${asset.fromCache ? 'cache' : 'render'} ${block.rendererType.padEnd(10)} ${asset.relativePath}`);
174
+ }
175
+ }
176
+ catch (err) {
177
+ fallos.push({ doc, block, error: err });
178
+ }
179
+ }
180
+ }));
181
+ // El orden de llegada depende de que motor termine antes, y eso no puede
182
+ // filtrarse al resultado: se reordena por documento y por linea para que
183
+ // dos builds del mismo proyecto reporten exactamente lo mismo.
184
+ fallos.sort((a, b) => a.doc.relativeSource === b.doc.relativeSource
185
+ ? a.block.line - b.block.line
186
+ : a.doc.relativeSource < b.doc.relativeSource
187
+ ? -1
188
+ : 1);
189
+ for (const { doc, block, error } of fallos) {
190
+ result.errors.push(toDocVizError(error, { file: doc.relativeSource, line: block.line, renderer: block.rendererType }));
191
+ if (options.continueOnError === true) {
192
+ log(` aviso: se conserva el bloque original por error de render (${doc.relativeSource}:${block.line})`);
193
+ }
194
+ }
195
+ result.assets.sort((a, b) => (a.relativePath < b.relativePath ? -1 : a.relativePath > b.relativePath ? 1 : 0));
196
+ // Los documentos solo se escriben si el build va a considerarse valido.
197
+ if (result.errors.length === 0 || options.continueOnError === true) {
198
+ for (const doc of documentos) {
199
+ await mkdir(path.dirname(doc.outputPath), { recursive: true });
200
+ await writeFile(doc.outputPath, applyReplacements(doc.text, doc.replacements), 'utf8');
201
+ result.documents.push({
202
+ source: doc.relativeSource,
203
+ output: toPosix(path.relative(config.rootDir, doc.outputPath)),
204
+ blocks: doc.blocks.length,
205
+ });
206
+ result.stats.documents += 1;
207
+ }
208
+ }
209
+ // Archivos que no son Markdown se copian tal cual (imagenes, adjuntos).
210
+ if (result.errors.length === 0 || options.continueOnError === true) {
211
+ await copyNonMarkdown(sourceDir, outputDir);
212
+ }
213
+ }
214
+ finally {
215
+ await registry.disposeAll().catch(() => undefined);
216
+ }
217
+ if (result.errors.length > 0 && options.continueOnError !== true) {
218
+ throw new BuildFailedError(result.errors);
219
+ }
220
+ return result;
221
+ }
222
+ async function renderBlock(args) {
223
+ const { block, config, registry, cache, hashes, assetsDir, theme } = args;
224
+ const renderer = registry.get(block.rendererType);
225
+ const format = resolveFormat(block, config, renderer.defaultFormat);
226
+ const version = await renderer.version();
227
+ const hashInput = {
228
+ rendererType: block.rendererType,
229
+ source: block.source,
230
+ themeName: args.themeName,
231
+ themeFingerprint: args.themeFingerprintValue,
232
+ rendererVersion: version,
233
+ format,
234
+ };
235
+ const digest = fullHash(hashInput);
236
+ const short = shortHash(hashInput, config.hash.length);
237
+ const claim = hashes.claim(short, digest);
238
+ if (!claim.ok) {
239
+ throw new RenderError(block.rendererType, `colision de hash truncado (${short})`, `dos diagramas distintos producen el mismo prefijo de ${config.hash.length} caracteres; sube hash.length en docviz.config.yaml`, ERROR_CODES.HASH_COLLISION);
240
+ }
241
+ const fileName = assetFileName(block.title, short, format);
242
+ const absolutePath = assertInside(assetsDir, fileName);
243
+ const relativePath = toPosix(path.relative(path.dirname(assetsDir), absolutePath));
244
+ const cached = await cache.get(digest, format);
245
+ if (cached !== undefined) {
246
+ await writeFile(absolutePath, cached);
247
+ return {
248
+ relativePath,
249
+ absolutePath,
250
+ hash: short,
251
+ format,
252
+ bytes: cached.byteLength,
253
+ fromCache: true,
254
+ };
255
+ }
256
+ const rendered = await renderer.render(block.source, {
257
+ format,
258
+ theme,
259
+ title: block.title,
260
+ timeoutMs: config.renderers.timeoutMs,
261
+ maxOutputBytes: config.renderers.maxOutputBytes,
262
+ });
263
+ await cache.set(digest, format, rendered.content);
264
+ await writeFile(absolutePath, rendered.content);
265
+ return {
266
+ relativePath,
267
+ absolutePath,
268
+ hash: short,
269
+ format,
270
+ bytes: rendered.content.byteLength,
271
+ fromCache: false,
272
+ };
273
+ }
274
+ function resolveFormat(block, config, fallback) {
275
+ return block.requestedFormat ?? config.formats[block.rendererType] ?? fallback;
276
+ }
277
+ function scanBlocks(text, registry) {
278
+ return scanDocument(text, {
279
+ resolveLanguage: (lang) => registry.resolve(lang),
280
+ // El DSL necesita saber que motores hay registrados: si el preferido no
281
+ // esta, compila para el respaldo declarado en lugar de abortar.
282
+ compileDsl: (lang, source) => compileDsl(lang, source, (engine) => registry.has(engine)),
283
+ dslLanguages: DSL_LANGUAGES,
284
+ });
285
+ }
286
+ function toDocVizError(err, location) {
287
+ if (err instanceof DocVizError)
288
+ return err.withLocation(location);
289
+ const message = err instanceof Error ? err.message : String(err);
290
+ return new DocVizError(message, location, err instanceof Error ? err.stack : undefined);
291
+ }
292
+ // --------------------------------------------------------------------------
293
+ // Recorrido del arbol de documentos
294
+ // --------------------------------------------------------------------------
295
+ export async function collectMarkdown(dir) {
296
+ const out = [];
297
+ await walk(dir, (file) => {
298
+ if (MARKDOWN_EXTENSIONS.has(path.extname(file).toLowerCase()))
299
+ out.push(file);
300
+ });
301
+ return out.sort();
302
+ }
303
+ async function copyNonMarkdown(sourceDir, outputDir) {
304
+ const files = [];
305
+ await walk(sourceDir, (file) => {
306
+ if (!MARKDOWN_EXTENSIONS.has(path.extname(file).toLowerCase()))
307
+ files.push(file);
308
+ });
309
+ for (const file of files) {
310
+ const target = assertInside(outputDir, path.relative(sourceDir, file));
311
+ await mkdir(path.dirname(target), { recursive: true });
312
+ await copyFile(file, target);
313
+ }
314
+ }
315
+ async function walk(dir, onFile) {
316
+ let entries;
317
+ try {
318
+ entries = await readdir(dir, { withFileTypes: true });
319
+ }
320
+ catch {
321
+ return;
322
+ }
323
+ for (const entry of entries) {
324
+ if (entry.name.startsWith('.'))
325
+ continue;
326
+ const full = path.join(dir, entry.name);
327
+ if (entry.isDirectory()) {
328
+ if (IGNORED_DIRS.has(entry.name))
329
+ continue;
330
+ await walk(full, onFile);
331
+ }
332
+ else if (entry.isFile()) {
333
+ onFile(full);
334
+ }
335
+ }
336
+ }
337
+ //# sourceMappingURL=builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builder.js","sourceRoot":"","sources":["../../src/build/builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Comparacion de dos arboles de documentos.
3
+ *
4
+ * Responde a una pregunta que el build no responde: **que diagramas cambiaron**
5
+ * entre dos versiones de la documentacion. En una revision de codigo, el
6
+ * diff de un `.md` muestra que se toco un bloque YAML, pero no si el dibujo
7
+ * resultante es distinto; y el nombre del recurso generado cambia tambien
8
+ * cuando solo cambio el tema o la version del motor.
9
+ *
10
+ * Por eso la identidad que se compara aqui no es la del recurso, sino la del
11
+ * contenido efectivo: `motor + fuente compilada`. Un cambio de tema no aparece
12
+ * como cambio de diagrama, y reordenar el YAML sin alterar el resultado
13
+ * tampoco.
14
+ */
15
+ import type { DocVizConfig } from '../config/types.js';
16
+ export type DiffStatus = 'added' | 'removed' | 'changed' | 'unchanged';
17
+ export interface DiffEntry {
18
+ status: DiffStatus;
19
+ /** Ruta del documento, relativa al directorio comparado. */
20
+ file: string;
21
+ title: string;
22
+ /** Linea en head; para un diagrama eliminado, la que tenia en base. */
23
+ line: number;
24
+ lang: string;
25
+ engine: string;
26
+ /** Motor anterior, presente solo si cambio. */
27
+ previousEngine?: string;
28
+ baseHash?: string;
29
+ headHash?: string;
30
+ }
31
+ /** Bloque que no se pudo interpretar en uno de los dos lados. */
32
+ export interface DiffIssue {
33
+ side: 'base' | 'head';
34
+ file: string;
35
+ line: number;
36
+ message: string;
37
+ }
38
+ export interface DiffResult {
39
+ base: string;
40
+ head: string;
41
+ entries: DiffEntry[];
42
+ issues: DiffIssue[];
43
+ summary: {
44
+ added: number;
45
+ removed: number;
46
+ changed: number;
47
+ unchanged: number;
48
+ };
49
+ }
50
+ /**
51
+ * Compara los diagramas de `baseDir` con los de `headDir`.
52
+ *
53
+ * No renderiza: compila el DSL y se queda con la fuente que recibiria el motor.
54
+ * Un lado invalido no aborta la comparacion —la version antigua puede estar
55
+ * rota y aun asi interesa saber que cambio— pero sus bloques se reportan.
56
+ */
57
+ export declare function diff(config: DocVizConfig, baseDir: string, headDir: string): Promise<DiffResult>;
58
+ /** `true` si algo cambio entre las dos versiones. */
59
+ export declare function hasChanges(result: DiffResult): boolean;
60
+ /** Reporte legible, en el orden en que aparecen los documentos. */
61
+ export declare function formatDiff(result: DiffResult, options?: {
62
+ all?: boolean;
63
+ }): string;
64
+ //# sourceMappingURL=diff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../src/build/diff.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAUH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGvD,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,GAAG,WAAW,CAAC;AAEvE,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,UAAU,CAAC;IACnB,4DAA4D;IAC5D,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,uEAAuE;IACvE,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,+CAA+C;IAC/C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,iEAAiE;AACjE,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,SAAS,EAAE,CAAC;IACrB,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;CACjF;AAWD;;;;;;GAMG;AACH,wBAAsB,IAAI,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAsDtG;AAED,qDAAqD;AACrD,wBAAgB,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAEtD;AA2DD,mEAAmE;AACnE,wBAAgB,UAAU,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,GAAE;IAAE,GAAG,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,MAAM,CAuBtF"}