@domainlang/language 0.10.0 → 0.12.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 (87) hide show
  1. package/README.md +44 -102
  2. package/out/diagram/context-map-diagram-generator.d.ts +65 -0
  3. package/out/diagram/context-map-diagram-generator.js +356 -0
  4. package/out/diagram/context-map-diagram-generator.js.map +1 -0
  5. package/out/diagram/context-map-layout-configurator.d.ts +15 -0
  6. package/out/diagram/context-map-layout-configurator.js +39 -0
  7. package/out/diagram/context-map-layout-configurator.js.map +1 -0
  8. package/out/diagram/elk-layout-factory.d.ts +43 -0
  9. package/out/diagram/elk-layout-factory.js +64 -0
  10. package/out/diagram/elk-layout-factory.js.map +1 -0
  11. package/out/domain-lang-module.d.ts +9 -2
  12. package/out/domain-lang-module.js +13 -4
  13. package/out/domain-lang-module.js.map +1 -1
  14. package/out/index.d.ts +6 -0
  15. package/out/index.js +7 -0
  16. package/out/index.js.map +1 -1
  17. package/out/lsp/domain-lang-code-lens-provider.d.ts +8 -0
  18. package/out/lsp/domain-lang-code-lens-provider.js +48 -0
  19. package/out/lsp/domain-lang-code-lens-provider.js.map +1 -0
  20. package/out/lsp/domain-lang-completion.js +1 -1
  21. package/out/lsp/domain-lang-completion.js.map +1 -1
  22. package/out/lsp/domain-lang-document-symbol-provider.js +5 -5
  23. package/out/lsp/domain-lang-document-symbol-provider.js.map +1 -1
  24. package/out/lsp/domain-lang-index-manager.d.ts +149 -5
  25. package/out/lsp/domain-lang-index-manager.js +388 -52
  26. package/out/lsp/domain-lang-index-manager.js.map +1 -1
  27. package/out/lsp/domain-lang-refresh.d.ts +35 -0
  28. package/out/lsp/domain-lang-refresh.js +129 -0
  29. package/out/lsp/domain-lang-refresh.js.map +1 -0
  30. package/out/lsp/domain-lang-workspace-manager.d.ts +10 -0
  31. package/out/lsp/domain-lang-workspace-manager.js +35 -0
  32. package/out/lsp/domain-lang-workspace-manager.js.map +1 -1
  33. package/out/lsp/tool-handlers.js +63 -57
  34. package/out/lsp/tool-handlers.js.map +1 -1
  35. package/out/main.js +30 -190
  36. package/out/main.js.map +1 -1
  37. package/out/sdk/loader-node.js +1 -1
  38. package/out/sdk/loader-node.js.map +1 -1
  39. package/out/sdk/validator.js +17 -14
  40. package/out/sdk/validator.js.map +1 -1
  41. package/out/services/import-resolver.d.ts +67 -17
  42. package/out/services/import-resolver.js +146 -65
  43. package/out/services/import-resolver.js.map +1 -1
  44. package/out/services/lsp-logger.d.ts +42 -0
  45. package/out/services/lsp-logger.js +50 -0
  46. package/out/services/lsp-logger.js.map +1 -0
  47. package/out/services/lsp-runtime-settings.d.ts +20 -0
  48. package/out/services/lsp-runtime-settings.js +20 -0
  49. package/out/services/lsp-runtime-settings.js.map +1 -0
  50. package/out/services/performance-optimizer.d.ts +9 -9
  51. package/out/services/performance-optimizer.js +17 -41
  52. package/out/services/performance-optimizer.js.map +1 -1
  53. package/out/services/workspace-manager.d.ts +22 -1
  54. package/out/services/workspace-manager.js +57 -9
  55. package/out/services/workspace-manager.js.map +1 -1
  56. package/out/utils/import-utils.js +6 -6
  57. package/out/utils/import-utils.js.map +1 -1
  58. package/out/validation/constants.d.ts +6 -0
  59. package/out/validation/constants.js +7 -0
  60. package/out/validation/constants.js.map +1 -1
  61. package/out/validation/import.d.ts +13 -3
  62. package/out/validation/import.js +54 -10
  63. package/out/validation/import.js.map +1 -1
  64. package/package.json +5 -2
  65. package/src/diagram/context-map-diagram-generator.ts +451 -0
  66. package/src/diagram/context-map-layout-configurator.ts +43 -0
  67. package/src/diagram/elk-layout-factory.ts +83 -0
  68. package/src/domain-lang-module.ts +22 -5
  69. package/src/index.ts +8 -0
  70. package/src/lsp/domain-lang-code-lens-provider.ts +54 -0
  71. package/src/lsp/domain-lang-completion.ts +3 -3
  72. package/src/lsp/domain-lang-document-symbol-provider.ts +5 -5
  73. package/src/lsp/domain-lang-index-manager.ts +438 -56
  74. package/src/lsp/domain-lang-refresh.ts +205 -0
  75. package/src/lsp/domain-lang-workspace-manager.ts +45 -0
  76. package/src/lsp/tool-handlers.ts +61 -47
  77. package/src/main.ts +36 -244
  78. package/src/sdk/loader-node.ts +1 -1
  79. package/src/sdk/validator.ts +17 -13
  80. package/src/services/import-resolver.ts +196 -89
  81. package/src/services/lsp-logger.ts +89 -0
  82. package/src/services/lsp-runtime-settings.ts +34 -0
  83. package/src/services/performance-optimizer.ts +18 -57
  84. package/src/services/workspace-manager.ts +62 -10
  85. package/src/utils/import-utils.ts +6 -6
  86. package/src/validation/constants.ts +9 -0
  87. package/src/validation/import.ts +67 -12
@@ -1,28 +1,35 @@
1
1
  import fs from 'node:fs/promises';
2
2
  import path from 'node:path';
3
+ import { ImportResolutionError } from '../services/import-resolver.js';
3
4
  import { ValidationMessages, buildCodeDescription, IssueCodes } from './constants.js';
