@likec4/core 1.32.2 → 1.34.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 (113) hide show
  1. package/dist/builder/index.d.mts +6 -4
  2. package/dist/builder/index.mjs +45 -13
  3. package/dist/compute-view/index.d.mts +6 -4
  4. package/dist/compute-view/index.mjs +33 -10
  5. package/dist/compute-view/relationships-view/index.d.mts +6 -4
  6. package/dist/compute-view/relationships-view/index.mjs +6 -3
  7. package/dist/index.d.mts +9 -138
  8. package/dist/index.mjs +31 -3712
  9. package/dist/model/connection/deployment/index.d.mts +10 -0
  10. package/dist/model/connection/deployment/index.mjs +18 -0
  11. package/dist/model/connection/index.d.mts +70 -0
  12. package/dist/model/connection/index.mjs +23 -0
  13. package/dist/model/connection/model/index.d.mts +10 -0
  14. package/dist/model/connection/model/index.mjs +11 -0
  15. package/dist/model/index.d.mts +14 -256
  16. package/dist/model/index.mjs +27 -5
  17. package/dist/shared/{core.cbA9VZ02.mjs → core.4SpVCM9m.mjs} +31 -1073
  18. package/dist/shared/{core.BuO4ncfY.d.mts → core.668kXpZq.d.mts} +42 -52
  19. package/dist/shared/core.8KM0D6va.mjs +33 -0
  20. package/dist/shared/core.B0oEIXqd.mjs +47 -0
  21. package/dist/shared/core.BH9nN-_I.mjs +22 -0
  22. package/dist/shared/core.BMCb0wJI.mjs +177 -0
  23. package/dist/shared/core.BTnf14gD.mjs +331 -0
  24. package/dist/shared/core.BgvIuGGU.mjs +3 -0
  25. package/dist/shared/core.BoyJPEen.mjs +21 -0
  26. package/dist/shared/{core.CUYDgv2-.mjs → core.Br7Fab9l.mjs} +12 -15
  27. package/dist/shared/{core.BrCnZFTn.mjs → core.Btl47GOn.mjs} +3 -3
  28. package/dist/shared/core.ByrmCl9I.mjs +5 -0
  29. package/dist/shared/core.C80Z37Eu.mjs +29 -0
  30. package/dist/shared/{core.Pf5I9o0e.d.mts → core.CF82MWyh.d.mts} +1 -1
  31. package/dist/shared/core.CJSFKrYf.d.mts +83 -0
  32. package/dist/shared/{core.rmvsy0n3.mjs → core.C_C-3c1S.mjs} +5 -198
  33. package/dist/shared/{core.DoK86JEe.mjs → core.CpwrZi3D.mjs} +2 -73
  34. package/dist/shared/{core.CpXlRyE5.mjs → core.CtKXPqN_.mjs} +5 -36
  35. package/dist/shared/core.CxGKeL-L.mjs +144 -0
  36. package/dist/shared/core.CzdwsPmY.d.mts +69 -0
  37. package/dist/shared/core.D3xEWj5B.d.mts +41 -0
  38. package/dist/shared/{core.Cy9smucx.mjs → core.D4npX2q8.mjs} +1 -3
  39. package/dist/shared/core.D56nCp7e.mjs +168 -0
  40. package/dist/shared/core.D5qVzkws.mjs +724 -0
  41. package/dist/shared/{core.CBxTtXMi.d.mts → core.DAj3LuFH.d.mts} +58 -57
  42. package/dist/shared/{core.Bk7wEZFG.mjs → core.DXRAwwDB.mjs} +3 -2
  43. package/dist/shared/core.DcS-0zys.mjs +10 -0
  44. package/dist/shared/core.Di7__sMg.d.mts +87 -0
  45. package/dist/shared/{core.DaAyklhe.d.mts → core.DrS4Bf4y.d.mts} +31 -22
  46. package/dist/shared/core.DsMrjY2q.mjs +34 -0
  47. package/dist/shared/core.DuSLYTG6.d.mts +57 -0
  48. package/dist/shared/{core.Bdz6fBF1.d.mts → core.IWLie-Ma.d.mts} +92 -81
  49. package/dist/shared/{core.CBpKAlhj.mjs → core.PqNe5WxQ.mjs} +96 -56
  50. package/dist/shared/core.XptQjhMA.mjs +1295 -0
  51. package/dist/shared/core.zLlww-07.mjs +3 -0
  52. package/dist/theme/index.d.mts +134 -0
  53. package/dist/theme/index.mjs +3709 -0
  54. package/dist/types/_aux.d.mts +4 -0
  55. package/dist/types/index.d.mts +9 -5
  56. package/dist/types/index.mjs +17 -146
  57. package/dist/utils/index.d.mts +15 -100
  58. package/dist/utils/index.mjs +25 -1315
  59. package/dist/utils/iterable/index.d.mts +100 -0
  60. package/dist/utils/iterable/index.mjs +24 -0
  61. package/package.json +29 -13
  62. package/src/builder/Builder.ts +13 -4
  63. package/src/builder/__snapshots__/Builder-style1.spec.ts.snap +0 -13
  64. package/src/builder/__snapshots__/Builder-style2.compute-model.json5 +2 -6
  65. package/src/builder/__snapshots__/Builder-style2.spec.ts.snap +0 -7
  66. package/src/compute-view/deployment-view/__test__/fixture.ts +15 -5
  67. package/src/compute-view/deployment-view/utils.ts +13 -13
  68. package/src/compute-view/dynamic-view/compute.ts +2 -1
  69. package/src/compute-view/element-view/__test__/__snapshots__/legacy.spec.ts.snap +2 -2
  70. package/src/compute-view/relationships-view/layout.ts +1 -1
  71. package/src/compute-view/utils/applyCustomElementProperties.ts +8 -0
  72. package/src/compute-view/utils/applyCustomRelationProperties.ts +2 -0
  73. package/src/compute-view/utils/buildComputedNodes.ts +4 -3
  74. package/src/compute-view/utils/merge-props-from-relationships.ts +6 -5
  75. package/src/compute-view/utils/view-hash.ts +24 -3
  76. package/src/model/DeploymentElementModel.ts +21 -17
  77. package/src/model/DeploymentModel.ts +1 -1
  78. package/src/model/ElementModel.ts +15 -5
  79. package/src/model/LikeC4Model.ts +1 -1
  80. package/src/model/RelationModel.ts +20 -17
  81. package/src/model/index.ts +2 -0
  82. package/src/model/types.ts +2 -1
  83. package/src/model/view/EdgeModel.ts +4 -3
  84. package/src/model/view/LikeC4ViewModel.ts +6 -1
  85. package/src/model/view/NodeModel.ts +5 -3
  86. package/src/theme/index.ts +12 -5
  87. package/src/types/RichText.ts +200 -0
  88. package/src/types/expression-model.ts +2 -2
  89. package/src/types/expression.ts +2 -2
  90. package/src/types/fqnRef.ts +2 -2
  91. package/src/types/global.ts +1 -1
  92. package/src/types/index.ts +4 -2
  93. package/src/types/model-data.ts +2 -2
  94. package/src/types/model-deployment.ts +6 -5
  95. package/src/types/model-dump.ts +1 -1
  96. package/src/types/model-logical.ts +5 -5
  97. package/src/types/model-spec.ts +2 -2
  98. package/src/types/operators.ts +2 -2
  99. package/src/types/scalar.ts +47 -2
  100. package/src/types/view-common.ts +3 -3
  101. package/src/types/view-computed.ts +4 -6
  102. package/src/types/view-layouted.ts +11 -2
  103. package/src/types/view-parsed.deployment.ts +1 -1
  104. package/src/types/view-parsed.dynamic.ts +2 -2
  105. package/src/types/view-parsed.element.ts +2 -2
  106. package/src/types/view.ts +2 -2
  107. package/src/utils/index.ts +4 -9
  108. package/src/utils/markdown/index.ts +2 -0
  109. package/src/utils/markdown/to-html.ts +32 -0
  110. package/src/utils/markdown/to-text.ts +14 -0
  111. package/dist/types/aux.d.mts +0 -3
  112. /package/dist/types/{aux.mjs → _aux.mjs} +0 -0
  113. /package/src/types/{aux.ts → _aux.ts} +0 -0
