@likec4/core 0.40.0 → 0.41.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 (104) hide show
  1. package/README.md +2 -6
  2. package/dist/cjs/colors/element.d.ts +68 -0
  3. package/dist/{esm/colors.js → cjs/colors/element.js} +9 -23
  4. package/dist/cjs/colors/index.d.ts +132 -0
  5. package/dist/cjs/colors/index.js +27 -0
  6. package/dist/cjs/colors/relationships.d.ts +57 -0
  7. package/dist/cjs/colors/relationships.js +76 -0
  8. package/dist/cjs/index.d.ts +0 -2
  9. package/dist/cjs/index.js +0 -22
  10. package/dist/cjs/types/computed-view.d.ts +10 -7
  11. package/dist/cjs/types/diagram.d.ts +14 -5
  12. package/dist/cjs/types/expression.d.ts +1 -1
  13. package/dist/cjs/types/relation.d.ts +12 -0
  14. package/dist/cjs/types/relation.js +12 -1
  15. package/dist/cjs/types/theme.d.ts +12 -14
  16. package/dist/cjs/types/view.d.ts +7 -4
  17. package/dist/cjs/types/view.js +1 -1
  18. package/dist/cjs/utils/fqn.d.ts +6 -1
  19. package/dist/cjs/utils/fqn.js +17 -4
  20. package/dist/cjs/utils/guards.d.ts +1 -0
  21. package/dist/cjs/utils/guards.js +7 -0
  22. package/dist/cjs/utils/index.d.ts +0 -1
  23. package/dist/cjs/utils/index.js +0 -11
  24. package/dist/esm/colors/element.d.ts +68 -0
  25. package/dist/{cjs/colors.js → esm/colors/element.js} +1 -33
  26. package/dist/esm/colors/index.d.ts +132 -0
  27. package/dist/esm/colors/index.js +9 -0
  28. package/dist/esm/colors/relationships.d.ts +57 -0
  29. package/dist/esm/colors/relationships.js +64 -0
  30. package/dist/esm/index.d.ts +0 -2
  31. package/dist/esm/index.js +1 -3
  32. package/dist/esm/types/computed-view.d.ts +10 -7
  33. package/dist/esm/types/diagram.d.ts +14 -5
  34. package/dist/esm/types/expression.d.ts +1 -1
  35. package/dist/esm/types/relation.d.ts +12 -0
  36. package/dist/esm/types/relation.js +3 -0
  37. package/dist/esm/types/theme.d.ts +12 -14
  38. package/dist/esm/types/view.d.ts +7 -4
  39. package/dist/esm/types/view.js +1 -1
  40. package/dist/esm/utils/fqn.d.ts +6 -1
  41. package/dist/esm/utils/fqn.js +16 -4
  42. package/dist/esm/utils/guards.d.ts +1 -0
  43. package/dist/esm/utils/guards.js +1 -0
  44. package/dist/esm/utils/index.d.ts +0 -1
  45. package/dist/esm/utils/index.js +0 -1
  46. package/package.json +52 -55
  47. package/dist/cjs/colors.d.ts +0 -148
  48. package/dist/cjs/compute-view/EdgeBuilder.d.ts +0 -6
  49. package/dist/cjs/compute-view/EdgeBuilder.js +0 -37
  50. package/dist/cjs/compute-view/compute-ctx.d.ts +0 -20
  51. package/dist/cjs/compute-view/compute-ctx.js +0 -91
  52. package/dist/cjs/compute-view/compute-element-view.d.ts +0 -3
  53. package/dist/cjs/compute-view/compute-element-view.js +0 -100
  54. package/dist/cjs/compute-view/compute-predicates.d.ts +0 -16
  55. package/dist/cjs/compute-view/compute-predicates.js +0 -363
  56. package/dist/cjs/compute-view/compute.d.ts +0 -14
  57. package/dist/cjs/compute-view/compute.js +0 -46
  58. package/dist/cjs/compute-view/index.d.ts +0 -4
  59. package/dist/cjs/compute-view/index.js +0 -49
  60. package/dist/cjs/compute-view/resolve-extended-views.d.ts +0 -6
  61. package/dist/cjs/compute-view/resolve-extended-views.js +0 -53
  62. package/dist/cjs/compute-view/resolve-relative-paths.d.ts +0 -2
  63. package/dist/cjs/compute-view/resolve-relative-paths.js +0 -84
  64. package/dist/cjs/compute-view/utils/anyPossibleRelations.d.ts +0 -2
  65. package/dist/cjs/compute-view/utils/anyPossibleRelations.js +0 -18
  66. package/dist/cjs/compute-view/utils/applyViewRuleStyles.d.ts +0 -2
  67. package/dist/cjs/compute-view/utils/applyViewRuleStyles.js +0 -57
  68. package/dist/cjs/compute-view/utils/sortNodes.d.ts +0 -19
  69. package/dist/cjs/compute-view/utils/sortNodes.js +0 -47
  70. package/dist/cjs/model-index/ModelIndex.d.ts +0 -27
  71. package/dist/cjs/model-index/ModelIndex.js +0 -139
  72. package/dist/cjs/model-index/index.d.ts +0 -1
  73. package/dist/cjs/model-index/index.js +0 -13
  74. package/dist/cjs/utils/compute-node-levels.d.ts +0 -7
  75. package/dist/cjs/utils/compute-node-levels.js +0 -48
  76. package/dist/esm/colors.d.ts +0 -148
  77. package/dist/esm/compute-view/EdgeBuilder.d.ts +0 -6
  78. package/dist/esm/compute-view/EdgeBuilder.js +0 -30
  79. package/dist/esm/compute-view/compute-ctx.d.ts +0 -20
  80. package/dist/esm/compute-view/compute-ctx.js +0 -100
  81. package/dist/esm/compute-view/compute-element-view.d.ts +0 -3
  82. package/dist/esm/compute-view/compute-element-view.js +0 -98
  83. package/dist/esm/compute-view/compute-predicates.d.ts +0 -16
  84. package/dist/esm/compute-view/compute-predicates.js +0 -324
  85. package/dist/esm/compute-view/compute.d.ts +0 -14
  86. package/dist/esm/compute-view/compute.js +0 -36
  87. package/dist/esm/compute-view/index.d.ts +0 -4
  88. package/dist/esm/compute-view/index.js +0 -4
  89. package/dist/esm/compute-view/resolve-extended-views.d.ts +0 -6
  90. package/dist/esm/compute-view/resolve-extended-views.js +0 -41
  91. package/dist/esm/compute-view/resolve-relative-paths.d.ts +0 -2
  92. package/dist/esm/compute-view/resolve-relative-paths.js +0 -76
  93. package/dist/esm/compute-view/utils/anyPossibleRelations.d.ts +0 -2
  94. package/dist/esm/compute-view/utils/anyPossibleRelations.js +0 -12
  95. package/dist/esm/compute-view/utils/applyViewRuleStyles.d.ts +0 -2
  96. package/dist/esm/compute-view/utils/applyViewRuleStyles.js +0 -50
  97. package/dist/esm/compute-view/utils/sortNodes.d.ts +0 -19
  98. package/dist/esm/compute-view/utils/sortNodes.js +0 -37
  99. package/dist/esm/model-index/ModelIndex.d.ts +0 -27
  100. package/dist/esm/model-index/ModelIndex.js +0 -127
  101. package/dist/esm/model-index/index.d.ts +0 -1
  102. package/dist/esm/model-index/index.js +0 -1
  103. package/dist/esm/utils/compute-node-levels.d.ts +0 -7
  104. package/dist/esm/utils/compute-node-levels.js +0 -31