4
5
  /**
5
6
  * Validates import statements in DomainLang.
6
7
  *
7
8
  * Uses async validators (Langium 4.x supports MaybePromise<void>) to leverage
8
- * the shared WorkspaceManager service with its cached manifest/lock file reading.
9
+ * the shared ManifestManager service with its cached manifest/lock file reading.
9
10
  *
10
11
  * Checks:
11
12
  * - All import URIs resolve to existing files
12
13
  * - External imports require manifest + alias
13
14
  * - Local path dependencies stay inside workspace
14
15
  * - Lock file exists for external dependencies
16
+ * - Import cycles are detected and reported (PRS-017 R3)
15
17
  */
16
18
  export class ImportValidator {
17
19
  constructor(services) {
18
- this.workspaceManager = services.imports.WorkspaceManager;
20
+ this.workspaceManager = services.imports.ManifestManager;
19
21
  this.importResolver = services.imports.ImportResolver;
22
+ // IndexManager is in shared services — cast to DomainLangIndexManager for cycle detection
23
+ const indexMgr = services.shared.workspace.IndexManager;
24
+ this.indexManager = 'getCycleForDocument' in indexMgr
25
+ ? indexMgr
26
+ : undefined;
20
27
  }
21
28
  /**
22
29
  * Validates an import statement asynchronously.
23
30
  *
24
31
  * Langium validators can return MaybePromise<void>, enabling async operations
25
- * like reading manifests via the shared, cached WorkspaceManager.
32
+ * like reading manifests via the shared, cached ManifestManager.
26
33
  */
27
34
  async checkImportPath(imp, accept, document, _cancelToken) {
28
35
  if (!imp.uri) {
@@ -34,6 +41,8 @@ export class ImportValidator {
34
41
  });
35
42
  return;
36
43
  }
44
+ // PRS-017 R3: Check for import cycles detected during indexing
45
+ this.checkImportCycle(document, imp, accept);
37
46
  // First, verify the import resolves to a valid file
38
47
  // This catches renamed/moved/deleted files immediately
39
48
  const resolveError = await this.validateImportResolves(imp, document, accept);
@@ -126,13 +135,20 @@ export class ImportValidator {
126
135
  }
127
136
  return false;
128
137
  }
129
- catch {
130
- // Resolution failed - report as unresolved import
131
- accept('error', ValidationMessages.IMPORT_UNRESOLVED(imp.uri), {
138
+ catch (error) {
139
+ // R8: Use structured error properties for precise diagnostics
140
+ const message = error instanceof ImportResolutionError && error.hint
141
+ ? `${ValidationMessages.IMPORT_UNRESOLVED(imp.uri)}: ${error.hint}`
142
+ : ValidationMessages.IMPORT_UNRESOLVED(imp.uri);
143
+ accept('error', message, {
132
144
  node: imp,
133
145
  property: 'uri',
134
146
  codeDescription: buildCodeDescription('language.md', 'imports'),
135
- data: { code: IssueCodes.ImportUnresolved, uri: imp.uri }
147
+ data: {
148
+ code: IssueCodes.ImportUnresolved,
149
+ uri: imp.uri,
150
+ ...(error instanceof ImportResolutionError && { reason: error.reason }),
151
+ }
136
152
  });
137
153
  return true;
138
154
  }
@@ -253,7 +269,7 @@ export class ImportValidator {
253
269
  }
254
270
  }
255
271
  catch (error) {
256
- // WorkspaceManager not initialized - skip workspace boundary check
272
+ // ManifestManager not initialized - skip workspace boundary check
257
273
  // This can happen for standalone files without model.yaml
258
274
  console.warn(`Could not validate workspace boundary for path dependency: ${error}`);
259
275
  }
@@ -288,7 +304,7 @@ export class ImportValidator {
288
304
  }
289
305
  }
290
306
  catch (error) {
291
- // WorkspaceManager not initialized - log warning but continue
307
+ // ManifestManager not initialized - log warning but continue
292
308
  console.warn(`Could not validate cached package for ${alias}: ${error}`);
293
309
  }
294
310
  }
@@ -312,11 +328,39 @@ export class ImportValidator {
312
328
  return false;
313
329
  }
314
330
  }
331
+ // --- PRS-017 R3: Import cycle detection ---
332
+ /**
333
+ * Reports a warning if the current document is part of an import cycle.
334
+ *
335
+ * Cycle data is populated during indexing by DomainLangIndexManager.
336
+ * This method reads the pre-computed cycles and emits a diagnostic
337
+ * on the import statement contributing to the cycle.
338
+ */
339
+ checkImportCycle(document, imp, accept) {
340
+ if (!this.indexManager)
341
+ return;
342
+ const cycle = this.indexManager.getCycleForDocument(document.uri.toString());
343
+ if (!cycle || cycle.length === 0)
344
+ return;
345
+ // Build human-readable cycle display using basenames
346
+ const cycleDisplay = cycle
347
+ .map(uri => {
348
+ const parts = uri.split('/');
349
+ return parts.at(-1) ?? uri;
350
+ })
351
+ .join(' → ');
352
+ accept('warning', ValidationMessages.IMPORT_CYCLE_DETECTED(cycleDisplay), {
353
+ node: imp,
354
+ property: 'uri',
355
+ codeDescription: buildCodeDescription('language.md', 'imports'),
356
+ data: { code: IssueCodes.ImportCycleDetected }
357
+ });
358
+ }
315
359
  }
316
360
  /**
317
361
  * Creates validation checks for import statements.
318
362
  *
319
- * Returns async validators that leverage the shared WorkspaceManager
363
+ * Returns async validators that leverage the shared ManifestManager
320
364
  * for cached manifest/lock file reading.
321
365
  */