@@ -1,25 +1,25 @@
1
- import { C, f as s$1, u as hierarchyLevel, a as isAncestor, k as commonAncestor, v as sortNaturalByFqn, s as sortParentsFirst, D as DefaultMap, p as parentFqn, l as ancestorsFqn, b as ifilter, m as compareNatural, i as isDescendantOf, w as isString, d as isSameHierarchy } from './core.rmvsy0n3.mjs';
2
- import { E as splitGlobalFqn, D as DefaultElementShape, a as DefaultThemeColor, l as DefaultShapeSize, c as n$1, g as DefaultLineStyle, F as FqnRef, k as isDeploymentNode, h as DefaultRelationshipColor, I as extractStep, d as isStepEdgeId, e as isGroupElementKind, _ as _type, b as _stage, j as isOnStage, w as whereOperatorAsPredicate, C as isGlobalFqn, B as GlobalFqn, o as o$2 } from './core.CUYDgv2-.mjs';
3
- import { f as memoizeProp, e as ihead, a as intersection, d as difference, u as union, g as getOrCreate, c as ifind, m as m$2, k as stringHash, j as equals, b as isome } from './core.DoK86JEe.mjs';
4
1
  import { u as u$1 } from './core.DbRvwARP.mjs';
5
- import { n as nonNullable, i as invariant } from './core.Cy9smucx.mjs';
6
-
7
- function y(t,i){let a=i.length-t.length;if(a===1){let[n,...r]=i;return C(n,{lazy:t,lazyArgs:r})}if(a===0){let n={lazy:t,lazyArgs:i};return Object.assign(e=>C(e,n),n)}throw new Error("Wrong number of arguments")}
8
-
9
- function i(...e){return y(a$1,e)}function a$1(){let e=new Set;return t=>e.has(t)?s$1:(e.add(t),{done:false,hasNext:true,next:t})}
2
+ import { p } from './core.BTnf14gD.mjs';
3
+ import { m as m$2 } from './core.ByrmCl9I.mjs';
4
+ import { g as hierarchyLevel, n as nameFromFqn, i as isAncestor, d as commonAncestor, l as sortNaturalByFqn, m as sortParentsFirst, p as parentFqn, b as ancestorsFqn, C, c as compareNatural } from './core.C_C-3c1S.mjs';
5
+ import { g as getOrCreate } from './core.DcS-0zys.mjs';
6
+ import { i, n as n$2, e as DeploymentNodeModel, c as DeployedInstanceModel, N as NestedElementOfDeployedInstanceModel, g as DeploymentRelationModel } from './core.D5qVzkws.mjs';
7
+ import { D as DefaultMap } from './core.BMCb0wJI.mjs';
8
+ import { a as nonNullable, i as invariant } from './core.D4npX2q8.mjs';
9
+ import { s as splitGlobalFqn, F as FqnRef, b as isDeploymentNode, r as extractStep, q as isStepEdgeId, m as isGroupElementKind, a as _type, _ as _stage, i as isOnStage, w as whereOperatorAsPredicate, o as isGlobalFqn, n as GlobalFqn } from './core.Br7Fab9l.mjs';
10
+ import { m as memoizeProp } from './core.B0oEIXqd.mjs';
11
+ import { i as ifilter } from './core.BH9nN-_I.mjs';
12
+ import { a as DefaultElementShape, D as DefaultThemeColor, R as RichText, b as DefaultShapeSize, n as n$1, g as DefaultRelationshipColor, e as DefaultLineStyle } from './core.D56nCp7e.mjs';
13
+ import { a as ihead, i as ifind } from './core.DsMrjY2q.mjs';
10
14
 
11
15
  function r(...t){return u$1(Object.values,t)}
12
16
 
13
17
  var T={asc:(r,n)=>r>n,desc:(r,n)=>r<n};function s(r,n){let[e,...o]=n;if(!m$1(e)){let t=u(...o);return r(e,t)}let a=u(e,...o);return t=>r(t,a)}function u(r,n,...e){let o=typeof r=="function"?r:r[0],a=typeof r=="function"?"asc":r[1],{[a]:t}=T,i=n===void 0?void 0:u(n,...e);return (y,c)=>{let p=o(y),l=o(c);return t(p,l)?1:t(l,p)?-1:i?.(y,c)??0}}function m$1(r){if(d(r))return true;if(typeof r!="object"||!Array.isArray(r))return false;let[n,e,...o]=r;return d(n)&&typeof e=="string"&&e in T&&o.length===0}var d=r=>typeof r=="function"&&r.length===1;
14
18
 
15
- function m(...r){return u$1(o$1,r)}function o$1(r,t){let e=[...r];return e.sort(t),e}
19
+ function m(...r){return u$1(o,r)}function o(r,t){let e=[...r];return e.sort(t),e}
16
20
 
17
21
  function a(...r){return s(n,r)}var n=(r,t)=>[...r].sort(t);
18
22
 
19
- function p(...e){return u$1(t$2,e)}var t$2=(e,o)=>e[o];
20
-
21
- function t$1(...n){return u$1(o,n)}var o=n=>n.length===1?n[0]:void 0;
22
-
23
23
  function t(...r){return u$1(Object.entries,r)}
