@transitrix/diagrams 1.0.0 → 1.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/LICENSE +21 -21
- package/README.md +47 -47
- package/dist/__tests__/edge-path.test.js +8 -0
- package/dist/activities/cpm.js +11 -2
- package/dist/activities/gantt.js +6 -3
- package/dist/activities/types.d.ts +1 -0
- package/dist/activities/validate.js +3 -3
- package/dist/activity-card/__tests__/example.test.js +20 -1
- package/dist/activity-card/__tests__/layout.test.js +102 -11
- package/dist/activity-card/__tests__/resolver.test.js +161 -7
- package/dist/activity-card/index.d.ts +1 -1
- package/dist/activity-card/layout.d.ts +1 -1
- package/dist/activity-card/layout.js +220 -103
- package/dist/activity-card/resolver.js +115 -28
- package/dist/activity-card/types.d.ts +150 -27
- package/dist/activity-card/validate.js +3 -0
- package/dist/actor/__tests__/validate.test.js +63 -31
- package/dist/actor/index.d.ts +1 -1
- package/dist/actor/index.js +1 -1
- package/dist/actor/types.d.ts +7 -3
- package/dist/actor/types.js +17 -3
- package/dist/actor/validate.js +55 -26
- package/dist/assertion/types.d.ts +3 -1
- package/dist/assertion/types.js +1 -1
- package/dist/change/__tests__/validate.test.js +40 -34
- package/dist/change/index.d.ts +1 -0
- package/dist/change/types.d.ts +1 -1
- package/dist/change/types.js +2 -2
- package/dist/change/validate.d.ts +6 -1
- package/dist/change/validate.js +68 -41
- package/dist/compliance/__tests__/classify.test.js +34 -0
- package/dist/compliance/__tests__/coverage-metric.test.js +146 -46
- package/dist/compliance/__tests__/html.test.js +2 -2
- package/dist/compliance/__tests__/impact.test.js +509 -6
- package/dist/compliance/classify.d.ts +6 -0
- package/dist/compliance/classify.js +9 -1
- package/dist/compliance/coverage-metric.d.ts +31 -11
- package/dist/compliance/coverage-metric.js +149 -39
- package/dist/compliance/html.js +78 -81
- package/dist/compliance/impact.d.ts +100 -16
- package/dist/compliance/impact.js +272 -28
- package/dist/compliance/index.d.ts +2 -2
- package/dist/compliance/index.js +1 -1
- package/dist/compliance/markdown.js +1 -0
- package/dist/compliance/types.d.ts +25 -6
- package/dist/edge-path.d.ts +8 -4
- package/dist/edge-path.js +11 -6
- package/dist/factor/__tests__/validate.test.js +75 -46
- package/dist/factor/index.d.ts +3 -2
- package/dist/factor/index.js +1 -1
- package/dist/factor/types.d.ts +5 -8
- package/dist/factor/types.js +10 -5
- package/dist/factor/validate.d.ts +6 -1
- package/dist/factor/validate.js +68 -50
- package/dist/fgca/__tests__/chain-table.test.js +2 -2
- package/dist/fgca/__tests__/layout.test.js +11 -11
- package/dist/fgca/__tests__/preview-layout.test.js +7 -7
- package/dist/fgca/__tests__/resolver.test.js +185 -0
- package/dist/fgca/chain-table.d.ts +1 -1
- package/dist/fgca/chain-table.js +4 -4
- package/dist/fgca/index.d.ts +4 -2
- package/dist/fgca/index.js +2 -1
- package/dist/fgca/layout.d.ts +2 -2
- package/dist/fgca/layout.js +9 -9
- package/dist/fgca/nodeTypes.d.ts +1 -1
- package/dist/fgca/nodeTypes.js +2 -2
- package/dist/fgca/nodes/FGCAFactorNode.d.ts +3 -3
- package/dist/fgca/nodes/FGCAFactorNode.js +5 -5
- package/dist/fgca/parse-canonical.js +15 -10
- package/dist/fgca/preview-layout.d.ts +1 -1
- package/dist/fgca/preview-layout.js +4 -4
- package/dist/fgca/resolver.d.ts +49 -0
- package/dist/fgca/resolver.js +126 -0
- package/dist/fgca/types.d.ts +11 -11
- package/dist/fgca/types.js +2 -2
- package/dist/fgca/validate.d.ts +2 -2
- package/dist/fgca/validate.js +17 -14
- package/dist/goals/index.d.ts +1 -1
- package/dist/index.d.ts +5 -0
- package/dist/index.js +5 -0
- package/dist/process-blueprint/__tests__/layout.test.js +37 -0
- package/dist/process-blueprint/index.d.ts +1 -1
- package/dist/process-blueprint/layout.js +66 -35
- package/dist/process-blueprint/types.d.ts +36 -1
- package/dist/scenarios/index.d.ts +1 -1
- package/dist/scenarios/types.d.ts +4 -4
- package/dist/stakeholder/__tests__/validate.test.js +49 -47
- package/dist/stakeholder/index.d.ts +1 -0
- package/dist/stakeholder/types.d.ts +3 -4
- package/dist/stakeholder/types.js +2 -3
- package/dist/stakeholder/validate.d.ts +6 -1
- package/dist/stakeholder/validate.js +71 -50
- package/dist/target-state/__tests__/validate.test.js +43 -27
- package/dist/target-state/index.d.ts +2 -0
- package/dist/target-state/index.js +1 -0
- package/dist/target-state/types.d.ts +6 -1
- package/dist/target-state/types.js +8 -7
- package/dist/target-state/validate.d.ts +6 -1
- package/dist/target-state/validate.js +69 -45
- package/dist/theme/themes.js +71 -69
- package/dist/theme/tokens.d.ts +7 -1
- package/dist/theme/tokens.js +3 -1
- package/dist/webview/__tests__/entry-notations.test.js +2 -0
- package/dist/webview/__tests__/entry.test.js +11 -11
- package/dist/webview/__tests__/render-process.test.js +463 -0
- package/dist/webview/__tests__/render-util.test.d.ts +1 -0
- package/dist/webview/__tests__/render-util.test.js +54 -0
- package/dist/webview/entry.d.ts +1 -1
- package/dist/webview/entry.js +9 -5
- package/dist/webview/render-activities.d.ts +24 -2
- package/dist/webview/render-activities.js +92 -57
- package/dist/webview/render-activity-card.d.ts +11 -1
- package/dist/webview/render-activity-card.js +115 -79
- package/dist/webview/render-blocks.d.ts +24 -1
- package/dist/webview/render-blocks.js +58 -24
- package/dist/webview/render-fgca.d.ts +31 -0
- package/dist/webview/render-fgca.js +30 -19
- package/dist/webview/render-goals.d.ts +27 -1
- package/dist/webview/render-goals.js +42 -32
- package/dist/webview/render-process-blueprint.d.ts +11 -1
- package/dist/webview/render-process-blueprint.js +118 -53
- package/dist/webview/render-process.d.ts +95 -0
- package/dist/webview/render-process.js +392 -0
- package/dist/webview/render-scenarios.js +2 -2
- package/dist/webview/render-util.d.ts +19 -6
- package/dist/webview/render-util.js +23 -15
- package/package.json +54 -40
- package/src/__tests__/edge-path.test.ts +58 -46
- package/src/__tests__/scope.test.ts +27 -27
- package/src/__tests__/yaml-normalize.test.ts +158 -158
- package/src/activities/__tests__/cpm.test.ts +164 -164
- package/src/activities/__tests__/gantt.test.ts +245 -245
- package/src/activities/__tests__/layout.test.ts +112 -112
- package/src/activities/__tests__/validate.test.ts +409 -409
- package/src/activities/cpm.ts +107 -95
- package/src/activities/gantt.ts +277 -276
- package/src/activities/index.ts +28 -28
- package/src/activities/layout.ts +112 -112
- package/src/activities/types.ts +149 -148
- package/src/activities/validate.ts +357 -357
- package/src/activity-card/__tests__/example.test.ts +85 -66
- package/src/activity-card/__tests__/layout.test.ts +169 -63
- package/src/activity-card/__tests__/resolver.test.ts +330 -161
- package/src/activity-card/__tests__/validate.test.ts +131 -131
- package/src/activity-card/index.ts +38 -32
- package/src/activity-card/layout.ts +324 -194
- package/src/activity-card/resolver.ts +422 -337
- package/src/activity-card/types.ts +376 -237
- package/src/activity-card/validate.ts +162 -158
- package/src/actor/__tests__/validate.test.ts +70 -31
- package/src/actor/index.ts +1 -1
- package/src/actor/types.ts +21 -7
- package/src/actor/validate.ts +59 -27
- package/src/applications/__tests__/validate.test.ts +256 -256
- package/src/applications/index.ts +11 -11
- package/src/applications/types.ts +43 -43
- package/src/applications/validate.ts +131 -131
- package/src/assertion/__tests__/example.test.ts +37 -37
- package/src/assertion/__tests__/validate.test.ts +142 -142
- package/src/assertion/index.ts +12 -12
- package/src/assertion/types.ts +60 -58
- package/src/assertion/validate.ts +145 -145
- package/src/blocks/__tests__/layout.test.ts +169 -169
- package/src/blocks/__tests__/validate.test.ts +260 -260
- package/src/blocks/index.ts +17 -17
- package/src/blocks/layout.ts +186 -186
- package/src/blocks/types.ts +62 -62
- package/src/blocks/validate.ts +206 -206
- package/src/capability-map/__tests__/validate.test.ts +238 -238
- package/src/capability-map/index.ts +8 -8
- package/src/capability-map/types.ts +29 -29
- package/src/capability-map/validate.ts +127 -127
- package/src/change/__tests__/validate.test.ts +43 -34
- package/src/change/index.ts +1 -0
- package/src/change/types.ts +5 -3
- package/src/change/validate.ts +75 -43
- package/src/compliance/__tests__/classify.test.ts +64 -27
- package/src/compliance/__tests__/confidence.test.ts +98 -98
- package/src/compliance/__tests__/coverage-metric.test.ts +300 -188
- package/src/compliance/__tests__/demo-scenario.test.ts +273 -273
- package/src/compliance/__tests__/example.test.ts +57 -57
- package/src/compliance/__tests__/gap-report.test.ts +128 -128
- package/src/compliance/__tests__/html.test.ts +141 -141
- package/src/compliance/__tests__/impact.test.ts +1059 -481
- package/src/compliance/__tests__/markdown.test.ts +94 -94
- package/src/compliance/__tests__/views.test.ts +64 -64
- package/src/compliance/classify.ts +100 -84
- package/src/compliance/confidence.ts +69 -69
- package/src/compliance/coverage-metric.ts +404 -263
- package/src/compliance/gap-report.ts +94 -94
- package/src/compliance/html.ts +291 -295
- package/src/compliance/impact.ts +979 -677
- package/src/compliance/index.ts +57 -56
- package/src/compliance/markdown.ts +136 -135
- package/src/compliance/reverse-index.ts +33 -33
- package/src/compliance/types.ts +136 -120
- package/src/compliance/views.ts +46 -46
- package/src/compliance-matrix/__tests__/build.test.ts +200 -200
- package/src/compliance-matrix/__tests__/example.test.ts +57 -57
- package/src/compliance-matrix/index.ts +11 -11
- package/src/compliance-matrix/types.ts +102 -102
- package/src/edge-path.ts +50 -44
- package/src/factor/__tests__/validate.test.ts +81 -46
- package/src/factor/index.ts +3 -7
- package/src/factor/types.ts +15 -19
- package/src/factor/validate.ts +77 -51
- package/src/fgca/__tests__/chain-table.test.ts +172 -172
- package/src/fgca/__tests__/layout.test.ts +179 -179
- package/src/fgca/__tests__/parse-canonical.test.ts +248 -248
- package/src/fgca/__tests__/preview-layout.test.ts +124 -124
- package/src/fgca/__tests__/resolver.test.ts +209 -0
- package/src/fgca/__tests__/validate.test.ts +142 -142
- package/src/fgca/chain-table.ts +225 -225
- package/src/fgca/index.ts +47 -45
- package/src/fgca/layout.ts +204 -204
- package/src/fgca/nodeTypes.ts +11 -11
- package/src/fgca/nodes/FGCAActivityNode.tsx +65 -65
- package/src/fgca/nodes/FGCAChangeNode.tsx +64 -64
- package/src/fgca/nodes/FGCAFactorNode.tsx +64 -64
- package/src/fgca/nodes/FGCAGoalNode.tsx +72 -72
- package/src/fgca/parse-canonical.ts +405 -400
- package/src/fgca/preview-layout.ts +217 -217
- package/src/fgca/resolver.ts +159 -0
- package/src/fgca/types.ts +50 -50
- package/src/fgca/validate.ts +129 -126
- package/src/geometry.ts +9 -9
- package/src/goals/__tests__/layout.test.ts +175 -175
- package/src/goals/__tests__/mutations.test.ts +111 -111
- package/src/goals/__tests__/parse-canonical.test.ts +145 -145
- package/src/goals/__tests__/validate.test.ts +202 -202
- package/src/goals/index.ts +20 -21
- package/src/goals/layout.ts +172 -172
- package/src/goals/mutations.ts +123 -123
- package/src/goals/parse-canonical.ts +286 -286
- package/src/goals/types.ts +85 -85
- package/src/goals/validate.ts +136 -136
- package/src/index.ts +28 -23
- package/src/process-blueprint/__tests__/compliance-lane.test.ts +320 -320
- package/src/process-blueprint/__tests__/layout.test.ts +240 -195
- package/src/process-blueprint/__tests__/validate.test.ts +310 -310
- package/src/process-blueprint/index.ts +32 -31
- package/src/process-blueprint/layout.ts +564 -531
- package/src/process-blueprint/types.ts +278 -242
- package/src/process-blueprint/validate.ts +181 -181
- package/src/process-map/__tests__/validate.test.ts +223 -223
- package/src/process-map/index.ts +10 -10
- package/src/process-map/types.ts +36 -36
- package/src/process-map/validate.ts +135 -135
- package/src/products/__tests__/validate.test.ts +239 -239
- package/src/products/index.ts +9 -9
- package/src/products/types.ts +31 -31
- package/src/products/validate.ts +112 -112
- package/src/repo-validate/__tests__/validate-repo.test.ts +149 -149
- package/src/repo-validate/index.ts +2 -2
- package/src/repo-validate/types.ts +50 -50
- package/src/repo-validate/validate-repo.ts +196 -196
- package/src/requirement/__tests__/example.test.ts +24 -24
- package/src/requirement/__tests__/validate.test.ts +96 -96
- package/src/requirement/index.ts +4 -4
- package/src/requirement/types.ts +35 -35
- package/src/requirement/validate.ts +92 -92
- package/src/scenarios/__tests__/validate.test.ts +209 -209
- package/src/scenarios/index.ts +15 -15
- package/src/scenarios/types.ts +37 -37
- package/src/scenarios/validate.ts +122 -122
- package/src/schema-version.ts +16 -16
- package/src/scope.ts +46 -46
- package/src/stakeholder/__tests__/validate.test.ts +51 -47
- package/src/stakeholder/index.ts +1 -0
- package/src/stakeholder/types.ts +7 -7
- package/src/stakeholder/validate.ts +79 -52
- package/src/target-state/__tests__/validate.test.ts +48 -27
- package/src/target-state/index.ts +2 -0
- package/src/target-state/types.ts +11 -7
- package/src/target-state/validate.ts +76 -46
- package/src/theme/index.ts +4 -4
- package/src/theme/themes.ts +239 -237
- package/src/theme/tokens.ts +135 -133
- package/src/typed-id.ts +56 -56
- package/src/validation-types.ts +36 -36
- package/src/webview/__tests__/entry-notations.test.ts +79 -77
- package/src/webview/__tests__/entry.test.ts +64 -64
- package/src/webview/__tests__/render-goals.test.ts +72 -72
- package/src/webview/__tests__/render-process.test.ts +538 -0
- package/src/webview/__tests__/render-util.test.ts +66 -0
- package/src/webview/entry.ts +298 -292
- package/src/webview/render-activities.ts +111 -69
- package/src/webview/render-activity-card.ts +275 -234
- package/src/webview/render-blocks.ts +78 -28
- package/src/webview/render-fgca.ts +53 -28
- package/src/webview/render-goals.ts +133 -110
- package/src/webview/render-process-blueprint.ts +281 -207
- package/src/webview/render-process.ts +507 -0
- package/src/webview/render-scenarios.ts +3 -3
- package/src/webview/render-util.ts +27 -14
- package/src/webview/styles.css +322 -323
- package/src/yaml-normalize.ts +56 -56
- package/dist/element-envelope.d.ts +0 -15
- package/dist/element-envelope.js +0 -55
- package/dist/issues/__tests__/layout.test.js +0 -62
- package/dist/issues/__tests__/validate.test.js +0 -82
- package/dist/issues/index.d.ts +0 -4
- package/dist/issues/index.js +0 -2
- package/dist/issues/layout.d.ts +0 -10
- package/dist/issues/layout.js +0 -82
- package/dist/issues/types.d.ts +0 -61
- package/dist/issues/types.js +0 -6
- package/dist/issues/validate.d.ts +0 -3
- package/dist/issues/validate.js +0 -143
- package/dist/webview/transitrix-render.css +0 -323
- package/dist/webview/transitrix-render.js +0 -6452
- package/dist/webview/transitrix-render.js.map +0 -7
- package/src/element-envelope.ts +0 -76
- /package/dist/{issues/__tests__/layout.test.d.ts → fgca/__tests__/resolver.test.d.ts} +0 -0
- /package/dist/{issues/__tests__/validate.test.d.ts → webview/__tests__/render-process.test.d.ts} +0 -0
package/src/webview/entry.ts
CHANGED
|
@@ -1,292 +1,298 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Browser-bundle entry point for the IntelliJ JCEF preview surface (and any
|
|
3
|
-
* other host that wants the same in-browser API).
|
|
4
|
-
*
|
|
5
|
-
* Why: ADR 0001 picks JCEF + a bundled `@transitrix/diagrams` over a JVM-side
|
|
6
|
-
* re-implementation. This module is the API contract between the JVM host
|
|
7
|
-
* (which posts raw document text + the notation kind) and the rendering JS
|
|
8
|
-
* (which parses, validates, and — Step 3+ — renders SVG). Centralising the
|
|
9
|
-
* surface in one file means the JVM side only has to know about
|
|
10
|
-
* `window.transitrix.render(kind, source)` regardless of which notation the
|
|
11
|
-
* user opened.
|
|
12
|
-
*
|
|
13
|
-
* Step 2 scope: wire YAML parsing, dispatch to the right validator, surface
|
|
14
|
-
* validation/parse errors in a structured JSON shape.
|
|
15
|
-
* Step 3 scope: wire the `goals` SVG renderer so the bundle returns non-empty
|
|
16
|
-
* `svg` for a valid goals document.
|
|
17
|
-
* Step 4 scope (this PR): wire the remaining eleven notations — each one
|
|
18
|
-
* validates the parsed YAML and, when valid, renders host-neutral markup
|
|
19
|
-
* (SVG for the diagram notations, an HTML fragment for the catalogue
|
|
20
|
-
* notations). The JVM host drops whatever `svg` carries into the DOM, so the
|
|
21
|
-
* field name is historical — it transports any self-contained markup.
|
|
22
|
-
*/
|
|
23
|
-
import yaml from 'js-yaml';
|
|
24
|
-
|
|
25
|
-
import { validateActivities } from '../activities/index.js';
|
|
26
|
-
import type { ActivityDoc } from '../activities/index.js';
|
|
27
|
-
import { validateActivityCard } from '../activity-card/index.js';
|
|
28
|
-
import type { ActivityCardDoc } from '../activity-card/index.js';
|
|
29
|
-
import { validateApplicationsCatalogue } from '../applications/index.js';
|
|
30
|
-
import type { ApplicationsCatalogueFile } from '../applications/index.js';
|
|
31
|
-
import { validateNestedBlocks } from '../blocks/index.js';
|
|
32
|
-
import type { BlocksFile } from '../blocks/index.js';
|
|
33
|
-
import { validateCapabilityMap } from '../capability-map/index.js';
|
|
34
|
-
import type { CapabilityMapFile } from '../capability-map/index.js';
|
|
35
|
-
import { parseCanonicalFGCA, parseCanonicalFGA } from '../fgca/parse-canonical.js';
|
|
36
|
-
import { parseCanonicalGoals } from '../goals/parse-canonical.js';
|
|
37
|
-
import { validateProcessBlueprint } from '../process-blueprint/index.js';
|
|
38
|
-
import type { ProcessBlueprintFile } from '../process-blueprint/index.js';
|
|
39
|
-
import { validateProcessMap } from '../process-map/index.js';
|
|
40
|
-
import type { ProcessMapFile } from '../process-map/index.js';
|
|
41
|
-
import { validateProductsCatalogue } from '../products/index.js';
|
|
42
|
-
import type { ProductsCatalogueFile } from '../products/index.js';
|
|
43
|
-
import { validateScenario } from '../scenarios/index.js';
|
|
44
|
-
import type { ScenarioFile } from '../scenarios/index.js';
|
|
45
|
-
import { coerceDatesToIsoStrings } from '../yaml-normalize.js';
|
|
46
|
-
|
|
47
|
-
import { renderActivitiesSvg } from './render-activities.js';
|
|
48
|
-
import { renderActivityCardSvg } from './render-activity-card.js';
|
|
49
|
-
import { renderApplicationsHtml } from './render-applications.js';
|
|
50
|
-
import { renderBlocksSvg } from './render-blocks.js';
|
|
51
|
-
import { renderCapabilityMapHtml } from './render-capability-map.js';
|
|
52
|
-
import { renderFgcaSvg } from './render-fgca.js';
|
|
53
|
-
import { renderGoalsSvg } from './render-goals.js';
|
|
54
|
-
import { renderProcessBlueprintSvg } from './render-process-blueprint.js';
|
|
55
|
-
import { renderProcessMapHtml } from './render-process-map.js';
|
|
56
|
-
import { renderProductsHtml } from './render-products.js';
|
|
57
|
-
import { renderScenarioHtml } from './render-scenarios.js';
|
|
58
|
-
|
|
59
|
-
export interface RenderError {
|
|
60
|
-
code: string;
|
|
61
|
-
message: string;
|
|
62
|
-
path?: string;
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
export interface RenderWarning {
|
|
66
|
-
code: string;
|
|
67
|
-
message: string;
|
|
68
|
-
path?: string;
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
export type RenderStatus = 'ok' | 'error';
|
|
72
|
-
|
|
73
|
-
export interface RenderResult {
|
|
74
|
-
status: RenderStatus;
|
|
75
|
-
notation: string;
|
|
76
|
-
/**
|
|
77
|
-
* Self-contained markup for the rendered notation — an `<svg>` for the
|
|
78
|
-
* diagram notations, an HTML `<section>` for the catalogue notations. Empty
|
|
79
|
-
* on validation failure (the host shows the error panel instead). The field
|
|
80
|
-
* name is historical; the JVM host injects whatever it carries into the DOM.
|
|
81
|
-
*/
|
|
82
|
-
svg: string;
|
|
83
|
-
errors: RenderError[];
|
|
84
|
-
warnings: RenderWarning[];
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
/**
|
|
88
|
-
* Notation kinds the host can request. Mirrors the `*.<kind>.<…>` suffix
|
|
89
|
-
* convention used by the VS Code extension's `activationEvents`. All twelve
|
|
90
|
-
* are wired to their validator + renderer as of Step 4.
|
|
91
|
-
*/
|
|
92
|
-
export type NotationKind =
|
|
93
|
-
| 'goals'
|
|
94
|
-
| '
|
|
95
|
-
| '
|
|
96
|
-
| '
|
|
97
|
-
| '
|
|
98
|
-
| '
|
|
99
|
-
| '
|
|
100
|
-
| '
|
|
101
|
-
| '
|
|
102
|
-
| '
|
|
103
|
-
| '
|
|
104
|
-
| '
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
'
|
|
110
|
-
'
|
|
111
|
-
'
|
|
112
|
-
'
|
|
113
|
-
'
|
|
114
|
-
'
|
|
115
|
-
'
|
|
116
|
-
'
|
|
117
|
-
'
|
|
118
|
-
'
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
function
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
r
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
)
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
)
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
)
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
case '
|
|
227
|
-
return renderFromValidation('
|
|
228
|
-
|
|
229
|
-
);
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
)
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
)
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
)
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
)
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
);
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
if (
|
|
263
|
-
return errorResult(
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
}
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
export
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Browser-bundle entry point for the IntelliJ JCEF preview surface (and any
|
|
3
|
+
* other host that wants the same in-browser API).
|
|
4
|
+
*
|
|
5
|
+
* Why: ADR 0001 picks JCEF + a bundled `@transitrix/diagrams` over a JVM-side
|
|
6
|
+
* re-implementation. This module is the API contract between the JVM host
|
|
7
|
+
* (which posts raw document text + the notation kind) and the rendering JS
|
|
8
|
+
* (which parses, validates, and — Step 3+ — renders SVG). Centralising the
|
|
9
|
+
* surface in one file means the JVM side only has to know about
|
|
10
|
+
* `window.transitrix.render(kind, source)` regardless of which notation the
|
|
11
|
+
* user opened.
|
|
12
|
+
*
|
|
13
|
+
* Step 2 scope: wire YAML parsing, dispatch to the right validator, surface
|
|
14
|
+
* validation/parse errors in a structured JSON shape.
|
|
15
|
+
* Step 3 scope: wire the `goals` SVG renderer so the bundle returns non-empty
|
|
16
|
+
* `svg` for a valid goals document.
|
|
17
|
+
* Step 4 scope (this PR): wire the remaining eleven notations — each one
|
|
18
|
+
* validates the parsed YAML and, when valid, renders host-neutral markup
|
|
19
|
+
* (SVG for the diagram notations, an HTML fragment for the catalogue
|
|
20
|
+
* notations). The JVM host drops whatever `svg` carries into the DOM, so the
|
|
21
|
+
* field name is historical — it transports any self-contained markup.
|
|
22
|
+
*/
|
|
23
|
+
import yaml from 'js-yaml';
|
|
24
|
+
|
|
25
|
+
import { validateActivities } from '../activities/index.js';
|
|
26
|
+
import type { ActivityDoc } from '../activities/index.js';
|
|
27
|
+
import { validateActivityCard } from '../activity-card/index.js';
|
|
28
|
+
import type { ActivityCardDoc } from '../activity-card/index.js';
|
|
29
|
+
import { validateApplicationsCatalogue } from '../applications/index.js';
|
|
30
|
+
import type { ApplicationsCatalogueFile } from '../applications/index.js';
|
|
31
|
+
import { validateNestedBlocks } from '../blocks/index.js';
|
|
32
|
+
import type { BlocksFile } from '../blocks/index.js';
|
|
33
|
+
import { validateCapabilityMap } from '../capability-map/index.js';
|
|
34
|
+
import type { CapabilityMapFile } from '../capability-map/index.js';
|
|
35
|
+
import { parseCanonicalFGCA, parseCanonicalFGA } from '../fgca/parse-canonical.js';
|
|
36
|
+
import { parseCanonicalGoals } from '../goals/parse-canonical.js';
|
|
37
|
+
import { validateProcessBlueprint } from '../process-blueprint/index.js';
|
|
38
|
+
import type { ProcessBlueprintFile } from '../process-blueprint/index.js';
|
|
39
|
+
import { validateProcessMap } from '../process-map/index.js';
|
|
40
|
+
import type { ProcessMapFile } from '../process-map/index.js';
|
|
41
|
+
import { validateProductsCatalogue } from '../products/index.js';
|
|
42
|
+
import type { ProductsCatalogueFile } from '../products/index.js';
|
|
43
|
+
import { validateScenario } from '../scenarios/index.js';
|
|
44
|
+
import type { ScenarioFile } from '../scenarios/index.js';
|
|
45
|
+
import { coerceDatesToIsoStrings } from '../yaml-normalize.js';
|
|
46
|
+
|
|
47
|
+
import { renderActivitiesSvg } from './render-activities.js';
|
|
48
|
+
import { renderActivityCardSvg } from './render-activity-card.js';
|
|
49
|
+
import { renderApplicationsHtml } from './render-applications.js';
|
|
50
|
+
import { renderBlocksSvg } from './render-blocks.js';
|
|
51
|
+
import { renderCapabilityMapHtml } from './render-capability-map.js';
|
|
52
|
+
import { renderFgcaSvg } from './render-fgca.js';
|
|
53
|
+
import { renderGoalsSvg } from './render-goals.js';
|
|
54
|
+
import { renderProcessBlueprintSvg } from './render-process-blueprint.js';
|
|
55
|
+
import { renderProcessMapHtml } from './render-process-map.js';
|
|
56
|
+
import { renderProductsHtml } from './render-products.js';
|
|
57
|
+
import { renderScenarioHtml } from './render-scenarios.js';
|
|
58
|
+
|
|
59
|
+
export interface RenderError {
|
|
60
|
+
code: string;
|
|
61
|
+
message: string;
|
|
62
|
+
path?: string;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export interface RenderWarning {
|
|
66
|
+
code: string;
|
|
67
|
+
message: string;
|
|
68
|
+
path?: string;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export type RenderStatus = 'ok' | 'error';
|
|
72
|
+
|
|
73
|
+
export interface RenderResult {
|
|
74
|
+
status: RenderStatus;
|
|
75
|
+
notation: string;
|
|
76
|
+
/**
|
|
77
|
+
* Self-contained markup for the rendered notation — an `<svg>` for the
|
|
78
|
+
* diagram notations, an HTML `<section>` for the catalogue notations. Empty
|
|
79
|
+
* on validation failure (the host shows the error panel instead). The field
|
|
80
|
+
* name is historical; the JVM host injects whatever it carries into the DOM.
|
|
81
|
+
*/
|
|
82
|
+
svg: string;
|
|
83
|
+
errors: RenderError[];
|
|
84
|
+
warnings: RenderWarning[];
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Notation kinds the host can request. Mirrors the `*.<kind>.<…>` suffix
|
|
89
|
+
* convention used by the VS Code extension's `activationEvents`. All twelve
|
|
90
|
+
* are wired to their validator + renderer as of Step 4.
|
|
91
|
+
*/
|
|
92
|
+
export type NotationKind =
|
|
93
|
+
| 'goals'
|
|
94
|
+
| 'dgca'
|
|
95
|
+
| 'dga'
|
|
96
|
+
| 'fgca'
|
|
97
|
+
| 'fga'
|
|
98
|
+
| 'activities'
|
|
99
|
+
| 'activity-card'
|
|
100
|
+
| 'applications'
|
|
101
|
+
| 'products'
|
|
102
|
+
| 'process-map'
|
|
103
|
+
| 'process-blueprint'
|
|
104
|
+
| 'scenarios'
|
|
105
|
+
| 'capability-map'
|
|
106
|
+
| 'blocks';
|
|
107
|
+
|
|
108
|
+
const SUPPORTED_KINDS: readonly NotationKind[] = [
|
|
109
|
+
'goals',
|
|
110
|
+
'dgca',
|
|
111
|
+
'dga',
|
|
112
|
+
'fgca',
|
|
113
|
+
'fga',
|
|
114
|
+
'activities',
|
|
115
|
+
'activity-card',
|
|
116
|
+
'applications',
|
|
117
|
+
'products',
|
|
118
|
+
'process-map',
|
|
119
|
+
'process-blueprint',
|
|
120
|
+
'scenarios',
|
|
121
|
+
'capability-map',
|
|
122
|
+
'blocks',
|
|
123
|
+
];
|
|
124
|
+
|
|
125
|
+
const VERSION = '0.1.0';
|
|
126
|
+
|
|
127
|
+
function emptyResult(notation: string, status: RenderStatus): RenderResult {
|
|
128
|
+
return { status, notation, svg: '', errors: [], warnings: [] };
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
function errorResult(notation: string, code: string, message: string, path?: string): RenderResult {
|
|
132
|
+
const r = emptyResult(notation, 'error');
|
|
133
|
+
r.errors.push(path !== undefined ? { code, message, path } : { code, message });
|
|
134
|
+
return r;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
function parseYaml(source: string): { doc?: unknown; error?: string } {
|
|
138
|
+
try {
|
|
139
|
+
// Coerce native `Date`s (bare `2026-06-01` per YAML 1.1) back to ISO
|
|
140
|
+
// strings before validation — every notation validator expects string
|
|
141
|
+
// dates, and the VS Code previews apply the same normalisation. Without
|
|
142
|
+
// it the canonical-minus-quotes form would falsely fail shape checks.
|
|
143
|
+
return { doc: coerceDatesToIsoStrings(yaml.load(source)) };
|
|
144
|
+
} catch (e: unknown) {
|
|
145
|
+
return { error: e instanceof Error ? e.message : String(e) };
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
interface ValidationLike {
|
|
150
|
+
valid: boolean;
|
|
151
|
+
errors: RenderError[];
|
|
152
|
+
warnings: RenderWarning[];
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* Shared shape for the validate-then-render notations: copy the validator's
|
|
157
|
+
* errors/warnings into the result, and render markup only once the document is
|
|
158
|
+
* valid. `renderMarkup` is a thunk so the (type-asserted) render call never
|
|
159
|
+
* runs against a document the validator rejected.
|
|
160
|
+
*/
|
|
161
|
+
function renderFromValidation(
|
|
162
|
+
kind: NotationKind,
|
|
163
|
+
result: ValidationLike,
|
|
164
|
+
renderMarkup: () => string,
|
|
165
|
+
): RenderResult {
|
|
166
|
+
const r = emptyResult(kind, result.valid ? 'ok' : 'error');
|
|
167
|
+
r.errors.push(...result.errors);
|
|
168
|
+
r.warnings.push(...result.warnings);
|
|
169
|
+
if (result.valid) {
|
|
170
|
+
r.svg = renderMarkup();
|
|
171
|
+
}
|
|
172
|
+
return r;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
function dispatchValidate(kind: NotationKind, doc: unknown): RenderResult {
|
|
176
|
+
switch (kind) {
|
|
177
|
+
case 'goals': {
|
|
178
|
+
const v = parseCanonicalGoals(doc);
|
|
179
|
+
const r = emptyResult('goals', v.valid ? 'ok' : 'error');
|
|
180
|
+
r.errors.push(...v.errors);
|
|
181
|
+
r.warnings.push(...v.warnings);
|
|
182
|
+
if (v.valid && v.parsed) {
|
|
183
|
+
const meta = (doc ?? {}) as { name?: unknown };
|
|
184
|
+
const treeName = typeof meta.name === 'string' ? meta.name : '';
|
|
185
|
+
r.svg = renderGoalsSvg(v.parsed, { treeName });
|
|
186
|
+
}
|
|
187
|
+
return r;
|
|
188
|
+
}
|
|
189
|
+
// DGCA and DGA are the canonical new names; FGCA/FGA are accepted as
|
|
190
|
+
// deprecated aliases. All four share the same parse + renderer; only the
|
|
191
|
+
// Change column visibility differs (DGA/FGA collapse it).
|
|
192
|
+
case 'dgca':
|
|
193
|
+
case 'fgca': {
|
|
194
|
+
const v = parseCanonicalFGCA(doc);
|
|
195
|
+
const r = emptyResult(kind, v.valid ? 'ok' : 'error');
|
|
196
|
+
r.errors.push(...v.errors);
|
|
197
|
+
r.warnings.push(...v.warnings);
|
|
198
|
+
if (v.valid && v.parsed) {
|
|
199
|
+
r.svg = renderFgcaSvg(v.parsed, { variant: 'fgca' });
|
|
200
|
+
}
|
|
201
|
+
return r;
|
|
202
|
+
}
|
|
203
|
+
case 'dga':
|
|
204
|
+
case 'fga': {
|
|
205
|
+
const v = parseCanonicalFGA(doc);
|
|
206
|
+
const r = emptyResult(kind, v.valid ? 'ok' : 'error');
|
|
207
|
+
r.errors.push(...v.errors);
|
|
208
|
+
r.warnings.push(...v.warnings);
|
|
209
|
+
if (v.valid && v.parsed) {
|
|
210
|
+
r.svg = renderFgcaSvg(v.parsed, { variant: 'fga' });
|
|
211
|
+
}
|
|
212
|
+
return r;
|
|
213
|
+
}
|
|
214
|
+
case 'activities':
|
|
215
|
+
return renderFromValidation('activities', validateActivities(doc), () =>
|
|
216
|
+
renderActivitiesSvg(doc as ActivityDoc),
|
|
217
|
+
);
|
|
218
|
+
case 'activity-card':
|
|
219
|
+
return renderFromValidation('activity-card', validateActivityCard(doc), () =>
|
|
220
|
+
renderActivityCardSvg(doc as ActivityCardDoc),
|
|
221
|
+
);
|
|
222
|
+
case 'process-blueprint':
|
|
223
|
+
return renderFromValidation('process-blueprint', validateProcessBlueprint(doc), () =>
|
|
224
|
+
renderProcessBlueprintSvg(doc as ProcessBlueprintFile),
|
|
225
|
+
);
|
|
226
|
+
case 'blocks':
|
|
227
|
+
return renderFromValidation('blocks', validateNestedBlocks(doc), () =>
|
|
228
|
+
renderBlocksSvg(doc as BlocksFile),
|
|
229
|
+
);
|
|
230
|
+
// Catalogue notations render an HTML fragment from the header nested under
|
|
231
|
+
// their top-level wrapper key (`<thing>_catalogue` / `scenario` / …).
|
|
232
|
+
case 'applications':
|
|
233
|
+
return renderFromValidation('applications', validateApplicationsCatalogue(doc), () =>
|
|
234
|
+
renderApplicationsHtml((doc as ApplicationsCatalogueFile).applications_catalogue),
|
|
235
|
+
);
|
|
236
|
+
case 'products':
|
|
237
|
+
return renderFromValidation('products', validateProductsCatalogue(doc), () =>
|
|
238
|
+
renderProductsHtml((doc as ProductsCatalogueFile).products_catalogue),
|
|
239
|
+
);
|
|
240
|
+
case 'process-map':
|
|
241
|
+
return renderFromValidation('process-map', validateProcessMap(doc), () =>
|
|
242
|
+
renderProcessMapHtml((doc as ProcessMapFile).process_map),
|
|
243
|
+
);
|
|
244
|
+
case 'scenarios':
|
|
245
|
+
return renderFromValidation('scenarios', validateScenario(doc), () =>
|
|
246
|
+
renderScenarioHtml((doc as ScenarioFile).scenario),
|
|
247
|
+
);
|
|
248
|
+
case 'capability-map':
|
|
249
|
+
return renderFromValidation('capability-map', validateCapabilityMap(doc), () =>
|
|
250
|
+
renderCapabilityMapHtml((doc as CapabilityMapFile).capability_map),
|
|
251
|
+
);
|
|
252
|
+
default:
|
|
253
|
+
return errorResult(
|
|
254
|
+
kind,
|
|
255
|
+
'NOTATION-NOT-WIRED',
|
|
256
|
+
`Notation '${kind}' is not wired into the IntelliJ bundle yet.`,
|
|
257
|
+
);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
export function render(notationKind: string, source: string): RenderResult {
|
|
262
|
+
if (typeof notationKind !== 'string' || notationKind.length === 0) {
|
|
263
|
+
return errorResult('', 'KIND-MISSING', 'notationKind is required');
|
|
264
|
+
}
|
|
265
|
+
if (typeof source !== 'string') {
|
|
266
|
+
return errorResult(notationKind, 'SOURCE-INVALID', 'source must be a string');
|
|
267
|
+
}
|
|
268
|
+
if (!SUPPORTED_KINDS.includes(notationKind as NotationKind)) {
|
|
269
|
+
return errorResult(
|
|
270
|
+
notationKind,
|
|
271
|
+
'KIND-UNKNOWN',
|
|
272
|
+
`Unknown notation kind: '${notationKind}'. Expected one of: ${SUPPORTED_KINDS.join(', ')}.`,
|
|
273
|
+
);
|
|
274
|
+
}
|
|
275
|
+
const parsed = parseYaml(source);
|
|
276
|
+
if (parsed.error !== undefined) {
|
|
277
|
+
return errorResult(notationKind, 'YAML-PARSE', parsed.error);
|
|
278
|
+
}
|
|
279
|
+
return dispatchValidate(notationKind as NotationKind, parsed.doc);
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
export const api = {
|
|
283
|
+
version: VERSION,
|
|
284
|
+
supportedKinds: SUPPORTED_KINDS,
|
|
285
|
+
render,
|
|
286
|
+
};
|
|
287
|
+
|
|
288
|
+
export type TransitrixWebviewApi = typeof api;
|
|
289
|
+
|
|
290
|
+
// Install the API on `window.transitrix` when running in a browser-ish host
|
|
291
|
+
// (JCEF qualifies). In a Node/Vitest context `window` is undefined and the
|
|
292
|
+
// install is a no-op — the named exports remain available for unit tests.
|
|
293
|
+
declare const window: { transitrix?: TransitrixWebviewApi } | undefined;
|
|
294
|
+
if (typeof window !== 'undefined') {
|
|
295
|
+
(window as { transitrix?: TransitrixWebviewApi }).transitrix = api;
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
export default api;
|