322
366
  export function createImportChecks(services) {
@@ -1 +1 @@
1
- {"version":3,"file":"import.js","sourceRoot":"","sources":["../../src/validation/import.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAQ7B,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEtF;;;;;;;;;;;GAWG;AACH,MAAM,OAAO,eAAe;IAIxB,YAAY,QAA4B;QACpC,IAAI,CAAC,gBAAgB,GAAG,QAAQ,CAAC,OAAO,CAAC,gBAAgB,CAAC;QAC1D,IAAI,CAAC,cAAc,GAAG,QAAQ,CAAC,OAAO,CAAC,cAAc,CAAC;IAC1D,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,eAAe,CACjB,GAAoB,EACpB,MAA0B,EAC1B,QAAyB,EACzB,YAA4C;QAE5C,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;YACX,MAAM,CAAC,OAAO,EAAE,kBAAkB,CAAC,kBAAkB,EAAE,EAAE;gBACrD,IAAI,EAAE,GAAG;gBACT,OAAO,EAAE,QAAQ;gBACjB,eAAe,EAAE,oBAAoB,CAAC,aAAa,EAAE,SAAS,CAAC;gBAC/D,IAAI,EAAE,EAAE,IAAI,EAAE,UAAU,CAAC,gBAAgB,EAAE;aAC9C,CAAC,CAAC;YACH,OAAO;QACX,CAAC;QAED,oDAAoD;QACpD,uDAAuD;QACvD,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,sBAAsB,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC9E,IAAI,YAAY,EAAE,CAAC;YACf,OAAO,CAAC,yDAAyD;QACrE,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAClC,OAAO;QACX,CAAC;QAED,sDAAsD;QACtD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACjD,MAAM,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAE/C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE,CAAC;QAC3D,IAAI,CAAC,QAAQ,EAAE,CAAC;YACZ,MAAM,CAAC,OAAO,EAAE,kBAAkB,CAAC,wBAAwB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;gBAClE,IAAI,EAAE,GAAG;gBACT,QAAQ,EAAE,KAAK;gBACf,eAAe,EAAE,oBAAoB,CAAC,aAAa,EAAE,SAAS,CAAC;gBAC/D,IAAI,EAAE,EAAE,IAAI,EAAE,UAAU,CAAC,sBAAsB,EAAE,SAAS,EAAE,GAAG,CAAC,GAAG,EAAE;aACxE,CAAC,CAAC;YACH,OAAO;QACX,CAAC;QAED,6DAA6D;QAC7D,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;QAErD,IAAI,CAAC,KAAK,EAAE,CAAC;YACT,MAAM,CAAC,OAAO,EAAE,kBAAkB,CAAC,sBAAsB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;gBAChE,IAAI,EAAE,GAAG;gBACT,QAAQ,EAAE,KAAK;gBACf,eAAe,EAAE,oBAAoB,CAAC,aAAa,EAAE,SAAS,CAAC;gBAC/D,IAAI,EAAE,EAAE,IAAI,EAAE,UAAU,CAAC,mBAAmB,EAAE,KAAK,EAAE,GAAG,CAAC,GAAG,EAAE;aACjE,CAAC,CAAC;YACH,OAAO;QACX,CAAC;QAED,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,KAAK,CAAC;QAClC,IAAI,CAAC,wBAAwB,CAAC,UAAU,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;QAE5D,qEAAqE;QACrE,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;YACpB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE,CAAC;YAC3D,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACZ,MAAM,CAAC,OAAO,EAAE,kBAAkB,CAAC,oBAAoB,CAAC,GAAG,CAAC,EAAE;oBAC1D,IAAI,EAAE,GAAG;oBACT,QAAQ,EAAE,KAAK;oBACf,eAAe,EAAE,oBAAoB,CAAC,aAAa,EAAE,SAAS,CAAC;oBAC/D,IAAI,EAAE,EAAE,IAAI,EAAE,UAAU,CAAC,kBAAkB,EAAE,KAAK,EAAE,GAAG,EAAE;iBAC5D,CAAC,CAAC;gBACH,OAAO;YACX,CAAC;YAED,MAAM,IAAI,CAAC,qBAAqB,CAAC,UAAU,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;QAC7E,CAAC;IACL,CAAC;IAED;;;;;;;OAOG;IACK,gBAAgB,CAAC,GAAW;QAChC,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YAChD,OAAO,KAAK,CAAC;QACjB,CAAC;QACD,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACtB,OAAO,KAAK,CAAC;QACjB,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,sBAAsB,CAChC,GAAoB,EACpB,QAAyB,EACzB,MAA0B;QAE1B,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;YACX,OAAO,IAAI,CAAC,CAAC,yBAAyB;QAC1C,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAEjD,IAAI,CAAC;YACD,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;YAE3E,6CAA6C;YAC7C,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC;YACpC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YAE/C,IAAI,CAAC,MAAM,EAAE,CAAC;gBACV,MAAM,CAAC,OAAO,EAAE,kBAAkB,CAAC,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;oBAC3D,IAAI,EAAE,GAAG;oBACT,QAAQ,EAAE,KAAK;oBACf,eAAe,EAAE,oBAAoB,CAAC,aAAa,EAAE,SAAS,CAAC;oBAC/D,IAAI,EAAE,EAAE,IAAI,EAAE,UAAU,CAAC,gBAAgB,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE;iBAC5D,CAAC,CAAC;gBACH,OAAO,IAAI,CAAC;YAChB,CAAC;YAED,OAAO,KAAK,CAAC;QACjB,CAAC;QAAC,MAAM,CAAC;YACL,kDAAkD;YAClD,MAAM,CAAC,OAAO,EAAE,kBAAkB,CAAC,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;gBAC3D,IAAI,EAAE,GAAG;gBACT,QAAQ,EAAE,KAAK;gBACf,eAAe,EAAE,oBAAoB,CAAC,aAAa,EAAE,SAAS,CAAC;gBAC/D,IAAI,EAAE,EAAE,IAAI,EAAE,UAAU,CAAC,gBAAgB,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE;aAC5D,CAAC,CAAC;YACH,OAAO,IAAI,CAAC;QAChB,CAAC;IACL,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,UAAU,CAAC,QAAgB;QACrC,IAAI,CAAC;YACD,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACrC,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC;QACzB,CAAC;QAAC,MAAM,CAAC;YACL,OAAO,KAAK,CAAC;QACjB,CAAC;IACL,CAAC;IAED;;;;;;;;OAQG;IACK,cAAc,CAClB,QAAuB,EACvB,SAAiB;QAEjB,MAAM,YAAY,GAAG,QAAQ,CAAC,YAAY,CAAC;QAC3C,IAAI,CAAC,YAAY,EAAE,CAAC;YAChB,OAAO,SAAS,CAAC;QACrB,CAAC;QAED,8DAA8D;QAC9D,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;QAEjF,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;YAC3B,kDAAkD;YAClD,IAAI,SAAS,KAAK,GAAG,IAAI,SAAS,CAAC,UAAU,CAAC,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC;gBACvD,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;gBACrD,IAAI,UAAU,EAAE,CAAC;oBACb,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC;gBAC/B,CAAC;YACL,CAAC;QACL,CAAC;QAED,OAAO,SAAS,CAAC;IACrB,CAAC;IAED;;OAEG;IACK,aAAa,CAAC,QAAuB,EAAE,GAAW;QACtD,MAAM,GAAG,GAAG,QAAQ,CAAC,YAAY,EAAE,CAAC,GAAG,CAAC,CAAC;QACzC,IAAI,CAAC,GAAG,EAAE,CAAC;YACP,OAAO,SAAS,CAAC;QACrB,CAAC;QAED,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;YAC1B,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;QACrC,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;YAC3B,OAAO,EAAE,GAAG,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;QACnC,CAAC;QAED,OAAO,GAAG,CAAC;IACf,CAAC;IAED;;OAEG;IACK,wBAAwB,CAC5B,UAAkC,EAClC,KAAa,EACb,MAA0B,EAC1B,GAAoB;QAEpB,IAAI,UAAU,CAAC,MAAM,IAAI,UAAU,CAAC,IAAI,EAAE,CAAC;YACvC,MAAM,CAAC,OAAO,EAAE,kBAAkB,CAAC,8BAA8B,CAAC,KAAK,CAAC,EAAE;gBACtE,IAAI,EAAE,GAAG;gBACT,QAAQ,EAAE,KAAK;gBACf,eAAe,EAAE,oBAAoB,CAAC,aAAa,EAAE,SAAS,CAAC;gBAC/D,IAAI,EAAE,EAAE,IAAI,EAAE,UAAU,CAAC,2BAA2B,EAAE,KAAK,EAAE;aAChE,CAAC,CAAC;YACH,OAAO;QACX,CAAC;QAED,IAAI,CAAC,UAAU,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;YACzC,MAAM,CAAC,OAAO,EAAE,kBAAkB,CAAC,6BAA6B,CAAC,KAAK,CAAC,EAAE;gBACrE,IAAI,EAAE,GAAG;gBACT,QAAQ,EAAE,KAAK;gBACf,eAAe,EAAE,oBAAoB,CAAC,aAAa,EAAE,SAAS,CAAC;gBAC/D,IAAI,EAAE,EAAE,IAAI,EAAE,UAAU,CAAC,yBAAyB,EAAE,KAAK,EAAE;aAC9D,CAAC,CAAC;YACH,OAAO;QACX,CAAC;QAED,IAAI,UAAU,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC;YACvC,MAAM,CAAC,OAAO,EAAE,kBAAkB,CAAC,kBAAkB,CAAC,KAAK,CAAC,EAAE;gBAC1D,IAAI,EAAE,GAAG;gBACT,QAAQ,EAAE,KAAK;gBACf,eAAe,EAAE,oBAAoB,CAAC,aAAa,EAAE,SAAS,CAAC;gBAC/D,IAAI,EAAE,EAAE,IAAI,EAAE,UAAU,CAAC,gBAAgB,EAAE,KAAK,EAAE;aACrD,CAAC,CAAC;QACP,CAAC;QAED,IAAI,UAAU,CAAC,IAAI,EAAE,CAAC;YAClB,IAAI,CAAC,2BAA2B,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;QAC1E,CAAC;IACL,CAAC;IAED;;OAEG;IACK,2BAA2B,CAC/B,cAAsB,EACtB,KAAa,EACb,MAA0B,EAC1B,GAAoB;QAEpB,IAAI,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;YAClC,MAAM,CAAC,OAAO,EAAE,kBAAkB,CAAC,oBAAoB,CAAC,KAAK,EAAE,cAAc,CAAC,EAAE;gBAC5E,IAAI,EAAE,GAAG;gBACT,QAAQ,EAAE,KAAK;gBACf,eAAe,EAAE,oBAAoB,CAAC,aAAa,EAAE,SAAS,CAAC;gBAC/D,IAAI,EAAE,EAAE,IAAI,EAAE,UAAU,CAAC,kBAAkB,EAAE,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE;aAC7E,CAAC,CAAC;YACH,OAAO;QACX,CAAC;QAED,IAAI,CAAC;YACD,MAAM,aAAa,GAAG,IAAI,CAAC,gBAAgB,CAAC,gBAAgB,EAAE,CAAC;YAC/D,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC;YACjE,MAAM,mBAAmB,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;YAEvE,IAAI,mBAAmB,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,mBAAmB,CAAC,EAAE,CAAC;gBAC/E,MAAM,CAAC,OAAO,EAAE,kBAAkB,CAAC,wBAAwB,CAAC,KAAK,CAAC,EAAE;oBAChE,IAAI,EAAE,GAAG;oBACT,QAAQ,EAAE,KAAK;oBACf,eAAe,EAAE,oBAAoB,CAAC,aAAa,EAAE,SAAS,CAAC;oBAC/D,IAAI,EAAE,EAAE,IAAI,EAAE,UAAU,CAAC,sBAAsB,EAAE,KAAK,EAAE;iBAC3D,CAAC,CAAC;YACP,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,mEAAmE;YACnE,0DAA0D;YAC1D,OAAO,CAAC,IAAI,CAAC,8DAA8D,KAAK,EAAE,CAAC,CAAC;QACxF,CAAC;IACL,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,qBAAqB,CAC/B,UAAkC,EAClC,KAAa,EACb,QAAkB,EAClB,MAA0B,EAC1B,GAAoB;QAEpB,wEAAwE;QACxE,MAAM,UAAU,GAAG,UAAU,CAAC,MAAM,IAAI,KAAK,CAAC;QAC9C,MAAM,SAAS,GAAG,QAAQ,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;QAEpD,IAAI,CAAC,SAAS,EAAE,CAAC;YACb,MAAM,CAAC,OAAO,EAAE,kBAAkB,CAAC,oBAAoB,CAAC,KAAK,CAAC,EAAE;gBAC5D,IAAI,EAAE,GAAG;gBACT,QAAQ,EAAE,KAAK;gBACf,eAAe,EAAE,oBAAoB,CAAC,aAAa,EAAE,SAAS,CAAC;gBAC/D,IAAI,EAAE,EAAE,IAAI,EAAE,UAAU,CAAC,kBAAkB,EAAE,KAAK,EAAE;aACvD,CAAC,CAAC;YACH,OAAO;QACX,CAAC;QAED,IAAI,CAAC;YACD,MAAM,aAAa,GAAG,IAAI,CAAC,gBAAgB,CAAC,gBAAgB,EAAE,CAAC;YAC/D,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,CAAC,aAAa,EAAE,UAAU,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;YAErF,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;YACzD,IAAI,CAAC,WAAW,EAAE,CAAC;gBACf,MAAM,CAAC,OAAO,EAAE,kBAAkB,CAAC,oBAAoB,CAAC,KAAK,CAAC,EAAE;oBAC5D,IAAI,EAAE,GAAG;oBACT,QAAQ,EAAE,KAAK;oBACf,eAAe,EAAE,oBAAoB,CAAC,aAAa,EAAE,SAAS,CAAC;oBAC/D,IAAI,EAAE,EAAE,IAAI,EAAE,UAAU,CAAC,kBAAkB,EAAE,KAAK,EAAE;iBACvD,CAAC,CAAC;YACP,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,8DAA8D;YAC9D,OAAO,CAAC,IAAI,CAAC,yCAAyC,KAAK,KAAK,KAAK,EAAE,CAAC,CAAC;QAC7E,CAAC;IACL,CAAC;IAED;;;OAGG;IACK,iBAAiB,CAAC,aAAqB,EAAE,MAAc,EAAE,UAAkB;QAC/E,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACxC,OAAO,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;IACnF,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,eAAe,CAAC,OAAe;QACzC,IAAI,CAAC;YACD,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACpC,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;QAC9B,CAAC;QAAC,MAAM,CAAC;YACL,OAAO,KAAK,CAAC;QACjB,CAAC;IACL,CAAC;CACJ;AAED;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,QAA4B;IAC3D,MAAM,SAAS,GAAG,IAAI,eAAe,CAAC,QAAQ,CAAC,CAAC;IAEhD,OAAO;QACH,+DAA+D;QAC/D,eAAe,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE;YAChD,2DAA2D;YAC3D,mDAAmD;YACnD,MAAM,IAAI,GAAG,GAAG,CAAC,UAAU,CAAC;YAC5B,MAAM,QAAQ,GAAG,IAAI,EAAE,SAAS,CAAC;YACjC,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACZ,OAAO;YACX,CAAC;YAED,MAAM,SAAS,CAAC,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;QACxE,CAAC;KACJ,CAAC;AACN,CAAC"}
1
+ {"version":3,"file":"import.js","sourceRoot":"","sources":["../../src/validation/import.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@domainlang/language",
3
- "version": "0.10.0",
3
+ "version": "0.12.0",
4
4
  "displayName": "DomainLang Language",
5
5
  "description": "Core language library for DomainLang - parse, validate, and query Domain-Driven Design models programmatically",
6
6
  "author": "larsbaunwall",
@@ -85,9 +85,12 @@
85
85
  "test:coverage": "vitest run --coverage"
86
86
  },
87
87
  "dependencies": {
88
+ "elkjs": "^0.8.2",
88
89
  "langium": "~4.2.0",
90
+ "langium-sprotty": "~4.2.0",
89
91
  "monaco-editor": "0.55.1",
90
- "vite": "6.4.1",
92
+ "sprotty-elk": "~1.4.0",
93
+ "sprotty-protocol": "~1.4.0",
91
94
  "yaml": "^2.5.0"
92
95
  },
93
96
  "devDependencies": {
@@ -0,0 +1,451 @@
1
+ import type { LangiumDocument } from 'langium';
2
+ import type { SGraph, SModelElement, SModelRoot, SEdge, SNode } from 'sprotty-protocol';
3
+ import { LangiumDiagramGenerator, type GeneratorContext } from 'langium-sprotty';
4
+ import { fromDocument } from '../sdk/query.js';
5
+ import type { Query } from '../sdk/types.js';
6
+ import type { BoundedContext, ContextMap, Model, Relationship } from '../generated/ast.js';
7
+
8
+ /** Ellipse sizing for bounded context nodes — sized for long names like "CustomerManagementContext" */
9
+ const NODE_WIDTH = 280;
10
+ const NODE_HEIGHT = 100;
11
+
12
+ /**
13
+ * Maps long-form DomainLang integration pattern keywords to their standard
14
+ * DDD abbreviations for display in U/D badges.
15
+ */
16
+ const PATTERN_ABBREVIATIONS: Readonly<Record<string, string>> = {
17
+ OpenHostService: 'OHS',
18
+ PublishedLanguage: 'PL',
19
+ AntiCorruptionLayer: 'ACL',
20
+ Conformist: 'CF',
21
+ Partnership: 'P',
22
+ SharedKernel: 'SK',
23
+ BigBallOfMud: 'BBoM',
24
+ };
25
+
26
+ /**
27
+ * Returns the abbreviated form of an integration pattern keyword.
28
+ *
29
+ * Short forms (e.g. `OHS`, `ACL`) are returned unchanged. Long forms (e.g.
30
+ * `OpenHostService`, `AntiCorruptionLayer`) are mapped to their abbreviation.
31
+ */
32
+ function normalizePattern(pattern: string): string {
33
+ return PATTERN_ABBREVIATIONS[pattern] ?? pattern;
34
+ }
35
+
36
+ /**
37
+ * Returns `true` when the pattern identifies a Big Ball of Mud participant.
38
+ *
39
+ * BBoM is surfaced as a cloud node shape on the bounded context itself, not as
40
+ * a text annotation in the edge badge, so it should be excluded from badge text.
41
+ */
42
+ function isBBoMPattern(pattern: string): boolean {
43
+ return pattern === 'BBoM' || pattern === 'BigBallOfMud';
44
+ }
45
+
46
+ interface DiagramSelection {
47
+ selectedContextMapFqn?: string;
48
+ selectedContextMapName?: string;
49
+ }
50
+
51
+ interface RelationshipEdgeParams {
52
+ leftNode: SNode;
53
+ rightNode: SNode;
54
+ arrow: string;
55
+ leftPatterns: readonly string[];
56
+ rightPatterns: readonly string[];
57
+ type: string | undefined;
58
+ astNode: Relationship;
59
+ }
60
+
61
+ /**
62
+ * Generates context map diagrams in the **DDD community notation** style.
63
+ *
64
+ * Bounded contexts are rendered as ellipses. Relationships are rendered as edges
65
+ * with U/D (upstream/downstream) annotations and integration pattern labels at
66
+ * each end, matching the notation used in Eric Evans' "Domain-Driven Design" and
67
+ * Vaughn Vernon's "Implementing Domain-Driven Design".
68
+ *
69
+ * Edge label convention:
70
+ * - Position 0.1 (near source): `U [OHS, PL]` or `D [ACL]`
71
+ * - Position 0.9 (near target): `D [CF]` or `U [OHS]`
72
+ * - Position 0.5 (center): relationship type (e.g., "Customer/Supplier")
73
+ */
74
+ export class DomainLangContextMapDiagramGenerator extends LangiumDiagramGenerator {
75
+ protected override generateRoot(args: GeneratorContext): SModelRoot {
76
+ const document = args.document as LangiumDocument<Model>;
77
+ const query = fromDocument(document);
78
+ const selection = this.getSelection(args);
79
+ const contextMaps = query.contextMaps().toArray();
80
+
81
+ const selectedMap = this.selectContextMap(contextMaps, query, selection);
82
+ if (!selectedMap) {
83
+ return {
84
+ type: 'graph',
85
+ id: args.idCache.uniqueId('context-map:empty'),
86
+ children: [],
87
+ } satisfies SGraph;
88
+ }
89
+
90
+ // Fetch relationships first so the BBoM pre-pass can identify which BCs
91
+ // need the cloud node shape before any nodes are created.
92
+ const relationships = query.relationships()
93
+ .where((relationship) => relationship.source === 'ContextMap' && relationship.astNode.$container === selectedMap)
94
+ .toArray();
95
+
96
+ // BBoM pre-pass: collect the node keys of every bounded context that
97
+ // appears on a side annotated with the BigBallOfMud pattern. These get
98
+ // the `node:bbom` Sprotty type so the webview renders them as clouds.
99
+ const bboMNodeKeys = new Set<string>();
100
+ for (const rel of relationships) {
101
+ if (rel.leftPatterns.some(isBBoMPattern)) {
102
+ bboMNodeKeys.add(this.getNodeKey(query, rel.left));
103
+ }
104
+ if (rel.rightPatterns.some(isBBoMPattern)) {
105
+ bboMNodeKeys.add(this.getNodeKey(query, rel.right));
106
+ }
107
+ }
108
+
109
+ const nodeMap = new Map<string, SNode>();
110
+ this.collectContextMapNodes(selectedMap, query, nodeMap, bboMNodeKeys, args);
111
+
112
+ for (const relationship of relationships) {
113
+ this.ensureNode(nodeMap, query, relationship.left, bboMNodeKeys, args);
114
+ this.ensureNode(nodeMap, query, relationship.right, bboMNodeKeys, args);
115
+ }
116
+
117
+ const edges = relationships.flatMap((relationship) => {
118
+ const leftKey = this.getNodeKey(query, relationship.left);
119
+ const rightKey = this.getNodeKey(query, relationship.right);
120
+ const leftNode = nodeMap.get(leftKey);
121
+ const rightNode = nodeMap.get(rightKey);
122
+
123
+ if (!leftNode || !rightNode) {
124
+ return [];
125
+ }
126
+
127
+ return this.createRelationshipEdge({
128
+ leftNode,
129
+ rightNode,
130
+ arrow: relationship.arrow,
131
+ leftPatterns: relationship.leftPatterns,
132
+ rightPatterns: relationship.rightPatterns,
133
+ type: relationship.type,
134
+ astNode: relationship.astNode,
135
+ }, args);
136
+ });
137
+
138
+ return {
139
+ type: 'graph',
140
+ id: args.idCache.uniqueId(`context-map:${selectedMap.name}`, selectedMap),
141
+ children: [...nodeMap.values(), ...edges],
142
+ } satisfies SGraph;
143
+ }
144
+
145
+ // ── Relationship edges (DDD community notation) ──
146
+
147
+ /**
148
+ * Creates an edge with DDD community notation labels.
149
+ *
150
+ * For `->`: left = Upstream (U), right = Downstream (D)
151
+ * For `<-`: left = Downstream (D), right = Upstream (U)
152
+ * For `<->`: Partnership (bidirectional)
153
+ * For `><`: Separate Ways
154
+ *
155
+ * U/D labels are rendered as DDD notation badges with optional
156
+ * pattern boxes (e.g., `U [OHS, PL]`).
157
+ */
158
+ private createRelationshipEdge(
159
+ params: RelationshipEdgeParams,
160
+ args: GeneratorContext
161
+ ): SEdge[] {
162
+ const { leftNode, rightNode, arrow, leftPatterns, rightPatterns, type, astNode } = params;
163
+ // Determine source/target based on arrow direction
164
+ const sourceId = arrow === '<-' ? rightNode.id : leftNode.id;
165
+ const targetId = arrow === '<-' ? leftNode.id : rightNode.id;
166
+
167
+ const edgeId = args.idCache.uniqueId(
168
+ `edge:${sourceId}:${targetId}`,
169
+ astNode
170
+ );
171
+
172
+ const children: SModelElement[] = [];
173
+
174
+ if (arrow === '<->') {
175
+ // Partnership / bidirectional — no U/D roles
176
+ this.addUDBadge(children, edgeId, 'source', leftPatterns, undefined, args);
177
+ this.addUDBadge(children, edgeId, 'target', rightPatterns, undefined, args);
178
+ } else if (arrow === '><') {
179
+ // Separate Ways — no U/D, no patterns
180
+ } else {
181
+ // Unidirectional: -> or <-
182
+ const sourcePatterns = arrow === '<-' ? rightPatterns : leftPatterns;
183
+ const targetPatterns = arrow === '<-' ? leftPatterns : rightPatterns;
184
+ this.addUDBadge(children, edgeId, 'source', sourcePatterns, 'U', args);
185
+ this.addUDBadge(children, edgeId, 'target', targetPatterns, 'D', args);
186
+ }
187
+
188
+ // Center label: relationship type
189
+ const centerLabel = this.formatRelationshipType(type, arrow);
190
+ if (centerLabel) {
191
+ children.push({
192
+ type: 'label:edge',
193
+ id: args.idCache.uniqueId(`${edgeId}:type`),
194
+ text: centerLabel,
195
+ edgePlacement: {
196
+ side: 'on',
197
+ position: 0.5,
198
+ rotate: false,
199
+ offset: 10,
200
+ },
201
+ } as unknown as SModelElement);
202
+ }
203
+
204
+ let edgeCssClasses: string[] | undefined;
205
+ if (arrow === '><') {
206
+ edgeCssClasses = ['separate-ways'];
207
+ } else if (arrow === '<->') {
208
+ edgeCssClasses = ['partnership'];
209
+ }
210
+
211
+ const edge: SEdge = {
212
+ type: 'edge',
213
+ id: edgeId,
214
+ sourceId,
215
+ targetId,
216
+ cssClasses: edgeCssClasses,
217
+ children: children.length > 0 ? children : undefined,
218
+ };
219
+
220
+ this.traceProvider.trace(edge as SModelElement, astNode as unknown as import('langium').AstNode);
221
+ return [edge];
222
+ }
223
+
224
+ /**
225
+ * Adds a U/D badge label at the source or target end of an edge.
226
+ *
227
+ * Patterns are normalised to their short abbreviations (e.g. `OpenHostService` →
228
+ * `OHS`) and `BBoM`/`BigBallOfMud` is excluded — BBoM is surfaced visually as a
229
+ * cloud node shape rather than a text annotation.
230
+ *
231
+ * Badge text format: `ROLE|PATTERNS` (e.g. `U|OHS, PL` or `D|ACL`).
232
+ * The webview `UDBadgeLabelView` renders this as a bordered box.
233
+ */
234
+ private addUDBadge(
235
+ children: SModelElement[],
236
+ edgeId: string,
237
+ placement: 'source' | 'target',
238
+ patterns: readonly string[],
239
+ role: 'U' | 'D' | undefined,
240
+ args: GeneratorContext
241
+ ): void {
242
+ // Normalise pattern names and strip BBoM (shown on node, not in badge)
243
+ const badgePatterns = patterns
244
+ .filter((p) => !isBBoMPattern(p))
245
+ .map(normalizePattern);
246
+
247
+ if (!role && badgePatterns.length === 0) {
248
+ return;
249
+ }
250
+
251
+ // Encode as ROLE|PATTERNS for UDBadgeLabelView parsing
252
+ const rolePart = role ?? '';
253
+ const patternPart = badgePatterns.length > 0 ? badgePatterns.join(', ') : '';
254
+ const badgeText = `${rolePart}|${patternPart}`;
255
+
256
+ children.push({
257
+ type: 'label:ud-badge',
258
+ id: args.idCache.uniqueId(`${edgeId}:${placement}`),
259
+ text: badgeText,
260
+ edgePlacement: {
261
+ side: 'on',
262
+ position: placement === 'source' ? 0.1 : 0.9,
263
+ rotate: false,
264
+ offset: 0,
265
+ },
266
+ } as unknown as SModelElement);
267
+ }
268
+
269
+ /**
270
+ * Formats the relationship type for the center edge label.
271
+ *
272
+ * Maps DomainLang keywords to DDD community notation display names:
273
+ * CustomerSupplier → Customer/Supplier
274
+ * SharedKernel → Shared Kernel
275
+ * UpstreamDownstream → Upstream/Downstream
276
+ * Partnership → Partnership
277
+ *
278
+ * For `<->` without explicit type, defaults to "Partnership".
279
+ * For `><`, defaults to "Separate Ways".
280
+ */
281
+ private formatRelationshipType(type: string | undefined, arrow: string): string | undefined {
282
+ if (type) {
283
+ return this.displayRelationshipType(type);
284
+ }
285
+ if (arrow === '<->') {
286
+ return 'Partnership';
287
+ }
288
+ if (arrow === '><') {
289
+ return 'Separate Ways';
290
+ }
291
+ return undefined;
292
+ }
293
+
294
+ private displayRelationshipType(type: string): string {
295
+ switch (type) {
296
+ case 'CustomerSupplier': return 'Customer/Supplier';
297
+ case 'SharedKernel': return 'Shared Kernel';
298
+ case 'UpstreamDownstream': return 'Upstream/Downstream';
299
+ default: return type;
300
+ }
301
+ }
302
+
303
+ // ── Node generation ──
304
+
305
+ private collectContextMapNodes(
306
+ selectedMap: ContextMap,
307
+ query: Query,
308
+ nodeMap: Map<string, SNode>,
309
+ bboMNodeKeys: ReadonlySet<string>,
310
+ args: GeneratorContext
311
+ ): void {
312
+ for (const boundedContextRef of selectedMap.boundedContexts) {
313
+ for (const item of boundedContextRef.items) {
314
+ this.ensureNodeForContextMapItem(item, query, nodeMap, bboMNodeKeys, args);
315
+ }
316
+
317
+ if (boundedContextRef.items.length === 0 && boundedContextRef.$refText) {
318
+ this.ensureUnresolvedNode(nodeMap, boundedContextRef.$refText, args);
319
+ }
320
+ }
321
+ }
322
+
323
+ private ensureNodeForContextMapItem(
324
+ item: { ref?: BoundedContext; $refText?: string },
325
+ query: Query,
326
+ nodeMap: Map<string, SNode>,
327
+ bboMNodeKeys: ReadonlySet<string>,
328
+ args: GeneratorContext
329
+ ): void {
330
+ const boundedContext = item.ref;
331
+ if (!boundedContext) {
332
+ if (item.$refText) {
333
+ this.ensureUnresolvedNode(nodeMap, item.$refText, args);
334
+ }
335
+ return;
336
+ }
337
+
338
+ const nodeKey = this.getNodeKey(query, boundedContext);
339
+ if (nodeMap.has(nodeKey)) {
340
+ return;
341
+ }
342
+
343
+ const nodeId = args.idCache.uniqueId(`node:${nodeKey}`, boundedContext);
344
+ const node = this.createNode(nodeId, boundedContext.name, bboMNodeKeys.has(nodeKey));
345
+ this.traceProvider.trace(node as SModelElement, boundedContext);
346
+ nodeMap.set(nodeKey, node);
347
+ }
348
+
349
+ private createNode(id: string, label: string, isBBoM = false): SNode {
350
+ return {
351
+ type: isBBoM ? 'node:bbom' : 'node',
352
+ id,
353
+ position: { x: 0, y: 0 },
354
+ size: {
355
+ width: NODE_WIDTH,
356
+ height: NODE_HEIGHT,
357
+ },
358
+ layout: 'vbox',
359
+ layoutOptions: {
360
+ hAlign: 'center',
361
+ vAlign: 'center',
362
+ resizeContainer: false,
363
+ paddingTop: 10,
364
+ paddingBottom: 10,
365
+ paddingLeft: 20,
366
+ paddingRight: 20,
367
+ },
368
+ children: [this.createNodeLabel(id, label)],
369
+ };
370
+ }
371
+
372
+ private createNodeLabel(nodeId: string, label: string): SModelElement {
373
+ return {
374
+ type: 'label',
375
+ id: `${nodeId}:label`,
376
+ text: label,
377
+ } as unknown as SModelElement;
378
+ }
379
+
380
+ private ensureNode(
381
+ nodeMap: Map<string, SNode>,
382
+ query: Query,
383
+ boundedContext: BoundedContext,
384
+ bboMNodeKeys: ReadonlySet<string>,
385
+ args: GeneratorContext
386
+ ): void {
387
+ const nodeKey = this.getNodeKey(query, boundedContext);
388
+ if (nodeMap.has(nodeKey)) {
389
+ return;
390
+ }
391
+
392
+ const nodeId = args.idCache.uniqueId(`node:${nodeKey}`, boundedContext);
393
+ const node = this.createNode(nodeId, boundedContext.name, bboMNodeKeys.has(nodeKey));
394
+ this.traceProvider.trace(node as SModelElement, boundedContext);
395
+ nodeMap.set(nodeKey, node);
396
+ }
397
+
398
+ private ensureUnresolvedNode(nodeMap: Map<string, SNode>, label: string, args: GeneratorContext): void {
399
+ const key = `unresolved:${label}`;
400
+ if (nodeMap.has(key)) {
401
+ return;
402
+ }
403
+
404
+ const nodeId = args.idCache.uniqueId(`node:${key}`);
405
+ nodeMap.set(key, this.createNode(nodeId, label));
406
+ }
407
+
408
+ private getNodeKey(query: Query, boundedContext: BoundedContext): string {
409
+ const fqn = query.fqn(boundedContext);
410
+ return fqn ?? boundedContext.name;
411
+ }
412
+
413
+ // ── Selection helpers ──
414
+
415
+ private getSelection(args: GeneratorContext): DiagramSelection {
416
+ const options = args.options;
417
+ if (typeof options !== 'object' || options === null) {
418
+ return {};
419
+ }
420
+
421
+ const selectedContextMapFqn = this.getStringOption(options, 'selectedContextMapFqn');
422
+ const selectedContextMapName = this.getStringOption(options, 'selectedContextMapName');
423
+ return {
424
+ selectedContextMapFqn,
425
+ selectedContextMapName,
426
+ };
427
+ }
428
+
429
+ private getStringOption(options: object, key: string): string | undefined {
430
+ const value = Reflect.get(options, key);
431
+ return typeof value === 'string' && value.trim().length > 0 ? value.trim() : undefined;
432
+ }
433
+
434
+ private selectContextMap(contextMaps: readonly ContextMap[], query: Query, selection: DiagramSelection): ContextMap | undefined {
435
+ if (selection.selectedContextMapFqn) {
436
+ const byFqn = contextMaps.find((contextMap) => query.fqn(contextMap) === selection.selectedContextMapFqn);
437
+ if (byFqn) {
438
+ return byFqn;
439
+ }
440
+ }
441
+
442
+ if (selection.selectedContextMapName) {
443
+ const byName = contextMaps.find((contextMap) => contextMap.name === selection.selectedContextMapName);
444
+ if (byName) {
445
+ return byName;
446
+ }
447
+ }
448
+
449
+ return contextMaps[0];
450
+ }
451
+ }