24
24
 
25
25
  class ElementModel {
@@ -44,6 +44,9 @@ class ElementModel {
44
44
  _literalId;
45
45
  hierarchyLevel;
46
46
  imported;
47
+ get name() {
48
+ return nameFromFqn(this.id);
49
+ }
47
50
  get parent() {
48
51
  return this.$model.parent(this);
49
52
  }
@@ -75,7 +78,7 @@ class ElementModel {
75
78
  return this.$element.title;
76
79
  }
77
80
  get description() {
78
- return this.$element.description ?? null;
81
+ return RichText.memoize(this, this.$element.description);
79
82
  }
80
83
  get technology() {
81
84
  return this.$element.technology ?? null;
@@ -228,6 +231,9 @@ class ElementModel {
228
231
  deployments() {
229
232
  return this.$model.deployment.instancesOf(this);
230
233
  }
234
+ hasMetadata() {
235
+ return !!this.$element.metadata && !n$2(this.$element.metadata);
236
+ }
231
237
  getMetadata(field) {
232
238
  if (field) {
233
239
  return this.$element.metadata?.[field];
@@ -242,525 +248,6 @@ class ElementModel {
242
248
  }
243
249
  }
244
250
 
245
- class AbstractDeploymentElementModel {
246
- get style() {
247
- return {
248
- shape: DefaultElementShape,
249
- color: DefaultThemeColor,
250
- size: DefaultShapeSize,
251
- ...this.$node.style
252
- };
253
- }
254
- get shape() {
255
- return this.$node.style?.shape ?? DefaultElementShape;
256
- }
257
- get color() {
258
- return this.$node.style?.color ?? DefaultThemeColor;
259
- }
260
- get description() {
261
- return this.$node.description ?? null;
262
- }
263
- get technology() {
264
- return this.$node.technology ?? null;
265
- }
266
- get links() {
267
- return this.$node.links ?? [];
268
- }
269
- /**
270
- * Get all ancestor elements (i.e. parent, parent’s parent, etc.)
271
- * (from closest to root)
272
- */
273
- ancestors() {
274
- return this.$model.ancestors(this);
275
- }
276
- /**
277
- * Returns the common ancestor of this element and another element.
278
- */
279
- commonAncestor(another) {
280
- const common = commonAncestor(this.id, another.id);
281
- return common ? this.$model.node(common) : null;
282
- }
283
- /**
284
- * Get all sibling (i.e. same parent)
285
- */
286
- siblings() {
287
- return this.$model.siblings(this);
288
- }
289
- /**
290
- * Check if the element is a sibling of another element
291
- */
292
- isSibling(other) {
293
- return this.parent === other.parent;
294
- }
295
- /**
296
- * Resolve siblings of the element and its ancestors
297
- * (from closest to root)
298
- */
299
- *ascendingSiblings() {
300
- yield* this.siblings();
301
- for (const ancestor of this.ancestors()) {
302
- yield* ancestor.siblings();
303
- }
304
- return;
305
- }
306
- /**
307
- * Resolve siblings of the element and its ancestors
308
- * (from root to closest)
309
- */
310
- *descendingSiblings() {
311
- for (const ancestor of [...this.ancestors()].reverse()) {
312
- yield* ancestor.siblings();
313
- }
314
- yield* this.siblings();
315
- return;
316
- }
317
- incoming(filter = "all") {
318
- return this.$model.incoming(this, filter);
319
- }
320
- outgoing(filter = "all") {
321
- return this.$model.outgoing(this, filter);
322
- }
323
- *incomers(filter = "all") {
324
- const unique2 = /* @__PURE__ */ new Set();
325
- for (const r of this.incoming(filter)) {
326
- if (unique2.has(r.source.id)) {
327
- continue;
328
- }
329
- unique2.add(r.source.id);
330
- yield r.source;
331
- }
332
- return;
333
- }
334
- *outgoers(filter = "all") {
335
- const unique2 = /* @__PURE__ */ new Set();
336
- for (const r of this.outgoing(filter)) {
337
- if (unique2.has(r.target.id)) {
338
- continue;
339
- }
340
- unique2.add(r.target.id);
341
- yield r.target;
342
- }
343
- return;
344
- }
345
- /**
346
- * Iterate over all views that include this deployment element.
347
- */
348
- *views() {
349
- for (const view of this.$model.views()) {
350
- if (view._type !== "deployment") {
351
- continue;
352
- }
353
- if (view.includesDeployment(this.id)) {
354
- yield view;
355
- }
356
- }
357
- }
358
- // type guard
359
- isDeploymentNode() {
360
- return false;
361
- }
362
- // type guard
363
- isInstance() {
364
- return false;
365
- }
366
- get allOutgoing() {
367
- return memoizeProp(this, Symbol.for("allOutgoing"), () => RelationshipsAccum.from(
368
- new Set(this.outgoingModelRelationships()),
369
- new Set(this.outgoing())
370
- ));
371
- }
372
- get allIncoming() {
373
- return memoizeProp(this, Symbol.for("allIncoming"), () => RelationshipsAccum.from(
374
- new Set(this.incomingModelRelationships()),
375
- new Set(this.incoming())
376
- ));
377
- }
378
- getMetadata(field) {
379
- if (field) {
380
- return this.$node.metadata?.[field];
381
- }
382
- return this.$node.metadata ?? {};
383
- }
384
- /**
385
- * Checks if the deployment element has the given tag.
386
- */
387
- isTagged(tag) {
388
- return this.tags.includes(tag);
389
- }
390
- }
391
- class DeploymentNodeModel extends AbstractDeploymentElementModel {
392
- constructor($model, $node) {
393
- super();
394
- this.$model = $model;
395
- this.$node = $node;
396
- this.id = $node.id;
397
- this._literalId = $node.id;
398
- this.title = $node.title;
399
- this.hierarchyLevel = hierarchyLevel($node.id);
400
- }
401
- id;
402
- _literalId;
403
- title;
404
- hierarchyLevel;
405
- get parent() {
406
- return this.$model.parent(this);
407
- }
408
- get kind() {
409
- return this.$node.kind;
410
- }
411
- get tags() {
412
- return memoizeProp(this, Symbol.for("tags"), () => {
413
- return i([
414
- ...this.$node.tags ?? [],
415
- ...this.$model.$model.specification.deployments[this.kind]?.tags ?? []
416
- ]);
417
- });
418
- }
419
- children() {
420
- return this.$model.children(this);
421
- }
422
- descendants(sort = "desc") {
423
- return this.$model.descendants(this, sort);
424
- }
425
- isDeploymentNode() {
426
- return true;
427
- }
428
- /**
429
- * Iterate over all instances nested in this deployment node.
430
- */
431
- *instances() {
432
- for (const nested of this.descendants("desc")) {
433
- if (nested.isInstance()) {
434
- yield nested;
435
- }
436
- }
437
- return;
438
- }
439
- /**
440
- * Returns deployed instance inside this deployment node
441
- * if only there are no more instances
442
- */
443
- onlyOneInstance() {
444
- const children = this.children();
445
- if (children.size !== 1) {
446
- return null;
447
- }
448
- const child = t$1([...children]);
449
- return child?.isInstance() ? child : null;
450
- }
451
- /**
452
- * Cached result of relationships from instances
453
- */
454
- _relationshipsFromInstances = null;
455
- relationshipsFromInstances() {
456
- if (this._relationshipsFromInstances) {
457
- return this._relationshipsFromInstances;
458
- }
459
- const {
460
- outgoing,
461
- incoming
462
- } = this._relationshipsFromInstances = {
463
- outgoing: /* @__PURE__ */ new Set(),
464
- incoming: /* @__PURE__ */ new Set()
465
- };
466
- for (const instance of this.instances()) {
467
- for (const r of instance.element.outgoing()) {
468
- outgoing.add(r);
469
- }
470
- for (const r of instance.element.incoming()) {
471
- incoming.add(r);
472
- }
473
- }
474
- return this._relationshipsFromInstances;
475
- }
476
- /**
477
- * We return only relationships that are not already present in nested instances
478
- */
479
- outgoingModelRelationships() {
480
- return this.relationshipsFromInstances().outgoing.values();
481
- }
482
- /**
483
- * We return only relationships that are not already present in nested instances
484
- */
485
- incomingModelRelationships() {
486
- return this.relationshipsFromInstances().incoming.values();
487
- }
488
- /**
489
- * Returns an iterator of relationships between nested instances
490
- */
491
- internalModelRelationships() {
492
- const {
493
- outgoing,
494
- incoming
495
- } = this.relationshipsFromInstances();
496
- return intersection(incoming, outgoing);
497
- }
498
- }
499
- class DeployedInstanceModel extends AbstractDeploymentElementModel {
500
- constructor($model, $instance, element) {
501
- super();
502
- this.$model = $model;
503
- this.$instance = $instance;
504
- this.element = element;
505
- this.id = $instance.id;
506
- this._literalId = $instance.id;
507
- this.title = $instance.title ?? element.title;
508
- this.hierarchyLevel = hierarchyLevel($instance.id);
509
- }
510
- id;
511
- _literalId;
512
- title;
513
- hierarchyLevel;
514
- get $node() {
515
- return this.$instance;
516
- }
517
- get parent() {
518
- return nonNullable(this.$model.parent(this), `Parent of ${this.id} not found`);
519
- }
520
- get style() {
521
- const { icon, style } = this.element.$element;
522
- return {
523
- shape: this.element.shape,
524
- color: this.element.color,
525
- size: DefaultShapeSize,
526
- ...icon && { icon },
527
- ...style,
528
- ...this.$instance.style
529
- };
530
- }
531
- get shape() {
532
- return this.$instance.style?.shape ?? this.element.shape;
533
- }
534
- get color() {
535
- return this.$instance.style?.color ?? this.element.color;
536
- }
537
- get tags() {
538
- return memoizeProp(this, Symbol.for("tags"), () => {
539
- return i([
540
- ...this.$instance.tags ?? [],
541
- ...this.element.tags
542
- ]);
543
- });
544
- }
545
- get kind() {
546
- return this.element.kind;
547
- }
548
- get description() {
549
- return this.$instance.description ?? this.element.description;
550
- }
551
- get technology() {
552
- return this.$instance.technology ?? this.element.technology;
553
- }
554
- get links() {
555
- return this.$instance.links ?? this.element.links;
556
- }
557
- isInstance() {
558
- return true;
559
- }
560
- outgoingModelRelationships() {
561
- return this.element.outgoing();
562
- }
563
- incomingModelRelationships() {
564
- return this.element.incoming();
565
- }
566
- /**
567
- * Iterate over all views that include this instance.
568
- * (Some views may include the parent deployment node instead of the instance.)
569
- */
570
- *views() {
571
- for (const view of this.$model.views()) {
572
- if (view._type !== "deployment") {
573
- continue;
574
- }
575
- if (view.includesDeployment(this.id)) {
576
- yield view;
577
- continue;
578
- }
579
- if (view.includesDeployment(this.parent.id) && this.parent.onlyOneInstance()) {
580
- yield view;
581
- }
582
- }
583
- }
584
- }
585
- class NestedElementOfDeployedInstanceModel {
586
- constructor(instance, element) {
587
- this.instance = instance;
588
- this.element = element;
589
- }
590
- get id() {
591
- return this.instance.id;
592
- }
593
- get _literalId() {
594
- return this.instance.id;
595
- }
596
- get style() {
597
- const { icon, style } = this.element.$element;
598
- return {
599
- shape: this.element.shape,
600
- color: this.element.color,
601
- ...icon && { icon },
602
- ...style
603
- };
604
- }
605
- get shape() {
606
- return this.element.shape;
607
- }
608
- get color() {
609
- return this.element.color;
610
- }
611
- get title() {
612
- return this.element.title;
613
- }
614
- get description() {
615
- return this.element.description;
616
- }
617
- get technology() {
618
- return this.element.technology;
619
- }
620
- isDeploymentNode() {
621
- return false;
622
- }
623
- isInstance() {
624
- return false;
625
- }
626
- }
627
- class DeploymentRelationModel {
628
- constructor($model, $relationship) {
629
- this.$model = $model;
630
- this.$relationship = $relationship;
631
- this.source = $model.deploymentRef($relationship.source);
632
- this.target = $model.deploymentRef($relationship.target);
633
- const parent = commonAncestor(this.source.id, this.target.id);
634
- this.boundary = parent ? this.$model.node(parent) : null;
635
- }
636
- boundary;
637
- source;
638
- target;
639
- get id() {
640
- return this.$relationship.id;
641
- }
642
- get expression() {
643
- return `${this.source.id} -> ${this.target.id}`;
644
- }
645
- get title() {
646
- if (!n$1(this.$relationship.title)) {
647
- return null;
648
- }
649
- return this.$relationship.title;
650
- }
651
- get technology() {
652
- if (!n$1(this.$relationship.technology)) {
653
- return null;
654
- }
655
- return this.$relationship.technology;
656
- }
657
- get description() {
658
- if (!n$1(this.$relationship.description)) {
659
- return null;
660
- }
661
- return this.$relationship.description;
662
- }
663
- get tags() {
664
- return this.$relationship.tags ?? [];
665
- }
666
- get kind() {
667
- return this.$relationship.kind ?? null;
668
- }
669
- get navigateTo() {
670
- return this.$relationship.navigateTo ? this.$model.$model.view(this.$relationship.navigateTo) : null;
671
- }
672
- get links() {
673
- return this.$relationship.links ?? [];
674
- }
675
- get color() {
676
- return this.$relationship.color ?? DefaultThemeColor;
677
- }
678
- get line() {
679
- return this.$relationship.line ?? DefaultLineStyle;
680
- }
681
- *views() {
682
- for (const view of this.$model.views()) {
683
- if (view.includesRelation(this.id)) {
684
- yield view;
685
- }
686
- }
687
- return;
688
- }
689
- isDeploymentRelation() {
690
- return true;
691
- }
692
- isModelRelation() {
693
- return false;
694
- }
695
- getMetadata(field) {
696
- if (field) {
697
- return this.$relationship.metadata?.[field];
698
- }
699
- return this.$relationship.metadata ?? {};
700
- }
701
- /**
702
- * Checks if the relationship has the given tag.
703
- */
704
- isTagged(tag) {
705
- return this.tags.includes(tag);
706
- }
707
- }
708
- class RelationshipsAccum {
709
- /**
710
- * @param model relationships from logical model
711
- * @param deployment relationships from deployment model
712
- */
713
- constructor(model = /* @__PURE__ */ new Set(), deployment = /* @__PURE__ */ new Set()) {
714
- this.model = model;
715
- this.deployment = deployment;
716
- }
717
- static empty() {
718
- return new RelationshipsAccum();
719
- }
720
- static from(model, deployment) {
721
- return new RelationshipsAccum(
722
- new Set(model),
723
- new Set(deployment)
724
- );
725
- }
726
- get isEmpty() {
727
- return this.model.size === 0 && this.deployment.size === 0;
728
- }
729
- get nonEmpty() {
730
- return this.model.size > 0 || this.deployment.size > 0;
731
- }
732
- get size() {
733
- return this.model.size + this.deployment.size;
734
- }
735
- /**
736
- * Returns new Accum containing all the elements which are both in this and otherAccum
737
- */
738
- intersect(otherAccum) {
739
- return RelationshipsAccum.from(
740
- intersection(this.model, otherAccum.model),
741
- intersection(this.deployment, otherAccum.deployment)
742
- );
743
- }
744
- /**
745
- * Returns new Accum containing all the elements which are both in this and otherAccum
746
- */
747
- difference(otherAccum) {
748
- return RelationshipsAccum.from(
749
- difference(this.model, otherAccum.model),
750
- difference(this.deployment, otherAccum.deployment)
751
- );
752
- }
753
- /**
754
- * Returns new Accum containing all the elements from both
755
- */
756
- union(otherAccum) {
757
- return RelationshipsAccum.from(
758
- union(this.model, otherAccum.model),
759
- union(this.deployment, otherAccum.deployment)
760
- );
761
- }
762
- }
763
-
764
251
  function getId(element) {
765
252
  return typeof element === "string" ? element : element.id;
766
253
  }
@@ -1104,10 +591,7 @@ class RelationshipModel {
1104
591
  return this.$relationship.technology;
1105
592
  }
1106
593
  get description() {
1107
- if (!n$1(this.$relationship.description)) {
1108
- return null;
1109
- }
1110
- return this.$relationship.description;
594
+ return RichText.memoize(this, this.$relationship.description);
1111
595
  }
1112
596
  get navigateTo() {
1113
597
  return this.$relationship.navigateTo ? this.model.view(this.$relationship.navigateTo) : null;
@@ -1144,6 +628,9 @@ class RelationshipModel {
1144
628
  isModelRelation() {
1145
629
  return true;
1146
630
  }
631
+ hasMetadata() {
632
+ return !!this.$relationship.metadata && !n$2(this.$relationship.metadata);
633
+ }
1147
634
  getMetadata(field) {
1148
635
  if (field) {
1149
636
  return this.$relationship.metadata?.[field];
@@ -1174,10 +661,10 @@ class EdgeModel {
1174
661
  return this.#edge.parent ? this.view.node(this.#edge.parent) : null;
1175
662
  }
1176
663
  get label() {
1177
- return this.#edge.label;
664
+ return this.#edge.label ?? null;
1178
665
  }
1179
666
  get description() {
1180
- return this.#edge.description ?? null;
667
+ return RichText.memoize(this, this.#edge.description);
1181
668
  }
1182
669
  get technology() {
1183
670
  return this.#edge.technology ?? null;
@@ -1242,7 +729,7 @@ class NodeModel {
1242
729
  return this.#node.kind;
1243
730
  }
1244
731
  get description() {
1245
- return this.#node.description ?? null;
732
+ return RichText.memoize(this, this.#node.description);
1246
733
  }
1247
734
  get technology() {
1248
735
  return this.#node.technology ?? null;
@@ -1448,6 +935,9 @@ class LikeC4ViewModel {
1448
935
  get title() {
1449
936
  return this.$view.title;
1450
937
  }
938
+ get description() {
939
+ return RichText.memoize(this, this.$view.description);
940
+ }
1451
941
  get tags() {
1452
942
  return this.$view.tags ?? [];
1453
943
  }
@@ -2115,538 +1605,6 @@ class LikeC4Model {
2115
1605
  });
2116
1606
  })(LikeC4Model || (LikeC4Model = {}));
2117
1607
 
2118
- var Connection;
2119
- ((Connection2) => {
2120
- Connection2.isInside = (fqn) => {
2121
- return (connection) => isAncestor(fqn, connection.source.id) && isAncestor(fqn, connection.target.id);
2122
- };
2123
- Connection2.isDirectedBetween = (source, target) => {
2124
- return (connection) => (connection.source.id === source || isAncestor(source, connection.source.id)) && (connection.target.id === target || isAncestor(target, connection.target.id));
2125
- };
2126
- Connection2.isAnyBetween = (source, target) => {
2127
- const forward = (0, Connection2.isDirectedBetween)(source, target), backward = (0, Connection2.isDirectedBetween)(target, source);
2128
- return (connection) => forward(connection) || backward(connection);
2129
- };
2130
- Connection2.isIncoming = (target) => {
2131
- return (connection) => (connection.target.id === target || isAncestor(target, connection.target.id)) && !isAncestor(target, connection.source.id);
2132
- };
2133
- Connection2.isOutgoing = (source) => {
2134
- return (connection) => (connection.source.id === source || isAncestor(source, connection.source.id)) && !isAncestor(source, connection.target.id);
2135
- };
2136
- Connection2.isAnyInOut = (source) => {
2137
- const isIn = (0, Connection2.isIncoming)(source), isOut = (0, Connection2.isOutgoing)(source);
2138
- return (connection) => isIn(connection) || isOut(connection);
2139
- };
2140
- })(Connection || (Connection = {}));
2141
-
2142
- const customInspectSymbol = Symbol.for("nodejs.util.inspect.custom");
2143
-
2144
- class DeploymentConnectionModel {
2145
- constructor(source, target, relations) {
2146
- this.source = source;
2147
- this.target = target;
2148
- this.relations = relations;
2149
- this.id = stringHash(`deployment:${source.id}:${target.id}`);
2150
- }
2151
- id;
2152
- /**
2153
- * Human readable expression of the connection
2154
- * Mostly used for testing and debugging
2155
- */
2156
- get expression() {
2157
- return `${this.source.id} -> ${this.target.id}`;
2158
- }
2159
- _boundary;
2160
- /**
2161
- * Common ancestor of the source and target elements.
2162
- * Represents the boundary of the connection.
2163
- */
2164
- get boundary() {
2165
- this._boundary ??= this.source.commonAncestor(this.target);
2166
- return this._boundary;
2167
- }
2168
- nonEmpty() {
2169
- return this.relations.nonEmpty;
2170
- }
2171
- [customInspectSymbol](depth, inspectOptions, inspect) {
2172
- const asString = this.toString();
2173
- Object.defineProperty(asString, "constructor", {
2174
- value: DeploymentConnectionModel,
2175
- enumerable: false
2176
- });
2177
- return asString;
2178
- }
2179
- toString() {
2180
- const model = [...this.relations.model].map((c) => " " + c.expression);
2181
- if (model.length) {
2182
- model.unshift(" model:");
2183
- } else {
2184
- model.unshift(" model: []");
2185
- }
2186
- const deployment = [...this.relations.deployment].map((c) => " " + c.expression);
2187
- if (deployment.length) {
2188
- deployment.unshift(" deployment:");
2189
- } else {
2190
- deployment.unshift(" deployment: []");
2191
- }
2192
- return [
2193
- this.expression,
2194
- ...model,
2195
- ...deployment
2196
- ].join("\n");
2197
- }
2198
- /**
2199
- * Check if connection contains deployment relation,
2200
- * that is directly connected to source or target.
2201
- */
2202
- hasDirectDeploymentRelation() {
2203
- for (const relation of this.relations.deployment) {
2204
- if (relation.source.id === this.source.id || relation.target.id === this.target.id) {
2205
- return true;
2206
- }
2207
- }
2208
- return false;
2209
- }
2210
- *values() {
2211
- yield* this.relations.model;
2212
- yield* this.relations.deployment;
2213
- }
2214
- mergeWith(other) {
2215
- if (Array.isArray(other)) {
2216
- return other.reduce((acc, o) => acc.mergeWith(o), this);
2217
- }
2218
- invariant(this.source.id === other.source.id, "Cannot merge connections with different sources");
2219
- invariant(this.target.id === other.target.id, "Cannot merge connections with different targets");
2220
- return new DeploymentConnectionModel(
2221
- this.source,
2222
- this.target,
2223
- this.relations.union(other.relations)
2224
- );
2225
- }
2226
- difference(other) {
2227
- return new DeploymentConnectionModel(
2228
- this.source,
2229
- this.target,
2230
- this.relations.difference(other.relations)
2231
- );
2232
- }
2233
- intersect(other) {
2234
- return new DeploymentConnectionModel(
2235
- this.source,
2236
- this.target,
2237
- this.relations.intersect(other.relations)
2238
- );
2239
- }
2240
- equals(other) {
2241
- invariant(other instanceof DeploymentConnectionModel, "Other should ne DeploymentConnectionModel");
2242
- return this.id === other.id && this.source.id === other.source.id && this.target.id === other.target.id && equals(this.relations.model, other.relations.model) && equals(this.relations.deployment, other.relations.deployment);
2243
- }
2244
- /**
2245
- * Creates a clone of the current `DeploymentConnectionModel` instance with optional overrides.
2246
- * if `null` is provided in overrides, the corresponding relation set will be empty.
2247
- */
2248
- update(overrides) {
2249
- if (overrides) {
2250
- overrides = {
2251
- model: this.relations.model,
2252
- deployment: this.relations.deployment,
2253
- ...overrides
2254
- };
2255
- }
2256
- return new DeploymentConnectionModel(
2257
- this.source,
2258
- this.target,
2259
- overrides ? new RelationshipsAccum(
2260
- overrides.model ?? /* @__PURE__ */ new Set(),
2261
- overrides.deployment ?? /* @__PURE__ */ new Set()
2262
- ) : this.relations
2263
- );
2264
- }
2265
- }
2266
-
2267
- function isNestedConnection(nested, parent) {
2268
- if (!parent) {
2269
- const p = nested;
2270
- return (n) => isNestedConnection(n, p);
2271
- }
2272
- const isSameSource = nested.source === parent.source;
2273
- const isSameTarget = nested.target === parent.target;
2274
- if (isSameSource && isSameTarget) {
2275
- return false;
2276
- }
2277
- const isSourceNested = isAncestor(parent.source.id, nested.source.id);
2278
- const isTargetNested = isAncestor(parent.target.id, nested.target.id);
2279
- return isSourceNested && isTargetNested || isSameSource && isTargetNested || isSameTarget && isSourceNested;
2280
- }
2281
- function findDeepestNestedConnection(connections, connection) {
2282
- let deepest = connection;
2283
- for (const c of connections) {
2284
- if (isNestedConnection(c, deepest)) {
2285
- deepest = c;
2286
- }
2287
- }
2288
- return deepest !== connection ? deepest : null;
2289
- }
2290
- function sortDeepestFirst(connections) {
2291
- const sorted = [];
2292
- const unsorted = connections.slice();
2293
- let next;
2294
- while (next = unsorted.shift()) {
2295
- let deepest;
2296
- while (deepest = findDeepestNestedConnection(unsorted, next)) {
2297
- const index = unsorted.indexOf(deepest);
2298
- sorted.push(unsorted.splice(index, 1)[0]);
2299
- }
2300
- sorted.push(next);
2301
- }
2302
- return sorted;
2303
- }
2304
- const boundaryHierarchy = (conn) => conn.boundary?.id ? `.${conn.boundary.id}` : "";
2305
- function sortConnectionsByBoundaryHierarchy(connections, sort) {
2306
- if (!connections || isString(connections)) {
2307
- const dir = connections ?? "asc";
2308
- return (arr) => _sortByBoundary(arr, dir);
2309
- }
2310
- return _sortByBoundary(connections, sort ?? "asc");
2311
- }
2312
- function _sortByBoundary(connections, order) {
2313
- return C(
2314
- connections,
2315
- m$2((conn) => ({
2316
- id: boundaryHierarchy(conn),
2317
- conn
2318
- })),
2319
- sortNaturalByFqn(order),
2320
- m$2(p("conn"))
2321
- );
2322
- }
2323
- function findAscendingConnections(connections, connection) {
2324
- return connections.filter((c) => isNestedConnection(connection, c));
2325
- }
2326
- function findDescendantConnections(connections, connection) {
2327
- return connections.filter(isNestedConnection(connection));
2328
- }
2329
- function mergeConnections(connections) {
2330
- const map2 = /* @__PURE__ */ new Map();
2331
- for (const conn of connections) {
2332
- const existing = map2.get(conn.id);
2333
- if (existing) {
2334
- map2.set(conn.id, conn.mergeWith(existing));
2335
- } else {
2336
- map2.set(conn.id, conn);
2337
- }
2338
- }
2339
- return [...map2.values()];
2340
- }
2341
- function differenceConnections(source, exclude) {
2342
- const minus = new Map([...exclude].map((c) => [c.id, c]));
2343
- return [...source].reduce((acc, c) => {
2344
- const other = minus.get(c.id);
2345
- if (!other) {
2346
- acc.push(c);
2347
- return acc;
2348
- }
2349
- const updated = c.difference(other);
2350
- if (updated.nonEmpty()) {
2351
- acc.push(updated);
2352
- }
2353
- return acc;
2354
- }, []);
2355
- }
2356
- function hasSameSourceTarget(a, b) {
2357
- if (b) {
2358
- return a.source === b.source && a.target === b.target;
2359
- }
2360
- return (b2) => a.source === b2.source && a.target === b2.target;
2361
- }
2362
- function hasSameSource(a, b) {
2363
- if (b) {
2364
- return a.source === b.source;
2365
- }
2366
- return (b2) => a.source === b2.source;
2367
- }
2368
- function hasSameTarget(a, b) {
2369
- if (b) {
2370
- return a.target === b.target;
2371
- }
2372
- return (b2) => a.target === b2.target;
2373
- }
2374
- function isOutgoing(a, source) {
2375
- if (!source) {
2376
- const _source = a;
2377
- return (b) => isOutgoing(b, _source);
2378
- }
2379
- const at = a;
2380
- return isDescendantOf(at.source, source) && !isDescendantOf(at.target, source);
2381
- }
2382
- function isIncoming(a, target) {
2383
- if (!target) {
2384
- const _target = a;
2385
- return (b) => isIncoming(b, _target);
2386
- }
2387
- const at = a;
2388
- return isDescendantOf(at.target, target) && !isDescendantOf(at.source, target);
2389
- }
2390
- function isAnyInOut(a, source) {
2391
- if (!source) {
2392
- const _source = a;
2393
- return (b) => isAnyInOut(b, _source);
2394
- }
2395
- const at = a;
2396
- return isDescendantOf(at.source, source) !== isDescendantOf(at.target, source);
2397
- }
2398
-
2399
- function findConnection$1(source, target, direction = "directed") {
2400
- if (source === target) {
2401
- return [];
2402
- }
2403
- if (isSameHierarchy(source, target)) {
2404
- return [];
2405
- }
2406
- const directedIntersection = intersection(source.allOutgoing, target.allIncoming);
2407
- const directed = directedIntersection.size > 0 ? new ConnectionModel(
2408
- source,
2409
- target,
2410
- directedIntersection
2411
- ) : null;
2412
- if (direction === "directed") {
2413
- return directed ? [directed] : [];
2414
- }
2415
- const reverseIntersection = intersection(source.allIncoming, target.allOutgoing);
2416
- const reverse = reverseIntersection.size > 0 ? new ConnectionModel(
2417
- target,
2418
- source,
2419
- reverseIntersection
2420
- ) : null;
2421
- if (directed && reverse) {
2422
- return [directed, reverse];
2423
- }
2424
- if (directed) {
2425
- return [directed];
2426
- }
2427
- if (reverse) {
2428
- return [reverse];
2429
- }
2430
- return [];
2431
- }
2432
- function findConnectionsBetween$1(element, others, direction = "both") {
2433
- if (element.allIncoming.size === 0 && element.allOutgoing.size === 0) {
2434
- return [];
2435
- }
2436
- const outgoing = [];
2437
- const incoming = [];
2438
- for (const _other of others) {
2439
- if (element === _other) {
2440
- continue;
2441
- }
2442
- for (const found of findConnection$1(element, _other, direction)) {
2443
- if (found.source === element) {
2444
- outgoing.push(found);
2445
- } else {
2446
- incoming.push(found);
2447
- }
2448
- }
2449
- }
2450
- return [
2451
- ...outgoing,
2452
- ...incoming
2453
- ];
2454
- }
2455
- function findConnectionsWithin$1(elements) {
2456
- return [...elements].reduce((acc, el, index, array) => {
2457
- if (index === array.length - 1) {
2458
- return acc;
2459
- }
2460
- acc.push(
2461
- ...findConnectionsBetween$1(el, array.slice(index + 1), "both")
2462
- );
2463
- return acc;
2464
- }, []);
2465
- }
2466
-
2467
- const modelConnection = {
2468
- __proto__: null,
2469
- findConnection: findConnection$1,
2470
- findConnectionsBetween: findConnectionsBetween$1,
2471
- findConnectionsWithin: findConnectionsWithin$1
2472
- };
2473
-
2474
- class ConnectionModel {
2475
- constructor(source, target, relations = /* @__PURE__ */ new Set()) {
2476
- this.source = source;
2477
- this.target = target;
2478
- this.relations = relations;
2479
- this.id = stringHash(`model:${source.id}:${target.id}`);
2480
- }
2481
- id;
2482
- _boundary;
2483
- /**
2484
- * Common ancestor of the source and target elements.
2485
- * Represents the boundary of the connection.
2486
- */
2487
- get boundary() {
2488
- return this._boundary ??= this.source.commonAncestor(this.target);
2489
- }
2490
- /**
2491
- * Human readable expression of the connection
2492
- * Mostly used for testing and debugging
2493
- */
2494
- get expression() {
2495
- return `${this.source.id} -> ${this.target.id}`;
2496
- }
2497
- /**
2498
- * Returns true if only includes relations between the source and target elements.
2499
- */
2500
- get isDirect() {
2501
- return this.nonEmpty() && !this.isImplicit;
2502
- }
2503
- /**
2504
- * Returns true if includes relations between nested elements of the source and target elements.
2505
- */
2506
- get isImplicit() {
2507
- return this.nonEmpty() && isome(this.relations, o$2(hasSameSourceTarget(this)));
2508
- }
2509
- get directRelations() {
2510
- return new Set(ifilter(this.relations, hasSameSourceTarget(this)));
2511
- }
2512
- nonEmpty() {
2513
- return this.relations.size > 0;
2514
- }
2515
- mergeWith(other) {
2516
- invariant(this.source.id === other.source.id, "Cannot merge connections with different sources");
2517
- invariant(this.target.id === other.target.id, "Cannot merge connections with different targets");
2518
- return new ConnectionModel(
2519
- this.source,
2520
- this.target,
2521
- union(this.relations, other.relations)
2522
- );
2523
- }
2524
- difference(other) {
2525
- return new ConnectionModel(
2526
- this.source,
2527
- this.target,
2528
- difference(this.relations, other.relations)
2529
- );
2530
- }
2531
- intersect(other) {
2532
- invariant(other instanceof ConnectionModel, "Cannot intersect connection with different type");
2533
- return new ConnectionModel(
2534
- this.source,
2535
- this.target,
2536
- intersection(this.relations, other.relations)
2537
- );
2538
- }
2539
- equals(other) {
2540
- invariant(other instanceof ConnectionModel, "Cannot merge connection with different type");
2541
- const _other = other;
2542
- return this.id === _other.id && this.source.id === _other.source.id && this.target.id === _other.target.id && equals(this.relations, _other.relations);
2543
- }
2544
- /**
2545
- * Returns a new instance with the updated relations.
2546
- *
2547
- * @param relations - A readonly set of `RelationshipModel` instances representing the new relations.
2548
- * @returns A new `ConnectionModel` instance with the updated relations.
2549
- */
2550
- update(relations) {
2551
- return new ConnectionModel(
2552
- this.source,
2553
- this.target,
2554
- relations
2555
- );
2556
- }
2557
- [customInspectSymbol](depth, inspectOptions, inspect) {
2558
- const asString = this.toString();
2559
- Object.defineProperty(asString, "constructor", {
2560
- value: ConnectionModel,
2561
- enumerable: false
2562
- });
2563
- return asString;
2564
- }
2565
- toString() {
2566
- return [
2567
- this.expression,
2568
- this.relations.size ? " relations:" : " relations: [ ]",
2569
- ...[...this.relations].map((c) => " " + c.expression)
2570
- ].join("\n");
2571
- }
2572
- /**
2573
- * Creates a new connection with reversed direction (target becomes source and vice versa)
2574
- * @param search - When true, attempts to find an existing connection between the reversed nodes
2575
- */
2576
- reversed(search = false) {
2577
- if (!search) {
2578
- return new ConnectionModel(this.target, this.source);
2579
- }
2580
- const [found] = findConnection$1(this.target, this.source, "directed");
2581
- return found ?? new ConnectionModel(this.target, this.source, /* @__PURE__ */ new Set());
2582
- }
2583
- }
2584
-
2585
- function findConnection(source, target, direction = "directed") {
2586
- if (source === target) {
2587
- return [];
2588
- }
2589
- if (isSameHierarchy(source, target)) {
2590
- return [];
2591
- }
2592
- const directedIntersection = source.allOutgoing.intersect(target.allIncoming);
2593
- const directed = directedIntersection.nonEmpty ? [
2594
- new DeploymentConnectionModel(
2595
- source,
2596
- target,
2597
- directedIntersection
2598
- )
2599
- ] : [];
2600
- if (direction === "directed") {
2601
- return directed;
2602
- }
2603
- return [
2604
- ...directed,
2605
- ...findConnection(target, source, "directed")
2606
- ];
2607
- }
2608
- function findConnectionsBetween(element, others, direction = "both") {
2609
- if (element.allIncoming.isEmpty && element.allOutgoing.isEmpty) {
2610
- return [];
2611
- }
2612
- const outgoing = [];
2613
- const incoming = [];
2614
- for (const _other of others) {
2615
- if (element === _other) {
2616
- continue;
2617
- }
2618
- for (const found of findConnection(element, _other, direction)) {
2619
- if (found.source === element) {
2620
- outgoing.push(found);
2621
- } else {
2622
- incoming.push(found);
2623
- }
2624
- }
2625
- }
2626
- return [
2627
- ...outgoing,
2628
- ...incoming
2629
- ];
2630
- }
2631
- function findConnectionsWithin(elements) {
2632
- return [...elements].reduce((acc, el, index, array) => {
2633
- if (index === array.length - 1) {
2634
- return acc;
2635
- }
2636
- acc.push(
2637
- ...findConnectionsBetween(el, array.slice(index + 1), "both")
2638
- );
2639
- return acc;
2640
- }, []);
2641
- }
2642
-
2643
- const deploymentConnection = {
2644
- __proto__: null,
2645
- findConnection: findConnection,
2646
- findConnectionsBetween: findConnectionsBetween,
2647
- findConnectionsWithin: findConnectionsWithin
2648
- };
2649
-
2650
1608
  function isDeploymentNodeModel(model) {
2651
1609
  return model instanceof DeploymentNodeModel;
2652
1610
  }
@@ -2678,4 +1636,4 @@ function isEdgeModel(edge) {
2678
1636
  return edge instanceof EdgeModel;
2679
1637
  }
2680
1638
 
2681
- export { RelationshipModel as A, hasSameSource as B, Connection as C, DeploymentConnectionModel as D, ElementModel as E, hasSameSourceTarget as F, hasSameTarget as G, sortDeepestFirst as H, DeployedInstanceModel as I, DeploymentNodeModel as J, DeploymentRelationModel as K, LikeC4Model as L, LikeC4DeploymentModel as M, EdgeModel as N, LikeC4ViewModel as O, NodeModel as P, isDeploymentRelationModel as Q, RelationshipsAccum as R, isRelationModel as S, isLikeC4ViewModel as T, isNodeModel as U, isEdgeModel as V, a, t$1 as b, differenceConnections as c, deploymentConnection as d, isNestedConnection as e, findAscendingConnections as f, customInspectSymbol as g, findConnectionsBetween$1 as h, i, isElementModel as j, isNestedElementOfDeployedInstanceModel as k, isDeployedInstanceModel as l, mergeConnections as m, isDeploymentNodeModel as n, isDeploymentElementModel as o, p, modelConnection as q, r, sortConnectionsByBoundaryHierarchy as s, t, findDescendantConnections as u, findDeepestNestedConnection as v, isAnyInOut as w, isOutgoing as x, isIncoming as y, ConnectionModel as z };
1639
+ export { ElementModel as E, LikeC4Model as L, NodeModel as N, RelationshipModel as R, LikeC4DeploymentModel as a, EdgeModel as b, LikeC4ViewModel as c, isDeployedInstanceModel as d, isDeploymentElementModel as e, isNestedElementOfDeployedInstanceModel as f, isDeploymentRelationModel as g, isRelationModel as h, isDeploymentNodeModel as i, isElementModel as j, isLikeC4ViewModel as k, isNodeModel as l, isEdgeModel as m, a as n, r, t };