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,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Piezas compartidas por todos los renderers: limite de tiempo, limite de
|
|
3
|
+
* tamano y construccion del `RenderResult` (seccion 12, puntos 3 y 4).
|
|
4
|
+
*/
|
|
5
|
+
import { RenderError } from '../core/errors.js';
|
|
6
|
+
import { MIME_TYPES } from '../core/types.js';
|
|
7
|
+
import { applyColorScheme } from './color-scheme.js';
|
|
8
|
+
import { finalizeSvg } from './svg-utils.js';
|
|
9
|
+
/** Ejecuta una promesa con limite de tiempo; superarlo es un `RenderError`. */
|
|
10
|
+
export async function withTimeout(renderer, timeoutMs, work) {
|
|
11
|
+
const controller = new AbortController();
|
|
12
|
+
let timer;
|
|
13
|
+
const timeout = new Promise((_, reject) => {
|
|
14
|
+
timer = setTimeout(() => {
|
|
15
|
+
controller.abort();
|
|
16
|
+
reject(new RenderError(renderer, `el render supero el limite de ${timeoutMs} ms`));
|
|
17
|
+
}, timeoutMs);
|
|
18
|
+
timer.unref?.();
|
|
19
|
+
});
|
|
20
|
+
try {
|
|
21
|
+
return await Promise.race([work(controller.signal), timeout]);
|
|
22
|
+
}
|
|
23
|
+
finally {
|
|
24
|
+
if (timer !== undefined)
|
|
25
|
+
clearTimeout(timer);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/** Rechaza recursos que superen el tamano maximo configurado. */
|
|
29
|
+
export function enforceSize(renderer, content, maxBytes) {
|
|
30
|
+
if (content.byteLength > maxBytes) {
|
|
31
|
+
throw new RenderError(renderer, `el recurso generado ocupa ${content.byteLength} bytes y supera el maximo de ${maxBytes}`, 'reduce el numero de nodos del diagrama o sube renderers.maxOutputBytes en docviz.config.yaml');
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/** Comprueba que el formato pedido este soportado por el renderer. */
|
|
35
|
+
export function assertFormat(renderer, format, supported) {
|
|
36
|
+
if (!supported.includes(format)) {
|
|
37
|
+
throw new RenderError(renderer, `el formato "${format}" no esta soportado por el renderer ${renderer}`, `formatos soportados: ${supported.join(', ')}`);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/** Normaliza, sanea y empaqueta un SVG como `RenderResult`. */
|
|
41
|
+
export function svgResult(renderer, svg, options) {
|
|
42
|
+
// El esquema dual se aplica al final, sobre los colores que el tema ya inyecto.
|
|
43
|
+
const finalized = applyColorScheme(finalizeSvg(svg, options.title), options.theme);
|
|
44
|
+
const content = Buffer.from(finalized, 'utf8');
|
|
45
|
+
enforceSize(renderer, content, options.maxOutputBytes);
|
|
46
|
+
return { format: 'svg', content, mimeType: MIME_TYPES.svg };
|
|
47
|
+
}
|
|
48
|
+
export function pngResult(renderer, png, options) {
|
|
49
|
+
enforceSize(renderer, png, options.maxOutputBytes);
|
|
50
|
+
return { format: 'png', content: png, mimeType: MIME_TYPES.png };
|
|
51
|
+
}
|
|
52
|
+
/** Convierte un error desconocido en `RenderError` sin perder el detalle. */
|
|
53
|
+
export function asRenderError(renderer, err, fallback) {
|
|
54
|
+
if (err instanceof RenderError)
|
|
55
|
+
return err;
|
|
56
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
57
|
+
return new RenderError(renderer, fallback, message);
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=base.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/renderers/base.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Renderer BPMN (bpmn-js dentro de un Chromium local).
|
|
3
|
+
*
|
|
4
|
+
* bpmn-js es la implementacion de referencia de la notacion, pero es una
|
|
5
|
+
* biblioteca de navegador: necesita un DOM para medir y dibujar. Se ejecuta con
|
|
6
|
+
* el mismo Chromium que usa Mermaid, sin acceso a la red.
|
|
7
|
+
*/
|
|
8
|
+
import type { DiagramRenderer, OutputFormat, RenderOptions, RenderResult } from '../core/types.js';
|
|
9
|
+
import type { Theme } from '../themes/types.js';
|
|
10
|
+
/**
|
|
11
|
+
* Lanzador del navegador.
|
|
12
|
+
*
|
|
13
|
+
* Se inyecta para poder probar los caminos de error —no hay navegador, no
|
|
14
|
+
* arranca, la pagina falla— sin depender de que la maquina que ejecuta las
|
|
15
|
+
* pruebas tenga o no un Chromium, y sin provocar fallos reales del sistema.
|
|
16
|
+
*/
|
|
17
|
+
export type LaunchBrowser = (executablePath: string, opciones?: {
|
|
18
|
+
noSandbox: boolean;
|
|
19
|
+
}) => Promise<Browser>;
|
|
20
|
+
export interface BpmnOptions {
|
|
21
|
+
/** Sustituye el lanzador real. Solo se usa en pruebas. */
|
|
22
|
+
launch?: LaunchBrowser;
|
|
23
|
+
/** Sustituye la busqueda del ejecutable. Solo se usa en pruebas. */
|
|
24
|
+
findExecutable?: (explicit?: string) => string | undefined;
|
|
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
|
+
};
|
|
33
|
+
export type Page = {
|
|
34
|
+
setContent(html: string, options?: unknown): Promise<void>;
|
|
35
|
+
addScriptTag(options: {
|
|
36
|
+
content: string;
|
|
37
|
+
}): Promise<unknown>;
|
|
38
|
+
evaluate<T, A extends unknown[]>(fn: (...args: A) => T | Promise<T>, ...args: A): Promise<T>;
|
|
39
|
+
setRequestInterception?(v: boolean): Promise<void>;
|
|
40
|
+
on(event: string, handler: (...args: never[]) => void): void;
|
|
41
|
+
close(): Promise<void>;
|
|
42
|
+
};
|
|
43
|
+
export declare class BpmnRenderer implements DiagramRenderer {
|
|
44
|
+
readonly type = "bpmn";
|
|
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
|
+
constructor(options?: BpmnOptions);
|
|
55
|
+
version(): Promise<string>;
|
|
56
|
+
private bundle;
|
|
57
|
+
private browser;
|
|
58
|
+
render(source: string, options: RenderOptions): Promise<RenderResult>;
|
|
59
|
+
dispose(): Promise<void>;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* bpmn-js dibuja en negro sobre transparente. Se anaden el fondo del tema y una
|
|
63
|
+
* hoja de estilos que colorea trazos y textos sin alterar la notacion: en BPMN
|
|
64
|
+
* la forma tiene significado normativo, el color no.
|
|
65
|
+
*/
|
|
66
|
+
export declare function applyTheme(svg: string, theme: Theme): string;
|
|
67
|
+
export declare function createBpmnRenderer(options?: BpmnOptions): DiagramRenderer;
|
|
68
|
+
//# sourceMappingURL=bpmn.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bpmn.d.ts","sourceRoot":"","sources":["../../src/renderers/bpmn.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAKnG,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAOhD;;;;;;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,WAAW;IAC1B,0DAA0D;IAC1D,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,oEAAoE;IACpE,cAAc,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;IAC3D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oEAAoE;IACpE,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,MAAM,OAAO,GAAG;IAAE,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAAC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,CAAC;AAC3E,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;IAC7D,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB,CAAC;AAEF,qBAAa,YAAa,YAAW,eAAe;IAClD,QAAQ,CAAC,IAAI,UAAQ;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;gBAEnB,OAAO,GAAE,WAAgB;IAO/B,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;YAKlB,MAAM;YAiBN,OAAO;IAef,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;IA2CrE,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAK/B;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,MAAM,CAgB5D;AA8BD,wBAAgB,kBAAkB,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG,eAAe,CAEzE"}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Renderer BPMN (bpmn-js dentro de un Chromium local).
|
|
3
|
+
*
|
|
4
|
+
* bpmn-js es la implementacion de referencia de la notacion, pero es una
|
|
5
|
+
* biblioteca de navegador: necesita un DOM para medir y dibujar. Se ejecuta con
|
|
6
|
+
* el mismo Chromium que usa Mermaid, sin acceso a la red.
|
|
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 { renderBpmnInPage } from './in-page.js';
|
|
16
|
+
const TYPE = 'bpmn';
|
|
17
|
+
const SUPPORTED = ['svg'];
|
|
18
|
+
const require_ = createRequire(import.meta.url);
|
|
19
|
+
export class BpmnRenderer {
|
|
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
|
+
constructor(options = {}) {
|
|
31
|
+
this.browserPath = options.browserPath;
|
|
32
|
+
this.noSandbox = shouldDisableSandbox(options.noSandbox);
|
|
33
|
+
if (options.launch !== undefined)
|
|
34
|
+
this.launch = options.launch;
|
|
35
|
+
if (options.findExecutable !== undefined)
|
|
36
|
+
this.findExecutable = options.findExecutable;
|
|
37
|
+
}
|
|
38
|
+
async version() {
|
|
39
|
+
this.cachedVersion ??= `bpmn-js-${packageVersion('bpmn-js')}`;
|
|
40
|
+
return this.cachedVersion;
|
|
41
|
+
}
|
|
42
|
+
async bundle() {
|
|
43
|
+
this.bundlePromise ??= (async () => {
|
|
44
|
+
const pkg = require_.resolve('bpmn-js/package.json');
|
|
45
|
+
const file = path.join(path.dirname(pkg), 'dist', 'bpmn-viewer.production.min.js');
|
|
46
|
+
try {
|
|
47
|
+
return await readFile(file, 'utf8');
|
|
48
|
+
}
|
|
49
|
+
catch (err) {
|
|
50
|
+
throw new RenderError(TYPE, 'no se encuentra el visor de bpmn-js', `${file}\n${err instanceof Error ? err.message : String(err)}`);
|
|
51
|
+
}
|
|
52
|
+
})();
|
|
53
|
+
return this.bundlePromise;
|
|
54
|
+
}
|
|
55
|
+
async browser() {
|
|
56
|
+
this.browserPromise ??= (async () => {
|
|
57
|
+
const executablePath = this.findExecutable(this.browserPath);
|
|
58
|
+
if (executablePath === undefined) {
|
|
59
|
+
throw new RenderError(TYPE, 'no se encontro un navegador Chromium', browserNotFoundHelp());
|
|
60
|
+
}
|
|
61
|
+
try {
|
|
62
|
+
return await this.launch(executablePath, { noSandbox: this.noSandbox });
|
|
63
|
+
}
|
|
64
|
+
catch (err) {
|
|
65
|
+
throw asRenderError(TYPE, err, `no se pudo lanzar el navegador en ${executablePath}`);
|
|
66
|
+
}
|
|
67
|
+
})();
|
|
68
|
+
return this.browserPromise;
|
|
69
|
+
}
|
|
70
|
+
async render(source, options) {
|
|
71
|
+
assertFormat(TYPE, options.format, SUPPORTED);
|
|
72
|
+
if (!source.includes('<bpmn:definitions') && !source.includes('<definitions')) {
|
|
73
|
+
throw new RenderError(TYPE, 'el contenido no es un proceso BPMN 2.0', 'usa el bloque `diagram` con `type: bpmn`; DocViz genera el XML y su trazado');
|
|
74
|
+
}
|
|
75
|
+
const browser = await this.browser();
|
|
76
|
+
const bundle = await this.bundle();
|
|
77
|
+
const page = await browser.newPage();
|
|
78
|
+
try {
|
|
79
|
+
await page.setRequestInterception?.(true);
|
|
80
|
+
page.on('request', ((req) => {
|
|
81
|
+
if (req.url().startsWith('data:') || req.url() === 'about:blank')
|
|
82
|
+
req.continue();
|
|
83
|
+
else
|
|
84
|
+
req.abort();
|
|
85
|
+
}));
|
|
86
|
+
await page.setContent(`<!doctype html><html><head><meta charset="utf-8"></head><body style="margin:0">` +
|
|
87
|
+
`<div id="lienzo" style="width:2000px;height:1400px"></div></body></html>`, { waitUntil: 'domcontentloaded' });
|
|
88
|
+
await page.addScriptTag({ content: bundle });
|
|
89
|
+
const result = await withTimeout(options.timeoutMs, page.evaluate(renderBpmnInPage, source));
|
|
90
|
+
if ('error' in result && result.error !== undefined) {
|
|
91
|
+
throw new RenderError(TYPE, 'bpmn-js no pudo dibujar el proceso', result.error);
|
|
92
|
+
}
|
|
93
|
+
const svg = result.svg;
|
|
94
|
+
if (svg === undefined || !svg.includes('<svg')) {
|
|
95
|
+
throw new RenderError(TYPE, 'bpmn-js no produjo un SVG valido');
|
|
96
|
+
}
|
|
97
|
+
return svgResult(TYPE, applyTheme(svg, options.theme), options);
|
|
98
|
+
}
|
|
99
|
+
finally {
|
|
100
|
+
await page.close().catch(() => undefined);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
async dispose() {
|
|
104
|
+
const browser = await this.browserPromise?.catch(() => undefined);
|
|
105
|
+
this.browserPromise = undefined;
|
|
106
|
+
await browser?.close().catch(() => undefined);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* bpmn-js dibuja en negro sobre transparente. Se anaden el fondo del tema y una
|
|
111
|
+
* hoja de estilos que colorea trazos y textos sin alterar la notacion: en BPMN
|
|
112
|
+
* la forma tiene significado normativo, el color no.
|
|
113
|
+
*/
|
|
114
|
+
export function applyTheme(svg, theme) {
|
|
115
|
+
const style = `<style>` +
|
|
116
|
+
`.djs-visual > :is(rect,circle,path,polygon,polyline){stroke:${theme.palette.text};}` +
|
|
117
|
+
`.djs-visual > :is(rect,circle){fill:${theme.palette.surface};}` +
|
|
118
|
+
`.djs-visual > text, .djs-label{fill:${theme.palette.text};font-family:${theme.fontFamily};}` +
|
|
119
|
+
`.djs-visual > path{fill:none;}` +
|
|
120
|
+
`marker path, marker polyline{fill:${theme.palette.text};stroke:${theme.palette.text};}` +
|
|
121
|
+
`</style>`;
|
|
122
|
+
const open = /<svg\b[^>]*>/i.exec(svg);
|
|
123
|
+
if (open === null)
|
|
124
|
+
return svg;
|
|
125
|
+
const at = open.index + open[0].length;
|
|
126
|
+
// El fondo se pinta como primer elemento para que la imagen no sea transparente.
|
|
127
|
+
const background = `<rect x="-100000" y="-100000" width="200000" height="200000" fill="${theme.palette.background}"/>`;
|
|
128
|
+
return `${svg.slice(0, at)}${style}${background}${svg.slice(at)}`;
|
|
129
|
+
}
|
|
130
|
+
async function withTimeout(timeoutMs, work) {
|
|
131
|
+
let timer;
|
|
132
|
+
try {
|
|
133
|
+
return await Promise.race([
|
|
134
|
+
work,
|
|
135
|
+
new Promise((_, reject) => {
|
|
136
|
+
timer = setTimeout(() => reject(new RenderError(TYPE, `el render supero el limite de ${timeoutMs} ms`)), timeoutMs);
|
|
137
|
+
timer.unref?.();
|
|
138
|
+
}),
|
|
139
|
+
]);
|
|
140
|
+
}
|
|
141
|
+
finally {
|
|
142
|
+
if (timer !== undefined)
|
|
143
|
+
clearTimeout(timer);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
/** Lanzador real: Chromium sin red. */
|
|
147
|
+
const defaultLaunch = async (executablePath, opciones) => {
|
|
148
|
+
const puppeteer = await import('puppeteer-core');
|
|
149
|
+
return (await puppeteer.default.launch({
|
|
150
|
+
executablePath,
|
|
151
|
+
headless: true,
|
|
152
|
+
args: chromiumLaunchArgs(opciones?.noSandbox === true),
|
|
153
|
+
}));
|
|
154
|
+
};
|
|
155
|
+
export function createBpmnRenderer(options) {
|
|
156
|
+
return new BpmnRenderer(options);
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=bpmn.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bpmn.js","sourceRoot":"","sources":["../../src/renderers/bpmn.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Localizacion de un navegador Chromium ya instalado en la maquina.
|
|
3
|
+
*
|
|
4
|
+
* DocViz no descarga navegadores: usa el Chrome/Chromium del sistema o el que
|
|
5
|
+
* ya tengan cacheado Playwright o Puppeteer. Es la unica dependencia pesada del
|
|
6
|
+
* renderer Mermaid y conviene que sea explicita y diagnosticable.
|
|
7
|
+
*/
|
|
8
|
+
/** Orden de busqueda, de mas explicito a mas implicito. */
|
|
9
|
+
export declare function browserCandidates(explicit?: string): string[];
|
|
10
|
+
export declare function findBrowser(explicit?: string): string | undefined;
|
|
11
|
+
export declare function browserNotFoundHelp(): string;
|
|
12
|
+
/**
|
|
13
|
+
* Argumentos con los que se lanza Chromium.
|
|
14
|
+
*
|
|
15
|
+
* `--no-sandbox` **no** esta en la lista por defecto. El contenido que se
|
|
16
|
+
* dibuja aqui puede venir del documento de otra persona —un pull request, por
|
|
17
|
+
* ejemplo— y renderizarlo en un navegador sin sandbox convierte cualquier fallo
|
|
18
|
+
* del motor de render en ejecucion con los permisos del usuario. Se activa a
|
|
19
|
+
* proposito, no por descuido.
|
|
20
|
+
*/
|
|
21
|
+
export declare function chromiumLaunchArgs(noSandbox: boolean): string[];
|
|
22
|
+
/**
|
|
23
|
+
* Si hay que desactivar el sandbox.
|
|
24
|
+
*
|
|
25
|
+
* Como root, Chromium **se niega a arrancar** con el sandbox activo, asi que en
|
|
26
|
+
* ese caso se desactiva solo: es eso o no dibujar nada, y es la situacion
|
|
27
|
+
* habitual dentro de un contenedor. En cualquier otro caso hay que pedirlo.
|
|
28
|
+
*/
|
|
29
|
+
export declare function shouldDisableSandbox(explicit?: boolean): boolean;
|
|
30
|
+
//# sourceMappingURL=browser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../src/renderers/browser.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAsFH,2DAA2D;AAC3D,wBAAgB,iBAAiB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAa7D;AAED,wBAAgB,WAAW,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAEjE;AAED,wBAAgB,mBAAmB,IAAI,MAAM,CAS5C;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,OAAO,GAAG,MAAM,EAAE,CAa/D;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,CAAC,EAAE,OAAO,GAAG,OAAO,CAIhE"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Localizacion de un navegador Chromium ya instalado en la maquina.
|
|
3
|
+
*
|
|
4
|
+
* DocViz no descarga navegadores: usa el Chrome/Chromium del sistema o el que
|
|
5
|
+
* ya tengan cacheado Playwright o Puppeteer. Es la unica dependencia pesada del
|
|
6
|
+
* renderer Mermaid y conviene que sea explicita y diagnosticable.
|
|
7
|
+
*/
|
|
8
|
+
import { existsSync, readdirSync } from 'node:fs';
|
|
9
|
+
import os from 'node:os';
|
|
10
|
+
import path from 'node:path';
|
|
11
|
+
const MAC_APPS = [
|
|
12
|
+
'/Applications/Google Chrome.app/Contents/MacOS/Google Chrome',
|
|
13
|
+
'/Applications/Google Chrome 2.app/Contents/MacOS/Google Chrome',
|
|
14
|
+
'/Applications/Chromium.app/Contents/MacOS/Chromium',
|
|
15
|
+
'/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge',
|
|
16
|
+
'/Applications/Brave Browser.app/Contents/MacOS/Brave Browser',
|
|
17
|
+
];
|
|
18
|
+
const LINUX_BINS = [
|
|
19
|
+
'/usr/bin/google-chrome',
|
|
20
|
+
'/usr/bin/google-chrome-stable',
|
|
21
|
+
'/usr/bin/chromium',
|
|
22
|
+
'/usr/bin/chromium-browser',
|
|
23
|
+
'/usr/bin/microsoft-edge',
|
|
24
|
+
'/snap/bin/chromium',
|
|
25
|
+
];
|
|
26
|
+
const WINDOWS_BINS = [
|
|
27
|
+
'C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe',
|
|
28
|
+
'C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe',
|
|
29
|
+
'C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe',
|
|
30
|
+
];
|
|
31
|
+
/** Navegadores descargados por Playwright (`~/Library/Caches/ms-playwright`, etc.). */
|
|
32
|
+
function playwrightCandidates() {
|
|
33
|
+
const roots = [
|
|
34
|
+
process.env['PLAYWRIGHT_BROWSERS_PATH'],
|
|
35
|
+
os.platform() === 'darwin'
|
|
36
|
+
? path.join(os.homedir(), 'Library', 'Caches', 'ms-playwright')
|
|
37
|
+
: os.platform() === 'win32'
|
|
38
|
+
? path.join(os.homedir(), 'AppData', 'Local', 'ms-playwright')
|
|
39
|
+
: path.join(os.homedir(), '.cache', 'ms-playwright'),
|
|
40
|
+
].filter((r) => typeof r === 'string' && r !== '' && existsSync(r));
|
|
41
|
+
const found = [];
|
|
42
|
+
for (const root of roots) {
|
|
43
|
+
let entries;
|
|
44
|
+
try {
|
|
45
|
+
entries = readdirSync(root);
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
for (const entry of entries.filter((e) => e.startsWith('chromium')).sort().reverse()) {
|
|
51
|
+
const base = path.join(root, entry);
|
|
52
|
+
found.push(path.join(base, 'chrome-mac-arm64', 'Chromium.app', 'Contents', 'MacOS', 'Chromium'), path.join(base, 'chrome-mac', 'Chromium.app', 'Contents', 'MacOS', 'Chromium'), path.join(base, 'chrome-linux', 'chrome'), path.join(base, 'chrome-win', 'chrome.exe'), path.join(base, 'chrome-headless-shell-mac-arm64', 'chrome-headless-shell'), path.join(base, 'chrome-headless-shell-linux', 'chrome-headless-shell'));
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return found;
|
|
56
|
+
}
|
|
57
|
+
/** Navegadores descargados por Puppeteer (`~/.cache/puppeteer`). */
|
|
58
|
+
function puppeteerCandidates() {
|
|
59
|
+
const root = process.env['PUPPETEER_CACHE_DIR'] ?? path.join(os.homedir(), '.cache', 'puppeteer');
|
|
60
|
+
if (!existsSync(root))
|
|
61
|
+
return [];
|
|
62
|
+
const found = [];
|
|
63
|
+
for (const channel of ['chrome', 'chrome-headless-shell', 'chromium']) {
|
|
64
|
+
const dir = path.join(root, channel);
|
|
65
|
+
if (!existsSync(dir))
|
|
66
|
+
continue;
|
|
67
|
+
for (const version of readdirSync(dir).sort().reverse()) {
|
|
68
|
+
const base = path.join(dir, version);
|
|
69
|
+
found.push(path.join(base, 'chrome-mac-arm64', 'Google Chrome for Testing.app', 'Contents', 'MacOS', 'Google Chrome for Testing'), path.join(base, 'chrome-mac-x64', 'Google Chrome for Testing.app', 'Contents', 'MacOS', 'Google Chrome for Testing'), path.join(base, 'chrome-linux64', 'chrome'), path.join(base, 'chrome-win64', 'chrome.exe'), path.join(base, 'chrome-headless-shell-mac-arm64', 'chrome-headless-shell'), path.join(base, 'chrome-headless-shell-linux64', 'chrome-headless-shell'));
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return found;
|
|
73
|
+
}
|
|
74
|
+
/** Orden de busqueda, de mas explicito a mas implicito. */
|
|
75
|
+
export function browserCandidates(explicit) {
|
|
76
|
+
const list = [
|
|
77
|
+
explicit,
|
|
78
|
+
process.env['DOCVIZ_BROWSER_PATH'],
|
|
79
|
+
process.env['PUPPETEER_EXECUTABLE_PATH'],
|
|
80
|
+
process.env['CHROME_PATH'],
|
|
81
|
+
];
|
|
82
|
+
const platform = os.platform();
|
|
83
|
+
if (platform === 'darwin')
|
|
84
|
+
list.push(...MAC_APPS);
|
|
85
|
+
else if (platform === 'win32')
|
|
86
|
+
list.push(...WINDOWS_BINS);
|
|
87
|
+
else
|
|
88
|
+
list.push(...LINUX_BINS);
|
|
89
|
+
list.push(...playwrightCandidates(), ...puppeteerCandidates());
|
|
90
|
+
return list.filter((p) => typeof p === 'string' && p !== '');
|
|
91
|
+
}
|
|
92
|
+
export function findBrowser(explicit) {
|
|
93
|
+
return browserCandidates(explicit).find((p) => existsSync(p));
|
|
94
|
+
}
|
|
95
|
+
export function browserNotFoundHelp() {
|
|
96
|
+
return [
|
|
97
|
+
'DocViz usa un Chromium ya instalado; no descarga navegadores.',
|
|
98
|
+
'Opciones:',
|
|
99
|
+
' - instala Google Chrome, o',
|
|
100
|
+
' - exporta DOCVIZ_BROWSER_PATH=/ruta/al/chrome, o',
|
|
101
|
+
' - define renderers.mermaid.browserPath en docviz.config.yaml, o',
|
|
102
|
+
' - ejecuta `npx playwright install chromium`.',
|
|
103
|
+
].join('\n');
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Argumentos con los que se lanza Chromium.
|
|
107
|
+
*
|
|
108
|
+
* `--no-sandbox` **no** esta en la lista por defecto. El contenido que se
|
|
109
|
+
* dibuja aqui puede venir del documento de otra persona —un pull request, por
|
|
110
|
+
* ejemplo— y renderizarlo en un navegador sin sandbox convierte cualquier fallo
|
|
111
|
+
* del motor de render en ejecucion con los permisos del usuario. Se activa a
|
|
112
|
+
* proposito, no por descuido.
|
|
113
|
+
*/
|
|
114
|
+
export function chromiumLaunchArgs(noSandbox) {
|
|
115
|
+
const args = [
|
|
116
|
+
'--disable-dev-shm-usage',
|
|
117
|
+
'--disable-gpu',
|
|
118
|
+
'--hide-scrollbars',
|
|
119
|
+
'--mute-audio',
|
|
120
|
+
'--disable-background-networking',
|
|
121
|
+
'--disable-sync',
|
|
122
|
+
'--no-first-run',
|
|
123
|
+
'--no-default-browser-check',
|
|
124
|
+
];
|
|
125
|
+
if (noSandbox)
|
|
126
|
+
args.unshift('--no-sandbox');
|
|
127
|
+
return args;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Si hay que desactivar el sandbox.
|
|
131
|
+
*
|
|
132
|
+
* Como root, Chromium **se niega a arrancar** con el sandbox activo, asi que en
|
|
133
|
+
* ese caso se desactiva solo: es eso o no dibujar nada, y es la situacion
|
|
134
|
+
* habitual dentro de un contenedor. En cualquier otro caso hay que pedirlo.
|
|
135
|
+
*/
|
|
136
|
+
export function shouldDisableSandbox(explicit) {
|
|
137
|
+
if (explicit !== undefined)
|
|
138
|
+
return explicit;
|
|
139
|
+
if (process.env['DOCVIZ_NO_SANDBOX'] === '1')
|
|
140
|
+
return true;
|
|
141
|
+
return process.getuid?.() === 0;
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=browser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser.js","sourceRoot":"","sources":["../../src/renderers/browser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Esquema de color dual: la misma imagen legible en un visor claro y en uno
|
|
3
|
+
* oscuro.
|
|
4
|
+
*
|
|
5
|
+
* Un SVG referenciado desde `<img>` se renderiza como su propio documento, y el
|
|
6
|
+
* navegador le aplica la preferencia de color del usuario. Eso permite declarar
|
|
7
|
+
* los colores como variables CSS y redefinirlas bajo
|
|
8
|
+
* `@media (prefers-color-scheme: dark)`.
|
|
9
|
+
*
|
|
10
|
+
* La sustitucion es textual sobre los hexadecimales que el propio DocViz inyecto
|
|
11
|
+
* al aplicar el tema, y funciona tanto en atributos de presentacion
|
|
12
|
+
* (`fill="var(--dv1,#12508F)"`) como en estilos en linea y hojas de estilo
|
|
13
|
+
* incrustadas: los tres son declaraciones CSS y admiten `var()`.
|
|
14
|
+
*/
|
|
15
|
+
import type { Theme } from '../themes/types.js';
|
|
16
|
+
/** Correspondencia entre un color del tema claro y su equivalente oscuro. */
|
|
17
|
+
export interface ColorPair {
|
|
18
|
+
light: string;
|
|
19
|
+
dark: string;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Empareja cada color de la paleta clara con su equivalente oscuro.
|
|
23
|
+
*
|
|
24
|
+
* Un mismo hexadecimal puede cumplir varios roles —en el tema corporativo, el
|
|
25
|
+
* fondo y el texto sobre el color primario son ambos blanco— y eso es correcto
|
|
26
|
+
* siempre que todos los roles lleven al mismo color oscuro. Si no coincidieran,
|
|
27
|
+
* la sustitucion seria ambigua y el tema esta mal definido, asi que se rechaza
|
|
28
|
+
* en el arranque en lugar de producir una imagen ilegible.
|
|
29
|
+
*/
|
|
30
|
+
export declare function colorPairs(theme: Theme): ColorPair[];
|
|
31
|
+
/**
|
|
32
|
+
* Reescribe los colores del tema como variables CSS y anade el bloque que las
|
|
33
|
+
* redefine en modo oscuro.
|
|
34
|
+
*
|
|
35
|
+
* Devuelve el SVG sin tocar si el tema no declara contraparte oscura, o si
|
|
36
|
+
* ninguno de sus colores aparece en la imagen (por ejemplo un diagrama de D2,
|
|
37
|
+
* que trae su propio tema y su propio bloque de modo oscuro).
|
|
38
|
+
*/
|
|
39
|
+
export declare function applyColorScheme(svg: string, theme: Theme): string;
|
|
40
|
+
//# sourceMappingURL=color-scheme.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"color-scheme.d.ts","sourceRoot":"","sources":["../../src/renderers/color-scheme.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,KAAK,EAAE,KAAK,EAAgB,MAAM,oBAAoB,CAAC;AAE9D,6EAA6E;AAC7E,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAkBD;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,KAAK,GAAG,SAAS,EAAE,CAyBpD;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,MAAM,CAmClE"}
|