@@ -1,50 +0,0 @@
1
- import { anyPass, clone, filter, isNil } from "rambdax";
2
- import { isDefined } from "remeda";
3
- import { nonexhaustive } from "../../errors/index.js";
4
- import { Expr } from "../../types/index.js";
5
- export function applyViewRuleStyles(rules, _nodes) {
6
- if (rules.length === 0) {
7
- return _nodes;
8
- }
9
- const nodes = clone(_nodes);
10
- for (const rule of rules) {
11
- const predicates = [];
12
- if (!rule.style.color && !rule.style.shape) {
13
- continue;
14
- }
15
- for (const target of rule.targets) {
16
- if (Expr.isWildcard(target)) {
17
- predicates.push(() => true);
18
- break;
19
- }
20
- if (Expr.isElementKindExpr(target)) {
21
- predicates.push(
22
- target.isEqual ? (n) => n.kind === target.elementKind : (n) => n.kind !== target.elementKind
23
- );
24
- continue;
25
- }
26
- if (Expr.isElementTagExpr(target)) {
27
- predicates.push(
28
- target.isEqual ? ({ tags }) => !!tags && tags.includes(target.elementTag) : ({ tags }) => isNil(tags) || !tags.includes(target.elementTag)
29
- );
30
- continue;
31
- }
32
- if (Expr.isElementRef(target)) {
33
- const { element, isDescedants } = target;
34
- predicates.push(
35
- isDescedants ? (n) => n.id.startsWith(element + ".") : (n) => n.id === element
36
- );
37
- continue;
38
- }
39
- nonexhaustive(target);
40
- }
41
- filter(anyPass(predicates), nodes).forEach((n) => {
42
- n.shape = rule.style.shape ?? n.shape;
43
- n.color = rule.style.color ?? n.color;
44
- if (isDefined.strict(rule.style.icon)) {
45
- n.icon = rule.style.icon;
46
- }
47
- });
48
- }
49
- return nodes;
50
- }
@@ -1,19 +0,0 @@
1
- import type { ComputedEdge, ComputedNode } from '../../types';
2
- export declare function sortNodes(_nodes: ComputedNode[], edges: ComputedEdge[]): {
3
- children: import("../../types").Fqn[];
4
- id: import("../../types").Fqn;
5
- kind: import("../../types").ElementKind;
6
- parent: import("../../types").Fqn | null;
7
- title: string;
8
- description: string | null;
9
- technology: string | null;
10
- tags: import("../../types").NonEmptyArray<import("../../types").Tag> | null;
11
- links: import("../../types").NonEmptyArray<string> | null;
12
- inEdges: import("../../types").EdgeId[];
13
- outEdges: import("../../types").EdgeId[];
14
- shape: import("../../types").ElementShape;
15
- color: import("../../types").ThemeColor;
16
- icon?: import("../../types").IconUrl | undefined;
17
- navigateTo?: import("../../types").ViewID | undefined;
18
- level: number;
19
- }[];
@@ -1,37 +0,0 @@
1
- import pkg from "@dagrejs/graphlib";
2
- const { Graph, alg } = pkg;
3
- function fillChildren(nodes) {
4
- return nodes.map((node) => ({
5
- ...node,
6
- children: nodes.flatMap((n) => n.parent === node.id ? n.id : [])
7
- }));
8
- }
9
- export function sortNodes(_nodes, edges) {
10
- if (edges.length === 0) {
11
- return fillChildren(_nodes);
12
- }
13
- const g = new Graph({
14
- compound: true,
15
- directed: true,
16
- multigraph: false
17
- });
18
- for (const e of edges) {
19
- g.setEdge(e.source, e.target);
20
- }
21
- for (const n of _nodes) {
22
- g.setNode(n.id);
23
- if (n.parent) {
24
- g.setEdge(n.id, n.parent);
25
- }
26
- }
27
- const unprocessed = [..._nodes];
28
- const sorted = [];
29
- const ordered = alg.postorder(g, g.sources()).reverse();
30
- for (const id of ordered) {
31
- const inx = unprocessed.findIndex((n) => n.id === id);
32
- if (inx >= 0) {
33
- sorted.push(...unprocessed.splice(inx, 1));
34
- }
35
- }
36
- return fillChildren(sorted.concat(unprocessed));
37
- }
@@ -1,27 +0,0 @@
1
- import type { Element, Fqn, Relation, RelationID } from '../types';
2
- type ModelInput = {
3
- elements: Record<Fqn, Element>;
4
- relations: Record<RelationID, Relation>;
5
- };
6
- export default class ModelIndex {
7
- private root;
8
- private _elements;
9
- private _relations;
10
- get relations(): Relation[];
11
- filterRelations(predicate: (r: Relation) => boolean): Relation[];
12
- static from({ elements, relations }: ModelInput): ModelIndex;
13
- addElement(el: Element): void;
14
- private locateTrie;
15
- find: (id: Fqn) => Element;
16
- children: (id: Fqn) => Element[];
17
- siblings: (id: Fqn) => Element[];
18
- /**
19
- * Ancestors from closest parent to root
20
- */
21
- ancestors(id: Fqn): Element[];
22
- rootElements(): Element[];
23
- get elements(): Element[];
24
- hasElement(fqn: Fqn): boolean;
25
- addRelation(rel: Relation): void;
26
- }
27
- export {};
@@ -1,127 +0,0 @@
1
- import { values } from "remeda";
2
- import { InvalidModelError, ensureModel } from "../errors/index.js";
3
- import { parentFqn } from "../utils/index.js";
4
- function childrenOf(trie) {
5
- const children = [];
6
- for (const { el } of values(trie.children)) {
7
- if (el) {
8
- children.push(el);
9
- }
10
- }
11
- return children;
12
- }
13
- function asPath(id) {
14
- return id.split(".");
15
- }
16
- export default class ModelIndex {
17
- root = {
18
- children: {}
19
- };
20
- _elements = /* @__PURE__ */ new Map();
21
- _relations = /* @__PURE__ */ new Map();
22
- // private _taggedElements = new Map<Tag, Set<Element>>()
23
- // private _taggedRelations = new Map<Tag, Set<Relation>>()
24
- get relations() {
25
- return Array.from(this._relations.values());
26
- }
27
- filterRelations(predicate) {
28
- return this.relations.filter(predicate);
29
- }
30
- static from({ elements, relations }) {
31
- const index = new ModelIndex();
32
- for (const el of values(elements)) {
33
- index.addElement(el);
34
- }
35
- for (const rel of values(relations)) {
36
- index.addRelation(rel);
37
- }
38
- return index;
39
- }
40
- addElement(el) {
41
- if (this.hasElement(el.id)) {
42
- throw new InvalidModelError(`Element already exists with id ${el.id}`);
43
- }
44
- const path = asPath(el.id);
45
- let scope = this.root;
46
- for (const name of path) {
47
- const next = scope.children[name] ?? {
48
- children: {}
49
- };
50
- scope.children[name] = next;
51
- scope = next;
52
- }
53
- scope.el = el;
54
- this._elements.set(el.id, el);
55
- }
56
- locateTrie = (id) => {
57
- let scope = this.root;
58
- for (const name of asPath(id)) {
59
- const next = scope.children[name];
60
- ensureModel(next, `Invalid index, Element not found at path ${name} of ${id}`);
61
- scope = next;
62
- }
63
- return scope;
64
- };
65
- find = (id) => {
66
- const el = this._elements.get(id);
67
- ensureModel(el, `Element not found with id ${id}`);
68
- return el;
69
- };
70
- children = (id) => {
71
- return childrenOf(this.locateTrie(id));
72
- };
73
- siblings = (id) => {
74
- const parent = parentFqn(id);
75
- const trie = parent ? this.locateTrie(parent) : this.root;
76
- return childrenOf(trie).filter((e) => e.id !== id);
77
- };
78
- /**
79
- * Ancestors from closest parent to root
80
- */
81
- ancestors(id) {
82
- const path = asPath(id);
83
- const ancestors = [];
84
- if (path.length === 1) {
85
- return ancestors;
86
- }
87
- path.pop();
88
- let name = path.shift();
89
- let trie = this.root;
90
- while (name) {
91
- const next = trie.children[name];
92
- ensureModel(next, `Invalid index, Element not found at path ${name} of ${id}`);
93
- trie = next;
94
- ensureModel(trie.el, `invalid index, no element ${name} found in ${id}`);
95
- ancestors.unshift(trie.el);
96
- name = path.shift();
97
- }
98
- return ancestors;
99
- }
100
- // tagged = (tag?: Tag): TaggedResult => {
101
- // return tag ? {
102
- // elements: [...this._taggedElements.get(tag)?.values() ?? []],
103
- // relations: [...this._taggedRelations.get(tag)?.values() ?? []],
104
- // } : {
105
- // elements: uniq([...this._taggedElements.values()].flatMap(s => [...s.values()])),
106
- // relations: uniq([...this._taggedRelations.values()].flatMap(s => [...s.values()]))
107
- // }
108
- // }
109
- rootElements() {
110
- return childrenOf(this.root);
111
- }
112
- get elements() {
113
- return Array.from(this._elements.values());
114
- }
115
- hasElement(fqn) {
116
- return this._elements.has(fqn);
117
- }
118
- addRelation(rel) {
119
- if (!this.hasElement(rel.source)) {
120
- throw new InvalidModelError(`Source of relation not found ${rel.source}`);
121
- }
122
- if (!this.hasElement(rel.target)) {
123
- throw new InvalidModelError(`Target of relation not found ${rel.target}`);
124
- }
125
- this._relations.set(rel.id, rel);
126
- }
127
- }
@@ -1 +0,0 @@
1
- export { default as ModelIndex } from './ModelIndex';
@@ -1 +0,0 @@
1
- export { default as ModelIndex } from "./ModelIndex.js";
@@ -1,7 +0,0 @@
1
- import type { ComputedView } from '../types';
2
- type NodeLevelDepth = {
3
- level: number;
4
- depth: number;
5
- };
6
- export declare const computeNodeLevels: ({ nodes }: ComputedView) => Record<import("../types").Fqn, NodeLevelDepth>;
7
- export {};
@@ -1,31 +0,0 @@
1
- import { invariant } from "../errors/index.js";
2
- export const computeNodeLevels = ({ nodes }) => {
3
- const nodeLevels = {};
4
- const compute = (node, level) => {
5
- let levels = nodeLevels[node.id];
6
- if (levels) {
7
- return levels;
8
- }
9
- if (node.children.length === 0) {
10
- levels = { level, depth: 0 };
11
- nodeLevels[node.id] = levels;
12
- return levels;
13
- }
14
- let depth = 1;
15
- for (const childId of node.children) {
16
- const child = nodes.find((n) => n.id === childId);
17
- invariant(child, `Child ${childId} not found`);
18
- const { depth: childDepth } = compute(child, level + 1);
19
- depth = Math.max(childDepth + 1, depth);
20
- }
21
- levels = { level, depth };
22
- nodeLevels[node.id] = levels;
23
- return levels;
24
- };
25
- for (const node of nodes) {
26
- if (!node.parent) {
27
- compute(node, 0);
28
- }
29
- }
30
- return nodeLevels;
31
- };