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.
- package/AGENTS.md +371 -0
- package/LICENSE +21 -0
- package/README.md +837 -0
- package/bin/docviz-mcp.mjs +10 -0
- package/bin/docviz.mjs +11 -0
- package/dist/build/builder.d.ts +62 -0
- package/dist/build/builder.d.ts.map +1 -0
- package/dist/build/builder.js +337 -0
- package/dist/build/builder.js.map +1 -0
- package/dist/build/diff.d.ts +64 -0
- package/dist/build/diff.d.ts.map +1 -0
- package/dist/build/diff.js +156 -0
- package/dist/build/diff.js.map +1 -0
- package/dist/build/doctor.d.ts +39 -0
- package/dist/build/doctor.d.ts.map +1 -0
- package/dist/build/doctor.js +190 -0
- package/dist/build/doctor.js.map +1 -0
- package/dist/build/init.d.ts +28 -0
- package/dist/build/init.d.ts.map +1 -0
- package/dist/build/init.js +274 -0
- package/dist/build/init.js.map +1 -0
- package/dist/build/preview.d.ts +13 -0
- package/dist/build/preview.d.ts.map +1 -0
- package/dist/build/preview.js +277 -0
- package/dist/build/preview.js.map +1 -0
- package/dist/build/skill.d.ts +41 -0
- package/dist/build/skill.d.ts.map +1 -0
- package/dist/build/skill.js +63 -0
- package/dist/build/skill.js.map +1 -0
- package/dist/build/verify.d.ts +26 -0
- package/dist/build/verify.d.ts.map +1 -0
- package/dist/build/verify.js +99 -0
- package/dist/build/verify.js.map +1 -0
- package/dist/cli.d.ts +20 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +427 -0
- package/dist/cli.js.map +1 -0
- package/dist/config/load.d.ts +32 -0
- package/dist/config/load.d.ts.map +1 -0
- package/dist/config/load.js +279 -0
- package/dist/config/load.js.map +1 -0
- package/dist/config/types.d.ts +89 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +5 -0
- package/dist/config/types.js.map +1 -0
- package/dist/core/cache.d.ts +32 -0
- package/dist/core/cache.d.ts.map +1 -0
- package/dist/core/cache.js +69 -0
- package/dist/core/cache.js.map +1 -0
- package/dist/core/errors.d.ts +115 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +164 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/hash.d.ts +57 -0
- package/dist/core/hash.d.ts.map +1 -0
- package/dist/core/hash.js +0 -0
- package/dist/core/hash.js.map +1 -0
- package/dist/core/package-version.d.ts +9 -0
- package/dist/core/package-version.d.ts.map +1 -0
- package/dist/core/package-version.js +44 -0
- package/dist/core/package-version.js.map +1 -0
- package/dist/core/paths.d.ts +46 -0
- package/dist/core/paths.d.ts.map +1 -0
- package/dist/core/paths.js +105 -0
- package/dist/core/paths.js.map +1 -0
- package/dist/core/registry.d.ts +24 -0
- package/dist/core/registry.d.ts.map +1 -0
- package/dist/core/registry.js +72 -0
- package/dist/core/registry.js.map +1 -0
- package/dist/core/types.d.ts +78 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +11 -0
- package/dist/core/types.js.map +1 -0
- package/dist/dsl/architecture.d.ts +15 -0
- package/dist/dsl/architecture.d.ts.map +1 -0
- package/dist/dsl/architecture.js +242 -0
- package/dist/dsl/architecture.js.map +1 -0
- package/dist/dsl/catalog.d.ts +62 -0
- package/dist/dsl/catalog.d.ts.map +1 -0
- package/dist/dsl/catalog.en.d.ts +18 -0
- package/dist/dsl/catalog.en.d.ts.map +1 -0
- package/dist/dsl/catalog.en.js +299 -0
- package/dist/dsl/catalog.en.js.map +1 -0
- package/dist/dsl/catalog.js +1082 -0
- package/dist/dsl/catalog.js.map +1 -0
- package/dist/dsl/chart.d.ts +14 -0
- package/dist/dsl/chart.d.ts.map +1 -0
- package/dist/dsl/chart.js +435 -0
- package/dist/dsl/chart.js.map +1 -0
- package/dist/dsl/compile.d.ts +31 -0
- package/dist/dsl/compile.d.ts.map +1 -0
- package/dist/dsl/compile.js +120 -0
- package/dist/dsl/compile.js.map +1 -0
- package/dist/dsl/diagram-bpmn.d.ts +13 -0
- package/dist/dsl/diagram-bpmn.d.ts.map +1 -0
- package/dist/dsl/diagram-bpmn.js +215 -0
- package/dist/dsl/diagram-bpmn.js.map +1 -0
- package/dist/dsl/diagram-product.d.ts +15 -0
- package/dist/dsl/diagram-product.d.ts.map +1 -0
- package/dist/dsl/diagram-product.js +291 -0
- package/dist/dsl/diagram-product.js.map +1 -0
- package/dist/dsl/diagram-technical.d.ts +28 -0
- package/dist/dsl/diagram-technical.d.ts.map +1 -0
- package/dist/dsl/diagram-technical.js +365 -0
- package/dist/dsl/diagram-technical.js.map +1 -0
- package/dist/dsl/diagram.d.ts +22 -0
- package/dist/dsl/diagram.d.ts.map +1 -0
- package/dist/dsl/diagram.js +542 -0
- package/dist/dsl/diagram.js.map +1 -0
- package/dist/dsl/fallbacks-d2.d.ts +27 -0
- package/dist/dsl/fallbacks-d2.d.ts.map +1 -0
- package/dist/dsl/fallbacks-d2.js +265 -0
- package/dist/dsl/fallbacks-d2.js.map +1 -0
- package/dist/dsl/fallbacks.d.ts +25 -0
- package/dist/dsl/fallbacks.d.ts.map +1 -0
- package/dist/dsl/fallbacks.js +264 -0
- package/dist/dsl/fallbacks.js.map +1 -0
- package/dist/dsl/fields.d.ts +93 -0
- package/dist/dsl/fields.d.ts.map +1 -0
- package/dist/dsl/fields.js +233 -0
- package/dist/dsl/fields.js.map +1 -0
- package/dist/dsl/index.d.ts +50 -0
- package/dist/dsl/index.d.ts.map +1 -0
- package/dist/dsl/index.js +114 -0
- package/dist/dsl/index.js.map +1 -0
- package/dist/dsl/util.d.ts +105 -0
- package/dist/dsl/util.d.ts.map +1 -0
- package/dist/dsl/util.js +261 -0
- package/dist/dsl/util.js.map +1 -0
- package/dist/index.d.ts +27 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/markdown/scan.d.ts +73 -0
- package/dist/markdown/scan.d.ts.map +1 -0
- package/dist/markdown/scan.js +150 -0
- package/dist/markdown/scan.js.map +1 -0
- package/dist/markdown/transform.d.ts +28 -0
- package/dist/markdown/transform.d.ts.map +1 -0
- package/dist/markdown/transform.js +38 -0
- package/dist/markdown/transform.js.map +1 -0
- package/dist/mcp/server.d.ts +18 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +118 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools.d.ts +118 -0
- package/dist/mcp/tools.d.ts.map +1 -0
- package/dist/mcp/tools.js +573 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/renderers/base.d.ts +18 -0
- package/dist/renderers/base.d.ts.map +1 -0
- package/dist/renderers/base.js +59 -0
- package/dist/renderers/base.js.map +1 -0
- package/dist/renderers/bpmn.d.ts +68 -0
- package/dist/renderers/bpmn.d.ts.map +1 -0
- package/dist/renderers/bpmn.js +158 -0
- package/dist/renderers/bpmn.js.map +1 -0
- package/dist/renderers/browser.d.ts +30 -0
- package/dist/renderers/browser.d.ts.map +1 -0
- package/dist/renderers/browser.js +143 -0
- package/dist/renderers/browser.js.map +1 -0
- package/dist/renderers/color-scheme.d.ts +40 -0
- package/dist/renderers/color-scheme.d.ts.map +1 -0
- package/dist/renderers/color-scheme.js +122 -0
- package/dist/renderers/color-scheme.js.map +1 -0
- package/dist/renderers/d2.d.ts +37 -0
- package/dist/renderers/d2.d.ts.map +1 -0
- package/dist/renderers/d2.js +108 -0
- package/dist/renderers/d2.js.map +1 -0
- package/dist/renderers/graphviz.d.ts +33 -0
- package/dist/renderers/graphviz.d.ts.map +1 -0
- package/dist/renderers/graphviz.js +88 -0
- package/dist/renderers/graphviz.js.map +1 -0
- package/dist/renderers/in-page.d.ts +33 -0
- package/dist/renderers/in-page.d.ts.map +1 -0
- package/dist/renderers/in-page.js +76 -0
- package/dist/renderers/in-page.js.map +1 -0
- package/dist/renderers/index.d.ts +20 -0
- package/dist/renderers/index.d.ts.map +1 -0
- package/dist/renderers/index.js +94 -0
- package/dist/renderers/index.js.map +1 -0
- package/dist/renderers/kroki.d.ts +38 -0
- package/dist/renderers/kroki.d.ts.map +1 -0
- package/dist/renderers/kroki.js +151 -0
- package/dist/renderers/kroki.js.map +1 -0
- package/dist/renderers/likec4-svg.d.ts +82 -0
- package/dist/renderers/likec4-svg.d.ts.map +1 -0
- package/dist/renderers/likec4-svg.js +435 -0
- package/dist/renderers/likec4-svg.js.map +1 -0
- package/dist/renderers/likec4.d.ts +22 -0
- package/dist/renderers/likec4.d.ts.map +1 -0
- package/dist/renderers/likec4.js +77 -0
- package/dist/renderers/likec4.js.map +1 -0
- package/dist/renderers/mermaid.d.ts +64 -0
- package/dist/renderers/mermaid.d.ts.map +1 -0
- package/dist/renderers/mermaid.js +196 -0
- package/dist/renderers/mermaid.js.map +1 -0
- package/dist/renderers/plantuml.d.ts +56 -0
- package/dist/renderers/plantuml.d.ts.map +1 -0
- package/dist/renderers/plantuml.js +195 -0
- package/dist/renderers/plantuml.js.map +1 -0
- package/dist/renderers/svg-utils.d.ts +46 -0
- package/dist/renderers/svg-utils.d.ts.map +1 -0
- package/dist/renderers/svg-utils.js +439 -0
- package/dist/renderers/svg-utils.js.map +1 -0
- package/dist/renderers/svgbob.d.ts +26 -0
- package/dist/renderers/svgbob.d.ts.map +1 -0
- package/dist/renderers/svgbob.js +70 -0
- package/dist/renderers/svgbob.js.map +1 -0
- package/dist/renderers/vega-lite.d.ts +18 -0
- package/dist/renderers/vega-lite.d.ts.map +1 -0
- package/dist/renderers/vega-lite.js +94 -0
- package/dist/renderers/vega-lite.js.map +1 -0
- package/dist/themes/index.d.ts +17 -0
- package/dist/themes/index.d.ts.map +1 -0
- package/dist/themes/index.js +419 -0
- package/dist/themes/index.js.map +1 -0
- package/dist/themes/types.d.ts +99 -0
- package/dist/themes/types.d.ts.map +1 -0
- package/dist/themes/types.js +9 -0
- package/dist/themes/types.js.map +1 -0
- package/eval/casos.json +513 -0
- package/package.json +114 -0
- package/scripts/capture-preview.mjs +101 -0
- package/scripts/check-github.mjs +128 -0
- package/scripts/eval.d.mts +8 -0
- package/scripts/eval.mjs +284 -0
- package/scripts/fetch-plantuml.mjs +122 -0
- package/scripts/generate-catalog-doc.mjs +106 -0
- package/scripts/rasterize.mjs +68 -0
- package/scripts/sync-docs.mjs +158 -0
- package/skills/docviz/SKILL.md +111 -0
- package/vendor/.gitkeep +0 -0
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Renderer Mermaid — Mermaid necesita medir texto en un DOM real, asi que se
|
|
3
|
+
* ejecuta dentro de un Chromium local en modo headless.
|
|
4
|
+
*
|
|
5
|
+
* Nada sale a la red: la pagina es `about:blank`, el bundle de Mermaid se
|
|
6
|
+
* inyecta desde `node_modules` y la navegacion queda bloqueada.
|
|
7
|
+
*/
|
|
8
|
+
import type { DiagramRenderer, OutputFormat, RenderOptions, RenderResult } from '../core/types.js';
|
|
9
|
+
/**
|
|
10
|
+
* Lanzador del navegador.
|
|
11
|
+
*
|
|
12
|
+
* Se inyecta para poder probar los caminos de error —no hay navegador, no
|
|
13
|
+
* arranca, la pagina falla— sin depender de que la maquina que ejecuta las
|
|
14
|
+
* pruebas tenga o no un Chromium, y sin provocar fallos reales del sistema.
|
|
15
|
+
*/
|
|
16
|
+
export type LaunchBrowser = (executablePath: string, opciones?: {
|
|
17
|
+
noSandbox: boolean;
|
|
18
|
+
}) => Promise<Browser>;
|
|
19
|
+
export interface MermaidOptions {
|
|
20
|
+
/** Sustituye el lanzador real. Solo se usa en pruebas. */
|
|
21
|
+
launch?: LaunchBrowser;
|
|
22
|
+
/** Sustituye la busqueda del ejecutable. Solo se usa en pruebas. */
|
|
23
|
+
findExecutable?: (explicit?: string) => string | undefined;
|
|
24
|
+
/** Ruta explicita al ejecutable de Chromium. */
|
|
25
|
+
browserPath?: string;
|
|
26
|
+
/** Desactiva el sandbox de Chromium. Ver `shouldDisableSandbox`. */
|
|
27
|
+
noSandbox?: boolean;
|
|
28
|
+
}
|
|
29
|
+
export type Browser = {
|
|
30
|
+
newPage(): Promise<Page>;
|
|
31
|
+
close(): Promise<void>;
|
|
32
|
+
connected?: boolean;
|
|
33
|
+
};
|
|
34
|
+
export type Page = {
|
|
35
|
+
setContent(html: string, options?: unknown): Promise<void>;
|
|
36
|
+
addScriptTag(options: {
|
|
37
|
+
content: string;
|
|
38
|
+
}): Promise<unknown>;
|
|
39
|
+
evaluate<T, A extends unknown[]>(fn: (...args: A) => T | Promise<T>, ...args: A): Promise<T>;
|
|
40
|
+
setRequestInterception?(v: boolean): Promise<void>;
|
|
41
|
+
on(event: string, handler: (...args: never[]) => void): void;
|
|
42
|
+
};
|
|
43
|
+
export declare class MermaidRenderer implements DiagramRenderer {
|
|
44
|
+
readonly type = "mermaid";
|
|
45
|
+
readonly defaultFormat: OutputFormat;
|
|
46
|
+
readonly supportedFormats: readonly OutputFormat[];
|
|
47
|
+
private readonly browserPath?;
|
|
48
|
+
private readonly noSandbox;
|
|
49
|
+
private readonly launch;
|
|
50
|
+
private readonly findExecutable;
|
|
51
|
+
private browserPromise?;
|
|
52
|
+
private bundlePromise?;
|
|
53
|
+
private cachedVersion?;
|
|
54
|
+
private counter;
|
|
55
|
+
constructor(options?: MermaidOptions);
|
|
56
|
+
version(): Promise<string>;
|
|
57
|
+
/** Bundle UMD autocontenido de Mermaid (define `window.mermaid`). */
|
|
58
|
+
private bundle;
|
|
59
|
+
private browser;
|
|
60
|
+
render(source: string, options: RenderOptions): Promise<RenderResult>;
|
|
61
|
+
dispose(): Promise<void>;
|
|
62
|
+
}
|
|
63
|
+
export declare function createMermaidRenderer(options?: MermaidOptions): DiagramRenderer;
|
|
64
|
+
//# sourceMappingURL=mermaid.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mermaid.d.ts","sourceRoot":"","sources":["../../src/renderers/mermaid.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAWnG;;;;;;GAMG;AACH,MAAM,MAAM,aAAa,GAAG,CAC1B,cAAc,EAAE,MAAM,EACtB,QAAQ,CAAC,EAAE;IAAE,SAAS,EAAE,OAAO,CAAA;CAAE,KAC9B,OAAO,CAAC,OAAO,CAAC,CAAC;AAEtB,MAAM,WAAW,cAAc;IAC7B,0DAA0D;IAC1D,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,oEAAoE;IACpE,cAAc,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;IAC3D,gDAAgD;IAChD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oEAAoE;IACpE,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,MAAM,OAAO,GAAG;IACpB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC;AACF,MAAM,MAAM,IAAI,GAAG;IACjB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3D,YAAY,CAAC,OAAO,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7D,QAAQ,CAAC,CAAC,EAAE,CAAC,SAAS,OAAO,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAC7F,sBAAsB,CAAC,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnD,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,IAAI,GAAG,IAAI,CAAC;CAC9D,CAAC;AAEF,qBAAa,eAAgB,YAAW,eAAe;IACrD,QAAQ,CAAC,IAAI,aAAQ;IACrB,QAAQ,CAAC,aAAa,EAAE,YAAY,CAAS;IAC7C,QAAQ,CAAC,gBAAgB,0BAAa;IAEtC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAU;IACpC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgC;IACvD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA0D;IACzF,OAAO,CAAC,cAAc,CAAC,CAAmB;IAC1C,OAAO,CAAC,aAAa,CAAC,CAAkB;IACxC,OAAO,CAAC,aAAa,CAAC,CAAS;IAC/B,OAAO,CAAC,OAAO,CAAK;gBAER,OAAO,GAAE,cAAmB;IAOlC,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;IAMhC,qEAAqE;YACvD,MAAM;YAiBN,OAAO;IAef,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;IA6DrE,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAK/B;AAkED,wBAAgB,qBAAqB,CAAC,OAAO,CAAC,EAAE,cAAc,GAAG,eAAe,CAE/E"}
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Renderer Mermaid — Mermaid necesita medir texto en un DOM real, asi que se
|
|
3
|
+
* ejecuta dentro de un Chromium local en modo headless.
|
|
4
|
+
*
|
|
5
|
+
* Nada sale a la red: la pagina es `about:blank`, el bundle de Mermaid se
|
|
6
|
+
* inyecta desde `node_modules` y la navegacion queda bloqueada.
|
|
7
|
+
*/
|
|
8
|
+
import { readFile } from 'node:fs/promises';
|
|
9
|
+
import { createRequire } from 'node:module';
|
|
10
|
+
import path from 'node:path';
|
|
11
|
+
import { RenderError } from '../core/errors.js';
|
|
12
|
+
import { packageVersion } from '../core/package-version.js';
|
|
13
|
+
import { assertFormat, asRenderError, svgResult } from './base.js';
|
|
14
|
+
import { browserNotFoundHelp, chromiumLaunchArgs, findBrowser, shouldDisableSandbox } from './browser.js';
|
|
15
|
+
import { renderMermaidInPage } from './in-page.js';
|
|
16
|
+
const TYPE = 'mermaid';
|
|
17
|
+
const SUPPORTED = ['svg'];
|
|
18
|
+
const require_ = createRequire(import.meta.url);
|
|
19
|
+
export class MermaidRenderer {
|
|
20
|
+
type = TYPE;
|
|
21
|
+
defaultFormat = 'svg';
|
|
22
|
+
supportedFormats = SUPPORTED;
|
|
23
|
+
browserPath;
|
|
24
|
+
noSandbox;
|
|
25
|
+
launch = defaultLaunch;
|
|
26
|
+
findExecutable = findBrowser;
|
|
27
|
+
browserPromise;
|
|
28
|
+
bundlePromise;
|
|
29
|
+
cachedVersion;
|
|
30
|
+
counter = 0;
|
|
31
|
+
constructor(options = {}) {
|
|
32
|
+
this.browserPath = options.browserPath;
|
|
33
|
+
this.noSandbox = shouldDisableSandbox(options.noSandbox);
|
|
34
|
+
if (options.launch !== undefined)
|
|
35
|
+
this.launch = options.launch;
|
|
36
|
+
if (options.findExecutable !== undefined)
|
|
37
|
+
this.findExecutable = options.findExecutable;
|
|
38
|
+
}
|
|
39
|
+
async version() {
|
|
40
|
+
if (this.cachedVersion !== undefined)
|
|
41
|
+
return this.cachedVersion;
|
|
42
|
+
this.cachedVersion = `mermaid-${packageVersion('mermaid')}`;
|
|
43
|
+
return this.cachedVersion;
|
|
44
|
+
}
|
|
45
|
+
/** Bundle UMD autocontenido de Mermaid (define `window.mermaid`). */
|
|
46
|
+
async bundle() {
|
|
47
|
+
this.bundlePromise ??= (async () => {
|
|
48
|
+
const entry = require_.resolve('mermaid/package.json');
|
|
49
|
+
const file = path.join(path.dirname(entry), 'dist', 'mermaid.min.js');
|
|
50
|
+
try {
|
|
51
|
+
return await readFile(file, 'utf8');
|
|
52
|
+
}
|
|
53
|
+
catch (err) {
|
|
54
|
+
throw new RenderError(TYPE, 'no se encuentra el bundle de Mermaid', `${file}\n${err instanceof Error ? err.message : String(err)}`);
|
|
55
|
+
}
|
|
56
|
+
})();
|
|
57
|
+
return this.bundlePromise;
|
|
58
|
+
}
|
|
59
|
+
async browser() {
|
|
60
|
+
this.browserPromise ??= (async () => {
|
|
61
|
+
const executablePath = this.findExecutable(this.browserPath);
|
|
62
|
+
if (executablePath === undefined) {
|
|
63
|
+
throw new RenderError(TYPE, 'no se encontro un navegador Chromium', browserNotFoundHelp());
|
|
64
|
+
}
|
|
65
|
+
try {
|
|
66
|
+
return await this.launch(executablePath, { noSandbox: this.noSandbox });
|
|
67
|
+
}
|
|
68
|
+
catch (err) {
|
|
69
|
+
throw asRenderError(TYPE, err, `no se pudo lanzar el navegador en ${executablePath}`);
|
|
70
|
+
}
|
|
71
|
+
})();
|
|
72
|
+
return this.browserPromise;
|
|
73
|
+
}
|
|
74
|
+
async render(source, options) {
|
|
75
|
+
assertFormat(TYPE, options.format, SUPPORTED);
|
|
76
|
+
if (source.trim() === '')
|
|
77
|
+
throw new RenderError(TYPE, 'el diagrama Mermaid esta vacio');
|
|
78
|
+
const browser = await this.browser();
|
|
79
|
+
const bundle = await this.bundle();
|
|
80
|
+
const page = await browser.newPage();
|
|
81
|
+
const id = `docviz-${(this.counter += 1)}`;
|
|
82
|
+
try {
|
|
83
|
+
// Bloquea toda peticion de red que Mermaid pudiera intentar (p.ej. fuentes).
|
|
84
|
+
await page.setRequestInterception?.(true);
|
|
85
|
+
page.on('request', ((req) => {
|
|
86
|
+
if (req.url().startsWith('data:') || req.url() === 'about:blank')
|
|
87
|
+
req.continue();
|
|
88
|
+
else
|
|
89
|
+
req.abort();
|
|
90
|
+
}));
|
|
91
|
+
await page.setContent(`<!doctype html><html><head><meta charset="utf-8"><style>body{margin:0;background:${options.theme.palette.background};font-family:${options.theme.fontFamily}}</style></head><body><div id="host"></div></body></html>`, { waitUntil: 'domcontentloaded' });
|
|
92
|
+
await page.addScriptTag({ content: bundle });
|
|
93
|
+
const result = await withPageTimeout(options.timeoutMs, page.evaluate(renderMermaidInPage, {
|
|
94
|
+
code: source,
|
|
95
|
+
id,
|
|
96
|
+
config: {
|
|
97
|
+
startOnLoad: false,
|
|
98
|
+
// `strict` desactiva HTML arbitrario y manejadores `click` dentro
|
|
99
|
+
// del diagrama: el codigo viene de un documento, no de un humano.
|
|
100
|
+
securityLevel: 'strict',
|
|
101
|
+
theme: options.theme.mermaid.theme,
|
|
102
|
+
themeVariables: options.theme.mermaid.themeVariables,
|
|
103
|
+
fontFamily: options.theme.fontFamily,
|
|
104
|
+
flowchart: { htmlLabels: false, useMaxWidth: false, curve: 'basis' },
|
|
105
|
+
sequence: { useMaxWidth: false },
|
|
106
|
+
gantt: { useMaxWidth: false },
|
|
107
|
+
class: { useMaxWidth: false },
|
|
108
|
+
state: { useMaxWidth: false },
|
|
109
|
+
er: { useMaxWidth: false },
|
|
110
|
+
journey: { useMaxWidth: false },
|
|
111
|
+
pie: { useMaxWidth: false },
|
|
112
|
+
},
|
|
113
|
+
}));
|
|
114
|
+
if ('error' in result && result.error !== undefined) {
|
|
115
|
+
throw new RenderError(TYPE, 'Mermaid no pudo dibujar el diagrama', result.error);
|
|
116
|
+
}
|
|
117
|
+
const svg = result.svg;
|
|
118
|
+
if (svg === undefined || !svg.includes('<svg')) {
|
|
119
|
+
throw new RenderError(TYPE, 'Mermaid no produjo un SVG valido');
|
|
120
|
+
}
|
|
121
|
+
return svgResult(TYPE, stripMermaidIds(svg, id), options);
|
|
122
|
+
}
|
|
123
|
+
finally {
|
|
124
|
+
await page.close().catch(() => undefined);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
async dispose() {
|
|
128
|
+
const browser = await this.browserPromise?.catch(() => undefined);
|
|
129
|
+
this.browserPromise = undefined;
|
|
130
|
+
await browser?.close().catch(() => undefined);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Mermaid usa el id de render como prefijo de todas sus clases CSS. Se
|
|
135
|
+
* reemplaza por uno estable para que dos builds del mismo diagrama produzcan
|
|
136
|
+
* bytes identicos (requisito de determinismo del hash).
|
|
137
|
+
*/
|
|
138
|
+
function stripMermaidIds(svg, id) {
|
|
139
|
+
return estabilizarCommits(svg.split(id).join('docviz-diagram'));
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Identificadores de commit deterministas en `git-graph`.
|
|
143
|
+
*
|
|
144
|
+
* Mermaid inventa un hash aleatorio de siete caracteres para cada commit que no
|
|
145
|
+
* lleva `id`, y lo escribe en las clases del SVG. El resultado es que **el mismo
|
|
146
|
+
* bloque produce bytes distintos en cada render**, lo que rompe la promesa
|
|
147
|
+
* central del proyecto: el nombre del recurso se deriva de la fuente, asi que el
|
|
148
|
+
* archivo se llama igual y cambia por dentro. Un `git diff` con ruido en cada
|
|
149
|
+
* build, y un cache que sirve una imagen distinta de la que se acaba de dibujar.
|
|
150
|
+
*
|
|
151
|
+
* Se sustituyen por un contador en orden de aparicion. Sigue habiendo un
|
|
152
|
+
* identificador distinto por commit —que es para lo que Mermaid los usa— pero
|
|
153
|
+
* ahora es el mismo en cada ejecucion.
|
|
154
|
+
*/
|
|
155
|
+
function estabilizarCommits(svg) {
|
|
156
|
+
const aleatorio = /\b(\d+)-([0-9a-f]{7})\b/g;
|
|
157
|
+
const vistos = new Map();
|
|
158
|
+
return svg.replace(aleatorio, (completo, indice, hash) => {
|
|
159
|
+
const clave = `${indice}-${hash}`;
|
|
160
|
+
const existente = vistos.get(clave);
|
|
161
|
+
if (existente !== undefined)
|
|
162
|
+
return existente;
|
|
163
|
+
const estable = `${indice}-c${vistos.size + 1}`;
|
|
164
|
+
vistos.set(clave, estable);
|
|
165
|
+
return estable;
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
async function withPageTimeout(timeoutMs, work) {
|
|
169
|
+
let timer;
|
|
170
|
+
try {
|
|
171
|
+
return await Promise.race([
|
|
172
|
+
work,
|
|
173
|
+
new Promise((_, reject) => {
|
|
174
|
+
timer = setTimeout(() => reject(new RenderError(TYPE, `el render supero el limite de ${timeoutMs} ms`)), timeoutMs);
|
|
175
|
+
timer.unref?.();
|
|
176
|
+
}),
|
|
177
|
+
]);
|
|
178
|
+
}
|
|
179
|
+
finally {
|
|
180
|
+
if (timer !== undefined)
|
|
181
|
+
clearTimeout(timer);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
/** Lanzador real: Chromium sin red, porque el contenido puede ser confidencial. */
|
|
185
|
+
const defaultLaunch = async (executablePath, opciones) => {
|
|
186
|
+
const puppeteer = await import('puppeteer-core');
|
|
187
|
+
return (await puppeteer.default.launch({
|
|
188
|
+
executablePath,
|
|
189
|
+
headless: true,
|
|
190
|
+
args: chromiumLaunchArgs(opciones?.noSandbox === true),
|
|
191
|
+
}));
|
|
192
|
+
};
|
|
193
|
+
export function createMermaidRenderer(options) {
|
|
194
|
+
return new MermaidRenderer(options);
|
|
195
|
+
}
|
|
196
|
+
//# sourceMappingURL=mermaid.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mermaid.js","sourceRoot":"","sources":["../../src/renderers/mermaid.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Renderer PlantUML — JVM local con `plantuml.jar` vendorizado.
|
|
3
|
+
*
|
|
4
|
+
* No se usa ningun servicio publico: el codigo fuente nunca sale del proceso.
|
|
5
|
+
* La comunicacion es por `-pipe` (stdin/stdout), asi que PlantUML nunca recibe
|
|
6
|
+
* una ruta de archivo procedente del documento.
|
|
7
|
+
*/
|
|
8
|
+
import type { DiagramRenderer, OutputFormat, RenderOptions, RenderResult } from '../core/types.js';
|
|
9
|
+
export interface PlantUmlOptions {
|
|
10
|
+
/** Ruta al jar. Por defecto `vendor/plantuml.jar` del propio paquete. */
|
|
11
|
+
jarPath?: string;
|
|
12
|
+
/** Ejecutable de Java. */
|
|
13
|
+
javaPath?: string;
|
|
14
|
+
/** Memoria maxima de la JVM. */
|
|
15
|
+
maxHeap?: string;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Donde vive el jar cuando nadie dice lo contrario.
|
|
19
|
+
*
|
|
20
|
+
* Es el **directorio del paquete**, no el del proyecto que lo usa: instalado
|
|
21
|
+
* como dependencia, el jar viaja dentro de `node_modules`. Se exporta porque
|
|
22
|
+
* `docviz doctor` tiene que mirar exactamente aqui; si lo dedujera por su
|
|
23
|
+
* cuenta diria que falta un jar que el renderer encuentra sin problema.
|
|
24
|
+
*/
|
|
25
|
+
export declare function defaultJarPath(): string;
|
|
26
|
+
/** Ruta efectiva del jar segun configuracion, entorno y valor por defecto. */
|
|
27
|
+
export declare function resolveJarPath(explicit?: string): string;
|
|
28
|
+
export declare class PlantUmlRenderer implements DiagramRenderer {
|
|
29
|
+
readonly type = "plantuml";
|
|
30
|
+
readonly defaultFormat: OutputFormat;
|
|
31
|
+
readonly supportedFormats: readonly OutputFormat[];
|
|
32
|
+
private readonly jarPath;
|
|
33
|
+
private readonly javaPath;
|
|
34
|
+
private readonly maxHeap;
|
|
35
|
+
private cachedVersion?;
|
|
36
|
+
constructor(options?: PlantUmlOptions);
|
|
37
|
+
version(): Promise<string>;
|
|
38
|
+
render(source: string, options: RenderOptions): Promise<RenderResult>;
|
|
39
|
+
/**
|
|
40
|
+
* Inserta el preambulo del tema justo despues de la directiva de apertura.
|
|
41
|
+
* Si el usuario ya definio un `skinparam`, el suyo gana porque va despues.
|
|
42
|
+
*/
|
|
43
|
+
private applyTheme;
|
|
44
|
+
/**
|
|
45
|
+
* Bloquea las directivas que harian que PlantUML lea disco o red.
|
|
46
|
+
*
|
|
47
|
+
* Se evalua linea a linea: una inclusion de la biblioteca estandar del jar es
|
|
48
|
+
* legitima, y comprobar el documento entero de una vez no permitiria
|
|
49
|
+
* distinguirla de un `!include /etc/passwd` en la linea siguiente.
|
|
50
|
+
*/
|
|
51
|
+
private assertNoFileAccess;
|
|
52
|
+
private assertJarAvailable;
|
|
53
|
+
private runJava;
|
|
54
|
+
}
|
|
55
|
+
export declare function createPlantUmlRenderer(options?: PlantUmlOptions): DiagramRenderer;
|
|
56
|
+
//# sourceMappingURL=plantuml.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plantuml.d.ts","sourceRoot":"","sources":["../../src/renderers/plantuml.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAOH,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAwBnG,MAAM,WAAW,eAAe;IAC9B,yEAAyE;IACzE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,0BAA0B;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gCAAgC;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAIvC;AAED,8EAA8E;AAC9E,wBAAgB,cAAc,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAExD;AAED,qBAAa,gBAAiB,YAAW,eAAe;IACtD,QAAQ,CAAC,IAAI,cAAQ;IACrB,QAAQ,CAAC,aAAa,EAAE,YAAY,CAAS;IAC7C,QAAQ,CAAC,gBAAgB,0BAAa;IAEtC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,aAAa,CAAC,CAAS;gBAEnB,OAAO,GAAE,eAAoB;IAMnC,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;IAS1B,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;IAwB3E;;;OAGG;IACH,OAAO,CAAC,UAAU;IAalB;;;;;;OAMG;IACH,OAAO,CAAC,kBAAkB;YAeZ,kBAAkB;IAYhC,OAAO,CAAC,OAAO;CA0DhB;AAqBD,wBAAgB,sBAAsB,CAAC,OAAO,CAAC,EAAE,eAAe,GAAG,eAAe,CAEjF"}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Renderer PlantUML — JVM local con `plantuml.jar` vendorizado.
|
|
3
|
+
*
|
|
4
|
+
* No se usa ningun servicio publico: el codigo fuente nunca sale del proceso.
|
|
5
|
+
* La comunicacion es por `-pipe` (stdin/stdout), asi que PlantUML nunca recibe
|
|
6
|
+
* una ruta de archivo procedente del documento.
|
|
7
|
+
*/
|
|
8
|
+
import { spawn } from 'node:child_process';
|
|
9
|
+
import { access, constants } from 'node:fs/promises';
|
|
10
|
+
import path from 'node:path';
|
|
11
|
+
import { fileURLToPath } from 'node:url';
|
|
12
|
+
import { RenderError } from '../core/errors.js';
|
|
13
|
+
import { assertFormat, pngResult, svgResult } from './base.js';
|
|
14
|
+
const TYPE = 'plantuml';
|
|
15
|
+
const SUPPORTED = ['svg', 'png'];
|
|
16
|
+
/**
|
|
17
|
+
* Inclusiones permitidas: solo la biblioteca estandar que viaja dentro del jar.
|
|
18
|
+
*
|
|
19
|
+
* `!include <C4/C4_Context>` no toca el sistema de archivos ni la red: PlantUML
|
|
20
|
+
* resuelve la forma `<...>` contra los recursos empaquetados. Es lo que permite
|
|
21
|
+
* dibujar C4, y bloquearla obligaria a depender de un servicio externo para algo
|
|
22
|
+
* que ya esta en la maquina.
|
|
23
|
+
*/
|
|
24
|
+
const STDLIB_INCLUDE = /^\s*!include(?:sub)?\s+<[^>\n]+>\s*$/i;
|
|
25
|
+
/** Directivas de PlantUML que permiten leer o escribir en disco / en la red. */
|
|
26
|
+
const FORBIDDEN_DIRECTIVES = [
|
|
27
|
+
{ re: /^\s*!includeurl\b/im, what: '!includeurl' },
|
|
28
|
+
{ re: /^\s*!include(?:sub)?\b/im, what: '!include' },
|
|
29
|
+
{ re: /^\s*!import\b/im, what: '!import' },
|
|
30
|
+
{ re: /^\s*!theme\s+.*\bfrom\b/im, what: '!theme ... from' },
|
|
31
|
+
];
|
|
32
|
+
/**
|
|
33
|
+
* Donde vive el jar cuando nadie dice lo contrario.
|
|
34
|
+
*
|
|
35
|
+
* Es el **directorio del paquete**, no el del proyecto que lo usa: instalado
|
|
36
|
+
* como dependencia, el jar viaja dentro de `node_modules`. Se exporta porque
|
|
37
|
+
* `docviz doctor` tiene que mirar exactamente aqui; si lo dedujera por su
|
|
38
|
+
* cuenta diria que falta un jar que el renderer encuentra sin problema.
|
|
39
|
+
*/
|
|
40
|
+
export function defaultJarPath() {
|
|
41
|
+
const here = path.dirname(fileURLToPath(import.meta.url));
|
|
42
|
+
// dist/renderers/plantuml.js -> raiz del paquete
|
|
43
|
+
return path.resolve(here, '..', '..', 'vendor', 'plantuml.jar');
|
|
44
|
+
}
|
|
45
|
+
/** Ruta efectiva del jar segun configuracion, entorno y valor por defecto. */
|
|
46
|
+
export function resolveJarPath(explicit) {
|
|
47
|
+
return path.resolve(explicit ?? process.env['DOCVIZ_PLANTUML_JAR'] ?? defaultJarPath());
|
|
48
|
+
}
|
|
49
|
+
export class PlantUmlRenderer {
|
|
50
|
+
type = TYPE;
|
|
51
|
+
defaultFormat = 'svg';
|
|
52
|
+
supportedFormats = SUPPORTED;
|
|
53
|
+
jarPath;
|
|
54
|
+
javaPath;
|
|
55
|
+
maxHeap;
|
|
56
|
+
cachedVersion;
|
|
57
|
+
constructor(options = {}) {
|
|
58
|
+
this.jarPath = resolveJarPath(options.jarPath);
|
|
59
|
+
this.javaPath = options.javaPath ?? process.env['DOCVIZ_JAVA'] ?? 'java';
|
|
60
|
+
this.maxHeap = options.maxHeap ?? '1024m';
|
|
61
|
+
}
|
|
62
|
+
async version() {
|
|
63
|
+
if (this.cachedVersion !== undefined)
|
|
64
|
+
return this.cachedVersion;
|
|
65
|
+
await this.assertJarAvailable();
|
|
66
|
+
const { stdout } = await this.runJava(['-version'], undefined, 60_000);
|
|
67
|
+
const match = /PlantUML version ([\w.]+)/i.exec(stdout.toString('utf8'));
|
|
68
|
+
this.cachedVersion = `plantuml-${match?.[1] ?? 'desconocida'}`;
|
|
69
|
+
return this.cachedVersion;
|
|
70
|
+
}
|
|
71
|
+
async render(source, options) {
|
|
72
|
+
assertFormat(TYPE, options.format, SUPPORTED);
|
|
73
|
+
await this.assertJarAvailable();
|
|
74
|
+
this.assertNoFileAccess(source);
|
|
75
|
+
const prepared = this.applyTheme(source, options);
|
|
76
|
+
const args = [options.format === 'png' ? '-tpng' : '-tsvg'];
|
|
77
|
+
const { stdout, stderr, code } = await this.runJava(['-pipe', '-failfast2', '-charset', 'UTF-8', ...args], Buffer.from(prepared, 'utf8'), options.timeoutMs);
|
|
78
|
+
if (code !== 0) {
|
|
79
|
+
throw new RenderError(TYPE, describePlantUmlError(stderr.toString('utf8')), stderr.toString('utf8').trim());
|
|
80
|
+
}
|
|
81
|
+
if (stdout.byteLength === 0) {
|
|
82
|
+
throw new RenderError(TYPE, 'PlantUML no produjo salida', stderr.toString('utf8').trim());
|
|
83
|
+
}
|
|
84
|
+
if (options.format === 'png')
|
|
85
|
+
return pngResult(TYPE, stdout, options);
|
|
86
|
+
return svgResult(TYPE, stdout.toString('utf8'), options);
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Inserta el preambulo del tema justo despues de la directiva de apertura.
|
|
90
|
+
* Si el usuario ya definio un `skinparam`, el suyo gana porque va despues.
|
|
91
|
+
*/
|
|
92
|
+
applyTheme(source, options) {
|
|
93
|
+
const skin = options.theme.plantuml.skinparams.join('\n');
|
|
94
|
+
const trimmed = source.trim();
|
|
95
|
+
const openTag = /^@start[a-z]+\b.*$/im.exec(trimmed);
|
|
96
|
+
if (openTag === null) {
|
|
97
|
+
// Sin @startuml explicito PlantUML asume uno; lo hacemos explicito para
|
|
98
|
+
// poder inyectar el tema de forma fiable.
|
|
99
|
+
return `@startuml\n${skin}\n${trimmed}\n@enduml\n`;
|
|
100
|
+
}
|
|
101
|
+
const insertAt = openTag.index + openTag[0].length;
|
|
102
|
+
return `${trimmed.slice(0, insertAt)}\n${skin}\n${trimmed.slice(insertAt)}\n`;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Bloquea las directivas que harian que PlantUML lea disco o red.
|
|
106
|
+
*
|
|
107
|
+
* Se evalua linea a linea: una inclusion de la biblioteca estandar del jar es
|
|
108
|
+
* legitima, y comprobar el documento entero de una vez no permitiria
|
|
109
|
+
* distinguirla de un `!include /etc/passwd` en la linea siguiente.
|
|
110
|
+
*/
|
|
111
|
+
assertNoFileAccess(source) {
|
|
112
|
+
for (const line of source.split('\n')) {
|
|
113
|
+
if (STDLIB_INCLUDE.test(line))
|
|
114
|
+
continue;
|
|
115
|
+
for (const { re, what } of FORBIDDEN_DIRECTIVES) {
|
|
116
|
+
if (re.test(line)) {
|
|
117
|
+
throw new RenderError(TYPE, `la directiva ${what} esta deshabilitada por seguridad`, 'DocViz solo admite la biblioteca estandar empaquetada, con la forma !include <biblioteca/archivo>');
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
async assertJarAvailable() {
|
|
123
|
+
try {
|
|
124
|
+
await access(this.jarPath, constants.R_OK);
|
|
125
|
+
}
|
|
126
|
+
catch {
|
|
127
|
+
throw new RenderError(TYPE, `no se encuentra plantuml.jar en ${this.jarPath}`, 'ejecuta `npx docviz setup` para descargarlo, o define renderers.plantuml.jar en docviz.config.yaml');
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
runJava(jarArgs, stdin, timeoutMs) {
|
|
131
|
+
return new Promise((resolve, reject) => {
|
|
132
|
+
const child = spawn(this.javaPath, [
|
|
133
|
+
'-Djava.awt.headless=true',
|
|
134
|
+
'-Dfile.encoding=UTF-8',
|
|
135
|
+
`-Xmx${this.maxHeap}`,
|
|
136
|
+
'-jar',
|
|
137
|
+
this.jarPath,
|
|
138
|
+
...jarArgs,
|
|
139
|
+
], { stdio: ['pipe', 'pipe', 'pipe'] });
|
|
140
|
+
const out = [];
|
|
141
|
+
const err = [];
|
|
142
|
+
let settled = false;
|
|
143
|
+
const timer = setTimeout(() => {
|
|
144
|
+
if (settled)
|
|
145
|
+
return;
|
|
146
|
+
settled = true;
|
|
147
|
+
child.kill('SIGKILL');
|
|
148
|
+
reject(new RenderError(TYPE, `el render supero el limite de ${timeoutMs} ms`));
|
|
149
|
+
}, timeoutMs);
|
|
150
|
+
timer.unref?.();
|
|
151
|
+
child.stdout.on('data', (c) => out.push(c));
|
|
152
|
+
child.stderr.on('data', (c) => err.push(c));
|
|
153
|
+
child.on('error', (e) => {
|
|
154
|
+
if (settled)
|
|
155
|
+
return;
|
|
156
|
+
settled = true;
|
|
157
|
+
clearTimeout(timer);
|
|
158
|
+
reject(new RenderError(TYPE, `no se pudo ejecutar Java (${this.javaPath})`, `${e.message}\ninstala un JRE 8+ o define renderers.plantuml.java en docviz.config.yaml`));
|
|
159
|
+
});
|
|
160
|
+
child.on('close', (code) => {
|
|
161
|
+
if (settled)
|
|
162
|
+
return;
|
|
163
|
+
settled = true;
|
|
164
|
+
clearTimeout(timer);
|
|
165
|
+
resolve({ stdout: Buffer.concat(out), stderr: Buffer.concat(err), code: code ?? -1 });
|
|
166
|
+
});
|
|
167
|
+
if (stdin !== undefined)
|
|
168
|
+
child.stdin.end(stdin);
|
|
169
|
+
else
|
|
170
|
+
child.stdin.end();
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* PlantUML escribe en stderr un bloque `ERROR / <linea> / <mensaje>`.
|
|
176
|
+
* Se extrae el mensaje util para que el reporte no sea "exit code 200".
|
|
177
|
+
*/
|
|
178
|
+
function describePlantUmlError(stderr) {
|
|
179
|
+
const lines = stderr
|
|
180
|
+
.split('\n')
|
|
181
|
+
.map((l) => l.trim())
|
|
182
|
+
.filter((l) => l !== '');
|
|
183
|
+
const errIdx = lines.findIndex((l) => l.toUpperCase() === 'ERROR');
|
|
184
|
+
if (errIdx >= 0) {
|
|
185
|
+
const lineNo = lines[errIdx + 1];
|
|
186
|
+
const message = lines.slice(errIdx + 2).find((l) => l !== '') ?? 'error de sintaxis';
|
|
187
|
+
const where = /^\d+$/.test(lineNo ?? '') ? ` (linea ${lineNo} del diagrama)` : '';
|
|
188
|
+
return `${message}${where}`;
|
|
189
|
+
}
|
|
190
|
+
return lines[0] ?? 'PlantUML fallo sin describir el motivo';
|
|
191
|
+
}
|
|
192
|
+
export function createPlantUmlRenderer(options) {
|
|
193
|
+
return new PlantUmlRenderer(options);
|
|
194
|
+
}
|
|
195
|
+
//# sourceMappingURL=plantuml.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plantuml.js","sourceRoot":"","sources":["../../src/renderers/plantuml.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
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
|
+
* Deja el SVG con solo los elementos y atributos permitidos.
|
|
11
|
+
*
|
|
12
|
+
* No intenta reparar un SVG mal formado: recorre las etiquetas respetando las
|
|
13
|
+
* comillas, y lo que no reconoce lo descarta.
|
|
14
|
+
*/
|
|
15
|
+
export declare function sanitizeSvg(svg: string): string;
|
|
16
|
+
/**
|
|
17
|
+
* Garantiza `width`, `height` y `viewBox` numericos en el elemento raiz.
|
|
18
|
+
*
|
|
19
|
+
* Mermaid emite `width="100%"` sin `height`, lo que en un visor Markdown
|
|
20
|
+
* produce una imagen de altura cero. Aqui se deriva el tamano real del
|
|
21
|
+
* `viewBox` y se fija en pixeles.
|
|
22
|
+
*/
|
|
23
|
+
export declare function normalizeSvgDimensions(svg: string): string;
|
|
24
|
+
/**
|
|
25
|
+
* Renumera los identificadores internos del SVG en orden de aparicion.
|
|
26
|
+
*
|
|
27
|
+
* Vega mantiene un contador global de `clipPath` por proceso: el mismo grafico
|
|
28
|
+
* renderizado dos veces produce `clip1` y luego `clip2`, es decir bytes
|
|
29
|
+
* distintos para la misma entrada. Eso rompe el determinismo que exige el
|
|
30
|
+
* modelo de cache, asi que los ids se normalizan aqui para todos los motores.
|
|
31
|
+
*
|
|
32
|
+
* Se reescribe tanto el atributo `id` como toda referencia `#id`: Mermaid
|
|
33
|
+
* incrusta una hoja de estilos cuyos selectores estan acotados por el id del
|
|
34
|
+
* elemento raiz (`#mi-id .task { ... }`). Renombrar solo el atributo dejaria
|
|
35
|
+
* esos selectores sin destino y el diagrama saldria sin estilos, con los
|
|
36
|
+
* rectangulos en negro.
|
|
37
|
+
*/
|
|
38
|
+
export declare function stabilizeSvgIds(svg: string, prefix?: string): string;
|
|
39
|
+
export declare function escapeXml(text: string): string;
|
|
40
|
+
/** Inserta `<title>` como primer hijo del `<svg>` si aun no existe uno. */
|
|
41
|
+
export declare function injectTitle(svg: string, title: string | undefined): string;
|
|
42
|
+
/** Asegura que exista la declaracion de namespace SVG. */
|
|
43
|
+
export declare function ensureNamespace(svg: string): string;
|
|
44
|
+
/** Pipeline completo aplicado a todo SVG antes de escribirlo a disco. */
|
|
45
|
+
export declare function finalizeSvg(svg: string, title?: string): string;
|
|
46
|
+
//# sourceMappingURL=svg-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"svg-utils.d.ts","sourceRoot":"","sources":["../../src/renderers/svg-utils.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AA8NH;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAwD/C;AAyCD;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAsC1D;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,SAAO,GAAG,MAAM,CA2BlE;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAO9C;AAED,2EAA2E;AAC3E,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAQ1E;AAED,0DAA0D;AAC1D,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAMnD;AAED,yEAAyE;AACzE,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAa/D"}
|