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,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deteccion de campos que el tipo no usa.
|
|
3
|
+
*
|
|
4
|
+
* Un bloque puede compilar y aun asi no decir lo que el autor queria: escribir
|
|
5
|
+
* `steps:` donde el tipo espera `flow:` no rompe nada, simplemente ignora el
|
|
6
|
+
* contenido. El silencio es peor que el error, porque el agente da por buena una
|
|
7
|
+
* documentacion incompleta.
|
|
8
|
+
*
|
|
9
|
+
* La lista de campos validos no se mantiene a mano —serian 57 listas que se
|
|
10
|
+
* desincronizarian— sino que se deduce de dos fuentes que ya existen y ya estan
|
|
11
|
+
* probadas:
|
|
12
|
+
*
|
|
13
|
+
* 1. las claves del ejemplo canonico del catalogo, que compila tal cual;
|
|
14
|
+
* 2. las claves que el compilador realmente leyo, observadas con un Proxy.
|
|
15
|
+
*
|
|
16
|
+
* Un campo que no esta en ninguna de las dos no hizo nada. Eso es un hecho, no
|
|
17
|
+
* una heuristica, y por eso se puede reportar sin miedo a falsos positivos.
|
|
18
|
+
*/
|
|
19
|
+
import { type ErrorCode } from '../core/errors.js';
|
|
20
|
+
import type { TypeSpec } from './catalog.js';
|
|
21
|
+
export interface FieldWarning {
|
|
22
|
+
readonly code: ErrorCode;
|
|
23
|
+
readonly field: string;
|
|
24
|
+
readonly message: string;
|
|
25
|
+
/** Campo valido mas parecido, si la distancia sugiere una errata. */
|
|
26
|
+
readonly suggestion?: string;
|
|
27
|
+
}
|
|
28
|
+
/** Un mapa observado: el original, lo que se leyo de el y de donde viene. */
|
|
29
|
+
interface RegistroObservado {
|
|
30
|
+
ruta: string;
|
|
31
|
+
objetivo: Record<string, unknown>;
|
|
32
|
+
accessed: Set<string>;
|
|
33
|
+
enumerated: boolean;
|
|
34
|
+
}
|
|
35
|
+
export interface FieldAccessTracker<T extends object> {
|
|
36
|
+
/** El documento envuelto: pasalo al compilador en lugar del original. */
|
|
37
|
+
readonly doc: T;
|
|
38
|
+
/** Claves leidas hasta ahora. */
|
|
39
|
+
readonly accessed: ReadonlySet<string>;
|
|
40
|
+
/**
|
|
41
|
+
* `true` si alguien enumero el mapa completo (`Object.keys`, `for...in`,
|
|
42
|
+
* desestructuracion con resto). En ese caso no se puede saber que claves se
|
|
43
|
+
* usaron de verdad y el analisis se abstiene.
|
|
44
|
+
*/
|
|
45
|
+
enumerated(): boolean;
|
|
46
|
+
/** Mapas anidados observados durante la compilacion. */
|
|
47
|
+
readonly anidados: readonly RegistroObservado[];
|
|
48
|
+
}
|
|
49
|
+
/** Envuelve un mapa anidado si hay una compilacion observada en curso. */
|
|
50
|
+
export declare function observarAnidado(valor: Record<string, unknown>, ruta: string): Record<string, unknown>;
|
|
51
|
+
/**
|
|
52
|
+
* Envuelve el documento para observar que claves lee el compilador.
|
|
53
|
+
*
|
|
54
|
+
* No altera el valor devuelto por ninguna clave: el compilador se comporta
|
|
55
|
+
* exactamente igual con el Proxy que sin el.
|
|
56
|
+
*/
|
|
57
|
+
export declare function trackFieldAccess<T extends object>(doc: T): FieldAccessTracker<T>;
|
|
58
|
+
/** Cierra la observacion. Siempre en un `finally`: si no, se filtra a la siguiente. */
|
|
59
|
+
export declare function stopTracking(): void;
|
|
60
|
+
/**
|
|
61
|
+
* Campos que el tipo declara en su ejemplo canonico, mas los universales.
|
|
62
|
+
*
|
|
63
|
+
* El ejemplo es la fuente correcta porque una prueba de integracion lo dibuja
|
|
64
|
+
* de verdad con su motor: si dejara de ser valido, el catalogo fallaria antes
|
|
65
|
+
* que esta funcion.
|
|
66
|
+
*/
|
|
67
|
+
export declare function knownFields(spec: TypeSpec): ReadonlySet<string>;
|
|
68
|
+
/**
|
|
69
|
+
* Campos presentes en el bloque que ni el ejemplo declara ni el compilador leyo.
|
|
70
|
+
*
|
|
71
|
+
* Devuelve avisos, nunca errores: el bloque compila, solo que una parte de lo
|
|
72
|
+
* que escribio el autor no llego al dibujo.
|
|
73
|
+
*/
|
|
74
|
+
export declare function unknownFields(doc: Record<string, unknown>, spec: TypeSpec | undefined, tracker?: FieldAccessTracker<object>): FieldWarning[];
|
|
75
|
+
/**
|
|
76
|
+
* Campos sin usar en los mapas anidados del documento.
|
|
77
|
+
*
|
|
78
|
+
* Aqui no hay ejemplo canonico contra el que comparar —no se sabe que posicion
|
|
79
|
+
* del ejemplo corresponde a cada mapa—, asi que el criterio es solo uno: si el
|
|
80
|
+
* compilador no leyo la clave, esa clave no hizo nada. Sigue siendo un hecho.
|
|
81
|
+
*/
|
|
82
|
+
export declare function unknownNestedFields(tracker: FieldAccessTracker<object>): FieldWarning[];
|
|
83
|
+
/**
|
|
84
|
+
* Convierte los avisos en el detalle que acompana a un error ya producido.
|
|
85
|
+
*
|
|
86
|
+
* Cuando el bloque falla, la causa suele ser justo la errata: reportar solo
|
|
87
|
+
* "falta participants" obliga al agente a adivinar que `particpants` sobraba.
|
|
88
|
+
*/
|
|
89
|
+
export declare function describeFieldWarnings(warnings: readonly FieldWarning[], spec: TypeSpec | undefined): string;
|
|
90
|
+
/** Distancia de Levenshtein con una sola fila de trabajo. */
|
|
91
|
+
export declare function editDistance(a: string, b: string): number;
|
|
92
|
+
export {};
|
|
93
|
+
//# sourceMappingURL=fields.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fields.d.ts","sourceRoot":"","sources":["../../src/dsl/fields.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAGH,OAAO,EAAe,KAAK,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAChE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAQ7C,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,qEAAqE;IACrE,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,6EAA6E;AAC7E,UAAU,iBAAiB;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACtB,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB,CAAC,CAAC,SAAS,MAAM;IAClD,yEAAyE;IACzE,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC;IAChB,iCAAiC;IACjC,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACvC;;;;OAIG;IACH,UAAU,IAAI,OAAO,CAAC;IACtB,wDAAwD;IACxD,QAAQ,CAAC,QAAQ,EAAE,SAAS,iBAAiB,EAAE,CAAC;CACjD;AAWD,0EAA0E;AAC1E,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAErG;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,kBAAkB,CAAC,CAAC,CAAC,CA4ChF;AAED,uFAAuF;AACvF,wBAAgB,YAAY,IAAI,IAAI,CAEnC;AAID;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,CAgB/D;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAC3B,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,IAAI,EAAE,QAAQ,GAAG,SAAS,EAC1B,OAAO,CAAC,EAAE,kBAAkB,CAAC,MAAM,CAAC,GACnC,YAAY,EAAE,CA4BhB;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,kBAAkB,CAAC,MAAM,CAAC,GAAG,YAAY,EAAE,CAqBvF;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,SAAS,YAAY,EAAE,EAAE,IAAI,EAAE,QAAQ,GAAG,SAAS,GAAG,MAAM,CAU3G;AAqBD,6DAA6D;AAC7D,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAezD"}
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deteccion de campos que el tipo no usa.
|
|
3
|
+
*
|
|
4
|
+
* Un bloque puede compilar y aun asi no decir lo que el autor queria: escribir
|
|
5
|
+
* `steps:` donde el tipo espera `flow:` no rompe nada, simplemente ignora el
|
|
6
|
+
* contenido. El silencio es peor que el error, porque el agente da por buena una
|
|
7
|
+
* documentacion incompleta.
|
|
8
|
+
*
|
|
9
|
+
* La lista de campos validos no se mantiene a mano —serian 57 listas que se
|
|
10
|
+
* desincronizarian— sino que se deduce de dos fuentes que ya existen y ya estan
|
|
11
|
+
* probadas:
|
|
12
|
+
*
|
|
13
|
+
* 1. las claves del ejemplo canonico del catalogo, que compila tal cual;
|
|
14
|
+
* 2. las claves que el compilador realmente leyo, observadas con un Proxy.
|
|
15
|
+
*
|
|
16
|
+
* Un campo que no esta en ninguna de las dos no hizo nada. Eso es un hecho, no
|
|
17
|
+
* una heuristica, y por eso se puede reportar sin miedo a falsos positivos.
|
|
18
|
+
*/
|
|
19
|
+
import { parse as parseYaml } from 'yaml';
|
|
20
|
+
import { ERROR_CODES } from '../core/errors.js';
|
|
21
|
+
/** Campos que admite cualquier bloque, sea cual sea su tipo. */
|
|
22
|
+
const UNIVERSAL_FIELDS = ['type', 'title'];
|
|
23
|
+
/** Distancia maxima para considerar que un campo es una errata de otro. */
|
|
24
|
+
const MAX_TYPO_DISTANCE = 2;
|
|
25
|
+
/**
|
|
26
|
+
* Observador activo durante una compilacion.
|
|
27
|
+
*
|
|
28
|
+
* Los mapas anidados no se pueden envolver desde fuera: aparecen a medida que
|
|
29
|
+
* el compilador desciende por el documento, y quien los desenvuelve es
|
|
30
|
+
* `asRecord`. Esta variable es como `asRecord` sabe que hay alguien mirando.
|
|
31
|
+
*/
|
|
32
|
+
let observadorActivo;
|
|
33
|
+
/** Envuelve un mapa anidado si hay una compilacion observada en curso. */
|
|
34
|
+
export function observarAnidado(valor, ruta) {
|
|
35
|
+
return observadorActivo === undefined ? valor : observadorActivo.registrar(valor, ruta);
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Envuelve el documento para observar que claves lee el compilador.
|
|
39
|
+
*
|
|
40
|
+
* No altera el valor devuelto por ninguna clave: el compilador se comporta
|
|
41
|
+
* exactamente igual con el Proxy que sin el.
|
|
42
|
+
*/
|
|
43
|
+
export function trackFieldAccess(doc) {
|
|
44
|
+
const anidados = [];
|
|
45
|
+
const envolver = (objetivo, registro) => new Proxy(objetivo, {
|
|
46
|
+
get(t, prop, receiver) {
|
|
47
|
+
if (typeof prop === 'string' && registro !== undefined)
|
|
48
|
+
registro.accessed.add(prop);
|
|
49
|
+
return Reflect.get(t, prop, receiver);
|
|
50
|
+
},
|
|
51
|
+
has(t, prop) {
|
|
52
|
+
if (typeof prop === 'string' && registro !== undefined)
|
|
53
|
+
registro.accessed.add(prop);
|
|
54
|
+
return Reflect.has(t, prop);
|
|
55
|
+
},
|
|
56
|
+
ownKeys(t) {
|
|
57
|
+
if (registro !== undefined)
|
|
58
|
+
registro.enumerated = true;
|
|
59
|
+
return Reflect.ownKeys(t);
|
|
60
|
+
},
|
|
61
|
+
});
|
|
62
|
+
const raiz = {
|
|
63
|
+
ruta: '',
|
|
64
|
+
objetivo: doc,
|
|
65
|
+
accessed: new Set(),
|
|
66
|
+
enumerated: false,
|
|
67
|
+
};
|
|
68
|
+
const observador = {
|
|
69
|
+
registrar(valor, ruta) {
|
|
70
|
+
// El mismo objeto puede llegar dos veces: se observa una sola.
|
|
71
|
+
const previo = anidados.find((r) => r.objetivo === valor);
|
|
72
|
+
if (previo !== undefined)
|
|
73
|
+
return envolver(valor, previo);
|
|
74
|
+
const registro = { ruta, objetivo: valor, accessed: new Set(), enumerated: false };
|
|
75
|
+
anidados.push(registro);
|
|
76
|
+
return envolver(valor, registro);
|
|
77
|
+
},
|
|
78
|
+
};
|
|
79
|
+
observadorActivo = observador;
|
|
80
|
+
return {
|
|
81
|
+
doc: envolver(doc, raiz),
|
|
82
|
+
accessed: raiz.accessed,
|
|
83
|
+
enumerated: () => raiz.enumerated,
|
|
84
|
+
anidados,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
/** Cierra la observacion. Siempre en un `finally`: si no, se filtra a la siguiente. */
|
|
88
|
+
export function stopTracking() {
|
|
89
|
+
observadorActivo = undefined;
|
|
90
|
+
}
|
|
91
|
+
const knownCache = new Map();
|
|
92
|
+
/**
|
|
93
|
+
* Campos que el tipo declara en su ejemplo canonico, mas los universales.
|
|
94
|
+
*
|
|
95
|
+
* El ejemplo es la fuente correcta porque una prueba de integracion lo dibuja
|
|
96
|
+
* de verdad con su motor: si dejara de ser valido, el catalogo fallaria antes
|
|
97
|
+
* que esta funcion.
|
|
98
|
+
*/
|
|
99
|
+
export function knownFields(spec) {
|
|
100
|
+
const cached = knownCache.get(spec.type);
|
|
101
|
+
if (cached !== undefined)
|
|
102
|
+
return cached;
|
|
103
|
+
const fields = new Set(UNIVERSAL_FIELDS);
|
|
104
|
+
try {
|
|
105
|
+
const parsed = parseYaml(spec.example);
|
|
106
|
+
if (parsed !== null && typeof parsed === 'object' && !Array.isArray(parsed)) {
|
|
107
|
+
for (const key of Object.keys(parsed))
|
|
108
|
+
fields.add(key);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
// Un ejemplo que no parsea es un fallo del catalogo, no de este analisis:
|
|
113
|
+
// se queda con los universales y las pruebas del catalogo lo denuncian.
|
|
114
|
+
}
|
|
115
|
+
knownCache.set(spec.type, fields);
|
|
116
|
+
return fields;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Campos presentes en el bloque que ni el ejemplo declara ni el compilador leyo.
|
|
120
|
+
*
|
|
121
|
+
* Devuelve avisos, nunca errores: el bloque compila, solo que una parte de lo
|
|
122
|
+
* que escribio el autor no llego al dibujo.
|
|
123
|
+
*/
|
|
124
|
+
export function unknownFields(doc, spec, tracker) {
|
|
125
|
+
if (spec === undefined)
|
|
126
|
+
return [];
|
|
127
|
+
if (tracker !== undefined && tracker.enumerated())
|
|
128
|
+
return [];
|
|
129
|
+
const known = knownFields(spec);
|
|
130
|
+
const accessed = tracker?.accessed;
|
|
131
|
+
const warnings = [];
|
|
132
|
+
for (const field of Object.keys(doc)) {
|
|
133
|
+
if (known.has(field))
|
|
134
|
+
continue;
|
|
135
|
+
if (accessed !== undefined && accessed.has(field))
|
|
136
|
+
continue;
|
|
137
|
+
const suggestion = nearestField(field, known);
|
|
138
|
+
const message = suggestion !== undefined
|
|
139
|
+
? `el campo "${field}" no existe en el tipo ${spec.type}; quiza querias "${suggestion}"`
|
|
140
|
+
: `el campo "${field}" no existe en el tipo ${spec.type} y se ha ignorado`;
|
|
141
|
+
const warning = {
|
|
142
|
+
code: ERROR_CODES.DSL_FIELD_UNKNOWN,
|
|
143
|
+
field,
|
|
144
|
+
message,
|
|
145
|
+
...(suggestion !== undefined ? { suggestion } : {}),
|
|
146
|
+
};
|
|
147
|
+
warnings.push(warning);
|
|
148
|
+
}
|
|
149
|
+
return warnings;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Campos sin usar en los mapas anidados del documento.
|
|
153
|
+
*
|
|
154
|
+
* Aqui no hay ejemplo canonico contra el que comparar —no se sabe que posicion
|
|
155
|
+
* del ejemplo corresponde a cada mapa—, asi que el criterio es solo uno: si el
|
|
156
|
+
* compilador no leyo la clave, esa clave no hizo nada. Sigue siendo un hecho.
|
|
157
|
+
*/
|
|
158
|
+
export function unknownNestedFields(tracker) {
|
|
159
|
+
const warnings = [];
|
|
160
|
+
for (const registro of tracker.anidados) {
|
|
161
|
+
if (registro.enumerated)
|
|
162
|
+
continue;
|
|
163
|
+
for (const field of Object.keys(registro.objetivo)) {
|
|
164
|
+
if (registro.accessed.has(field))
|
|
165
|
+
continue;
|
|
166
|
+
const hermanas = [...registro.accessed].filter((k) => k in registro.objetivo);
|
|
167
|
+
const suggestion = nearestField(field, new Set(hermanas));
|
|
168
|
+
const donde = registro.ruta === '' ? '' : ` en ${registro.ruta}`;
|
|
169
|
+
warnings.push({
|
|
170
|
+
code: ERROR_CODES.DSL_FIELD_UNKNOWN,
|
|
171
|
+
field,
|
|
172
|
+
message: suggestion !== undefined
|
|
173
|
+
? `el campo "${field}"${donde} no se usa; quiza querias "${suggestion}"`
|
|
174
|
+
: `el campo "${field}"${donde} no se usa y se ha ignorado`,
|
|
175
|
+
...(suggestion !== undefined ? { suggestion } : {}),
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
return warnings;
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Convierte los avisos en el detalle que acompana a un error ya producido.
|
|
183
|
+
*
|
|
184
|
+
* Cuando el bloque falla, la causa suele ser justo la errata: reportar solo
|
|
185
|
+
* "falta participants" obliga al agente a adivinar que `particpants` sobraba.
|
|
186
|
+
*/
|
|
187
|
+
export function describeFieldWarnings(warnings, spec) {
|
|
188
|
+
if (warnings.length === 0)
|
|
189
|
+
return '';
|
|
190
|
+
const lines = warnings.map((w) => ` - ${w.message}`);
|
|
191
|
+
// "del ejemplo" y no "de sequence": el ejemplo es el esqueleto minimo, y un
|
|
192
|
+
// tipo puede admitir campos opcionales que no aparecen en el. Prometer una
|
|
193
|
+
// lista cerrada seria mentir.
|
|
194
|
+
const campos = spec === undefined ? '' : `\ncampos del ejemplo de ${spec.type}: ${[...knownFields(spec)].sort().join(', ')}`;
|
|
195
|
+
const ficha = spec === undefined ? '' : `\nficha completa: docviz types ${spec.type}`;
|
|
196
|
+
return `campos no reconocidos:\n${lines.join('\n')}${campos}${ficha}`;
|
|
197
|
+
}
|
|
198
|
+
/** Campo valido mas parecido, si la diferencia es propia de una errata. */
|
|
199
|
+
function nearestField(field, known) {
|
|
200
|
+
let best;
|
|
201
|
+
let bestDistance = Number.POSITIVE_INFINITY;
|
|
202
|
+
for (const candidate of known) {
|
|
203
|
+
const distance = editDistance(field, candidate);
|
|
204
|
+
if (distance < bestDistance) {
|
|
205
|
+
bestDistance = distance;
|
|
206
|
+
best = candidate;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
// El umbral es relativo ademas de absoluto: en un campo de tres letras, dos
|
|
210
|
+
// ediciones ya son una palabra distinta.
|
|
211
|
+
const limit = Math.min(MAX_TYPO_DISTANCE, Math.floor(field.length / 2));
|
|
212
|
+
return best !== undefined && bestDistance <= limit && bestDistance > 0 ? best : undefined;
|
|
213
|
+
}
|
|
214
|
+
/** Distancia de Levenshtein con una sola fila de trabajo. */
|
|
215
|
+
export function editDistance(a, b) {
|
|
216
|
+
if (a === b)
|
|
217
|
+
return 0;
|
|
218
|
+
if (a.length === 0)
|
|
219
|
+
return b.length;
|
|
220
|
+
if (b.length === 0)
|
|
221
|
+
return a.length;
|
|
222
|
+
let previous = Array.from({ length: b.length + 1 }, (_, i) => i);
|
|
223
|
+
for (let i = 1; i <= a.length; i += 1) {
|
|
224
|
+
const current = [i];
|
|
225
|
+
for (let j = 1; j <= b.length; j += 1) {
|
|
226
|
+
const substitution = previous[j - 1] + (a[i - 1] === b[j - 1] ? 0 : 1);
|
|
227
|
+
current[j] = Math.min(current[j - 1] + 1, previous[j] + 1, substitution);
|
|
228
|
+
}
|
|
229
|
+
previous = current;
|
|
230
|
+
}
|
|
231
|
+
return previous[b.length];
|
|
232
|
+
}
|
|
233
|
+
//# sourceMappingURL=fields.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fields.js","sourceRoot":"","sources":["../../src/dsl/fields.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Punto de entrada del DSL de alto nivel.
|
|
3
|
+
*
|
|
4
|
+
* El agente que escribe documentacion solo necesita aprender tres vallas:
|
|
5
|
+
*
|
|
6
|
+
* ```diagram``` intencion visual (secuencia, flujo, arbol, ...)
|
|
7
|
+
* ```chart``` comparacion o tendencia cuantitativa
|
|
8
|
+
* ```architecture``` modelo C4
|
|
9
|
+
*
|
|
10
|
+
* DocViz decide el motor. Los lenguajes nativos (`plantuml`, `mermaid`, `d2`,
|
|
11
|
+
* `graphviz`, `vega-lite`, `likec4`) siguen disponibles como via de escape.
|
|
12
|
+
*/
|
|
13
|
+
import { type TypeSpec } from './catalog.js';
|
|
14
|
+
import { type FieldWarning } from './fields.js';
|
|
15
|
+
export declare const DSL_LANGUAGES: readonly ["diagram", "chart", "architecture"];
|
|
16
|
+
export type DslLanguage = (typeof DSL_LANGUAGES)[number];
|
|
17
|
+
export interface CompiledDsl {
|
|
18
|
+
/** Motor que finalmente dibuja el bloque. */
|
|
19
|
+
rendererType: string;
|
|
20
|
+
source: string;
|
|
21
|
+
title?: string;
|
|
22
|
+
/** Ficha del tipo resuelto, util para diagnosticos. */
|
|
23
|
+
spec?: TypeSpec;
|
|
24
|
+
/**
|
|
25
|
+
* Campos que el bloque declaraba y el dibujo ignoro.
|
|
26
|
+
*
|
|
27
|
+
* No impiden compilar: el documento sale, pero no dice lo que el autor creia.
|
|
28
|
+
*/
|
|
29
|
+
warnings?: FieldWarning[];
|
|
30
|
+
}
|
|
31
|
+
/** Predicado que indica si un motor esta disponible en el registro actual. */
|
|
32
|
+
export type EngineAvailability = (engine: string) => boolean;
|
|
33
|
+
export declare function isDslLanguage(lang: string): lang is DslLanguage;
|
|
34
|
+
/** Catalogo legible, usado por `docviz types` y por las herramientas MCP. */
|
|
35
|
+
export declare function dslCatalog(): Record<DslLanguage, string[]>;
|
|
36
|
+
/** Catalogo completo con los metadatos de cada tipo. */
|
|
37
|
+
export declare function dslCatalogDetailed(): readonly TypeSpec[];
|
|
38
|
+
export declare function compileDsl(lang: string, source: string, isAvailable?: EngineAvailability): CompiledDsl;
|
|
39
|
+
export { compileType, compileChartType, typesForEngine, compiledTypeNames, compilerEngines } from './compile.js';
|
|
40
|
+
export { TYPE_CATALOG, findType, typeNames, typesFor, allTypeNames } from './catalog.js';
|
|
41
|
+
export type { TypeSpec, DslLang } from './catalog.js';
|
|
42
|
+
export { compileChartOfType } from './chart.js';
|
|
43
|
+
export { knownFields, unknownFields, describeFieldWarnings, editDistance } from './fields.js';
|
|
44
|
+
export type { FieldWarning } from './fields.js';
|
|
45
|
+
export { compileArchitecture, architectureLikeC4 } from './architecture.js';
|
|
46
|
+
/** Nombres de tipo de `diagram`, en orden alfabetico. */
|
|
47
|
+
export declare function diagramTypeNames(): string[];
|
|
48
|
+
/** Nombres de tipo de `chart`, en orden alfabetico. */
|
|
49
|
+
export declare function chartTypeNames(): string[];
|
|
50
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/dsl/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAKH,OAAO,EAAqC,KAAK,QAAQ,EAAE,MAAM,cAAc,CAAC;AAChF,OAAO,EAML,KAAK,YAAY,EAClB,MAAM,aAAa,CAAC;AAGrB,eAAO,MAAM,aAAa,+CAAgD,CAAC;AAC3E,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC;AAEzD,MAAM,WAAW,WAAW;IAC1B,6CAA6C;IAC7C,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,uDAAuD;IACvD,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,YAAY,EAAE,CAAC;CAC3B;AAED,8EAA8E;AAC9E,MAAM,MAAM,kBAAkB,GAAG,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC;AAI7D,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,IAAI,WAAW,CAE/D;AAED,6EAA6E;AAC7E,wBAAgB,UAAU,IAAI,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,CAAC,CAM1D;AAED,wDAAwD;AACxD,wBAAgB,kBAAkB,IAAI,SAAS,QAAQ,EAAE,CAExD;AAED,wBAAgB,UAAU,CACxB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,WAAW,GAAE,kBAAkC,GAC9C,WAAW,CA8Eb;AAOD,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,cAAc,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACjH,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACzF,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC9F,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAE5E,yDAAyD;AACzD,wBAAgB,gBAAgB,IAAI,MAAM,EAAE,CAE3C;AAED,uDAAuD;AACvD,wBAAgB,cAAc,IAAI,MAAM,EAAE,CAEzC"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Punto de entrada del DSL de alto nivel.
|
|
3
|
+
*
|
|
4
|
+
* El agente que escribe documentacion solo necesita aprender tres vallas:
|
|
5
|
+
*
|
|
6
|
+
* ```diagram``` intencion visual (secuencia, flujo, arbol, ...)
|
|
7
|
+
* ```chart``` comparacion o tendencia cuantitativa
|
|
8
|
+
* ```architecture``` modelo C4
|
|
9
|
+
*
|
|
10
|
+
* DocViz decide el motor. Los lenguajes nativos (`plantuml`, `mermaid`, `d2`,
|
|
11
|
+
* `graphviz`, `vega-lite`, `likec4`) siguen disponibles como via de escape.
|
|
12
|
+
*/
|
|
13
|
+
import { parse as parseYaml } from 'yaml';
|
|
14
|
+
import { DocVizError, DslValidationError, ERROR_CODES } from '../core/errors.js';
|
|
15
|
+
import { compileChartType, compileType } from './compile.js';
|
|
16
|
+
import { findType, TYPE_CATALOG, typeNames } from './catalog.js';
|
|
17
|
+
import { describeFieldWarnings, stopTracking, trackFieldAccess, unknownFields, unknownNestedFields, } from './fields.js';
|
|
18
|
+
import { asRecord, optionalString } from './util.js';
|
|
19
|
+
export const DSL_LANGUAGES = ['diagram', 'chart', 'architecture'];
|
|
20
|
+
const ALL_AVAILABLE = () => true;
|
|
21
|
+
export function isDslLanguage(lang) {
|
|
22
|
+
return DSL_LANGUAGES.includes(lang);
|
|
23
|
+
}
|
|
24
|
+
/** Catalogo legible, usado por `docviz types` y por las herramientas MCP. */
|
|
25
|
+
export function dslCatalog() {
|
|
26
|
+
return {
|
|
27
|
+
diagram: typeNames('diagram'),
|
|
28
|
+
chart: typeNames('chart'),
|
|
29
|
+
architecture: typeNames('architecture'),
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
/** Catalogo completo con los metadatos de cada tipo. */
|
|
33
|
+
export function dslCatalogDetailed() {
|
|
34
|
+
return TYPE_CATALOG;
|
|
35
|
+
}
|
|
36
|
+
export function compileDsl(lang, source, isAvailable = ALL_AVAILABLE) {
|
|
37
|
+
if (!isDslLanguage(lang)) {
|
|
38
|
+
throw new DslValidationError(`"${lang}" no es un lenguaje de DSL de DocViz`, `lenguajes validos: ${DSL_LANGUAGES.join(', ')}`, ERROR_CODES.DSL_TYPE);
|
|
39
|
+
}
|
|
40
|
+
let parsed;
|
|
41
|
+
try {
|
|
42
|
+
parsed = parseYaml(source);
|
|
43
|
+
}
|
|
44
|
+
catch (err) {
|
|
45
|
+
throw new DslValidationError(`el bloque ${lang} no es YAML valido`, err instanceof Error ? err.message : String(err), ERROR_CODES.DSL_YAML);
|
|
46
|
+
}
|
|
47
|
+
if (parsed === null || parsed === undefined) {
|
|
48
|
+
throw new DslValidationError(`el bloque ${lang} esta vacio`, exampleFor(lang), ERROR_CODES.DSL_FIELD_MISSING);
|
|
49
|
+
}
|
|
50
|
+
const doc = asRecord(parsed, lang);
|
|
51
|
+
const title = optionalString(doc, 'title');
|
|
52
|
+
const declared = optionalString(doc, 'type');
|
|
53
|
+
if (declared === undefined && lang !== 'architecture') {
|
|
54
|
+
throw new DslValidationError(`el bloque ${lang} necesita un campo "type"`, exampleFor(lang), ERROR_CODES.DSL_FIELD_MISSING);
|
|
55
|
+
}
|
|
56
|
+
const typeName = declared ?? 'c4-context';
|
|
57
|
+
// El tipo debe pertenecer a la valla en la que se declaro: escribir un
|
|
58
|
+
// `type: bar` dentro de un bloque `diagram` es un error del autor, no una
|
|
59
|
+
// conversion silenciosa.
|
|
60
|
+
const spec = findType(typeName);
|
|
61
|
+
if (spec !== undefined && spec.lang !== lang) {
|
|
62
|
+
throw new DslValidationError(`el tipo "${typeName}" pertenece a la valla \`${spec.lang}\`, no a \`${lang}\``, `escribe el bloque como \`\`\`${spec.lang} en lugar de \`\`\`${lang}`, ERROR_CODES.DSL_TYPE);
|
|
63
|
+
}
|
|
64
|
+
// El compilador recibe el documento observado, no el original: asi se sabe
|
|
65
|
+
// que campos leyo de verdad y cuales quedaron sin usar.
|
|
66
|
+
const tracker = trackFieldAccess(doc);
|
|
67
|
+
let compiled;
|
|
68
|
+
try {
|
|
69
|
+
compiled =
|
|
70
|
+
lang === 'chart'
|
|
71
|
+
? compileChartType(tracker.doc, typeName)
|
|
72
|
+
: compileType(tracker.doc, typeName, isAvailable);
|
|
73
|
+
}
|
|
74
|
+
catch (err) {
|
|
75
|
+
// Una errata suele ser la causa real del fallo: "falta participants" no le
|
|
76
|
+
// dice a nadie que el problema era haber escrito "particpants".
|
|
77
|
+
if (err instanceof DocVizError) {
|
|
78
|
+
throw err.withExtraDetail(describeFieldWarnings(unknownFields(doc, spec, tracker), spec));
|
|
79
|
+
}
|
|
80
|
+
throw err;
|
|
81
|
+
}
|
|
82
|
+
finally {
|
|
83
|
+
stopTracking();
|
|
84
|
+
}
|
|
85
|
+
const result = {
|
|
86
|
+
rendererType: compiled.engine,
|
|
87
|
+
source: compiled.source,
|
|
88
|
+
spec: compiled.spec,
|
|
89
|
+
};
|
|
90
|
+
if (title !== undefined)
|
|
91
|
+
result.title = title;
|
|
92
|
+
const warnings = [...unknownFields(doc, compiled.spec, tracker), ...unknownNestedFields(tracker)];
|
|
93
|
+
if (warnings.length > 0)
|
|
94
|
+
result.warnings = warnings;
|
|
95
|
+
return result;
|
|
96
|
+
}
|
|
97
|
+
function exampleFor(lang) {
|
|
98
|
+
const spec = findType(lang === 'diagram' ? 'sequence' : lang === 'chart' ? 'bar' : 'c4-context');
|
|
99
|
+
return spec !== undefined ? `ejemplo:\n${spec.example}` : '';
|
|
100
|
+
}
|
|
101
|
+
export { compileType, compileChartType, typesForEngine, compiledTypeNames, compilerEngines } from './compile.js';
|
|
102
|
+
export { TYPE_CATALOG, findType, typeNames, typesFor, allTypeNames } from './catalog.js';
|
|
103
|
+
export { compileChartOfType } from './chart.js';
|
|
104
|
+
export { knownFields, unknownFields, describeFieldWarnings, editDistance } from './fields.js';
|
|
105
|
+
export { compileArchitecture, architectureLikeC4 } from './architecture.js';
|
|
106
|
+
/** Nombres de tipo de `diagram`, en orden alfabetico. */
|
|
107
|
+
export function diagramTypeNames() {
|
|
108
|
+
return typeNames('diagram');
|
|
109
|
+
}
|
|
110
|
+
/** Nombres de tipo de `chart`, en orden alfabetico. */
|
|
111
|
+
export function chartTypeNames() {
|
|
112
|
+
return typeNames('chart');
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/dsl/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utilidades de validacion del DSL declarativo.
|
|
3
|
+
*
|
|
4
|
+
* Los mensajes son la interfaz real del DSL para un agente: deben decir que
|
|
5
|
+
* campo falla, que se esperaba y como se escribe bien.
|
|
6
|
+
*/
|
|
7
|
+
import { type ErrorCode } from '../core/errors.js';
|
|
8
|
+
/**
|
|
9
|
+
* Aborta la compilacion del bloque.
|
|
10
|
+
*
|
|
11
|
+
* El codigo es tan importante como el texto: un agente que reintenta necesita
|
|
12
|
+
* distinguir "falta un campo" de "el valor no vale" sin leer castellano.
|
|
13
|
+
*/
|
|
14
|
+
export declare function fail(message: string, detail?: string, code?: ErrorCode): never;
|
|
15
|
+
export declare function asRecord(value: unknown, field: string): Record<string, unknown>;
|
|
16
|
+
/**
|
|
17
|
+
* Texto obligatorio.
|
|
18
|
+
*
|
|
19
|
+
* Acepta numeros y booleanos porque YAML los convierte sin avisar: en
|
|
20
|
+
* `- name: 2025` el valor llega como numero, y rechazarlo obligaria al autor a
|
|
21
|
+
* entrecomillar cualquier etiqueta que parezca un dato.
|
|
22
|
+
*/
|
|
23
|
+
export declare function requireString(record: Record<string, unknown>, key: string, field: string): string;
|
|
24
|
+
export declare function optionalString(record: Record<string, unknown>, key: string): string | undefined;
|
|
25
|
+
export declare function optionalNumber(record: Record<string, unknown>, key: string, field: string): number | undefined;
|
|
26
|
+
export declare function requireNumber(record: Record<string, unknown>, key: string, field: string): number;
|
|
27
|
+
export declare function requireArray(value: unknown, field: string): unknown[];
|
|
28
|
+
export declare function optionalArray(value: unknown, field: string): unknown[];
|
|
29
|
+
/**
|
|
30
|
+
* Acepta `- Texto` o `- name: Texto` de forma indistinta.
|
|
31
|
+
*
|
|
32
|
+
* Los numeros se admiten porque YAML los convierte solo: en `quadrants: [1, 2]`
|
|
33
|
+
* el autor esta escribiendo etiquetas, no cantidades.
|
|
34
|
+
*/
|
|
35
|
+
export declare function nameOf(item: unknown, field: string, key?: string): string;
|
|
36
|
+
/**
|
|
37
|
+
* Normaliza `- Texto` y `- {name: Texto, ...}` a un mapa.
|
|
38
|
+
*
|
|
39
|
+
* Es el patron mas repetido del DSL: casi todas las listas admiten la forma
|
|
40
|
+
* corta. Centralizarlo evita que cada compilador olvide que YAML convierte
|
|
41
|
+
* `- 2025` en numero y rompa con una etiqueta perfectamente valida.
|
|
42
|
+
*/
|
|
43
|
+
export declare function asNamedRecord(raw: unknown, field: string, key?: string): Record<string, unknown>;
|
|
44
|
+
export declare function oneOf<T extends string>(value: string | undefined, allowed: readonly T[], field: string, fallback: T): T;
|
|
45
|
+
/**
|
|
46
|
+
* Generador de ids estables y seguros.
|
|
47
|
+
*
|
|
48
|
+
* Los motores destino se alimentan siempre de ids sinteticos (`n1`, `n2`, ...)
|
|
49
|
+
* y del texto original solo como etiqueta entrecomillada. Asi ningun caracter
|
|
50
|
+
* del documento puede alterar la sintaxis generada.
|
|
51
|
+
*/
|
|
52
|
+
export declare class IdFactory {
|
|
53
|
+
private readonly prefix;
|
|
54
|
+
private readonly byKey;
|
|
55
|
+
private counter;
|
|
56
|
+
constructor(prefix?: string);
|
|
57
|
+
id(key: string): string;
|
|
58
|
+
has(key: string): boolean;
|
|
59
|
+
get(key: string): string | undefined;
|
|
60
|
+
keys(): string[];
|
|
61
|
+
}
|
|
62
|
+
/** Cadena entre comillas dobles para D2. */
|
|
63
|
+
export declare function d2Label(text: string): string;
|
|
64
|
+
/** Cadena entre comillas simples para LikeC4. */
|
|
65
|
+
export declare function likec4Label(text: string): string;
|
|
66
|
+
/** Etiqueta segura para Mermaid: entre comillas y sin comillas internas. */
|
|
67
|
+
export declare function mermaidLabel(text: string): string;
|
|
68
|
+
/** Texto seguro dentro de una etiqueta PlantUML de una sola linea. */
|
|
69
|
+
export declare function plantUmlText(text: string): string;
|
|
70
|
+
/** Cadena entrecomillada para Graphviz DOT. */
|
|
71
|
+
export declare function dotLabel(text: string): string;
|
|
72
|
+
/**
|
|
73
|
+
* Interpreta la forma `Origen -> Destino: etiqueta`, admitiendo `->`, `-->`,
|
|
74
|
+
* `..>` y `<-` para invertir el sentido.
|
|
75
|
+
*/
|
|
76
|
+
export interface ParsedEdge {
|
|
77
|
+
from: string;
|
|
78
|
+
to: string;
|
|
79
|
+
label?: string;
|
|
80
|
+
dashed: boolean;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Detecta el mapa de una sola entrada que YAML produce a partir de
|
|
84
|
+
* `- Origen -> Destino: etiqueta`.
|
|
85
|
+
*/
|
|
86
|
+
export declare function asArrowShorthand(item: unknown): {
|
|
87
|
+
expression: string;
|
|
88
|
+
label?: string;
|
|
89
|
+
} | undefined;
|
|
90
|
+
export declare function parseEdgeExpression(expression: string, field: string): ParsedEdge;
|
|
91
|
+
/**
|
|
92
|
+
* Normaliza un item de relacion.
|
|
93
|
+
*
|
|
94
|
+
* Admite tres formas:
|
|
95
|
+
*
|
|
96
|
+
* - Usuario -> API: Login (YAML lo entrega como mapa de una entrada)
|
|
97
|
+
* - "Usuario -> API" (cadena)
|
|
98
|
+
* - {from: Usuario, to: API} (mapa explicito)
|
|
99
|
+
*
|
|
100
|
+
* La primera es la que escribe cualquiera de forma natural, pero YAML la
|
|
101
|
+
* interpreta como `{ "Usuario -> API": "Login" }` por culpa de los dos puntos.
|
|
102
|
+
* Se reconoce ese caso en lugar de exigir comillas.
|
|
103
|
+
*/
|
|
104
|
+
export declare function toEdge(item: unknown, field: string): ParsedEdge;
|
|
105
|
+
//# sourceMappingURL=util.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../src/dsl/util.ts"],"names":[],"mappings":"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"}
|