@cda/adapter-xma 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. package/README.md +192 -0
  2. package/dist/diagnostics/diagnostics.d.ts +20 -0
  3. package/dist/diagnostics/diagnostics.d.ts.map +1 -0
  4. package/dist/diagnostics/diagnostics.js +19 -0
  5. package/dist/diagnostics/diagnostics.js.map +1 -0
  6. package/dist/diagnostics/errors.d.ts +13 -0
  7. package/dist/diagnostics/errors.d.ts.map +1 -0
  8. package/dist/diagnostics/errors.js +20 -0
  9. package/dist/diagnostics/errors.js.map +1 -0
  10. package/dist/geometry/bendpoints.d.ts +33 -0
  11. package/dist/geometry/bendpoints.d.ts.map +1 -0
  12. package/dist/geometry/bendpoints.js +44 -0
  13. package/dist/geometry/bendpoints.js.map +1 -0
  14. package/dist/geometry/geometry.d.ts +36 -0
  15. package/dist/geometry/geometry.d.ts.map +1 -0
  16. package/dist/geometry/geometry.js +41 -0
  17. package/dist/geometry/geometry.js.map +1 -0
  18. package/dist/index.d.ts +5 -0
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +3 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/infrastructure/id-allocator.d.ts +34 -0
  23. package/dist/infrastructure/id-allocator.d.ts.map +1 -0
  24. package/dist/infrastructure/id-allocator.js +54 -0
  25. package/dist/infrastructure/id-allocator.js.map +1 -0
  26. package/dist/infrastructure/xml-writer.d.ts +20 -0
  27. package/dist/infrastructure/xml-writer.d.ts.map +1 -0
  28. package/dist/infrastructure/xml-writer.js +54 -0
  29. package/dist/infrastructure/xml-writer.js.map +1 -0
  30. package/dist/mapping/element-mapping.d.ts +31 -0
  31. package/dist/mapping/element-mapping.d.ts.map +1 -0
  32. package/dist/mapping/element-mapping.js +112 -0
  33. package/dist/mapping/element-mapping.js.map +1 -0
  34. package/dist/mapping/relationship-mapping.d.ts +21 -0
  35. package/dist/mapping/relationship-mapping.d.ts.map +1 -0
  36. package/dist/mapping/relationship-mapping.js +45 -0
  37. package/dist/mapping/relationship-mapping.js.map +1 -0
  38. package/dist/mapping/scheme-mapping.d.ts +38 -0
  39. package/dist/mapping/scheme-mapping.d.ts.map +1 -0
  40. package/dist/mapping/scheme-mapping.js +39 -0
  41. package/dist/mapping/scheme-mapping.js.map +1 -0
  42. package/dist/mapping/visual-mapping.d.ts +24 -0
  43. package/dist/mapping/visual-mapping.d.ts.map +1 -0
  44. package/dist/mapping/visual-mapping.js +39 -0
  45. package/dist/mapping/visual-mapping.js.map +1 -0
  46. package/dist/serializer/document-writer.d.ts +19 -0
  47. package/dist/serializer/document-writer.d.ts.map +1 -0
  48. package/dist/serializer/document-writer.js +126 -0
  49. package/dist/serializer/document-writer.js.map +1 -0
  50. package/dist/serializer/graphical-writer.d.ts +25 -0
  51. package/dist/serializer/graphical-writer.d.ts.map +1 -0
  52. package/dist/serializer/graphical-writer.js +287 -0
  53. package/dist/serializer/graphical-writer.js.map +1 -0
  54. package/dist/serializer/profile-values.d.ts +8 -0
  55. package/dist/serializer/profile-values.d.ts.map +1 -0
  56. package/dist/serializer/profile-values.js +25 -0
  57. package/dist/serializer/profile-values.js.map +1 -0
  58. package/dist/serializer/relationship-writer.d.ts +15 -0
  59. package/dist/serializer/relationship-writer.d.ts.map +1 -0
  60. package/dist/serializer/relationship-writer.js +83 -0
  61. package/dist/serializer/relationship-writer.js.map +1 -0
  62. package/dist/serializer/rtf.d.ts +9 -0
  63. package/dist/serializer/rtf.d.ts.map +1 -0
  64. package/dist/serializer/rtf.js +50 -0
  65. package/dist/serializer/rtf.js.map +1 -0
  66. package/dist/serializer/semantic-writer.d.ts +36 -0
  67. package/dist/serializer/semantic-writer.d.ts.map +1 -0
  68. package/dist/serializer/semantic-writer.js +91 -0
  69. package/dist/serializer/semantic-writer.js.map +1 -0
  70. package/dist/serializer/serialize-xma.d.ts +29 -0
  71. package/dist/serializer/serialize-xma.d.ts.map +1 -0
  72. package/dist/serializer/serialize-xma.js +80 -0
  73. package/dist/serializer/serialize-xma.js.map +1 -0
  74. package/dist/serializer/view-writer.d.ts +26 -0
  75. package/dist/serializer/view-writer.d.ts.map +1 -0
  76. package/dist/serializer/view-writer.js +147 -0
  77. package/dist/serializer/view-writer.js.map +1 -0
  78. package/package.json +58 -0
