@diagrammo/dgmo 0.47.0 → 0.48.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/dist/auto.js +1 -1
- package/dist/auto.mjs +1 -1
- package/dist/element.js +1 -1
- package/dist/element.mjs +1 -1
- package/package.json +19 -70
- package/dist/advanced.cjs +0 -71648
- package/dist/advanced.d.cts +0 -5719
- package/dist/auto.cjs +0 -70648
- package/dist/auto.d.cts +0 -54
- package/dist/block.cjs +0 -70208
- package/dist/block.d.cts +0 -115
- package/dist/editor.cjs +0 -526
- package/dist/editor.d.cts +0 -26
- package/dist/element.cjs +0 -70530
- package/dist/element.d.cts +0 -62
- package/dist/highlight.cjs +0 -852
- package/dist/highlight.d.cts +0 -49
- package/dist/index.cjs +0 -70491
- package/dist/index.d.cts +0 -160
- package/dist/pert.cjs +0 -325
- package/dist/pert.d.cts +0 -559
- package/dist/themes-1-CuKpeH.d.cts +0 -908
- package/src/advanced.ts +0 -873
- package/src/arc/parser.ts +0 -15
- package/src/arc/renderer.ts +0 -633
- package/src/auto/index.ts +0 -621
- package/src/auto/shared.ts +0 -370
- package/src/auto/styles.ts +0 -73
- package/src/block/layout.ts +0 -198
- package/src/block/parser.ts +0 -427
- package/src/block/renderer.ts +0 -484
- package/src/block/types.ts +0 -67
- package/src/boxes-and-lines/collapse.ts +0 -96
- package/src/boxes-and-lines/focus.ts +0 -257
- package/src/boxes-and-lines/label-placement.ts +0 -339
- package/src/boxes-and-lines/layout-grouped.ts +0 -912
- package/src/boxes-and-lines/layout-layered.ts +0 -722
- package/src/boxes-and-lines/layout-search.ts +0 -1678
- package/src/boxes-and-lines/layout.ts +0 -398
- package/src/boxes-and-lines/parser.ts +0 -1181
- package/src/boxes-and-lines/renderer.ts +0 -1465
- package/src/boxes-and-lines/types.ts +0 -66
- package/src/c4/layout.ts +0 -2441
- package/src/c4/parser.ts +0 -1158
- package/src/c4/renderer.ts +0 -2008
- package/src/c4/types.ts +0 -89
- package/src/chart-type-registry.ts +0 -529
- package/src/chart-types.ts +0 -225
- package/src/chart.ts +0 -685
- package/src/charts-d3/bar.ts +0 -338
- package/src/charts-d3/chord.ts +0 -140
- package/src/charts-d3/function.ts +0 -147
- package/src/charts-d3/funnel.ts +0 -104
- package/src/charts-d3/heatmap.ts +0 -145
- package/src/charts-d3/index.ts +0 -337
- package/src/charts-d3/interactions.ts +0 -477
- package/src/charts-d3/line.ts +0 -344
- package/src/charts-d3/mount.ts +0 -151
- package/src/charts-d3/pie.ts +0 -117
- package/src/charts-d3/polar.ts +0 -89
- package/src/charts-d3/radar.ts +0 -0
- package/src/charts-d3/sankey.ts +0 -0
- package/src/charts-d3/scatter.ts +0 -185
- package/src/charts-d3/shared.ts +0 -208
- package/src/class/layout.ts +0 -326
- package/src/class/parser.ts +0 -635
- package/src/class/renderer.ts +0 -793
- package/src/class/types.ts +0 -58
- package/src/cli-banner.ts +0 -106
- package/src/cli.ts +0 -1080
- package/src/colors-diagnostics.ts +0 -35
- package/src/colors.ts +0 -379
- package/src/completion-types.ts +0 -27
- package/src/completion.ts +0 -2668
- package/src/cycle/layout.ts +0 -1026
- package/src/cycle/parser.ts +0 -387
- package/src/cycle/renderer.ts +0 -653
- package/src/cycle/types.ts +0 -101
- package/src/d3.ts +0 -1434
- package/src/data-chart-parser.ts +0 -1007
- package/src/dgmo-router.ts +0 -296
- package/src/diagnostics-registry.ts +0 -108
- package/src/diagnostics.ts +0 -0
- package/src/dimensions.ts +0 -20
- package/src/directives-registry.ts +0 -396
- package/src/editor/dgmo.grammar +0 -76
- package/src/editor/dgmo.grammar.d.ts +0 -2
- package/src/editor/dgmo.grammar.js +0 -18
- package/src/editor/dgmo.grammar.terms.d.ts +0 -5
- package/src/editor/dgmo.grammar.terms.js +0 -35
- package/src/editor/highlight-api.ts +0 -596
- package/src/editor/highlight.ts +0 -36
- package/src/editor/index.ts +0 -27
- package/src/editor/keywords.ts +0 -128
- package/src/editor/tokens.ts +0 -30
- package/src/element/index.ts +0 -432
- package/src/embed/css.ts +0 -312
- package/src/embed/escape.ts +0 -15
- package/src/embed/index.ts +0 -280
- package/src/er/classify.ts +0 -228
- package/src/er/layout.ts +0 -530
- package/src/er/parser.ts +0 -750
- package/src/er/renderer.ts +0 -725
- package/src/er/types.ts +0 -52
- package/src/error-card.ts +0 -269
- package/src/event-line/diagnostics.ts +0 -117
- package/src/event-line/parser.ts +0 -643
- package/src/event-line/renderer.ts +0 -1742
- package/src/event-line/types.ts +0 -74
- package/src/fonts.ts +0 -3
- package/src/gantt/calculator.ts +0 -979
- package/src/gantt/parser.ts +0 -1641
- package/src/gantt/renderer.ts +0 -3787
- package/src/gantt/resolver.ts +0 -172
- package/src/gantt/types.ts +0 -206
- package/src/graph/diagnostics.ts +0 -64
- package/src/graph/edge-spline.ts +0 -29
- package/src/graph/flowchart-parser.ts +0 -759
- package/src/graph/flowchart-renderer.ts +0 -817
- package/src/graph/layout.ts +0 -472
- package/src/graph/notes.ts +0 -21
- package/src/graph/state-collapse.ts +0 -78
- package/src/graph/state-parser.ts +0 -574
- package/src/graph/state-renderer.ts +0 -653
- package/src/graph/types.ts +0 -65
- package/src/index.ts +0 -261
- package/src/infra/compute.ts +0 -1385
- package/src/infra/layout.ts +0 -888
- package/src/infra/parser.ts +0 -1234
- package/src/infra/renderer.ts +0 -2534
- package/src/infra/roles.ts +0 -75
- package/src/infra/types.ts +0 -216
- package/src/infra/validation.ts +0 -201
- package/src/journey-map/layout.ts +0 -490
- package/src/journey-map/parser.ts +0 -557
- package/src/journey-map/renderer.ts +0 -1580
- package/src/journey-map/types.ts +0 -47
- package/src/kanban/mutations.ts +0 -175
- package/src/kanban/parser.ts +0 -509
- package/src/kanban/renderer.ts +0 -1449
- package/src/kanban/types.ts +0 -39
- package/src/label-layout.ts +0 -368
- package/src/map/colorize.ts +0 -54
- package/src/map/completion.ts +0 -316
- package/src/map/context-labels.ts +0 -609
- package/src/map/data/PROVENANCE.json +0 -1
- package/src/map/data/README.md +0 -40
- package/src/map/data/airport-collisions.json +0 -1
- package/src/map/data/airports.json +0 -1
- package/src/map/data/gazetteer.json +0 -1
- package/src/map/data/lakes.json +0 -1
- package/src/map/data/mountain-ranges.json +0 -1
- package/src/map/data/na-lakes.json +0 -1
- package/src/map/data/na-land.json +0 -1
- package/src/map/data/region-names.json +0 -1
- package/src/map/data/rivers.json +0 -1
- package/src/map/data/types.ts +0 -121
- package/src/map/data/us-states.json +0 -1
- package/src/map/data/water-bodies.json +0 -1
- package/src/map/data/world-coarse.json +0 -1
- package/src/map/data/world-detail.json +0 -1
- package/src/map/diagnostics.ts +0 -134
- package/src/map/dimensions.ts +0 -150
- package/src/map/geo-query.ts +0 -295
- package/src/map/geo.ts +0 -438
- package/src/map/invert.ts +0 -111
- package/src/map/layout.ts +0 -5069
- package/src/map/legend-band.ts +0 -127
- package/src/map/load-data.ts +0 -186
- package/src/map/parser.ts +0 -783
- package/src/map/renderer.ts +0 -1445
- package/src/map/resolved-types.ts +0 -160
- package/src/map/resolver.ts +0 -1146
- package/src/map/types.ts +0 -194
- package/src/mindmap/collapse.ts +0 -67
- package/src/mindmap/layout.ts +0 -649
- package/src/mindmap/parser.ts +0 -430
- package/src/mindmap/renderer.ts +0 -637
- package/src/mindmap/text-wrap.ts +0 -218
- package/src/mindmap/types.ts +0 -56
- package/src/org/collapse.ts +0 -151
- package/src/org/layout.ts +0 -1262
- package/src/org/parser.ts +0 -519
- package/src/org/renderer.ts +0 -866
- package/src/org/resolver.ts +0 -636
- package/src/palettes/atlas.ts +0 -77
- package/src/palettes/blueprint.ts +0 -73
- package/src/palettes/catppuccin.ts +0 -84
- package/src/palettes/color-utils.ts +0 -443
- package/src/palettes/index.ts +0 -67
- package/src/palettes/nord.ts +0 -67
- package/src/palettes/registry.ts +0 -114
- package/src/palettes/slate.ts +0 -73
- package/src/palettes/tidewater.ts +0 -73
- package/src/palettes/tokyo-night.ts +0 -86
- package/src/palettes/types.ts +0 -88
- package/src/pert/analyzer.ts +0 -1183
- package/src/pert/diagnostics.ts +0 -110
- package/src/pert/index.ts +0 -43
- package/src/pert/internal.ts +0 -252
- package/src/pert/layout.ts +0 -971
- package/src/pert/monte-carlo.ts +0 -446
- package/src/pert/parser.ts +0 -1606
- package/src/pert/renderer.ts +0 -4009
- package/src/pert/share-normalize.ts +0 -62
- package/src/pert/types.ts +0 -604
- package/src/pyramid/parser.ts +0 -185
- package/src/pyramid/renderer.ts +0 -768
- package/src/pyramid/types.ts +0 -28
- package/src/quadrant/parser.ts +0 -18
- package/src/quadrant/renderer.ts +0 -638
- package/src/raci/diagnostics.ts +0 -213
- package/src/raci/index.ts +0 -23
- package/src/raci/mutations.ts +0 -321
- package/src/raci/parser.ts +0 -699
- package/src/raci/renderer.ts +0 -1627
- package/src/raci/types.ts +0 -82
- package/src/raci/variants.ts +0 -320
- package/src/render.ts +0 -268
- package/src/ring/parser.ts +0 -212
- package/src/ring/renderer.ts +0 -490
- package/src/ring/types.ts +0 -27
- package/src/sequence/collapse.ts +0 -174
- package/src/sequence/parser.ts +0 -1596
- package/src/sequence/participant-inference.ts +0 -152
- package/src/sequence/renderer.ts +0 -3168
- package/src/sequence/tag-resolution.ts +0 -164
- package/src/sharing.ts +0 -211
- package/src/sitemap/collapse.ts +0 -100
- package/src/sitemap/layout.ts +0 -925
- package/src/sitemap/parser.ts +0 -755
- package/src/sitemap/renderer.ts +0 -828
- package/src/sitemap/types.ts +0 -42
- package/src/slope/parser.ts +0 -18
- package/src/slope/renderer.ts +0 -378
- package/src/swimlane/diagnostics.ts +0 -94
- package/src/swimlane/layout.ts +0 -597
- package/src/swimlane/parser.ts +0 -613
- package/src/swimlane/renderer.ts +0 -681
- package/src/swimlane/types.ts +0 -151
- package/src/tech-radar/interactive.ts +0 -1129
- package/src/tech-radar/layout.ts +0 -197
- package/src/tech-radar/parser.ts +0 -436
- package/src/tech-radar/renderer.ts +0 -1239
- package/src/tech-radar/shared.ts +0 -151
- package/src/tech-radar/types.ts +0 -86
- package/src/themes.ts +0 -22
- package/src/timeline/parser.ts +0 -472
- package/src/timeline/renderer.ts +0 -3024
- package/src/timeline/types.ts +0 -33
- package/src/timeline/viz-parser.ts +0 -21
- package/src/treemap/diagnostics.ts +0 -62
- package/src/treemap/layout-radial.ts +0 -233
- package/src/treemap/layout.ts +0 -189
- package/src/treemap/parser.ts +0 -463
- package/src/treemap/renderer-radial.ts +0 -438
- package/src/treemap/renderer.ts +0 -572
- package/src/treemap/treemap-shared.ts +0 -309
- package/src/treemap/types.ts +0 -60
- package/src/utils/arrow-markers.ts +0 -51
- package/src/utils/arrows-diagnostics.ts +0 -62
- package/src/utils/arrows.ts +0 -227
- package/src/utils/brand.ts +0 -61
- package/src/utils/card.ts +0 -183
- package/src/utils/collapse-engine/tree-edges.ts +0 -115
- package/src/utils/collapse-engine/tree.ts +0 -117
- package/src/utils/d3-helpers.ts +0 -219
- package/src/utils/d3-types.ts +0 -9
- package/src/utils/description-helpers.ts +0 -38
- package/src/utils/duration.ts +0 -312
- package/src/utils/export-container.ts +0 -41
- package/src/utils/expr-eval.ts +0 -27
- package/src/utils/fit-canvas.ts +0 -64
- package/src/utils/hover-styles.ts +0 -673
- package/src/utils/inline-markdown.ts +0 -96
- package/src/utils/legend-constants.ts +0 -48
- package/src/utils/legend-d3.ts +0 -618
- package/src/utils/legend-integration.ts +0 -107
- package/src/utils/legend-layout.ts +0 -776
- package/src/utils/legend-svg.ts +0 -214
- package/src/utils/legend-types.ts +0 -272
- package/src/utils/name-normalize.ts +0 -163
- package/src/utils/note-box/constants.ts +0 -25
- package/src/utils/note-box/index.ts +0 -11
- package/src/utils/note-box/metrics.ts +0 -90
- package/src/utils/note-box/svg.ts +0 -331
- package/src/utils/notes/bounds.ts +0 -30
- package/src/utils/notes/build.ts +0 -131
- package/src/utils/notes/index.ts +0 -18
- package/src/utils/notes/model.ts +0 -19
- package/src/utils/notes/parse.ts +0 -131
- package/src/utils/notes/place.ts +0 -177
- package/src/utils/notes/resolve.ts +0 -88
- package/src/utils/number-format.ts +0 -36
- package/src/utils/parsing.ts +0 -953
- package/src/utils/reserved-key-registry.ts +0 -239
- package/src/utils/safe-href.ts +0 -38
- package/src/utils/scaling.ts +0 -97
- package/src/utils/svg-embed.ts +0 -251
- package/src/utils/tag-groups.ts +0 -607
- package/src/utils/text-measure.ts +0 -122
- package/src/utils/time-ticks.ts +0 -253
- package/src/utils/title-constants.ts +0 -24
- package/src/utils/visual-conventions.ts +0 -61
- package/src/utils/wrapped-desc.ts +0 -87
- package/src/venn/parser.ts +0 -18
- package/src/venn/renderer.ts +0 -1047
- package/src/version-control/diagnostics.ts +0 -67
- package/src/version-control/parser.ts +0 -544
- package/src/version-control/renderer.ts +0 -724
- package/src/version-control/types.ts +0 -100
- package/src/visualizations/parse.ts +0 -1560
- package/src/visualizations/types.ts +0 -262
- package/src/wireframe/layout.ts +0 -479
- package/src/wireframe/parser.ts +0 -1114
- package/src/wireframe/renderer.ts +0 -1318
- package/src/wireframe/types.ts +0 -110
- package/src/wordcloud/parser.ts +0 -18
- package/src/wordcloud/renderer.ts +0 -357
package/src/dgmo-router.ts
DELETED
|
@@ -1,296 +0,0 @@
|
|
|
1
|
-
// ============================================================
|
|
2
|
-
// .dgmo Unified Format — Chart Type Router
|
|
3
|
-
// ============================================================
|
|
4
|
-
|
|
5
|
-
import { looksLikeSequence } from './sequence/parser';
|
|
6
|
-
import { looksLikeFlowchart } from './graph/flowchart-parser';
|
|
7
|
-
import { looksLikeState } from './graph/state-parser';
|
|
8
|
-
import { looksLikeClassDiagram } from './class/parser';
|
|
9
|
-
import { looksLikeERDiagram } from './er/parser';
|
|
10
|
-
import { looksLikeOrg } from './org/parser';
|
|
11
|
-
import { looksLikeSitemap } from './sitemap/parser';
|
|
12
|
-
import { looksLikePert } from './pert/parser';
|
|
13
|
-
// parseVisualization is the no-explicit-type fallback parser in parseDgmo (not
|
|
14
|
-
// part of the derived chartTypeParsers, which come from the registry).
|
|
15
|
-
import { parseVisualization } from './visualizations/parse';
|
|
16
|
-
import { parseFirstLine } from './utils/parsing';
|
|
17
|
-
import { makeDgmoError, suggest, dedupeDiagnostics } from './diagnostics';
|
|
18
|
-
import type { DgmoError } from './diagnostics';
|
|
19
|
-
import { chartTypes } from './chart-types';
|
|
20
|
-
import {
|
|
21
|
-
CHART_TYPE_REGISTRY,
|
|
22
|
-
REGISTRY_BY_ID,
|
|
23
|
-
isExtendedChartParser,
|
|
24
|
-
} from './chart-type-registry';
|
|
25
|
-
import type { RenderCategory } from './chart-type-registry';
|
|
26
|
-
|
|
27
|
-
// ============================================================
|
|
28
|
-
// Content-based chart type inference helpers
|
|
29
|
-
// ============================================================
|
|
30
|
-
|
|
31
|
-
/** Gantt duration patterns: `10bd Task` */
|
|
32
|
-
const GANTT_DURATION_RE = /^\d+(?:\.\d+)?(?:min|bd|d|w|m|q|y|h)(?:\?)?\s+/;
|
|
33
|
-
/** Gantt date patterns: `2025-01-01 Task` */
|
|
34
|
-
const GANTT_DATE_RE = /^\d{4}-\d{2}-\d{2}(?:\s\d{2}:\d{2})?\s+/;
|
|
35
|
-
|
|
36
|
-
/**
|
|
37
|
-
* Returns true if content looks like a gantt chart.
|
|
38
|
-
* Detects duration patterns like `10bd Task` or `5d Task`.
|
|
39
|
-
*/
|
|
40
|
-
export function looksLikeGantt(content: string): boolean {
|
|
41
|
-
const lines = content.split('\n');
|
|
42
|
-
for (const line of lines) {
|
|
43
|
-
const trimmed = line.trim();
|
|
44
|
-
if (!trimmed || trimmed.startsWith('//')) continue;
|
|
45
|
-
if (GANTT_DURATION_RE.test(trimmed) || GANTT_DATE_RE.test(trimmed)) {
|
|
46
|
-
return true;
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
return false;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
/** C4 `Name is a person/system/container/component` pattern */
|
|
53
|
-
const C4_TYPE_RE = /\bis\s+an?\s+(person|system|container|component)\b/i;
|
|
54
|
-
|
|
55
|
-
/**
|
|
56
|
-
* Returns true if content looks like a C4 diagram.
|
|
57
|
-
* Detects `Name is a person/system/container/component` declarations.
|
|
58
|
-
* Does NOT match bare words like `container` at line start.
|
|
59
|
-
*/
|
|
60
|
-
export function looksLikeC4(content: string): boolean {
|
|
61
|
-
const lines = content.split('\n');
|
|
62
|
-
for (const line of lines) {
|
|
63
|
-
const trimmed = line.trim();
|
|
64
|
-
if (!trimmed || trimmed.startsWith('//')) continue;
|
|
65
|
-
if (C4_TYPE_RE.test(trimmed)) {
|
|
66
|
-
return true;
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
return false;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
/**
|
|
73
|
-
* Extracts the chart type from raw file content.
|
|
74
|
-
* First tries the first non-empty, non-comment line as a bare chart type name
|
|
75
|
-
* (e.g., `gantt Product Launch`).
|
|
76
|
-
* Falls back to inference when no explicit chart type is found.
|
|
77
|
-
*/
|
|
78
|
-
export function parseDgmoChartType(content: string): string | null {
|
|
79
|
-
const lines = content.split('\n');
|
|
80
|
-
|
|
81
|
-
// Find first non-empty, non-comment line
|
|
82
|
-
for (const line of lines) {
|
|
83
|
-
const trimmed = line.trim();
|
|
84
|
-
if (!trimmed || trimmed.startsWith('//')) continue;
|
|
85
|
-
|
|
86
|
-
// Try new first-line detection (bare chart type name)
|
|
87
|
-
const firstLineResult = parseFirstLine(trimmed);
|
|
88
|
-
if (firstLineResult) return firstLineResult.chartType;
|
|
89
|
-
|
|
90
|
-
// Not a chart type on the first line — stop looking for explicit declaration
|
|
91
|
-
break;
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
// Infer chart type from content patterns (sequence before flowchart —
|
|
95
|
-
// both use `->` but sequence uses bare names while flowchart uses shape delimiters)
|
|
96
|
-
// C4 must come AFTER sequence (both use `is a` but with different type nouns)
|
|
97
|
-
if (looksLikeSequence(content)) return 'sequence';
|
|
98
|
-
if (looksLikeFlowchart(content)) return 'flowchart';
|
|
99
|
-
if (looksLikeClassDiagram(content)) return 'class';
|
|
100
|
-
if (looksLikeERDiagram(content)) return 'er';
|
|
101
|
-
if (looksLikeState(content)) return 'state';
|
|
102
|
-
if (looksLikeSitemap(content)) return 'sitemap';
|
|
103
|
-
if (looksLikeOrg(content)) return 'org';
|
|
104
|
-
if (looksLikeC4(content)) return 'c4';
|
|
105
|
-
if (looksLikeGantt(content)) return 'gantt';
|
|
106
|
-
if (looksLikePert(content)) return 'pert';
|
|
107
|
-
|
|
108
|
-
return null;
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
// ============================================================
|
|
112
|
-
// Public render-category API — derived from the chart-type registry.
|
|
113
|
-
// ============================================================
|
|
114
|
-
|
|
115
|
-
/** User-visible rendering category for dispatch and routing. */
|
|
116
|
-
export type { RenderCategory };
|
|
117
|
-
|
|
118
|
-
/**
|
|
119
|
-
* Returns the render category for a given chart type, or `null` if unknown.
|
|
120
|
-
* Use this instead of the internal framework map for dispatch in consumers.
|
|
121
|
-
*/
|
|
122
|
-
export function getRenderCategory(chartType: string): RenderCategory | null {
|
|
123
|
-
return REGISTRY_BY_ID.get(chartType.toLowerCase())?.category ?? null;
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
/**
|
|
127
|
-
* Returns true if the chart type is an extended chart type
|
|
128
|
-
* handled by parseExtendedChart (scatter, sankey, function, heatmap, funnel).
|
|
129
|
-
* Returns false for standard chart types and all other types.
|
|
130
|
-
*/
|
|
131
|
-
export function isExtendedChartType(chartType: string): boolean {
|
|
132
|
-
const descriptor = REGISTRY_BY_ID.get(chartType.toLowerCase());
|
|
133
|
-
return descriptor ? isExtendedChartParser(descriptor.parse) : false;
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
/**
|
|
137
|
-
* Returns all supported chart type identifiers in canonical (tier) order,
|
|
138
|
-
* derived from `chartTypes`. Consumers that need alphabetical order should
|
|
139
|
-
* call `.sort()` explicitly.
|
|
140
|
-
*/
|
|
141
|
-
export function getAllChartTypes(): string[] {
|
|
142
|
-
return chartTypes.map((c) => c.id);
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
/**
|
|
146
|
-
* Canonical descriptions for every supported chart type. Derived from
|
|
147
|
-
* `chartTypes` so there is exactly one place to update when adding a new
|
|
148
|
-
* type. Consumed by the CLI `dgmo types` command, the editor autocomplete
|
|
149
|
-
* popup, and the MCP `list_chart_types` tool.
|
|
150
|
-
*/
|
|
151
|
-
export const CHART_TYPE_DESCRIPTIONS: Record<string, string> =
|
|
152
|
-
Object.fromEntries(chartTypes.map((c) => [c.id, c.description]));
|
|
153
|
-
|
|
154
|
-
// ============================================================
|
|
155
|
-
// Parser registry — single source of truth for id → parser
|
|
156
|
-
// ============================================================
|
|
157
|
-
|
|
158
|
-
type ParseResult = { diagnostics: readonly DgmoError[] };
|
|
159
|
-
type ParseFn = (content: string) => ParseResult;
|
|
160
|
-
|
|
161
|
-
/**
|
|
162
|
-
* Maps every chart-type id to the parser that handles it, DERIVED from
|
|
163
|
-
* `CHART_TYPE_REGISTRY` (src/chart-type-registry.ts). Adding a new chart type
|
|
164
|
-
* means adding ONE descriptor there plus its `chartTypes` metadata entry; the
|
|
165
|
-
* `chart-type-registry.test.ts` cross-check asserts the registry, `chartTypes`,
|
|
166
|
-
* the render-category sites, and the export handlers all stay in sync.
|
|
167
|
-
*/
|
|
168
|
-
export const chartTypeParsers: ReadonlyArray<readonly [string, ParseFn]> =
|
|
169
|
-
CHART_TYPE_REGISTRY.map((d) => [d.id, d.parse] as const);
|
|
170
|
-
|
|
171
|
-
/** Ids in the same order as `chartTypeParsers`; used for cross-checks. */
|
|
172
|
-
export const knownChartTypeIds: readonly string[] = chartTypeParsers.map(
|
|
173
|
-
([id]) => id
|
|
174
|
-
);
|
|
175
|
-
|
|
176
|
-
const PARSER_BY_ID: Map<string, ParseFn> = new Map(chartTypeParsers);
|
|
177
|
-
|
|
178
|
-
/** All known chart type names for colon-pattern detection. */
|
|
179
|
-
const ALL_KNOWN_TYPES: ReadonlySet<string> = new Set(knownChartTypeIds);
|
|
180
|
-
|
|
181
|
-
/**
|
|
182
|
-
* Parse DGMO content and return diagnostics without rendering.
|
|
183
|
-
* Useful for the CLI and editor to surface all errors before attempting render.
|
|
184
|
-
*/
|
|
185
|
-
export function parseDgmo(content: string): {
|
|
186
|
-
diagnostics: DgmoError[];
|
|
187
|
-
chartType: string | null;
|
|
188
|
-
} {
|
|
189
|
-
// Dedupe at the parse boundary so one offending line never reports the same
|
|
190
|
-
// problem N times — keeps the fix-loop signal clean for the CLI, the editor,
|
|
191
|
-
// and the MCP `validate_diagram` tool.
|
|
192
|
-
const result = parseDgmoUndeduped(content);
|
|
193
|
-
return {
|
|
194
|
-
diagnostics: dedupeDiagnostics(result.diagnostics),
|
|
195
|
-
chartType: result.chartType,
|
|
196
|
-
};
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
function parseDgmoUndeduped(content: string): {
|
|
200
|
-
diagnostics: DgmoError[];
|
|
201
|
-
chartType: string | null;
|
|
202
|
-
} {
|
|
203
|
-
const chartType = parseDgmoChartType(content);
|
|
204
|
-
|
|
205
|
-
if (!chartType) {
|
|
206
|
-
// Check for common mistake: colon in chart type declaration (e.g. "bar: Sales")
|
|
207
|
-
const colonDiag = detectColonChartType(content);
|
|
208
|
-
if (colonDiag) {
|
|
209
|
-
const fallback = parseVisualization(content).diagnostics;
|
|
210
|
-
return { diagnostics: [colonDiag, ...fallback], chartType: null };
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
// No chart type detected — try visualization parser as fallback
|
|
214
|
-
return {
|
|
215
|
-
diagnostics: parseVisualization(content).diagnostics,
|
|
216
|
-
chartType: null,
|
|
217
|
-
};
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
const parser = PARSER_BY_ID.get(chartType);
|
|
221
|
-
if (parser) {
|
|
222
|
-
const result = parser(content);
|
|
223
|
-
return {
|
|
224
|
-
diagnostics: [...result.diagnostics, ...detectEmptyContent(content)],
|
|
225
|
-
chartType,
|
|
226
|
-
};
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
// Unknown id (defensive): fall through to visualization parser.
|
|
230
|
-
const result = parseVisualization(content);
|
|
231
|
-
return {
|
|
232
|
-
diagnostics: [...result.diagnostics, ...detectEmptyContent(content)],
|
|
233
|
-
chartType,
|
|
234
|
-
};
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
// ============================================================
|
|
238
|
-
// Common-mistake detectors
|
|
239
|
-
// ============================================================
|
|
240
|
-
|
|
241
|
-
/**
|
|
242
|
-
* Detects colon-separated chart type declarations like "bar: Sales" or "pie: Data".
|
|
243
|
-
* Returns a diagnostic if the word before the colon is a known or similar chart type.
|
|
244
|
-
*/
|
|
245
|
-
function detectColonChartType(content: string): DgmoError | null {
|
|
246
|
-
const lines = content.split('\n');
|
|
247
|
-
for (let i = 0; i < lines.length; i++) {
|
|
248
|
-
// In-bounds by loop guard.
|
|
249
|
-
const trimmed = lines[i]!.trim();
|
|
250
|
-
if (!trimmed || trimmed.startsWith('#') || trimmed.startsWith('//'))
|
|
251
|
-
continue;
|
|
252
|
-
|
|
253
|
-
const match = trimmed.match(/^(\w[\w-]*)\s*:\s*(.*)$/);
|
|
254
|
-
if (!match) return null; // First non-empty line doesn't match colon pattern
|
|
255
|
-
|
|
256
|
-
// Regex captured groups 1 and 2 by successful match.
|
|
257
|
-
const word = match[1]!.toLowerCase();
|
|
258
|
-
const rest = match[2]!.trim();
|
|
259
|
-
|
|
260
|
-
if (ALL_KNOWN_TYPES.has(word)) {
|
|
261
|
-
const example = rest ? `${word} ${rest}` : word;
|
|
262
|
-
return makeDgmoError(
|
|
263
|
-
i + 1,
|
|
264
|
-
`Remove the colon — use '${example}' instead of '${trimmed}'. DGMO chart types don't use colons.`
|
|
265
|
-
);
|
|
266
|
-
}
|
|
267
|
-
|
|
268
|
-
// Check if it's a misspelling of a known type
|
|
269
|
-
const hint = suggest(word, [...ALL_KNOWN_TYPES]);
|
|
270
|
-
if (hint) {
|
|
271
|
-
return makeDgmoError(
|
|
272
|
-
i + 1,
|
|
273
|
-
`Unknown chart type: ${word}. ${hint} Also, DGMO chart types don't use colons.`
|
|
274
|
-
);
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
return null; // First line has colon but isn't a chart type — normal data
|
|
278
|
-
}
|
|
279
|
-
return null;
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
/**
|
|
283
|
-
* Detects when content has only the chart type line with no meaningful data lines.
|
|
284
|
-
*/
|
|
285
|
-
function detectEmptyContent(content: string): DgmoError[] {
|
|
286
|
-
const lines = content.split('\n');
|
|
287
|
-
const nonEmpty = lines.filter(
|
|
288
|
-
(l) => l.trim() && !l.trim().startsWith('#') && !l.trim().startsWith('//')
|
|
289
|
-
);
|
|
290
|
-
if (nonEmpty.length <= 1) {
|
|
291
|
-
return [
|
|
292
|
-
makeDgmoError(1, 'No content after chart type declaration.', 'warning'),
|
|
293
|
-
];
|
|
294
|
-
}
|
|
295
|
-
return [];
|
|
296
|
-
}
|
|
@@ -1,108 +0,0 @@
|
|
|
1
|
-
// ============================================================
|
|
2
|
-
// Diagnostic Registry — the single enumerable catalog
|
|
3
|
-
// ============================================================
|
|
4
|
-
//
|
|
5
|
-
// Every coded diagnostic dgmo can emit is declared as a `DiagnosticSpec`
|
|
6
|
-
// (see `diagnostics.ts`). This module aggregates the per-chart spec
|
|
7
|
-
// arrays plus the universal (chart-agnostic) codes into one flat list.
|
|
8
|
-
//
|
|
9
|
-
// `listDiagnosticCodes()` is the public entry point every consumer uses
|
|
10
|
-
// to enumerate the catalog: the CLI `diagnostics` subcommand, the
|
|
11
|
-
// console error-review surface, MCP `validate_diagram`, and the spec
|
|
12
|
-
// docs. Keeping one source of truth is what keeps parser output and the
|
|
13
|
-
// language spec's error catalog from drifting.
|
|
14
|
-
//
|
|
15
|
-
// A completeness test (`tests/diagnostics-registry.test.ts`) asserts
|
|
16
|
-
// that every `E_`/`W_`/`I_` code literal in `src/**` appears here with a
|
|
17
|
-
// severity matching its prefix — so a new code can't be added without
|
|
18
|
-
// being cataloged.
|
|
19
|
-
|
|
20
|
-
import type { DiagnosticSpec } from './diagnostics';
|
|
21
|
-
import { nameMergedMessage, emptyMetadataValueMessage } from './diagnostics';
|
|
22
|
-
import { SWIMLANE_DIAGNOSTICS } from './swimlane/diagnostics';
|
|
23
|
-
import { RACI_DIAGNOSTICS } from './raci/diagnostics';
|
|
24
|
-
import { TREEMAP_DIAGNOSTICS } from './treemap/diagnostics';
|
|
25
|
-
import { EVENT_LINE_DIAGNOSTICS } from './event-line/diagnostics';
|
|
26
|
-
import { VERSION_CONTROL_DIAGNOSTICS } from './version-control/diagnostics';
|
|
27
|
-
import { ARROW_DIAGNOSTICS } from './utils/arrows-diagnostics';
|
|
28
|
-
import { MAP_DIAGNOSTICS } from './map/diagnostics';
|
|
29
|
-
import { PERT_DIAGNOSTICS } from './pert/diagnostics';
|
|
30
|
-
import { GRAPH_DIAGNOSTICS } from './graph/diagnostics';
|
|
31
|
-
import { COLOR_DIAGNOSTICS } from './colors-diagnostics';
|
|
32
|
-
|
|
33
|
-
// ── Universal codes (chartType: null) ───────────────────────
|
|
34
|
-
// Name handling, alias syntax, and metadata grammar apply to every
|
|
35
|
-
// chart type, so they carry no owning chart. Canonical wording comes
|
|
36
|
-
// from the message builders in `diagnostics.ts` where they exist.
|
|
37
|
-
|
|
38
|
-
export const UNIVERSAL_DIAGNOSTICS: DiagnosticSpec[] = [
|
|
39
|
-
// ── Universal name handling ──
|
|
40
|
-
{
|
|
41
|
-
code: 'I_NAME_MERGED',
|
|
42
|
-
severity: 'warning',
|
|
43
|
-
chartType: null,
|
|
44
|
-
title: 'Names merged (case/whitespace)',
|
|
45
|
-
message: (p) =>
|
|
46
|
-
nameMergedMessage({
|
|
47
|
-
incomingDisplay: String(p.incomingDisplay ?? 'Backend'),
|
|
48
|
-
incomingLine: Number(p.incomingLine ?? 2),
|
|
49
|
-
existingDisplay: String(p.existingDisplay ?? 'backend'),
|
|
50
|
-
existingLine: Number(p.existingLine ?? 1),
|
|
51
|
-
}),
|
|
52
|
-
hint: 'Use one consistent spelling, or add `# allow-merge` on the line if the merge is intentional.',
|
|
53
|
-
example: 'infra\ninternet\n -> gw\ngw\n -> svc\nGW\n -> svc\n',
|
|
54
|
-
},
|
|
55
|
-
|
|
56
|
-
// ── Unified metadata grammar (0.18.0) ──
|
|
57
|
-
{
|
|
58
|
-
code: 'E_TAG_DECLARED_AFTER_CONTENT',
|
|
59
|
-
severity: 'error',
|
|
60
|
-
chartType: null,
|
|
61
|
-
title: 'Tag declared after content',
|
|
62
|
-
message:
|
|
63
|
-
'A `tag` declaration appears after the first content line — declare all tags before any content.',
|
|
64
|
-
hint: 'Move `tag` declarations to the top of the diagram.',
|
|
65
|
-
example: 'block\n[A]\ntag warn red',
|
|
66
|
-
},
|
|
67
|
-
{
|
|
68
|
-
code: 'W_EMPTY_METADATA_VALUE',
|
|
69
|
-
severity: 'warning',
|
|
70
|
-
chartType: null,
|
|
71
|
-
title: 'Empty metadata value',
|
|
72
|
-
message: (p) => emptyMetadataValueMessage(String(p.key ?? 'color')),
|
|
73
|
-
hint: 'Provide a value or remove the key.',
|
|
74
|
-
example: 'mindmap\nRoot color:\n Child',
|
|
75
|
-
},
|
|
76
|
-
];
|
|
77
|
-
|
|
78
|
-
// ── Aggregate ───────────────────────────────────────────────
|
|
79
|
-
|
|
80
|
-
const REGISTRY: DiagnosticSpec[] = [
|
|
81
|
-
...UNIVERSAL_DIAGNOSTICS,
|
|
82
|
-
...SWIMLANE_DIAGNOSTICS,
|
|
83
|
-
...RACI_DIAGNOSTICS,
|
|
84
|
-
...TREEMAP_DIAGNOSTICS,
|
|
85
|
-
...EVENT_LINE_DIAGNOSTICS,
|
|
86
|
-
...VERSION_CONTROL_DIAGNOSTICS,
|
|
87
|
-
...ARROW_DIAGNOSTICS,
|
|
88
|
-
...MAP_DIAGNOSTICS,
|
|
89
|
-
...PERT_DIAGNOSTICS,
|
|
90
|
-
...GRAPH_DIAGNOSTICS,
|
|
91
|
-
...COLOR_DIAGNOSTICS,
|
|
92
|
-
];
|
|
93
|
-
|
|
94
|
-
/**
|
|
95
|
-
* The full diagnostic catalog, sorted by code. Every coded diagnostic
|
|
96
|
-
* dgmo can emit — its severity, owning chart type, canonical message,
|
|
97
|
-
* fix hint, and a triggering example. This is the enumerable source of
|
|
98
|
-
* truth for the CLI `diagnostics` subcommand, the console error-review
|
|
99
|
-
* surface, MCP, and the language-spec catalog.
|
|
100
|
-
*/
|
|
101
|
-
export function listDiagnosticCodes(): DiagnosticSpec[] {
|
|
102
|
-
return [...REGISTRY].sort((a, b) => a.code.localeCompare(b.code));
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
/** Look up a single spec by its code, or `undefined` if not cataloged. */
|
|
106
|
-
export function getDiagnosticSpec(code: string): DiagnosticSpec | undefined {
|
|
107
|
-
return REGISTRY.find((s) => s.code === code);
|
|
108
|
-
}
|
package/src/diagnostics.ts
DELETED
|
Binary file
|
package/src/dimensions.ts
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import { parseDgmo } from './dgmo-router';
|
|
2
|
-
import type { ContentCounts } from './utils/scaling';
|
|
3
|
-
import { REGISTRY_BY_ID } from './chart-type-registry';
|
|
4
|
-
|
|
5
|
-
export function getMinDimensions(content: string): {
|
|
6
|
-
width: number;
|
|
7
|
-
height: number;
|
|
8
|
-
} {
|
|
9
|
-
const { chartType } = parseDgmo(content);
|
|
10
|
-
if (!chartType) return { width: 300, height: 200 };
|
|
11
|
-
|
|
12
|
-
// Both halves of sizing are owned by the chart type's descriptor in
|
|
13
|
-
// chart-type-registry.ts: `measure` (content → counts) and `minDims`
|
|
14
|
-
// (counts → min size). One lookup serves both. Types without a `minDims`
|
|
15
|
-
// fall back to {300,200} — the previous silent `default:` arm of
|
|
16
|
-
// computeMinDimensions; `measure`-less types contribute `{}` counts.
|
|
17
|
-
const descriptor = REGISTRY_BY_ID.get(chartType);
|
|
18
|
-
const counts: ContentCounts = descriptor?.measure?.(content) ?? {};
|
|
19
|
-
return descriptor?.minDims?.(counts) ?? { width: 300, height: 200 };
|
|
20
|
-
}
|