@cda/adapter-xma 0.4.3 → 0.6.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 -0
- package/README.md +54 -20
- package/dist/cjs/diagnostics/diagnostics.d.ts.map +1 -0
- package/dist/cjs/diagnostics/diagnostics.js +23 -0
- package/dist/cjs/diagnostics/diagnostics.js.map +1 -0
- package/dist/cjs/diagnostics/errors.d.ts.map +1 -0
- package/dist/cjs/diagnostics/errors.js +24 -0
- package/dist/cjs/diagnostics/errors.js.map +1 -0
- package/dist/cjs/geometry/bendpoints.d.ts.map +1 -0
- package/dist/cjs/geometry/bendpoints.js +51 -0
- package/dist/cjs/geometry/bendpoints.js.map +1 -0
- package/dist/cjs/geometry/geometry.d.ts +75 -0
- package/dist/cjs/geometry/geometry.d.ts.map +1 -0
- package/dist/cjs/geometry/geometry.js +77 -0
- package/dist/cjs/geometry/geometry.js.map +1 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +9 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/infrastructure/assert.d.ts +10 -0
- package/dist/cjs/infrastructure/assert.d.ts.map +1 -0
- package/dist/cjs/infrastructure/assert.js +18 -0
- package/dist/cjs/infrastructure/assert.js.map +1 -0
- package/dist/cjs/infrastructure/id-allocator.d.ts.map +1 -0
- package/dist/cjs/infrastructure/id-allocator.js +59 -0
- package/dist/cjs/infrastructure/id-allocator.js.map +1 -0
- package/dist/cjs/infrastructure/xml-writer.d.ts.map +1 -0
- package/dist/cjs/infrastructure/xml-writer.js +94 -0
- package/dist/cjs/infrastructure/xml-writer.js.map +1 -0
- package/dist/cjs/mapping/element-mapping.d.ts.map +1 -0
- package/dist/cjs/mapping/element-mapping.js +117 -0
- package/dist/cjs/mapping/element-mapping.js.map +1 -0
- package/dist/cjs/mapping/generic-relationship-mapping.d.ts.map +1 -0
- package/dist/cjs/mapping/generic-relationship-mapping.js +71 -0
- package/dist/cjs/mapping/generic-relationship-mapping.js.map +1 -0
- package/dist/cjs/mapping/relationship-mapping.d.ts.map +1 -0
- package/dist/cjs/mapping/relationship-mapping.js +697 -0
- package/dist/cjs/mapping/relationship-mapping.js.map +1 -0
- package/dist/cjs/mapping/scheme-mapping.d.ts.map +1 -0
- package/dist/cjs/mapping/scheme-mapping.js +42 -0
- package/dist/cjs/mapping/scheme-mapping.js.map +1 -0
- package/dist/{mapping → cjs/mapping}/visual-mapping.d.ts +8 -0
- package/dist/cjs/mapping/visual-mapping.d.ts.map +1 -0
- package/dist/cjs/mapping/visual-mapping.js +51 -0
- package/dist/cjs/mapping/visual-mapping.js.map +1 -0
- package/dist/cjs/package.json +3 -0
- package/dist/cjs/serializer/document-writer.d.ts.map +1 -0
- package/dist/cjs/serializer/document-writer.js +143 -0
- package/dist/cjs/serializer/document-writer.js.map +1 -0
- package/dist/{serializer → cjs/serializer}/graphical-writer.d.ts +8 -6
- package/dist/cjs/serializer/graphical-writer.d.ts.map +1 -0
- package/dist/cjs/serializer/graphical-writer.js +521 -0
- package/dist/cjs/serializer/graphical-writer.js.map +1 -0
- package/dist/cjs/serializer/profile-values.d.ts.map +1 -0
- package/dist/cjs/serializer/profile-values.js +28 -0
- package/dist/cjs/serializer/profile-values.js.map +1 -0
- package/dist/cjs/serializer/relationship-writer.d.ts.map +1 -0
- package/dist/cjs/serializer/relationship-writer.js +109 -0
- package/dist/cjs/serializer/relationship-writer.js.map +1 -0
- package/dist/cjs/serializer/rtf.d.ts.map +1 -0
- package/dist/cjs/serializer/rtf.js +67 -0
- package/dist/cjs/serializer/rtf.js.map +1 -0
- package/dist/cjs/serializer/semantic-writer.d.ts.map +1 -0
- package/dist/cjs/serializer/semantic-writer.js +170 -0
- package/dist/cjs/serializer/semantic-writer.js.map +1 -0
- package/dist/cjs/serializer/serialize-xma.d.ts.map +1 -0
- package/dist/cjs/serializer/serialize-xma.js +113 -0
- package/dist/cjs/serializer/serialize-xma.js.map +1 -0
- package/dist/{serializer → cjs/serializer}/view-writer.d.ts +6 -0
- package/dist/cjs/serializer/view-writer.d.ts.map +1 -0
- package/dist/cjs/serializer/view-writer.js +239 -0
- package/dist/cjs/serializer/view-writer.js.map +1 -0
- package/dist/esm/diagnostics/diagnostics.d.ts +20 -0
- package/dist/esm/diagnostics/diagnostics.d.ts.map +1 -0
- package/dist/esm/diagnostics/diagnostics.js.map +1 -0
- package/dist/esm/diagnostics/errors.d.ts +13 -0
- package/dist/esm/diagnostics/errors.d.ts.map +1 -0
- package/dist/esm/diagnostics/errors.js.map +1 -0
- package/dist/esm/geometry/bendpoints.d.ts +33 -0
- package/dist/esm/geometry/bendpoints.d.ts.map +1 -0
- package/dist/{geometry → esm/geometry}/bendpoints.js +6 -2
- package/dist/esm/geometry/bendpoints.js.map +1 -0
- package/dist/esm/geometry/geometry.d.ts +75 -0
- package/dist/esm/geometry/geometry.d.ts.map +1 -0
- package/dist/{geometry → esm/geometry}/geometry.js +25 -6
- package/dist/esm/geometry/geometry.js.map +1 -0
- package/dist/esm/index.d.ts +5 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/infrastructure/assert.d.ts +10 -0
- package/dist/esm/infrastructure/assert.d.ts.map +1 -0
- package/dist/esm/infrastructure/assert.js +15 -0
- package/dist/esm/infrastructure/assert.js.map +1 -0
- package/dist/esm/infrastructure/id-allocator.d.ts +34 -0
- package/dist/esm/infrastructure/id-allocator.d.ts.map +1 -0
- package/dist/esm/infrastructure/id-allocator.js.map +1 -0
- package/dist/esm/infrastructure/xml-writer.d.ts +20 -0
- package/dist/esm/infrastructure/xml-writer.d.ts.map +1 -0
- package/dist/{infrastructure → esm/infrastructure}/xml-writer.js +37 -2
- package/dist/esm/infrastructure/xml-writer.js.map +1 -0
- package/dist/esm/mapping/element-mapping.d.ts +31 -0
- package/dist/esm/mapping/element-mapping.d.ts.map +1 -0
- package/dist/esm/mapping/element-mapping.js.map +1 -0
- package/dist/esm/mapping/generic-relationship-mapping.d.ts +18 -0
- package/dist/esm/mapping/generic-relationship-mapping.d.ts.map +1 -0
- package/dist/esm/mapping/generic-relationship-mapping.js.map +1 -0
- package/dist/esm/mapping/relationship-mapping.d.ts +47 -0
- package/dist/esm/mapping/relationship-mapping.d.ts.map +1 -0
- package/dist/esm/mapping/relationship-mapping.js.map +1 -0
- package/dist/esm/mapping/scheme-mapping.d.ts +38 -0
- package/dist/esm/mapping/scheme-mapping.d.ts.map +1 -0
- package/dist/esm/mapping/scheme-mapping.js.map +1 -0
- package/dist/esm/mapping/visual-mapping.d.ts +32 -0
- package/dist/esm/mapping/visual-mapping.d.ts.map +1 -0
- package/dist/{mapping → esm/mapping}/visual-mapping.js +8 -0
- package/dist/esm/mapping/visual-mapping.js.map +1 -0
- package/dist/esm/serializer/document-writer.d.ts +40 -0
- package/dist/esm/serializer/document-writer.d.ts.map +1 -0
- package/dist/{serializer → esm/serializer}/document-writer.js +5 -0
- package/dist/esm/serializer/document-writer.js.map +1 -0
- package/dist/esm/serializer/graphical-writer.d.ts +29 -0
- package/dist/esm/serializer/graphical-writer.d.ts.map +1 -0
- package/dist/{serializer → esm/serializer}/graphical-writer.js +213 -54
- package/dist/esm/serializer/graphical-writer.js.map +1 -0
- package/dist/esm/serializer/profile-values.d.ts +8 -0
- package/dist/esm/serializer/profile-values.d.ts.map +1 -0
- package/dist/esm/serializer/profile-values.js.map +1 -0
- package/dist/esm/serializer/relationship-writer.d.ts +41 -0
- package/dist/esm/serializer/relationship-writer.d.ts.map +1 -0
- package/dist/{serializer → esm/serializer}/relationship-writer.js +4 -1
- package/dist/esm/serializer/relationship-writer.js.map +1 -0
- package/dist/esm/serializer/rtf.d.ts +9 -0
- package/dist/esm/serializer/rtf.d.ts.map +1 -0
- package/dist/{serializer → esm/serializer}/rtf.js +14 -0
- package/dist/esm/serializer/rtf.js.map +1 -0
- package/dist/esm/serializer/semantic-writer.d.ts +51 -0
- package/dist/esm/serializer/semantic-writer.d.ts.map +1 -0
- package/dist/{serializer → esm/serializer}/semantic-writer.js +24 -0
- package/dist/esm/serializer/semantic-writer.js.map +1 -0
- package/dist/esm/serializer/serialize-xma.d.ts +29 -0
- package/dist/esm/serializer/serialize-xma.d.ts.map +1 -0
- package/dist/{serializer → esm/serializer}/serialize-xma.js +40 -1
- package/dist/esm/serializer/serialize-xma.js.map +1 -0
- package/dist/esm/serializer/view-writer.d.ts +33 -0
- package/dist/esm/serializer/view-writer.d.ts.map +1 -0
- package/dist/esm/serializer/view-writer.js +236 -0
- package/dist/esm/serializer/view-writer.js.map +1 -0
- package/package.json +20 -9
- package/dist/diagnostics/diagnostics.d.ts.map +0 -1
- package/dist/diagnostics/diagnostics.js.map +0 -1
- package/dist/diagnostics/errors.d.ts.map +0 -1
- package/dist/diagnostics/errors.js.map +0 -1
- package/dist/geometry/bendpoints.d.ts.map +0 -1
- package/dist/geometry/bendpoints.js.map +0 -1
- package/dist/geometry/geometry.d.ts +0 -48
- package/dist/geometry/geometry.d.ts.map +0 -1
- package/dist/geometry/geometry.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/infrastructure/id-allocator.d.ts.map +0 -1
- package/dist/infrastructure/id-allocator.js.map +0 -1
- package/dist/infrastructure/xml-writer.d.ts.map +0 -1
- package/dist/infrastructure/xml-writer.js.map +0 -1
- package/dist/mapping/element-mapping.d.ts.map +0 -1
- package/dist/mapping/element-mapping.js.map +0 -1
- package/dist/mapping/generic-relationship-mapping.d.ts.map +0 -1
- package/dist/mapping/generic-relationship-mapping.js.map +0 -1
- package/dist/mapping/relationship-mapping.d.ts.map +0 -1
- package/dist/mapping/relationship-mapping.js.map +0 -1
- package/dist/mapping/scheme-mapping.d.ts.map +0 -1
- package/dist/mapping/scheme-mapping.js.map +0 -1
- package/dist/mapping/visual-mapping.d.ts.map +0 -1
- package/dist/mapping/visual-mapping.js.map +0 -1
- package/dist/serializer/document-writer.d.ts.map +0 -1
- package/dist/serializer/document-writer.js.map +0 -1
- package/dist/serializer/graphical-writer.d.ts.map +0 -1
- package/dist/serializer/graphical-writer.js.map +0 -1
- package/dist/serializer/profile-values.d.ts.map +0 -1
- package/dist/serializer/profile-values.js.map +0 -1
- package/dist/serializer/relationship-writer.d.ts.map +0 -1
- package/dist/serializer/relationship-writer.js.map +0 -1
- package/dist/serializer/rtf.d.ts.map +0 -1
- package/dist/serializer/rtf.js.map +0 -1
- package/dist/serializer/semantic-writer.d.ts.map +0 -1
- package/dist/serializer/semantic-writer.js.map +0 -1
- package/dist/serializer/serialize-xma.d.ts.map +0 -1
- package/dist/serializer/serialize-xma.js.map +0 -1
- package/dist/serializer/view-writer.d.ts.map +0 -1
- package/dist/serializer/view-writer.js +0 -145
- package/dist/serializer/view-writer.js.map +0 -1
- /package/dist/{diagnostics → cjs/diagnostics}/diagnostics.d.ts +0 -0
- /package/dist/{diagnostics → cjs/diagnostics}/errors.d.ts +0 -0
- /package/dist/{geometry → cjs/geometry}/bendpoints.d.ts +0 -0
- /package/dist/{index.d.ts → cjs/index.d.ts} +0 -0
- /package/dist/{infrastructure → cjs/infrastructure}/id-allocator.d.ts +0 -0
- /package/dist/{infrastructure → cjs/infrastructure}/xml-writer.d.ts +0 -0
- /package/dist/{mapping → cjs/mapping}/element-mapping.d.ts +0 -0
- /package/dist/{mapping → cjs/mapping}/generic-relationship-mapping.d.ts +0 -0
- /package/dist/{mapping → cjs/mapping}/relationship-mapping.d.ts +0 -0
- /package/dist/{mapping → cjs/mapping}/scheme-mapping.d.ts +0 -0
- /package/dist/{serializer → cjs/serializer}/document-writer.d.ts +0 -0
- /package/dist/{serializer → cjs/serializer}/profile-values.d.ts +0 -0
- /package/dist/{serializer → cjs/serializer}/relationship-writer.d.ts +0 -0
- /package/dist/{serializer → cjs/serializer}/rtf.d.ts +0 -0
- /package/dist/{serializer → cjs/serializer}/semantic-writer.d.ts +0 -0
- /package/dist/{serializer → cjs/serializer}/serialize-xma.d.ts +0 -0
- /package/dist/{diagnostics → esm/diagnostics}/diagnostics.js +0 -0
- /package/dist/{diagnostics → esm/diagnostics}/errors.js +0 -0
- /package/dist/{index.js → esm/index.js} +0 -0
- /package/dist/{infrastructure → esm/infrastructure}/id-allocator.js +0 -0
- /package/dist/{mapping → esm/mapping}/element-mapping.js +0 -0
- /package/dist/{mapping → esm/mapping}/generic-relationship-mapping.js +0 -0
- /package/dist/{mapping → esm/mapping}/relationship-mapping.js +0 -0
- /package/dist/{mapping → esm/mapping}/scheme-mapping.js +0 -0
- /package/dist/{serializer → esm/serializer}/profile-values.js +0 -0
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.buildView = buildView;
|
|
4
|
+
const xml_writer_js_1 = require("../infrastructure/xml-writer.js");
|
|
5
|
+
const profile_values_js_1 = require("./profile-values.js");
|
|
6
|
+
const geometry_js_1 = require("../geometry/geometry.js");
|
|
7
|
+
/**
|
|
8
|
+
* Builds one `AllView`'s `ViewGraphics` (Notes/Groups) and `RefObjects`
|
|
9
|
+
* (the three-layer view-reference indirection — see module docs on
|
|
10
|
+
* `graphical-writer.ts`). Also validates every diagram object/note/connection
|
|
11
|
+
* in the view, since geometry and view membership are model-wide
|
|
12
|
+
* preservation guarantees, not just node drawing concerns. Nested diagram
|
|
13
|
+
* objects (a `parentId` or non-empty `childrenIds`) are valid here — see
|
|
14
|
+
* `graphical-writer.ts`'s recursive node building for how nesting is drawn.
|
|
15
|
+
*/
|
|
16
|
+
function buildView(model, view, ids, refIds, mappedElements, mappedRelationships, diagnostics, language) {
|
|
17
|
+
const viewGraphicsXml = [];
|
|
18
|
+
const viewEdgesXml = [];
|
|
19
|
+
const refObjectsXml = [];
|
|
20
|
+
const validElementNodeObjectIds = new Set();
|
|
21
|
+
const validGroupObjectIds = new Set();
|
|
22
|
+
const validNoteIds = new Set();
|
|
23
|
+
const validViewReferenceObjectIds = new Set();
|
|
24
|
+
const viewEdgeSemanticIds = new Map();
|
|
25
|
+
const viewIds = new Set(model.views.map((v) => v.id));
|
|
26
|
+
const diagramObjectById = new Map(model.diagramObjects.map((o) => [o.id, o]));
|
|
27
|
+
/**
|
|
28
|
+
* Resolves the semantic XMA id a diagram object (or note) uses for its
|
|
29
|
+
* *own* node's `mm_semanticObject` — confirmed (across an
|
|
30
|
+
* element-backed/Group/Note/DiagramModelReference mix, in two independent
|
|
31
|
+
* fixtures) to be exactly the value an `ArchiMate:ViewEdge`'s `from`/`to`
|
|
32
|
+
* references for that same object. `undefined` when the id isn't a
|
|
33
|
+
* validated, drawable object/note in this view.
|
|
34
|
+
*/
|
|
35
|
+
function resolveObjectSemanticId(objectOrNoteId) {
|
|
36
|
+
if (validElementNodeObjectIds.has(objectOrNoteId)) {
|
|
37
|
+
const archimateElementId = diagramObjectById.get(objectOrNoteId)?.archimateElementId;
|
|
38
|
+
return archimateElementId ? refIds.get(archimateElementId) : undefined;
|
|
39
|
+
}
|
|
40
|
+
if (validGroupObjectIds.has(objectOrNoteId) || validNoteIds.has(objectOrNoteId)) {
|
|
41
|
+
return ids.get(objectOrNoteId);
|
|
42
|
+
}
|
|
43
|
+
if (validViewReferenceObjectIds.has(objectOrNoteId)) {
|
|
44
|
+
const referencedModelId = diagramObjectById.get(objectOrNoteId)?.referencedModelId;
|
|
45
|
+
return referencedModelId ? refIds.get(referencedModelId) : undefined;
|
|
46
|
+
}
|
|
47
|
+
return undefined;
|
|
48
|
+
}
|
|
49
|
+
for (const obj of model.diagramObjects) {
|
|
50
|
+
if (obj.viewId !== view.id) {
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
if (obj.referencedModelId !== null) {
|
|
54
|
+
// Corrected finding: an earlier version of this comment claimed "no
|
|
55
|
+
// trace whatsoever" of a DiagramModelReference in the real XMA export,
|
|
56
|
+
// based on grepping for Archi's own string id — which can never match
|
|
57
|
+
// anything, since XMA never reuses Archi's ids (see id-allocator.ts).
|
|
58
|
+
// That verification method was broken, not the underlying claim.
|
|
59
|
+
// Re-verified directly against agile-manifesto.xma: both
|
|
60
|
+
// DiagramModelReference objects there ARE drawn, as an
|
|
61
|
+
// `mm_concept="AllView"`/`mm_graphicType="3"` node whose
|
|
62
|
+
// `mm_semanticObject` resolves — via an `ArchiMate:AllViewRef`, the
|
|
63
|
+
// same Ref-layer indirection used for every other element/relationship
|
|
64
|
+
// — to the *referenced view's own* `ArchiMate:AllView` id (no new
|
|
65
|
+
// semantic concept is minted for the reference itself). See
|
|
66
|
+
// `graphical-writer.ts`'s `buildViewReferenceNode`.
|
|
67
|
+
//
|
|
68
|
+
// This only resolves when the reference targets another `ArchiView` in
|
|
69
|
+
// *this* model. `referencedModelId` can also point at a Sketch/Canvas
|
|
70
|
+
// view (per `archi-semantic-core`'s docs on the field) — archi-mate has
|
|
71
|
+
// no XMA representation at all, so that case remains genuinely
|
|
72
|
+
// unsupported.
|
|
73
|
+
if (!(0, geometry_js_1.hasCompleteBounds)(obj.bounds)) {
|
|
74
|
+
diagnostics.error({
|
|
75
|
+
code: 'missing-bounds',
|
|
76
|
+
message: `Diagram object "${obj.id}" has incomplete geometry (x/y/width/height) and cannot be positioned in XMA.`,
|
|
77
|
+
entityId: obj.id,
|
|
78
|
+
entityType: 'ArchiDiagramObject',
|
|
79
|
+
});
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
if (!viewIds.has(obj.referencedModelId)) {
|
|
83
|
+
diagnostics.warning({
|
|
84
|
+
code: 'unsupported-diagram-model-reference',
|
|
85
|
+
message: `Diagram object "${obj.id}" references a view/model ("${obj.referencedModelId}") not among this model's own ArchiMate views (e.g. a Sketch/Canvas) — not representable in XMA and was omitted.`,
|
|
86
|
+
entityId: obj.id,
|
|
87
|
+
entityType: 'ArchiDiagramObject',
|
|
88
|
+
});
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
if (!refIds.has(obj.referencedModelId)) {
|
|
92
|
+
const refId = refIds.idFor(obj.referencedModelId);
|
|
93
|
+
refObjectsXml.push((0, xml_writer_js_1.element)('ArchiMate:AllViewRef', [
|
|
94
|
+
['id', String(refId)],
|
|
95
|
+
['to', String(ids.idFor(obj.referencedModelId))],
|
|
96
|
+
]));
|
|
97
|
+
}
|
|
98
|
+
validViewReferenceObjectIds.add(obj.id);
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
if (obj.archimateElementId === null) {
|
|
102
|
+
if (obj.xsiType !== 'archimate:Group') {
|
|
103
|
+
diagnostics.error({
|
|
104
|
+
code: 'unsupported-diagram-object',
|
|
105
|
+
message: `Diagram object "${obj.id}" (${obj.xsiType}) has no backing semantic element and is not a recognized Group — not supported in XMA v0.1.`,
|
|
106
|
+
entityId: obj.id,
|
|
107
|
+
entityType: 'ArchiDiagramObject',
|
|
108
|
+
});
|
|
109
|
+
continue;
|
|
110
|
+
}
|
|
111
|
+
if (!(0, geometry_js_1.hasCompleteBounds)(obj.bounds)) {
|
|
112
|
+
diagnostics.error({
|
|
113
|
+
code: 'missing-bounds',
|
|
114
|
+
message: `Group "${obj.id}" has incomplete geometry (x/y/width/height) and cannot be positioned in XMA.`,
|
|
115
|
+
entityId: obj.id,
|
|
116
|
+
entityType: 'ArchiDiagramObject',
|
|
117
|
+
});
|
|
118
|
+
continue;
|
|
119
|
+
}
|
|
120
|
+
const groupXmaId = ids.idFor(obj.id);
|
|
121
|
+
viewGraphicsXml.push((0, xml_writer_js_1.element)('ArchiMate:ViewGraphic', [['id', String(groupXmaId)]], [
|
|
122
|
+
(0, profile_values_js_1.buildProfileValues)(language, obj.name ?? '', obj.documentation),
|
|
123
|
+
]));
|
|
124
|
+
validGroupObjectIds.add(obj.id);
|
|
125
|
+
continue;
|
|
126
|
+
}
|
|
127
|
+
// Element-backed diagram object.
|
|
128
|
+
if (!(0, geometry_js_1.hasCompleteBounds)(obj.bounds)) {
|
|
129
|
+
diagnostics.error({
|
|
130
|
+
code: 'missing-bounds',
|
|
131
|
+
message: `Diagram object "${obj.id}" has incomplete geometry (x/y/width/height) and cannot be positioned in XMA.`,
|
|
132
|
+
entityId: obj.id,
|
|
133
|
+
entityType: 'ArchiDiagramObject',
|
|
134
|
+
});
|
|
135
|
+
continue;
|
|
136
|
+
}
|
|
137
|
+
const mapping = mappedElements.get(obj.archimateElementId);
|
|
138
|
+
if (!mapping) {
|
|
139
|
+
// The backing element already produced an unsupported-element-type diagnostic.
|
|
140
|
+
continue;
|
|
141
|
+
}
|
|
142
|
+
if (!refIds.has(obj.archimateElementId)) {
|
|
143
|
+
const refId = refIds.idFor(obj.archimateElementId);
|
|
144
|
+
refObjectsXml.push((0, xml_writer_js_1.element)(`ArchiMate:${mapping.xmaType}Ref`, [
|
|
145
|
+
['id', String(refId)],
|
|
146
|
+
['to', String(ids.idFor(obj.archimateElementId))],
|
|
147
|
+
]));
|
|
148
|
+
}
|
|
149
|
+
validElementNodeObjectIds.add(obj.id);
|
|
150
|
+
}
|
|
151
|
+
for (const note of model.notes) {
|
|
152
|
+
if (note.viewId !== view.id) {
|
|
153
|
+
continue;
|
|
154
|
+
}
|
|
155
|
+
if (note.parentId !== null) {
|
|
156
|
+
// Unlike nested ArchiDiagramObjects (supported — see graphical-writer.ts's
|
|
157
|
+
// buildNodeTree), a nested Note has no fixture evidence: only one instance
|
|
158
|
+
// exists across all four fixtures, not enough to confirm its representation.
|
|
159
|
+
diagnostics.error({
|
|
160
|
+
code: 'unsupported-nested-diagram-object',
|
|
161
|
+
message: `Note "${note.id}" is nested inside another diagram object — not supported in XMA v0.1.`,
|
|
162
|
+
entityId: note.id,
|
|
163
|
+
entityType: 'ArchiNote',
|
|
164
|
+
});
|
|
165
|
+
continue;
|
|
166
|
+
}
|
|
167
|
+
if (!(0, geometry_js_1.hasCompleteBounds)(note.bounds)) {
|
|
168
|
+
diagnostics.error({
|
|
169
|
+
code: 'missing-bounds',
|
|
170
|
+
message: `Note "${note.id}" has incomplete geometry (x/y/width/height) and cannot be positioned in XMA.`,
|
|
171
|
+
entityId: note.id,
|
|
172
|
+
entityType: 'ArchiNote',
|
|
173
|
+
});
|
|
174
|
+
continue;
|
|
175
|
+
}
|
|
176
|
+
const noteXmaId = ids.idFor(note.id);
|
|
177
|
+
viewGraphicsXml.push((0, xml_writer_js_1.element)('ArchiMate:ViewGraphic', [['id', String(noteXmaId)]], [(0, profile_values_js_1.buildProfileValues)(language, note.content ?? '')]));
|
|
178
|
+
validNoteIds.add(note.id);
|
|
179
|
+
}
|
|
180
|
+
for (const connection of model.diagramConnections) {
|
|
181
|
+
if (connection.viewId !== view.id) {
|
|
182
|
+
continue;
|
|
183
|
+
}
|
|
184
|
+
if (connection.archimateRelationshipId === null) {
|
|
185
|
+
// A purely-visual connection (no underlying ArchiMate relationship).
|
|
186
|
+
// Confirmed against two independent real instances — agile-manifesto
|
|
187
|
+
// (between two DiagramModelReferences) and sabsa (between a
|
|
188
|
+
// Note/Group and a BusinessRole element) — that Archi represents
|
|
189
|
+
// this as an ArchiMate:ViewEdge, whose from/to are exactly each
|
|
190
|
+
// endpoint's own semantic id (the same value already used as that
|
|
191
|
+
// endpoint's own node's mm_semanticObject — see
|
|
192
|
+
// resolveObjectSemanticId above). Falls back to the pre-existing
|
|
193
|
+
// diagnostic when either endpoint isn't itself a drawable object —
|
|
194
|
+
// that remains a genuinely unsupported case, not guessed either way.
|
|
195
|
+
const fromSemanticId = resolveObjectSemanticId(connection.sourceId);
|
|
196
|
+
const toSemanticId = resolveObjectSemanticId(connection.targetId);
|
|
197
|
+
if (fromSemanticId === undefined || toSemanticId === undefined) {
|
|
198
|
+
diagnostics.error({
|
|
199
|
+
code: 'unsupported-connection-no-relationship',
|
|
200
|
+
message: `Connection "${connection.id}" has no underlying semantic relationship (a purely visual connector) and at least one endpoint is not a drawable object — not supported in XMA v0.1.`,
|
|
201
|
+
entityId: connection.id,
|
|
202
|
+
entityType: 'ArchiDiagramConnection',
|
|
203
|
+
});
|
|
204
|
+
continue;
|
|
205
|
+
}
|
|
206
|
+
const viewEdgeId = ids.idFor(connection.id);
|
|
207
|
+
viewEdgesXml.push((0, xml_writer_js_1.element)('ArchiMate:ViewEdge', [
|
|
208
|
+
['id', String(viewEdgeId)],
|
|
209
|
+
['from', String(fromSemanticId)],
|
|
210
|
+
['to', String(toSemanticId)],
|
|
211
|
+
]));
|
|
212
|
+
viewEdgeSemanticIds.set(connection.id, viewEdgeId);
|
|
213
|
+
continue;
|
|
214
|
+
}
|
|
215
|
+
const mapping = mappedRelationships.get(connection.archimateRelationshipId);
|
|
216
|
+
if (!mapping) {
|
|
217
|
+
// The underlying relationship already produced its own diagnostic.
|
|
218
|
+
continue;
|
|
219
|
+
}
|
|
220
|
+
if (!refIds.has(connection.archimateRelationshipId)) {
|
|
221
|
+
const refId = refIds.idFor(connection.archimateRelationshipId);
|
|
222
|
+
refObjectsXml.push((0, xml_writer_js_1.element)(`ArchiMate:${mapping.xmaType}Ref`, [
|
|
223
|
+
['id', String(refId)],
|
|
224
|
+
['to', String(ids.idFor(connection.archimateRelationshipId))],
|
|
225
|
+
]));
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
return {
|
|
229
|
+
viewGraphicsXml,
|
|
230
|
+
viewEdgesXml,
|
|
231
|
+
refObjectsXml,
|
|
232
|
+
validElementNodeObjectIds,
|
|
233
|
+
validGroupObjectIds,
|
|
234
|
+
validNoteIds,
|
|
235
|
+
validViewReferenceObjectIds,
|
|
236
|
+
viewEdgeSemanticIds,
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
//# sourceMappingURL=view-writer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"view-writer.js","sourceRoot":"","sources":["../../../src/serializer/view-writer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export type XmaDiagnosticSeverity = 'error' | 'warning';
|
|
2
|
+
export interface XmaDiagnostic {
|
|
3
|
+
/** Stable machine-readable code, e.g. "unsupported-element-type". */
|
|
4
|
+
code: string;
|
|
5
|
+
severity: XmaDiagnosticSeverity;
|
|
6
|
+
message: string;
|
|
7
|
+
/** Id of the offending source entity (Archi element/relationship/view/diagram id), when applicable. */
|
|
8
|
+
entityId?: string;
|
|
9
|
+
/** Kind of the offending source entity, e.g. "ArchiElement", "ArchiRelationship". */
|
|
10
|
+
entityType?: string;
|
|
11
|
+
}
|
|
12
|
+
/** Accumulates diagnostics during a single serialization pass. */
|
|
13
|
+
export declare class DiagnosticCollector {
|
|
14
|
+
private readonly items;
|
|
15
|
+
error(diagnostic: Omit<XmaDiagnostic, 'severity'>): void;
|
|
16
|
+
warning(diagnostic: Omit<XmaDiagnostic, 'severity'>): void;
|
|
17
|
+
get all(): XmaDiagnostic[];
|
|
18
|
+
get hasErrors(): boolean;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=diagnostics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagnostics.d.ts","sourceRoot":"","sources":["../../../src/diagnostics/diagnostics.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,qBAAqB,GAAG,OAAO,GAAG,SAAS,CAAC;AAExD,MAAM,WAAW,aAAa;IAC5B,qEAAqE;IACrE,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,qBAAqB,CAAC;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,uGAAuG;IACvG,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qFAAqF;IACrF,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,kEAAkE;AAClE,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAuB;IAE7C,KAAK,CAAC,UAAU,EAAE,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC,GAAG,IAAI;IAIxD,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC,GAAG,IAAI;IAI1D,IAAI,GAAG,IAAI,aAAa,EAAE,CAEzB;IAED,IAAI,SAAS,IAAI,OAAO,CAEvB;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../../../src/diagnostics/diagnostics.ts"],"names":[],"mappings":"AAaA,kEAAkE;AAClE,MAAM,OAAO,mBAAmB;IAAhC;QACmB,UAAK,GAAoB,EAAE,CAAC;IAiB/C,CAAC;IAfC,KAAK,CAAC,UAA2C;QAC/C,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;IACxD,CAAC;IAED,OAAO,CAAC,UAA2C;QACjD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED,IAAI,GAAG;QACL,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC;IAED,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC;IACxD,CAAC;CACF"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { XmaDiagnostic } from './diagnostics.js';
|
|
2
|
+
/**
|
|
3
|
+
* Thrown by `serializeXma` whenever serializing would silently lose
|
|
4
|
+
* semantics or presentation intent. Carries the full structured diagnostic
|
|
5
|
+
* list (not just the first failure) so callers can report everything wrong
|
|
6
|
+
* in one pass — see `inspectXmaSupport` to obtain the same list without
|
|
7
|
+
* throwing.
|
|
8
|
+
*/
|
|
9
|
+
export declare class XmaSerializationError extends Error {
|
|
10
|
+
readonly diagnostics: XmaDiagnostic[];
|
|
11
|
+
constructor(diagnostics: XmaDiagnostic[]);
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/diagnostics/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEtD;;;;;;GAMG;AACH,qBAAa,qBAAsB,SAAQ,KAAK;IAC9C,QAAQ,CAAC,WAAW,EAAE,aAAa,EAAE,CAAC;gBAE1B,WAAW,EAAE,aAAa,EAAE;CAYzC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/diagnostics/errors.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,MAAM,OAAO,qBAAsB,SAAQ,KAAK;IAG9C,YAAY,WAA4B;QACtC,MAAM,UAAU,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,MAAM,CAAC;QAC5E,KAAK,CACH,6BAA6B,UAAU,uEAAuE;YAC5G,WAAW;iBACR,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC;iBACrC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;iBACtC,IAAI,CAAC,IAAI,CAAC,CAChB,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;QACpC,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;IACjC,CAAC;CACF"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { Point, Rect } from './geometry.js';
|
|
2
|
+
export type BendpointAgreement = 'both' | 'source-only' | 'target-only';
|
|
3
|
+
export interface BendpointResolution {
|
|
4
|
+
/** Resolved absolute point, in Archi (pre-scale) coordinate space. */
|
|
5
|
+
point: Point;
|
|
6
|
+
agreement: BendpointAgreement;
|
|
7
|
+
/** Present only when both source- and target-relative forms were available but disagreed materially. */
|
|
8
|
+
mismatch?: {
|
|
9
|
+
fromSource: Point;
|
|
10
|
+
fromTarget: Point;
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Resolves a single Archi bendpoint (stored as offsets from the source and
|
|
15
|
+
* target diagram-object centers) to an absolute point in Archi coordinate
|
|
16
|
+
* space.
|
|
17
|
+
*
|
|
18
|
+
* Confirmed fixture: source bounds x=48,y=180,w=120,h=55 (center 108,207),
|
|
19
|
+
* target bounds x=204,y=276,w=120,h=55 (center 264,303), bendpoint
|
|
20
|
+
* startX=-12,startY=93,endX=-168,endY=-3 resolves to absolute (96, 300) via
|
|
21
|
+
* either offset.
|
|
22
|
+
*
|
|
23
|
+
* When both offsets are present, they are cross-checked against each other;
|
|
24
|
+
* a material disagreement is reported via `mismatch` rather than silently
|
|
25
|
+
* resolved, so the caller can surface a diagnostic instead of guessing.
|
|
26
|
+
*/
|
|
27
|
+
export declare function resolveBendpoint(bendpoint: {
|
|
28
|
+
startX: number | null;
|
|
29
|
+
startY: number | null;
|
|
30
|
+
endX: number | null;
|
|
31
|
+
endY: number | null;
|
|
32
|
+
}, sourceBounds: Rect, targetBounds: Rect): BendpointResolution | null;
|
|
33
|
+
//# sourceMappingURL=bendpoints.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bendpoints.d.ts","sourceRoot":"","sources":["../../../src/geometry/bendpoints.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAKjD,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,aAAa,GAAG,aAAa,CAAC;AAExE,MAAM,WAAW,mBAAmB;IAClC,sEAAsE;IACtE,KAAK,EAAE,KAAK,CAAC;IACb,SAAS,EAAE,kBAAkB,CAAC;IAC9B,wGAAwG;IACxG,QAAQ,CAAC,EAAE;QACT,UAAU,EAAE,KAAK,CAAC;QAClB,UAAU,EAAE,KAAK,CAAC;KACnB,CAAC;CACH;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE;IAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,EACrG,YAAY,EAAE,IAAI,EAClB,YAAY,EAAE,IAAI,GACjB,mBAAmB,GAAG,IAAI,CAoC5B"}
|
|
@@ -15,8 +15,12 @@ const AGREEMENT_EPSILON = 0.01;
|
|
|
15
15
|
* resolved, so the caller can surface a diagnostic instead of guessing.
|
|
16
16
|
*/
|
|
17
17
|
export function resolveBendpoint(bendpoint, sourceBounds, targetBounds) {
|
|
18
|
-
|
|
19
|
-
|
|
18
|
+
// A NaN/Infinity offset (e.g. from an upstream parser's failed arithmetic)
|
|
19
|
+
// is treated as absent rather than propagated into a nonsensical resolved
|
|
20
|
+
// point — this falls through to the existing "neither offset usable"
|
|
21
|
+
// diagnostic below instead of silently producing invalid geometry.
|
|
22
|
+
const hasSourceOffset = Number.isFinite(bendpoint.startX) && Number.isFinite(bendpoint.startY);
|
|
23
|
+
const hasTargetOffset = Number.isFinite(bendpoint.endX) && Number.isFinite(bendpoint.endY);
|
|
20
24
|
if (!hasSourceOffset && !hasTargetOffset) {
|
|
21
25
|
return null;
|
|
22
26
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bendpoints.js","sourceRoot":"","sources":["../../../src/geometry/bendpoints.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,MAAM,iBAAiB,GAAG,IAAI,CAAC;AAe/B;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,gBAAgB,CAC9B,SAAqG,EACrG,YAAkB,EAClB,YAAkB;IAElB,2EAA2E;IAC3E,0EAA0E;IAC1E,qEAAqE;IACrE,mEAAmE;IACnE,MAAM,eAAe,GAAG,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAC/F,MAAM,eAAe,GAAG,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAE3F,IAAI,CAAC,eAAe,IAAI,CAAC,eAAe,EAAE,CAAC;QACzC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,YAAY,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC;IAC5C,MAAM,YAAY,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC;IAE5C,MAAM,UAAU,GAAiB,eAAe;QAC9C,CAAC,CAAC,EAAE,CAAC,EAAE,YAAY,CAAC,CAAC,GAAI,SAAS,CAAC,MAAiB,EAAE,CAAC,EAAE,YAAY,CAAC,CAAC,GAAI,SAAS,CAAC,MAAiB,EAAE;QACxG,CAAC,CAAC,IAAI,CAAC;IACT,MAAM,UAAU,GAAiB,eAAe;QAC9C,CAAC,CAAC,EAAE,CAAC,EAAE,YAAY,CAAC,CAAC,GAAI,SAAS,CAAC,IAAe,EAAE,CAAC,EAAE,YAAY,CAAC,CAAC,GAAI,SAAS,CAAC,IAAe,EAAE;QACpG,CAAC,CAAC,IAAI,CAAC;IAET,IAAI,UAAU,IAAI,UAAU,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;QACrD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;QACrD,IAAI,MAAM,GAAG,iBAAiB,IAAI,MAAM,GAAG,iBAAiB,EAAE,CAAC;YAC7D,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,UAAU,EAAE,UAAU,EAAE,EAAE,CAAC;QACxF,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;IAClD,CAAC;IAED,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC;IACzD,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,UAAmB,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC;AAClE,CAAC"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Confirmed across all catalogue shapes and the relationship fixture: XMA
|
|
3
|
+
* geometry is Archi geometry uniformly scaled by 3 (x, y, width, height,
|
|
4
|
+
* and bendpoint coordinates alike).
|
|
5
|
+
*/
|
|
6
|
+
export declare const XMA_SCALE = 3;
|
|
7
|
+
export interface Rect {
|
|
8
|
+
x: number;
|
|
9
|
+
y: number;
|
|
10
|
+
width: number;
|
|
11
|
+
height: number;
|
|
12
|
+
}
|
|
13
|
+
export declare function scaleValue(archiValue: number): number;
|
|
14
|
+
export declare function scaleRect(bounds: Rect): Rect;
|
|
15
|
+
export interface Point {
|
|
16
|
+
x: number;
|
|
17
|
+
y: number;
|
|
18
|
+
}
|
|
19
|
+
export declare function scalePoint(point: Point): Point;
|
|
20
|
+
/**
|
|
21
|
+
* Rect center, floored to a whole pixel — confirmed against the proven
|
|
22
|
+
* bendpoint fixture: a 55px-tall shape's center is Archi's own `180 + 55/2`
|
|
23
|
+
* truncated to `207`, not `207.5`. Using the exact fraction here would
|
|
24
|
+
* throw off every bendpoint resolved against an odd-height/width shape.
|
|
25
|
+
*/
|
|
26
|
+
export declare function centerOf(bounds: Rect): Point;
|
|
27
|
+
interface NullableBounds {
|
|
28
|
+
x: number | null;
|
|
29
|
+
y: number | null;
|
|
30
|
+
width: number | null;
|
|
31
|
+
height: number | null;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* A bounds with confirmed `width`/`height`, but `x`/`y` still possibly
|
|
35
|
+
* `null` (Archi's own convention for "this coordinate is 0" — see
|
|
36
|
+
* `hasCompleteBounds`). Deliberately distinct from `Rect`: unlike the old
|
|
37
|
+
* `bounds is Rect` guard, this doesn't claim `x`/`y` are numbers when they
|
|
38
|
+
* might not be, so a caller can't reach for `bounds.x` arithmetic without
|
|
39
|
+
* going through `toRect` first and getting the null-to-0 substitution
|
|
40
|
+
* explicitly, instead of relying on it happening implicitly via JS
|
|
41
|
+
* coercion behind an unchecked cast.
|
|
42
|
+
*/
|
|
43
|
+
export interface CompleteBounds {
|
|
44
|
+
x: number | null;
|
|
45
|
+
y: number | null;
|
|
46
|
+
width: number;
|
|
47
|
+
height: number;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Type guard: true when a bounds has usable width/height (`x`/`y` may
|
|
51
|
+
* still be `null` — see `CompleteBounds`).
|
|
52
|
+
*
|
|
53
|
+
* `width`/`height` must be set — there is no fixture evidence of Archi ever
|
|
54
|
+
* omitting either. `x`/`y` are allowed to be `null`: confirmed across all
|
|
55
|
+
* four fixtures (three omitted-`x` cases in sabsa, one omitted-`y` case in
|
|
56
|
+
* agile-manifesto — always alone, never alongside a missing `width`/
|
|
57
|
+
* `height`) that Archi omits a bounds coordinate specifically when its value
|
|
58
|
+
* is `0`, per the ArchiMate Exchange Format convention. Use `toRect` to
|
|
59
|
+
* apply that default explicitly before doing numeric work with `x`/`y`.
|
|
60
|
+
*
|
|
61
|
+
* Every non-null field must also be a finite number: a `NaN`/`Infinity`
|
|
62
|
+
* value (e.g. from an upstream parser's failed arithmetic on garbled
|
|
63
|
+
* geometry text) would otherwise pass this check and flow silently into the
|
|
64
|
+
* rendered XML as a literal `"NaN"`/`"Infinity"` attribute — invalid output
|
|
65
|
+
* produced with no diagnostic. Treating it as incomplete instead routes it
|
|
66
|
+
* through the same `missing-bounds` diagnostic as an actually-missing value.
|
|
67
|
+
*/
|
|
68
|
+
export declare function hasCompleteBounds(bounds: NullableBounds | null): bounds is CompleteBounds;
|
|
69
|
+
/**
|
|
70
|
+
* Applies Archi's "omitted coordinate means 0" convention explicitly (see
|
|
71
|
+
* `hasCompleteBounds`), turning a `CompleteBounds` into a real `Rect`.
|
|
72
|
+
*/
|
|
73
|
+
export declare function toRect(bounds: CompleteBounds): Rect;
|
|
74
|
+
export {};
|
|
75
|
+
//# sourceMappingURL=geometry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"geometry.d.ts","sourceRoot":"","sources":["../../../src/geometry/geometry.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,eAAO,MAAM,SAAS,IAAI,CAAC;AAE3B,MAAM,WAAW,IAAI;IACnB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAErD;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,IAAI,GAAG,IAAI,CAO5C;AAED,MAAM,WAAW,KAAK;IACpB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,KAAK,GAAG,KAAK,CAE9C;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,MAAM,EAAE,IAAI,GAAG,KAAK,CAK5C;AAED,UAAU,cAAc;IACtB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,cAAc;IAC7B,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI,GAAG,MAAM,IAAI,cAAc,CAMzF;AAED;;;GAGG;AACH,wBAAgB,MAAM,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI,CAEnD"}
|
|
@@ -31,19 +31,38 @@ export function centerOf(bounds) {
|
|
|
31
31
|
};
|
|
32
32
|
}
|
|
33
33
|
/**
|
|
34
|
-
* Type guard: true when a bounds
|
|
34
|
+
* Type guard: true when a bounds has usable width/height (`x`/`y` may
|
|
35
|
+
* still be `null` — see `CompleteBounds`).
|
|
35
36
|
*
|
|
36
37
|
* `width`/`height` must be set — there is no fixture evidence of Archi ever
|
|
37
38
|
* omitting either. `x`/`y` are allowed to be `null`: confirmed across all
|
|
38
39
|
* four fixtures (three omitted-`x` cases in sabsa, one omitted-`y` case in
|
|
39
40
|
* agile-manifesto — always alone, never alongside a missing `width`/
|
|
40
41
|
* `height`) that Archi omits a bounds coordinate specifically when its value
|
|
41
|
-
* is `0`, per the ArchiMate Exchange Format convention.
|
|
42
|
-
*
|
|
43
|
-
*
|
|
44
|
-
*
|
|
42
|
+
* is `0`, per the ArchiMate Exchange Format convention. Use `toRect` to
|
|
43
|
+
* apply that default explicitly before doing numeric work with `x`/`y`.
|
|
44
|
+
*
|
|
45
|
+
* Every non-null field must also be a finite number: a `NaN`/`Infinity`
|
|
46
|
+
* value (e.g. from an upstream parser's failed arithmetic on garbled
|
|
47
|
+
* geometry text) would otherwise pass this check and flow silently into the
|
|
48
|
+
* rendered XML as a literal `"NaN"`/`"Infinity"` attribute — invalid output
|
|
49
|
+
* produced with no diagnostic. Treating it as incomplete instead routes it
|
|
50
|
+
* through the same `missing-bounds` diagnostic as an actually-missing value.
|
|
45
51
|
*/
|
|
46
52
|
export function hasCompleteBounds(bounds) {
|
|
47
|
-
|
|
53
|
+
if (bounds === null)
|
|
54
|
+
return false;
|
|
55
|
+
for (const value of [bounds.x, bounds.y, bounds.width, bounds.height]) {
|
|
56
|
+
if (value !== null && !Number.isFinite(value))
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
return bounds.width !== null && bounds.height !== null;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Applies Archi's "omitted coordinate means 0" convention explicitly (see
|
|
63
|
+
* `hasCompleteBounds`), turning a `CompleteBounds` into a real `Rect`.
|
|
64
|
+
*/
|
|
65
|
+
export function toRect(bounds) {
|
|
66
|
+
return { x: bounds.x ?? 0, y: bounds.y ?? 0, width: bounds.width, height: bounds.height };
|
|
48
67
|
}
|
|
49
68
|
//# sourceMappingURL=geometry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"geometry.js","sourceRoot":"","sources":["../../../src/geometry/geometry.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,CAAC;AAS3B,MAAM,UAAU,UAAU,CAAC,UAAkB;IAC3C,OAAO,UAAU,GAAG,SAAS,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,MAAY;IACpC,OAAO;QACL,CAAC,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;QACvB,CAAC,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;QACvB,KAAK,EAAE,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC;QAC/B,MAAM,EAAE,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC;KAClC,CAAC;AACJ,CAAC;AAOD,MAAM,UAAU,UAAU,CAAC,KAAY;IACrC,OAAO,EAAE,CAAC,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AAC5D,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,QAAQ,CAAC,MAAY;IACnC,OAAO;QACL,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC;QAC1C,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;KAC5C,CAAC;AACJ,CAAC;AA0BD;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAA6B;IAC7D,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAClC,KAAK,MAAM,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;QACtE,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;IAC9D,CAAC;IACD,OAAO,MAAM,CAAC,KAAK,KAAK,IAAI,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI,CAAC;AACzD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,MAAM,CAAC,MAAsB;IAC3C,OAAO,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;AAC5F,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { serializeXma, inspectXmaSupport } from './serializer/serialize-xma.js';
|
|
2
|
+
export type { XmaSerializeOptions } from './serializer/serialize-xma.js';
|
|
3
|
+
export { XmaSerializationError } from './diagnostics/errors.js';
|
|
4
|
+
export type { XmaDiagnostic, XmaDiagnosticSeverity } from './diagnostics/diagnostics.js';
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAChF,YAAY,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,YAAY,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAEhF,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Asserts an internal cross-module invariant (e.g. "view-writer always
|
|
3
|
+
* registers this id before graphical-writer reads it back") instead of
|
|
4
|
+
* silently trusting it via a `!` non-null assertion. If the invariant is
|
|
5
|
+
* ever violated by a future refactor, this throws a clear, specific error
|
|
6
|
+
* instead of letting `undefined` flow into the rendered XML as the literal
|
|
7
|
+
* string `"undefined"`.
|
|
8
|
+
*/
|
|
9
|
+
export declare function assertDefined<T>(value: T | undefined, message: string): T;
|
|
10
|
+
//# sourceMappingURL=assert.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assert.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/assert.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,CAAC,CAKzE"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Asserts an internal cross-module invariant (e.g. "view-writer always
|
|
3
|
+
* registers this id before graphical-writer reads it back") instead of
|
|
4
|
+
* silently trusting it via a `!` non-null assertion. If the invariant is
|
|
5
|
+
* ever violated by a future refactor, this throws a clear, specific error
|
|
6
|
+
* instead of letting `undefined` flow into the rendered XML as the literal
|
|
7
|
+
* string `"undefined"`.
|
|
8
|
+
*/
|
|
9
|
+
export function assertDefined(value, message) {
|
|
10
|
+
if (value === undefined) {
|
|
11
|
+
throw new Error(`Internal invariant violation: ${message}`);
|
|
12
|
+
}
|
|
13
|
+
return value;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=assert.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assert.js","sourceRoot":"","sources":["../../../src/infrastructure/assert.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,MAAM,UAAU,aAAa,CAAI,KAAoB,EAAE,OAAe;IACpE,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,iCAAiC,OAAO,EAAE,CAAC,CAAC;IAC9D,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deterministic numeric XMA id allocator.
|
|
3
|
+
*
|
|
4
|
+
* XMA reference documents use small sequential integer ids. We do not (and
|
|
5
|
+
* cannot) reproduce Archi's string ids — instead we hand out ids in strictly
|
|
6
|
+
* increasing order, starting from 1, driven entirely by serializer traversal
|
|
7
|
+
* order. As long as the traversal order over a given `ArchiModel` is stable
|
|
8
|
+
* (it is: every `ArchiModel` collection preserves source document order),
|
|
9
|
+
* the same input always yields the same ids.
|
|
10
|
+
*
|
|
11
|
+
* Never uses Math.random(), Date.now(), or any other non-deterministic or
|
|
12
|
+
* environment-specific source.
|
|
13
|
+
*/
|
|
14
|
+
export declare class XmaIdAllocator {
|
|
15
|
+
private counter;
|
|
16
|
+
next(): number;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* A registry mapping arbitrary string keys (Archi ids, or synthetic
|
|
20
|
+
* composite keys) to allocated XMA numeric ids, with reference-consistent
|
|
21
|
+
* reuse: asking for the same key twice returns the same id.
|
|
22
|
+
*/
|
|
23
|
+
export declare class XmaIdRegistry {
|
|
24
|
+
private readonly allocator;
|
|
25
|
+
private readonly ids;
|
|
26
|
+
constructor(allocator: XmaIdAllocator);
|
|
27
|
+
/** Allocates (or returns the previously allocated) id for `key`. */
|
|
28
|
+
idFor(key: string): number;
|
|
29
|
+
/** Allocates a fresh id not tied to any lookup key (e.g. structural scaffolding elements). */
|
|
30
|
+
fresh(): number;
|
|
31
|
+
has(key: string): boolean;
|
|
32
|
+
get(key: string): number | undefined;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=id-allocator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"id-allocator.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/id-allocator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,OAAO,CAAK;IAEpB,IAAI,IAAI,MAAM;CAIf;AAED;;;;GAIG;AACH,qBAAa,aAAa;IAGZ,OAAO,CAAC,QAAQ,CAAC,SAAS;IAFtC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAA6B;gBAEpB,SAAS,EAAE,cAAc;IAEtD,oEAAoE;IACpE,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAU1B,8FAA8F;IAC9F,KAAK,IAAI,MAAM;IAIf,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAIzB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;CAGrC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"id-allocator.js","sourceRoot":"","sources":["../../../src/infrastructure/id-allocator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,MAAM,OAAO,cAAc;IAA3B;QACU,YAAO,GAAG,CAAC,CAAC;IAMtB,CAAC;IAJC,IAAI;QACF,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC;QAClB,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;CACF;AAED;;;;GAIG;AACH,MAAM,OAAO,aAAa;IAGxB,YAA6B,SAAyB;QAAzB,cAAS,GAAT,SAAS,CAAgB;QAFrC,QAAG,GAAG,IAAI,GAAG,EAAkB,CAAC;IAEQ,CAAC;IAE1D,oEAAoE;IACpE,KAAK,CAAC,GAAW;QACf,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,OAAO,QAAQ,CAAC;QAClB,CAAC;QACD,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;QACjC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACtB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,8FAA8F;IAC9F,KAAK;QACH,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;IAC/B,CAAC;IAED,GAAG,CAAC,GAAW;QACb,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAED,GAAG,CAAC,GAAW;QACb,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;CACF"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal typed XML element tree + deterministic serializer.
|
|
3
|
+
*
|
|
4
|
+
* Business logic builds `XmlElement` trees (attribute order and child order
|
|
5
|
+
* are explicit arrays, controlled entirely by the caller) and this module
|
|
6
|
+
* turns them into text. No implicit ordering, no host/timestamp-dependent
|
|
7
|
+
* output, no third-party XML dependency — keeps the runtime browser-safe.
|
|
8
|
+
*/
|
|
9
|
+
export interface XmlElement {
|
|
10
|
+
tag: string;
|
|
11
|
+
attrs?: Array<[string, string]>;
|
|
12
|
+
children?: XmlElement[];
|
|
13
|
+
/** Leaf text content. Mutually exclusive with `children` in practice. */
|
|
14
|
+
text?: string;
|
|
15
|
+
}
|
|
16
|
+
export declare function element(tag: string, attrs?: Array<[string, string]>, children?: XmlElement[]): XmlElement;
|
|
17
|
+
export declare function textElement(tag: string, text: string, attrs?: Array<[string, string]>): XmlElement;
|
|
18
|
+
/** Renders a root element to a complete, deterministic XML document string. */
|
|
19
|
+
export declare function renderXmlDocument(root: XmlElement): string;
|
|
20
|
+
//# sourceMappingURL=xml-writer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xml-writer.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/xml-writer.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAChC,QAAQ,CAAC,EAAE,UAAU,EAAE,CAAC;IACxB,yEAAyE;IACzE,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,OAAO,CACrB,GAAG,EAAE,MAAM,EACX,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAC/B,QAAQ,CAAC,EAAE,UAAU,EAAE,GACtB,UAAU,CAEZ;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,UAAU,CAElG;AAuED,+EAA+E;AAC/E,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAI1D"}
|