@@ -0,0 +1,126 @@
1
+ import { element, textElement } from '../infrastructure/xml-writer.js';
2
+ import { SCHEME_BY_CATEGORY, TECHNOLOGY_PHYSICAL_FOLDER, VIEWS_FOLDER } from '../mapping/scheme-mapping.js';
3
+ import { buildProfileValues } from './profile-values.js';
4
+ import { renderSchemeChildren } from './semantic-writer.js';
5
+ /** Confirmed verbatim from both reference fixtures — the real XMA namespace set. */
6
+ const XML_NAMESPACES = [
7
+ ['xmlns:builtins', 'http://www.bizzdesign.com/metamodels/builtins'],
8
+ ['xmlns:Base', 'http://www.bizzdesign.com/metamodels/Base'],
9
+ ['xmlns:MM_ModelPackage', 'http://www.bizzdesign.com/metamodels/MM_ModelPackage'],
10
+ ['xmlns:Component', 'http://www.bizzdesign.com/metamodels/Component'],
11
+ ['xmlns:Amber', 'http://www.bizzdesign.com/metamodels/Amber'],
12
+ ['xmlns:ArchiMate', 'http://www.bizzdesign.com/metamodels/ArchiMate3.0'],
13
+ ['xmlns:BMC', 'http://www.bizzdesign.com/metamodels/BMC'],
14
+ ['xmlns:BPMN', 'http://www.bizzdesign.com/metamodels/BPMN'],
15
+ ['xmlns:Connection', 'http://www.bizzdesign.com/metamodels/Connection'],
16
+ ['xmlns:DMN', 'http://www.bizzdesign.com/metamodels/DMN'],
17
+ ['xmlns:ERD', 'http://www.bizzdesign.com/metamodels/ERD'],
18
+ ['xmlns:Lean', 'http://www.bizzdesign.com/metamodels/Lean'],
19
+ ['xmlns:META', 'http://www.bizzdesign.com/metamodels/META'],
20
+ ['xmlns:MM_Diagram', 'http://www.bizzdesign.com/metamodels/MM_Diagram'],
21
+ ['xmlns:TDM', 'http://www.bizzdesign.com/metamodels/TDM'],
22
+ ['xmlns:UML', 'http://www.bizzdesign.com/metamodels/UML'],
23
+ ];
24
+ const ROOT_LEVEL_CATEGORIES = [
25
+ 'Strategy',
26
+ 'Business',
27
+ 'Application',
28
+ 'Motivation',
29
+ 'ImplementationMigration',
30
+ 'Location', // Location and Grouping share CompositeScheme — deduplicated below.
31
+ ];
32
+ function findFolderName(folders, type, fallback) {
33
+ return folders.find((f) => f.type === type)?.name ?? fallback;
34
+ }
35
+ function renderRootScheme(schemeBuilds, ids, category, folders, language, emitted) {
36
+ const info = SCHEME_BY_CATEGORY[category];
37
+ if (emitted.has(info.tag)) {
38
+ return null;
39
+ }
40
+ const build = schemeBuilds.get(info.tag);
41
+ if (!build) {
42
+ return null;
43
+ }
44
+ emitted.add(info.tag);
45
+ const nameProfile = info.folderType && info.defaultLabel
46
+ ? buildProfileValues(language, findFolderName(folders, info.folderType, info.defaultLabel))
47
+ : null;
48
+ const children = renderSchemeChildren(build, nameProfile);
49
+ return element(`ArchiMate:${info.tag}`, [['id', String(ids.fresh())]], children);
50
+ }
51
+ function renderNestedScheme(build, ids) {
52
+ if (!build) {
53
+ return null;
54
+ }
55
+ const children = renderSchemeChildren(build, null);
56
+ return element(`ArchiMate:${build.tag}`, [['id', String(ids.fresh())]], children);
57
+ }
58
+ export function buildXmaDocument(input) {
59
+ const { modelName, packageName, language, ids, schemeBuilds, folders, view, viewResult, graphicalDiagramXml } = input;
60
+ const emittedSchemeTags = new Set();
61
+ const rootSchemesXml = ROOT_LEVEL_CATEGORIES.map((category) => renderRootScheme(schemeBuilds, ids, category, folders, language, emittedSchemeTags)).filter((el) => el !== null);
62
+ const technologySchemeXml = renderNestedScheme(schemeBuilds.get(SCHEME_BY_CATEGORY.Technology.tag), ids);
63
+ const physicalSchemeXml = renderNestedScheme(schemeBuilds.get(SCHEME_BY_CATEGORY.Physical.tag), ids);
64
+ const topLevelFolders = [];
65
+ if (technologySchemeXml || physicalSchemeXml) {
66
+ const nestedSchemes = [technologySchemeXml, physicalSchemeXml].filter((el) => el !== null);
67
+ topLevelFolders.push(element('ArchiMate:AbstractFolder', [['id', String(ids.fresh())]], [
68
+ textElement('nm', findFolderName(folders, TECHNOLOGY_PHYSICAL_FOLDER.archiFolderType, TECHNOLOGY_PHYSICAL_FOLDER.defaultLabel)),
69
+ element('ArchiMate:AbstractSchemes', [['name', 'schemes'], ['id', String(ids.fresh())]], nestedSchemes),
70
+ element('ArchiMate:AbstractViews', [['name', 'views'], ['id', String(ids.fresh())]]),
71
+ element('ArchiMate:AbstractFolders', [['name', 'folders'], ['id', String(ids.fresh())]]),
72
+ ]));
73
+ }
74
+ let allViewXmaId = null;
75
+ if (view && viewResult) {
76
+ allViewXmaId = ids.idFor(view.id);
77
+ const allViewXml = element('ArchiMate:AllView', [['id', String(allViewXmaId)]], [
78
+ buildProfileValues(language, view.name ?? '', view.documentation),
79
+ ...(viewResult.viewGraphicsXml.length > 0
80
+ ? [element('ArchiMate:ViewGraphics', [['name', 'viewGraphics'], ['id', String(ids.fresh())]], viewResult.viewGraphicsXml)]
81
+ : []),
82
+ element('ArchiMate:RefObjects', [['name', 'refObjects'], ['id', String(ids.fresh())]], viewResult.refObjectsXml),
83
+ ]);
84
+ topLevelFolders.push(element('ArchiMate:AbstractFolder', [['id', String(ids.fresh())]], [
85
+ textElement('nm', findFolderName(folders, VIEWS_FOLDER.archiFolderType, VIEWS_FOLDER.defaultLabel)),
86
+ element('ArchiMate:AbstractSchemes', [['name', 'schemes'], ['id', String(ids.fresh())]]),
87
+ element('ArchiMate:AbstractViews', [['name', 'views'], ['id', String(ids.fresh())]], [allViewXml]),
88
+ element('ArchiMate:AbstractFolders', [['name', 'folders'], ['id', String(ids.fresh())]]),
89
+ ]));
90
+ }
91
+ const modelNameProfile = buildProfileValues(language, modelName);
92
+ const archiMateComponent = element('ArchiMate:ArchiMateComponent', [['name', 'root'], ['id', String(ids.fresh())]], [
93
+ modelNameProfile,
94
+ element('ArchiMate:DomainDataSet', [['name', 'domainDataSet'], ['id', String(ids.fresh())]]),
95
+ element('ArchiMate:AbstractCommandContainers', [['name', 'commandContainers'], ['id', String(ids.fresh())]]),
96
+ element('ArchiMate:AbstractSchemes', [['name', 'schemes'], ['id', String(ids.fresh())]], rootSchemesXml),
97
+ element('ArchiMate:AbstractViews', [['name', 'views'], ['id', String(ids.fresh())]]),
98
+ element('ArchiMate:AbstractFolders', [['name', 'folders'], ['id', String(ids.fresh())]], topLevelFolders),
99
+ ]);
100
+ const semanticModule = element('MM_ModelPackage:MM_Module', [['id', String(ids.fresh())], ['nm', 'SemanticModule'], ['metaModel', 'ArchiMate']], [archiMateComponent]);
101
+ const modules = [semanticModule];
102
+ if (graphicalDiagramXml && allViewXmaId !== null) {
103
+ modules.push(element('MM_ModelPackage:MM_Module', [['id', String(ids.fresh())], ['nm', 'GraphicalModule'], ['metaModel', 'MM_Diagram']], [graphicalDiagramXml, element('Any', [['name', 'tag']], [element('Objectref', [['value', String(allViewXmaId)]])])]));
104
+ }
105
+ const archiMateMMModel = element('ArchiMate:ArchiMateMM_Model', [['id', String(ids.fresh())]], [
106
+ buildProfileValues(language, modelName),
107
+ element('MM_ModelPackage:MM_Modules', [['name', 'modules'], ['id', String(ids.fresh())]], modules),
108
+ ]);
109
+ const modelPackage = element('MM_ModelPackage:MM_ModelPackage', [['id', String(ids.fresh())]], [
110
+ textElement('nm', packageName),
111
+ element('MM_ModelPackage:MM_Folders', [['name', 'folders'], ['id', String(ids.fresh())]]),
112
+ element('MM_ModelPackage:MM_Models', [['name', 'models'], ['id', String(ids.fresh())]], [archiMateMMModel]),
113
+ element('MM_ModelPackage:DependencyRelations', [['name', 'dependencyRelations'], ['id', String(ids.fresh())]]),
114
+ element('MM_ModelPackage:MM_Languages', [['name', 'languages'], ['id', String(ids.fresh())]], [
115
+ element('MM_ModelPackage:MM_Language', [['id', String(ids.fresh())], ['isDefault', 'true']], [textElement('nm', language)]),
116
+ ]),
117
+ ]);
118
+ return element('MM_Document', [
119
+ ['version', '2.0'],
120
+ ['format', 'XML'],
121
+ ['includeMetaModels', 'false'],
122
+ ['requiredEngineVersion', '1'],
123
+ ...XML_NAMESPACES,
124
+ ], [element('MM_StorageUnit', undefined, [modelPackage])]);
125
+ }
126
+ //# sourceMappingURL=document-writer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"document-writer.js","sourceRoot":"","sources":["../../src/serializer/document-writer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import type { ArchiModel, ArchiView } from '@cda/archi-semantic-core';
2
+ import type { XmlElement } from '../infrastructure/xml-writer.js';
3
+ import { XmaIdRegistry, type XmaIdAllocator } from '../infrastructure/id-allocator.js';
4
+ import type { DiagnosticCollector } from '../diagnostics/diagnostics.js';
5
+ import type { ElementMappingEntry } from '../mapping/element-mapping.js';
6
+ import type { RelationshipMappingEntry } from '../mapping/relationship-mapping.js';
7
+ import type { ViewBuildResult } from './view-writer.js';
8
+ export interface GraphicalModuleResult {
9
+ diagramXml: XmlElement;
10
+ }
11
+ /**
12
+ * Builds the `GraphicalModule`'s `MM_Diagram` for the single supported
13
+ * view: a Canvas node wrapping one `MM_Node` per drawable diagram
14
+ * object/group/note, and one `MM_DirectedRel` per drawable connection.
15
+ *
16
+ * `mm_fromx`/`mm_fromy`/`mm_tox`/`mm_toy` (manual connector anchor
17
+ * metadata) are deliberately omitted — exactly one fixture exhibited them,
18
+ * which is not enough evidence to derive a general formula or confirm
19
+ * they're mandatory for import (see project docs, "unresolved
20
+ * reverse-engineering limitations"). If a future fixture proves them
21
+ * required, add that behavior here, isolated from the rest of this
22
+ * function.
23
+ */
24
+ export declare function buildGraphicalModule(model: ArchiModel, view: ArchiView, ids: XmaIdRegistry, refIds: XmaIdRegistry, allocator: XmaIdAllocator, mappedElements: ReadonlyMap<string, ElementMappingEntry>, mappedRelationships: ReadonlyMap<string, RelationshipMappingEntry>, viewResult: ViewBuildResult, diagnostics: DiagnosticCollector): GraphicalModuleResult;
25
+ //# sourceMappingURL=graphical-writer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graphical-writer.d.ts","sourceRoot":"","sources":["../../src/serializer/graphical-writer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,UAAU,EACV,SAAS,EAIV,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAElE,OAAO,EAAE,aAAa,EAAE,KAAK,cAAc,EAAE,MAAM,mCAAmC,CAAC;AACvF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,oCAAoC,CAAC;AAInF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAExD,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,UAAU,CAAC;CACxB;AAsLD;;;;;;;;;;;;GAYG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,UAAU,EACjB,IAAI,EAAE,SAAS,EACf,GAAG,EAAE,aAAa,EAClB,MAAM,EAAE,aAAa,EACrB,SAAS,EAAE,cAAc,EACzB,cAAc,EAAE,WAAW,CAAC,MAAM,EAAE,mBAAmB,CAAC,EACxD,mBAAmB,EAAE,WAAW,CAAC,MAAM,EAAE,wBAAwB,CAAC,EAClE,UAAU,EAAE,eAAe,EAC3B,WAAW,EAAE,mBAAmB,GAC/B,qBAAqB,CAyJvB"}
@@ -0,0 +1,287 @@
1
+ import { element, textElement } from '../infrastructure/xml-writer.js';
2
+ import { XmaIdRegistry } from '../infrastructure/id-allocator.js';
3
+ import { CATEGORY_FILL_COLOR, DEFAULT_FONT_NAME, DEFAULT_FONT_SIZE, DEFAULT_LINE_COLOR, DEFAULT_OPACITY, GROUP_FILL_COLOR, NOTE_FILL_COLOR, CANVAS_EXTENT, parseArchiHexColor } from '../mapping/visual-mapping.js';
4
+ import { scaleRect, scalePoint, hasCompleteBounds } from '../geometry/geometry.js';
5
+ import { resolveBendpoint } from '../geometry/bendpoints.js';
6
+ function colorElement(name, rgb, id) {
7
+ const attrs = [['id', String(id)]];
8
+ if (name !== null) {
9
+ attrs.push(['name', name]);
10
+ }
11
+ // Only regular styled colors carry r/g/b; a bare default (e.g. relationship line color) omits them — confirmed shape.
12
+ if (rgb) {
13
+ attrs.push(['mm_r', String(rgb.r)], ['mm_g', String(rgb.g)], ['mm_b', String(rgb.b)]);
14
+ }
15
+ return element('MM_Diagram:MM_Color', attrs);
16
+ }
17
+ function rectElement(id, rect) {
18
+ const scaled = scaleRect(rect);
19
+ return element('MM_Rect', [
20
+ ['name', 'mm_rect'],
21
+ ['x', String(scaled.x)],
22
+ ['y', String(scaled.y)],
23
+ ['w', String(scaled.width)],
24
+ ['h', String(scaled.height)],
25
+ ]);
26
+ }
27
+ /**
28
+ * Resolves a node's effective fill/line/font, applying explicit Archi
29
+ * styling only where mechanically lossless (a direct hex RGB copy, or a
30
+ * verbatim font-name substitution into the same structural slot) — per
31
+ * v0.1 policy, everything else explicit (font size, bold/italic, line
32
+ * width, font color) is diagnosed as an unsupported style override rather
33
+ * than guessed.
34
+ */
35
+ function resolveNodeVisuals(style, defaultFill, diagnostics, entityId, entityType) {
36
+ let fill = defaultFill;
37
+ let line = DEFAULT_LINE_COLOR;
38
+ let fontName = DEFAULT_FONT_NAME;
39
+ let fillOpacity = DEFAULT_OPACITY;
40
+ if (style) {
41
+ if (style.fillColor !== null) {
42
+ const parsed = parseArchiHexColor(style.fillColor);
43
+ if (parsed) {
44
+ fill = parsed;
45
+ }
46
+ else {
47
+ diagnostics.warning({
48
+ code: 'unsupported-style-fill-color',
49
+ message: `Fill color "${style.fillColor}" is not a recognized hex color and was not applied.`,
50
+ entityId,
51
+ entityType,
52
+ });
53
+ }
54
+ }
55
+ if (style.lineColor !== null) {
56
+ const parsed = parseArchiHexColor(style.lineColor);
57
+ if (parsed) {
58
+ line = parsed;
59
+ }
60
+ else {
61
+ diagnostics.warning({
62
+ code: 'unsupported-style-line-color',
63
+ message: `Line color "${style.lineColor}" is not a recognized hex color and was not applied.`,
64
+ entityId,
65
+ entityType,
66
+ });
67
+ }
68
+ }
69
+ if (style.fontName !== null) {
70
+ fontName = style.fontName;
71
+ }
72
+ if (style.alpha !== null) {
73
+ fillOpacity = style.alpha;
74
+ }
75
+ if (style.fontColor !== null) {
76
+ diagnostics.warning({
77
+ code: 'unsupported-style-font-color',
78
+ message: 'Explicit font color has no confirmed XMA representation and was not applied.',
79
+ entityId,
80
+ entityType,
81
+ });
82
+ }
83
+ if (style.fontSize !== null) {
84
+ diagnostics.warning({
85
+ code: 'unsupported-style-font-size',
86
+ message: 'Explicit font size has no confirmed XMA scaling formula and was not applied (default used).',
87
+ entityId,
88
+ entityType,
89
+ });
90
+ }
91
+ if (style.fontStyle !== null && (style.fontStyle.bold || style.fontStyle.italic)) {
92
+ diagnostics.warning({
93
+ code: 'unsupported-style-font-style',
94
+ message: 'Explicit bold/italic font style has no confirmed XMA representation and was not applied.',
95
+ entityId,
96
+ entityType,
97
+ });
98
+ }
99
+ if (style.lineWidth !== null) {
100
+ diagnostics.warning({
101
+ code: 'unsupported-style-line-width',
102
+ message: 'Explicit line width has no confirmed XMA representation and was not applied.',
103
+ entityId,
104
+ entityType,
105
+ });
106
+ }
107
+ }
108
+ return { fill, line, fontName, fillOpacity };
109
+ }
110
+ function buildLabelDecoration(id, fontName, extraAttrs = []) {
111
+ return element('MM_Diagram:MM_Decoration', [['id', String(id)], ['mm_fontSize', String(DEFAULT_FONT_SIZE)], ['mm_graphicType', '2'], ['mm_concept', 'label'], ...extraAttrs], [textElement('mm_font', fontName)]);
112
+ }
113
+ function buildIconDecoration(id) {
114
+ return element('MM_Diagram:MM_Decoration', [
115
+ ['id', String(id)],
116
+ ['mm_graphicType', '2'],
117
+ ['mm_concept', 'icon'],
118
+ ]);
119
+ }
120
+ /** Builds a fully-styled `MM_Node` for an element-backed diagram object, a Group, or a Note/ViewGraphic. */
121
+ function buildStyledNode(ids, nodeXmaId, concept, semanticObject, hasIcon, visuals, bounds, symbolName, labelExtraAttrs = []) {
122
+ const graphicsChildren = [];
123
+ if (hasIcon) {
124
+ graphicsChildren.push(buildIconDecoration(ids.fresh()));
125
+ }
126
+ graphicsChildren.push(buildLabelDecoration(ids.fresh(), visuals.fontName, labelExtraAttrs));
127
+ const attrs = [
128
+ ['id', String(nodeXmaId)],
129
+ ['mm_graphicType', '5'],
130
+ ['mm_concept', concept],
131
+ ];
132
+ if (symbolName) {
133
+ attrs.push(['mm_symbolName', symbolName]);
134
+ }
135
+ attrs.push(['mm_lineOpacity', String(DEFAULT_OPACITY)], ['mm_fillOpacity', String(visuals.fillOpacity)], ['mm_semanticObject', String(semanticObject)]);
136
+ return element('MM_Diagram:MM_Node', attrs, [
137
+ element('MM_Diagram:MM_Graphics', [['name', 'mm_graphics'], ['id', String(ids.fresh())]], graphicsChildren),
138
+ colorElement('mm_lineColor', visuals.line, ids.fresh()),
139
+ element('MM_Diagram:MM_Colors', [['name', 'mm_fillColors'], ['id', String(ids.fresh())]], [colorElement(null, visuals.fill, ids.fresh())]),
140
+ rectElement(ids.fresh(), bounds),
141
+ ]);
142
+ }
143
+ /**
144
+ * Builds the `GraphicalModule`'s `MM_Diagram` for the single supported
145
+ * view: a Canvas node wrapping one `MM_Node` per drawable diagram
146
+ * object/group/note, and one `MM_DirectedRel` per drawable connection.
147
+ *
148
+ * `mm_fromx`/`mm_fromy`/`mm_tox`/`mm_toy` (manual connector anchor
149
+ * metadata) are deliberately omitted — exactly one fixture exhibited them,
150
+ * which is not enough evidence to derive a general formula or confirm
151
+ * they're mandatory for import (see project docs, "unresolved
152
+ * reverse-engineering limitations"). If a future fixture proves them
153
+ * required, add that behavior here, isolated from the rest of this
154
+ * function.
155
+ */
156
+ export function buildGraphicalModule(model, view, ids, refIds, allocator, mappedElements, mappedRelationships, viewResult, diagnostics) {
157
+ const diagramObjectById = new Map(model.diagramObjects.map((o) => [o.id, o]));
158
+ const noteById = new Map(model.notes.map((n) => [n.id, n]));
159
+ const nodeIds = new XmaIdRegistry(allocator);
160
+ const canvasChildren = [];
161
+ for (const objId of view.diagramObjectIds) {
162
+ const obj = diagramObjectById.get(objId);
163
+ if (!obj)
164
+ continue;
165
+ if (viewResult.validElementNodeObjectIds.has(objId) && obj.archimateElementId) {
166
+ const mapping = mappedElements.get(obj.archimateElementId);
167
+ const refId = refIds.get(obj.archimateElementId);
168
+ const visuals = resolveNodeVisuals(obj.style, CATEGORY_FILL_COLOR[mapping.category], diagnostics, obj.id, 'ArchiDiagramObject');
169
+ const nodeXmaId = nodeIds.idFor(obj.id);
170
+ canvasChildren.push(buildStyledNode(ids, nodeXmaId, mapping.xmaType, refId, mapping.hasIcon, visuals, obj.bounds, null));
171
+ }
172
+ else if (viewResult.validGroupObjectIds.has(objId)) {
173
+ const groupSemanticId = ids.get(obj.id);
174
+ const visuals = resolveNodeVisuals(obj.style, GROUP_FILL_COLOR, diagnostics, obj.id, 'ArchiDiagramObject');
175
+ const nodeXmaId = nodeIds.idFor(obj.id);
176
+ canvasChildren.push(buildStyledNode(ids, nodeXmaId, 'ViewGraphic', groupSemanticId, false, visuals, obj.bounds, 'group', [
177
+ ['mm_frameStrategy', '12'],
178
+ ]));
179
+ }
180
+ }
181
+ for (const noteId of view.noteIds) {
182
+ if (!viewResult.validNoteIds.has(noteId))
183
+ continue;
184
+ const note = noteById.get(noteId);
185
+ if (!note)
186
+ continue;
187
+ const noteSemanticId = ids.get(note.id);
188
+ const visuals = resolveNodeVisuals(note.style, NOTE_FILL_COLOR, diagnostics, note.id, 'ArchiNote');
189
+ const nodeXmaId = nodeIds.idFor(note.id);
190
+ canvasChildren.push(buildStyledNode(ids, nodeXmaId, 'ViewGraphic', noteSemanticId, false, visuals, note.bounds, null));
191
+ }
192
+ const connectionById = new Map(model.diagramConnections.map((c) => [c.id, c]));
193
+ for (const connId of view.diagramConnectionIds) {
194
+ const connection = connectionById.get(connId);
195
+ if (!connection || connection.viewId !== view.id)
196
+ continue;
197
+ const relId = connection.archimateRelationshipId;
198
+ if (!relId)
199
+ continue; // already diagnosed by view-writer
200
+ const mapping = mappedRelationships.get(relId);
201
+ if (!mapping)
202
+ continue; // already diagnosed by relationship-writer
203
+ const sourceNodeXmaId = nodeIds.get(connection.sourceId);
204
+ const targetNodeXmaId = nodeIds.get(connection.targetId);
205
+ if (sourceNodeXmaId === undefined || targetNodeXmaId === undefined) {
206
+ diagnostics.error({
207
+ code: 'unsupported-connection-invalid-endpoint',
208
+ message: `Connection "${connection.id}" has a source/target diagram object that was not drawable.`,
209
+ entityId: connection.id,
210
+ entityType: 'ArchiDiagramConnection',
211
+ });
212
+ continue;
213
+ }
214
+ const sourceObj = diagramObjectById.get(connection.sourceId);
215
+ const targetObj = diagramObjectById.get(connection.targetId);
216
+ const points = [];
217
+ if (connection.bendpoints.length > 0 && sourceObj && targetObj && hasCompleteBounds(sourceObj.bounds) && hasCompleteBounds(targetObj.bounds)) {
218
+ for (const bp of connection.bendpoints) {
219
+ const resolution = resolveBendpoint(bp, sourceObj.bounds, targetObj.bounds);
220
+ if (!resolution) {
221
+ diagnostics.error({
222
+ code: 'unresolvable-bendpoint',
223
+ message: `Connection "${connection.id}" has a bendpoint with neither source- nor target-relative offsets set.`,
224
+ entityId: connection.id,
225
+ entityType: 'ArchiDiagramConnection',
226
+ });
227
+ continue;
228
+ }
229
+ if (resolution.mismatch) {
230
+ diagnostics.error({
231
+ code: 'bendpoint-endpoint-mismatch',
232
+ message: `Connection "${connection.id}" has a bendpoint whose source-relative and target-relative offsets disagree materially (source: ${resolution.mismatch.fromSource.x},${resolution.mismatch.fromSource.y}; target: ${resolution.mismatch.fromTarget.x},${resolution.mismatch.fromTarget.y}).`,
233
+ entityId: connection.id,
234
+ entityType: 'ArchiDiagramConnection',
235
+ });
236
+ }
237
+ const scaled = scalePoint(resolution.point);
238
+ points.push(element('MM_Diagram:MM_Point', [['id', String(ids.fresh())], ['mm_x', String(scaled.x)], ['mm_y', String(scaled.y)]]));
239
+ }
240
+ }
241
+ const relRefId = refIds.get(relId);
242
+ const directedRelChildren = [];
243
+ if (points.length > 0) {
244
+ directedRelChildren.push(element('MM_Diagram:MM_MultiLine', [['name', 'mm_line'], ['id', String(ids.fresh())]], points));
245
+ }
246
+ if (connection.style?.lineColor) {
247
+ diagnostics.warning({
248
+ code: 'unsupported-style-connection-line-color',
249
+ message: 'Explicit connection line color has no confirmed XMA representation and was not applied.',
250
+ entityId: connection.id,
251
+ entityType: 'ArchiDiagramConnection',
252
+ });
253
+ }
254
+ directedRelChildren.push(element('MM_Diagram:MM_Graphics', [['name', 'mm_graphics'], ['id', String(ids.fresh())]], [
255
+ buildLabelDecoration(ids.fresh(), DEFAULT_FONT_NAME),
256
+ ]));
257
+ directedRelChildren.push(colorElement('mm_lineColor', null, ids.fresh()));
258
+ canvasChildren.push(element('MM_Diagram:MM_DirectedRel', [
259
+ ['id', String(ids.fresh())],
260
+ ['mm_from', String(sourceNodeXmaId)],
261
+ ['mm_to', String(targetNodeXmaId)],
262
+ ['mm_graphicType', '7'],
263
+ ['mm_concept', mapping.xmaType],
264
+ ['mm_semanticObject', String(relRefId)],
265
+ ], directedRelChildren));
266
+ }
267
+ const canvasSemanticId = ids.idFor(view.id);
268
+ const canvasNode = element('MM_Diagram:MM_Node', [
269
+ ['name', 'mm_canvas'],
270
+ ['id', String(ids.fresh())],
271
+ ['mm_graphicType', '5'],
272
+ ['mm_concept', 'Canvas'],
273
+ ['mm_semanticObject', String(canvasSemanticId)],
274
+ ], [
275
+ element('MM_Diagram:MM_Graphics', [['name', 'mm_graphics'], ['id', String(ids.fresh())]], canvasChildren),
276
+ element('MM_Rect', [
277
+ ['name', 'mm_rect'],
278
+ ['x', '0'],
279
+ ['y', '0'],
280
+ ['w', String(CANVAS_EXTENT)],
281
+ ['h', String(CANVAS_EXTENT)],
282
+ ]),
283
+ ]);
284
+ const diagramXml = element('MM_Diagram:MM_Diagram', [['name', 'root'], ['id', String(ids.fresh())]], [canvasNode]);
285
+ return { diagramXml };
286
+ }
287
+ //# sourceMappingURL=graphical-writer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graphical-writer.js","sourceRoot":"","sources":["../../src/serializer/graphical-writer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { XmlElement } from '../infrastructure/xml-writer.js';
2
+ /**
3
+ * Builds an `<MM_ProfileValues>` block: a `nm` (display name) value, and
4
+ * optionally a `doc` (RTF documentation) value — confirmed order and shape
5
+ * from both reference fixtures (`nm` always precedes `doc`).
6
+ */
7
+ export declare function buildProfileValues(language: string, name: string, documentation?: string | null): XmlElement;
8
+ //# sourceMappingURL=profile-values.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile-values.d.ts","sourceRoot":"","sources":["../../src/serializer/profile-values.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAIlE;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,UAAU,CAkB5G"}
@@ -0,0 +1,25 @@
1
+ import { element, textElement } from '../infrastructure/xml-writer.js';
2
+ import { toRtfDocument } from './rtf.js';
3
+ /**
4
+ * Builds an `<MM_ProfileValues>` block: a `nm` (display name) value, and
5
+ * optionally a `doc` (RTF documentation) value — confirmed order and shape
6
+ * from both reference fixtures (`nm` always precedes `doc`).
7
+ */
8
+ export function buildProfileValues(language, name, documentation) {
9
+ const children = [
10
+ textElement('MM_Value', name, [
11
+ ['name', 'nm'],
12
+ ['type', 'string'],
13
+ ['xml:lang', language],
14
+ ]),
15
+ ];
16
+ if (documentation) {
17
+ children.push(textElement('MM_Value', toRtfDocument(documentation), [
18
+ ['name', 'doc'],
19
+ ['type', 'rtf'],
20
+ ['xml:lang', language],
21
+ ]));
22
+ }
23
+ return element('MM_ProfileValues', undefined, children);
24
+ }
25
+ //# sourceMappingURL=profile-values.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile-values.js","sourceRoot":"","sources":["../../src/serializer/profile-values.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AACvE,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,QAAgB,EAAE,IAAY,EAAE,aAA6B;IAC9F,MAAM,QAAQ,GAAiB;QAC7B,WAAW,CAAC,UAAU,EAAE,IAAI,EAAE;YAC5B,CAAC,MAAM,EAAE,IAAI,CAAC;YACd,CAAC,MAAM,EAAE,QAAQ,CAAC;YAClB,CAAC,UAAU,EAAE,QAAQ,CAAC;SACvB,CAAC;KACH,CAAC;IACF,IAAI,aAAa,EAAE,CAAC;QAClB,QAAQ,CAAC,IAAI,CACX,WAAW,CAAC,UAAU,EAAE,aAAa,CAAC,aAAa,CAAC,EAAE;YACpD,CAAC,MAAM,EAAE,KAAK,CAAC;YACf,CAAC,MAAM,EAAE,KAAK,CAAC;YACf,CAAC,UAAU,EAAE,QAAQ,CAAC;SACvB,CAAC,CACH,CAAC;IACJ,CAAC;IACD,OAAO,OAAO,CAAC,kBAAkB,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;AAC1D,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { ArchiModel, ArchiElement, ArchiRelationship } from '@cda/archi-semantic-core';
2
+ import type { XmaIdRegistry } from '../infrastructure/id-allocator.js';
3
+ import type { DiagnosticCollector } from '../diagnostics/diagnostics.js';
4
+ import { type RelationshipMappingEntry } from '../mapping/relationship-mapping.js';
5
+ import type { ElementMappingEntry } from '../mapping/element-mapping.js';
6
+ import type { SchemeBuild } from './semantic-writer.js';
7
+ /**
8
+ * Builds the semantic `<ArchiMate:{RelationshipType} from="..." to="..."/>`
9
+ * elements for every `ArchiRelationship` whose (type, source type, target
10
+ * type) triple matches one of the three confirmed mappings, appending them
11
+ * to the appropriate scheme's `Relations` collection. Everything else is
12
+ * diagnosed, never guessed — see `mapping/relationship-mapping.ts`.
13
+ */
14
+ export declare function buildSemanticRelationships(model: ArchiModel, ids: XmaIdRegistry, elementIndex: ReadonlyMap<string, ArchiElement>, relationshipIndex: ReadonlyMap<string, ArchiRelationship>, mappedElements: ReadonlyMap<string, ElementMappingEntry>, schemeBuilds: Map<string, SchemeBuild>, diagnostics: DiagnosticCollector): Map<string, RelationshipMappingEntry>;
15
+ //# sourceMappingURL=relationship-writer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relationship-writer.d.ts","sourceRoot":"","sources":["../../src/serializer/relationship-writer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE5F,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AACvE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAA6B,KAAK,wBAAwB,EAAE,MAAM,oCAAoC,CAAC;AAC9G,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAWxD;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,UAAU,EACjB,GAAG,EAAE,aAAa,EAClB,YAAY,EAAE,WAAW,CAAC,MAAM,EAAE,YAAY,CAAC,EAC/C,iBAAiB,EAAE,WAAW,CAAC,MAAM,EAAE,iBAAiB,CAAC,EACzD,cAAc,EAAE,WAAW,CAAC,MAAM,EAAE,mBAAmB,CAAC,EACxD,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,EACtC,WAAW,EAAE,mBAAmB,GAC/B,GAAG,CAAC,MAAM,EAAE,wBAAwB,CAAC,CA2EvC"}
@@ -0,0 +1,83 @@
1
+ import { element } from '../infrastructure/xml-writer.js';
2
+ import { lookupRelationshipMapping } from '../mapping/relationship-mapping.js';
3
+ function getOrCreateScheme(schemeBuilds, tag) {
4
+ let build = schemeBuilds.get(tag);
5
+ if (!build) {
6
+ build = { tag, collections: new Map(), relations: [] };
7
+ schemeBuilds.set(tag, build);
8
+ }
9
+ return build;
10
+ }
11
+ /**
12
+ * Builds the semantic `<ArchiMate:{RelationshipType} from="..." to="..."/>`
13
+ * elements for every `ArchiRelationship` whose (type, source type, target
14
+ * type) triple matches one of the three confirmed mappings, appending them
15
+ * to the appropriate scheme's `Relations` collection. Everything else is
16
+ * diagnosed, never guessed — see `mapping/relationship-mapping.ts`.
17
+ */
18
+ export function buildSemanticRelationships(model, ids, elementIndex, relationshipIndex, mappedElements, schemeBuilds, diagnostics) {
19
+ const mappedRelationships = new Map();
20
+ for (const rel of model.relationships) {
21
+ const sourceEl = elementIndex.get(rel.sourceId);
22
+ const targetEl = elementIndex.get(rel.targetId);
23
+ if (!sourceEl || !targetEl) {
24
+ const endpointIsRelationship = (!sourceEl && relationshipIndex.has(rel.sourceId)) || (!targetEl && relationshipIndex.has(rel.targetId));
25
+ diagnostics.error({
26
+ code: endpointIsRelationship ? 'unsupported-relationship-endpoint' : 'dangling-relationship-reference',
27
+ message: endpointIsRelationship
28
+ ? `Relationship "${rel.type}" (${rel.id}) has another relationship as an endpoint — relationship-to-relationship endpoints are not supported in XMA v0.1.`
29
+ : `Relationship "${rel.type}" (${rel.id}) references a source/target id not found among the model's elements.`,
30
+ entityId: rel.id,
31
+ entityType: 'ArchiRelationship',
32
+ });
33
+ continue;
34
+ }
35
+ if (!mappedElements.has(sourceEl.id) || !mappedElements.has(targetEl.id)) {
36
+ // The endpoint element itself already produced an unsupported-element-type
37
+ // diagnostic; this is the knock-on effect on the relationship.
38
+ diagnostics.error({
39
+ code: 'unsupported-relationship-endpoint-type',
40
+ message: `Relationship "${rel.type}" (${rel.id}) has an endpoint whose element type has no XMA mapping.`,
41
+ entityId: rel.id,
42
+ entityType: 'ArchiRelationship',
43
+ });
44
+ continue;
45
+ }
46
+ const mapping = lookupRelationshipMapping(rel.type, sourceEl.type, targetEl.type);
47
+ if (!mapping) {
48
+ diagnostics.error({
49
+ code: 'unsupported-relationship',
50
+ message: `Relationship "${rel.type}" from ${sourceEl.type} to ${targetEl.type} has no confirmed XMA mapping.`,
51
+ entityId: rel.id,
52
+ entityType: 'ArchiRelationship',
53
+ });
54
+ continue;
55
+ }
56
+ if (rel.properties.length > 0) {
57
+ diagnostics.warning({
58
+ code: 'unsupported-properties',
59
+ message: `Relationship "${rel.name ?? rel.id}" has ${rel.properties.length} propert${rel.properties.length === 1 ? 'y' : 'ies'} not represented in XMA v0.1.`,
60
+ entityId: rel.id,
61
+ entityType: 'ArchiRelationship',
62
+ });
63
+ }
64
+ if (rel.profiles.length > 0) {
65
+ diagnostics.warning({
66
+ code: 'unsupported-profile',
67
+ message: `Relationship "${rel.name ?? rel.id}" references ${rel.profiles.length} profile(s)/specialization(s) not represented in XMA v0.1.`,
68
+ entityId: rel.id,
69
+ entityType: 'ArchiRelationship',
70
+ });
71
+ }
72
+ mappedRelationships.set(rel.id, mapping);
73
+ const scheme = getOrCreateScheme(schemeBuilds, mapping.scheme);
74
+ const xmaId = ids.idFor(rel.id);
75
+ scheme.relations.push(element(`ArchiMate:${mapping.xmaType}`, [
76
+ ['id', String(xmaId)],
77
+ ['from', String(ids.idFor(sourceEl.id))],
78
+ ['to', String(ids.idFor(targetEl.id))],
79
+ ]));
80
+ }
81
+ return mappedRelationships;
82
+ }
83
+ //# sourceMappingURL=relationship-writer.js.map