@likec4/core 1.40.0 → 1.42.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 (257) hide show
  1. package/builder/package.json +4 -0
  2. package/compute-view/package.json +4 -0
  3. package/compute-view/relationships/package.json +4 -0
  4. package/dist/builder/index.d.mts +83 -20
  5. package/dist/builder/index.mjs +210 -126
  6. package/dist/compute-view/index.d.mts +8 -7
  7. package/dist/compute-view/index.mjs +14 -11
  8. package/dist/compute-view/relationships-view/index.d.mts +9 -8
  9. package/dist/compute-view/relationships-view/index.mjs +6 -6
  10. package/dist/index.d.mts +7 -7
  11. package/dist/index.mjs +12 -12
  12. package/dist/model/connection/deployment/index.d.mts +11 -10
  13. package/dist/model/connection/deployment/index.mjs +2 -2
  14. package/dist/model/connection/index.d.mts +12 -11
  15. package/dist/model/connection/index.mjs +3 -3
  16. package/dist/model/connection/model/index.d.mts +11 -10
  17. package/dist/model/connection/model/index.mjs +2 -2
  18. package/dist/model/index.d.mts +14 -14
  19. package/dist/model/index.mjs +4 -5
  20. package/dist/shared/{core.DHQ32OHa.mjs → core.01VTr9qu.mjs} +10 -29
  21. package/dist/shared/core.1vX5a9AY.mjs +86 -0
  22. package/dist/shared/{core.BVNaR17u.mjs → core.B7KhhkRY.mjs} +1 -1
  23. package/dist/shared/core.B85MJLTf.mjs +5 -0
  24. package/dist/shared/{core.BIAlzwKc.mjs → core.BIqHjQiH.mjs} +85 -45
  25. package/dist/shared/core.BKlholso.mjs +3 -0
  26. package/dist/shared/core.BR4zXDH-.mjs +13 -0
  27. package/dist/shared/{core.yHe79zEl.mjs → core.BYNkXQ8A.mjs} +21 -12
  28. package/dist/shared/core.BazD6cot.mjs +14 -0
  29. package/dist/shared/{core.BuoXfSMj.mjs → core.BbE4y-yl.mjs} +1 -1
  30. package/dist/shared/core.BoYfZOBm.mjs +3 -0
  31. package/dist/shared/core.BsSXS-_R.mjs +7 -0
  32. package/dist/shared/{core.T-eLZTW_.mjs → core.BzTakU3I.mjs} +15 -7
  33. package/dist/shared/{core.4u1dVmfX.mjs → core.C2TiyjI6.mjs} +2 -2
  34. package/dist/shared/{core.DLpidoWc.mjs → core.C3JowhaZ.mjs} +3 -3
  35. package/dist/shared/{core.CNGyqkJh.mjs → core.C4x8aaWa.mjs} +3 -1
  36. package/dist/shared/{core.BB6zA-UU.mjs → core.C8YY6Uub.mjs} +38 -9
  37. package/dist/shared/{core.FPITT8Vx.mjs → core.C8sl5Y8Z.mjs} +144 -61
  38. package/dist/shared/{core.DuR3R-xJ.mjs → core.CNgZvKb8.mjs} +3 -5176
  39. package/dist/shared/{core.BbThmf6M.d.mts → core.CQngdcuj.d.mts} +85 -4
  40. package/dist/shared/{core.Be1n9a0i.mjs → core.C_Ni6yHl.mjs} +5 -4
  41. package/dist/shared/core.CbT8JVYL.mjs +5 -0
  42. package/dist/shared/core.CqAJJpK_.mjs +3 -0
  43. package/dist/shared/{core.CySf-2gP.d.mts → core.D0PjZzIS.d.mts} +52 -15
  44. package/dist/shared/{core.DrvfVXkh.d.mts → core.D5fzJWbF.d.mts} +11 -2
  45. package/dist/shared/{core.DrVOJuxX.d.mts → core.DACpKp35.d.mts} +5 -5
  46. package/dist/shared/core.DFi2dOTl.mjs +39548 -0
  47. package/dist/shared/{core.D704WZES.d.mts → core.DIol3syK.d.mts} +2 -2
  48. package/dist/shared/{core.DlG1xWt2.mjs → core.DMMOWQqc.mjs} +3 -2
  49. package/dist/shared/core.DNbUPnve.mjs +3990 -0
  50. package/dist/shared/{core.CCD1ID81.mjs → core.DRJma0Ol.mjs} +4 -3
  51. package/dist/shared/{core.DgttqsJc.mjs → core.DRhg-gVU.mjs} +9 -9
  52. package/dist/shared/core.DSO_rTC2.mjs +5322 -0
  53. package/dist/shared/{core.vWJTxpLV.d.mts → core.D_vkffV4.d.mts} +4 -2
  54. package/dist/shared/core.DdMJk7nx.d.mts +476 -0
  55. package/dist/shared/{core.D_fI5Lf6.d.mts → core.Dgs6-nuz.d.mts} +24 -4
  56. package/dist/shared/{core.Be4Jy9Qx.mjs → core.FZ305VYd.mjs} +2 -2
  57. package/dist/shared/core.OHD4KXm9.mjs +5 -0
  58. package/dist/shared/{core.GTgsmXS_.mjs → core.QJD_fcrc.mjs} +2 -2
  59. package/dist/shared/core.RfnaEmgA.mjs +7 -0
  60. package/dist/shared/core.fHR_8Tnq.d.mts +450 -0
  61. package/dist/shared/{core.D0EgVMQK.mjs → core.lRvxPoao.mjs} +14 -12
  62. package/dist/shared/{core.CaT0SUUK.mjs → core.rCeaAqgW.mjs} +1 -84
  63. package/dist/shared/{core.kxeJe0OY.d.mts → core.s9uwOt60.d.mts} +4 -4
  64. package/dist/shared/core.yna0OdV5.d.mts +98 -0
  65. package/dist/styles/index.d.mts +106 -0
  66. package/dist/styles/index.mjs +1 -0
  67. package/dist/types/_aux.d.mts +2 -2
  68. package/dist/types/_aux.mjs +1 -5
  69. package/dist/types/expression-model.d.mts +3 -4
  70. package/dist/types/expression.d.mts +3 -4
  71. package/dist/types/fqnRef.d.mts +2 -2
  72. package/dist/types/fqnRef.mjs +3 -3
  73. package/dist/types/index.d.mts +8 -8
  74. package/dist/types/index.mjs +151 -6
  75. package/dist/types/scalar.mjs +3 -2
  76. package/dist/utils/graphology/index.d.mts +1864 -0
  77. package/dist/utils/graphology/index.mjs +1 -0
  78. package/dist/utils/index.d.mts +11 -6
  79. package/dist/utils/index.mjs +21 -37
  80. package/dist/utils/iterable/index.d.mts +1 -1
  81. package/dist/utils/iterable/index.mjs +45 -7
  82. package/model/package.json +4 -0
  83. package/package.json +42 -24
  84. package/styles/package.json +4 -0
  85. package/types/package.json +4 -0
  86. package/utils/graphology/package.json +4 -0
  87. package/utils/package.json +4 -0
  88. package/dist/shared/core.6_Vp2iiN.mjs +0 -172
  89. package/dist/shared/core.Bpou6c2f.d.mts +0 -850
  90. package/dist/shared/core.CUw_2J9j.mjs +0 -47
  91. package/dist/shared/core.CzdwsPmY.d.mts +0 -69
  92. package/dist/shared/core.DoM6aM9N.mjs +0 -7
  93. package/dist/shared/core.ILwny7BV.mjs +0 -38
  94. package/dist/theme/index.d.mts +0 -11
  95. package/dist/theme/index.mjs +0 -232
  96. package/src/builder/Builder.deployment.ts +0 -224
  97. package/src/builder/Builder.deploymentModel.ts +0 -449
  98. package/src/builder/Builder.element.ts +0 -241
  99. package/src/builder/Builder.model.ts +0 -494
  100. package/src/builder/Builder.ts +0 -870
  101. package/src/builder/Builder.view-common.ts +0 -273
  102. package/src/builder/Builder.view-deployment.ts +0 -135
  103. package/src/builder/Builder.view-element.ts +0 -202
  104. package/src/builder/Builder.views.ts +0 -399
  105. package/src/builder/Builder.with.ts +0 -156
  106. package/src/builder/_types.ts +0 -320
  107. package/src/builder/index.ts +0 -11
  108. package/src/compute-view/compute-view.ts +0 -80
  109. package/src/compute-view/deployment-view/_types.ts +0 -38
  110. package/src/compute-view/deployment-view/clean-connections.ts +0 -236
  111. package/src/compute-view/deployment-view/compute.ts +0 -94
  112. package/src/compute-view/deployment-view/memory/index.ts +0 -9
  113. package/src/compute-view/deployment-view/memory/memory.ts +0 -96
  114. package/src/compute-view/deployment-view/predicates/deploymentRefs-where.ts +0 -18
  115. package/src/compute-view/deployment-view/predicates/deploymentRefs.ts +0 -154
  116. package/src/compute-view/deployment-view/predicates/index.ts +0 -8
  117. package/src/compute-view/deployment-view/predicates/relation-direct.ts +0 -243
  118. package/src/compute-view/deployment-view/predicates/relation-in-out.ts +0 -70
  119. package/src/compute-view/deployment-view/predicates/relation-incoming.ts +0 -101
  120. package/src/compute-view/deployment-view/predicates/relation-outgoing.ts +0 -95
  121. package/src/compute-view/deployment-view/predicates/relation-where.ts +0 -18
  122. package/src/compute-view/deployment-view/predicates/utils.ts +0 -282
  123. package/src/compute-view/deployment-view/predicates/wildcard.ts +0 -41
  124. package/src/compute-view/deployment-view/stages/stage-exclude.ts +0 -5
  125. package/src/compute-view/deployment-view/stages/stage-final.ts +0 -245
  126. package/src/compute-view/deployment-view/stages/stage-include.ts +0 -95
  127. package/src/compute-view/deployment-view/utils.ts +0 -286
  128. package/src/compute-view/dynamic-view/compute.ts +0 -312
  129. package/src/compute-view/element-view/_types.ts +0 -47
  130. package/src/compute-view/element-view/clean-connections.ts +0 -117
  131. package/src/compute-view/element-view/compute.ts +0 -324
  132. package/src/compute-view/element-view/memory/NodeGroup.ts +0 -31
  133. package/src/compute-view/element-view/memory/index.ts +0 -10
  134. package/src/compute-view/element-view/memory/memory.ts +0 -178
  135. package/src/compute-view/element-view/memory/stage-exclude.ts +0 -59
  136. package/src/compute-view/element-view/memory/stage-final.ts +0 -129
  137. package/src/compute-view/element-view/memory/stage-include.ts +0 -130
  138. package/src/compute-view/element-view/predicates/_utils.ts +0 -91
  139. package/src/compute-view/element-view/predicates/element-expand.ts +0 -29
  140. package/src/compute-view/element-view/predicates/element-kind-tag.ts +0 -27
  141. package/src/compute-view/element-view/predicates/element-ref.ts +0 -24
  142. package/src/compute-view/element-view/predicates/relation-direct.ts +0 -321
  143. package/src/compute-view/element-view/predicates/relation-in-out.ts +0 -64
  144. package/src/compute-view/element-view/predicates/relation-in.ts +0 -115
  145. package/src/compute-view/element-view/predicates/relation-out.ts +0 -119
  146. package/src/compute-view/element-view/predicates/wildcard.ts +0 -88
  147. package/src/compute-view/element-view/utils.ts +0 -65
  148. package/src/compute-view/index.ts +0 -4
  149. package/src/compute-view/memory/AbstractMemory.ts +0 -45
  150. package/src/compute-view/memory/AbstractStageExclude.ts +0 -215
  151. package/src/compute-view/memory/AbstractStageInclude.ts +0 -200
  152. package/src/compute-view/memory/_types.ts +0 -148
  153. package/src/compute-view/memory/index.ts +0 -5
  154. package/src/compute-view/memory/ops.ts +0 -43
  155. package/src/compute-view/relationships-view/_types.ts +0 -16
  156. package/src/compute-view/relationships-view/compute.ts +0 -159
  157. package/src/compute-view/relationships-view/index.ts +0 -3
  158. package/src/compute-view/relationships-view/layout.ts +0 -357
  159. package/src/compute-view/relationships-view/utils.ts +0 -73
  160. package/src/compute-view/utils/ancestorsOfNode.ts +0 -19
  161. package/src/compute-view/utils/applyCustomElementProperties.ts +0 -107
  162. package/src/compute-view/utils/applyCustomRelationProperties.ts +0 -58
  163. package/src/compute-view/utils/applyViewRuleStyles.ts +0 -73
  164. package/src/compute-view/utils/buildComputedNodes.ts +0 -153
  165. package/src/compute-view/utils/buildElementNotations.ts +0 -63
  166. package/src/compute-view/utils/elementExpressionToPredicate.ts +0 -50
  167. package/src/compute-view/utils/link-nodes-with-edges.ts +0 -56
  168. package/src/compute-view/utils/merge-props-from-relationships.ts +0 -161
  169. package/src/compute-view/utils/relationExpressionToPredicates.ts +0 -55
  170. package/src/compute-view/utils/resolve-extended-views.ts +0 -85
  171. package/src/compute-view/utils/resolve-global-rules.ts +0 -88
  172. package/src/compute-view/utils/topological-sort.ts +0 -256
  173. package/src/compute-view/utils/view-hash.ts +0 -45
  174. package/src/compute-view/utils/with-readable-edges.ts +0 -40
  175. package/src/index.ts +0 -32
  176. package/src/model/DeploymentElementModel.ts +0 -682
  177. package/src/model/DeploymentModel.ts +0 -393
  178. package/src/model/ElementModel.ts +0 -293
  179. package/src/model/LikeC4Model.ts +0 -882
  180. package/src/model/RelationModel.ts +0 -152
  181. package/src/model/connection/Connection.ts +0 -72
  182. package/src/model/connection/deployment/DeploymentConnectionModel.ts +0 -185
  183. package/src/model/connection/deployment/find.ts +0 -120
  184. package/src/model/connection/deployment/index.ts +0 -8
  185. package/src/model/connection/index.ts +0 -22
  186. package/src/model/connection/model/ConnectionModel.ts +0 -158
  187. package/src/model/connection/model/find.ts +0 -117
  188. package/src/model/connection/model/index.ts +0 -8
  189. package/src/model/connection/ops.ts +0 -276
  190. package/src/model/guards.ts +0 -77
  191. package/src/model/index.ts +0 -72
  192. package/src/model/types.ts +0 -67
  193. package/src/model/utils.ts +0 -66
  194. package/src/model/view/EdgeModel.ts +0 -120
  195. package/src/model/view/LikeC4ViewModel.ts +0 -361
  196. package/src/model/view/LikeC4ViewsFolder.ts +0 -151
  197. package/src/model/view/NodeModel.ts +0 -247
  198. package/src/theme/element.ts +0 -61
  199. package/src/theme/index.ts +0 -127
  200. package/src/theme/relationships.ts +0 -54
  201. package/src/types/RichText.ts +0 -206
  202. package/src/types/_aux.ts +0 -291
  203. package/src/types/_common.ts +0 -80
  204. package/src/types/const.ts +0 -34
  205. package/src/types/expression-model.ts +0 -294
  206. package/src/types/expression.ts +0 -313
  207. package/src/types/fqnRef.ts +0 -91
  208. package/src/types/geometry.ts +0 -159
  209. package/src/types/global.ts +0 -21
  210. package/src/types/index.ts +0 -42
  211. package/src/types/model-data.ts +0 -77
  212. package/src/types/model-deployment.ts +0 -88
  213. package/src/types/model-dump.ts +0 -79
  214. package/src/types/model-logical.ts +0 -135
  215. package/src/types/model-spec.ts +0 -85
  216. package/src/types/operators.ts +0 -156
  217. package/src/types/project.ts +0 -14
  218. package/src/types/scalar.ts +0 -162
  219. package/src/types/styles.ts +0 -122
  220. package/src/types/view-changes.ts +0 -32
  221. package/src/types/view-common.ts +0 -157
  222. package/src/types/view-computed.ts +0 -118
  223. package/src/types/view-layouted.ts +0 -98
  224. package/src/types/view-parsed.deployment.ts +0 -39
  225. package/src/types/view-parsed.dynamic.ts +0 -89
  226. package/src/types/view-parsed.element.ts +0 -65
  227. package/src/types/view.ts +0 -113
  228. package/src/utils/common-head.ts +0 -22
  229. package/src/utils/compare-natural.ts +0 -60
  230. package/src/utils/const.ts +0 -1
  231. package/src/utils/fqn.ts +0 -302
  232. package/src/utils/getOrCreate.ts +0 -8
  233. package/src/utils/guards.ts +0 -9
  234. package/src/utils/index.ts +0 -68
  235. package/src/utils/invariant.ts +0 -29
  236. package/src/utils/iterable/_types.ts +0 -5
  237. package/src/utils/iterable/filter.ts +0 -55
  238. package/src/utils/iterable/find.ts +0 -38
  239. package/src/utils/iterable/first.ts +0 -48
  240. package/src/utils/iterable/flat.ts +0 -17
  241. package/src/utils/iterable/head.ts +0 -22
  242. package/src/utils/iterable/index.ts +0 -15
  243. package/src/utils/iterable/map.ts +0 -40
  244. package/src/utils/iterable/reduce.ts +0 -24
  245. package/src/utils/iterable/some.ts +0 -36
  246. package/src/utils/iterable/to.ts +0 -19
  247. package/src/utils/iterable/unique.ts +0 -23
  248. package/src/utils/markdown/index.ts +0 -2
  249. package/src/utils/markdown/to-html.ts +0 -32
  250. package/src/utils/markdown/to-text.ts +0 -14
  251. package/src/utils/memoize-prop.ts +0 -30
  252. package/src/utils/mnemonist.ts +0 -9
  253. package/src/utils/object-hash.ts +0 -14
  254. package/src/utils/promises.ts +0 -24
  255. package/src/utils/relations.ts +0 -36
  256. package/src/utils/set.ts +0 -83
  257. package/src/utils/string-hash.ts +0 -16
@@ -1,107 +0,0 @@
1
- import { isEmpty, isNullish, omitBy } from 'remeda'
2
- import {
3
- type AnyAux,
4
- type ComputedNode,
5
- type ElementViewRule,
6
- type ModelExpression,
7
- isGroupElementKind,
8
- isViewRuleGroup,
9
- isViewRulePredicate,
10
- ModelFqnExpr,
11
- } from '../../types'
12
- import { elementExprToPredicate } from './elementExpressionToPredicate'
13
-
14
- export function flattenGroupRules<A extends AnyAux, T extends ModelExpression<A>>(
15
- guard: (expr: ModelExpression<A>) => expr is T,
16
- ) {
17
- return (rule: ElementViewRule<A>): Array<T> => {
18
- if (isViewRuleGroup(rule)) {
19
- return rule.groupRules.flatMap(flattenGroupRules(guard))
20
- }
21
- if (isViewRulePredicate(rule)) {
22
- return 'include' in rule ? rule.include.filter(guard) : []
23
- }
24
-
25
- return []
26
- }
27
- }
28
-
29
- export function applyCustomElementProperties<A extends AnyAux>(
30
- _rules: ElementViewRule<A>[],
31
- _nodes: ComputedNode<A>[],
32
- ) {
33
- const rules = _rules.flatMap(flattenGroupRules(ModelFqnExpr.isCustom))
34
- if (rules.length === 0) {
35
- return _nodes
36
- }
37
- const nodes = [..._nodes]
38
- for (
39
- const {
40
- custom: { expr, ...props },
41
- } of rules
42
- ) {
43
- const {
44
- border,
45
- opacity,
46
- multiple,
47
- padding,
48
- size,
49
- textSize,
50
- description,
51
- ...rest
52
- } = omitBy(props, isNullish)
53
- const notEmpty = !isEmpty(rest)
54
- const satisfies = elementExprToPredicate(expr)
55
- nodes.forEach((node, i) => {
56
- if (isGroupElementKind(node) || !satisfies(node)) {
57
- return
58
- }
59
- if (notEmpty) {
60
- node = {
61
- ...node,
62
- isCustomized: true,
63
- ...rest,
64
- }
65
- }
66
- if (description !== undefined) {
67
- node = {
68
- ...node,
69
- isCustomized: true,
70
- description,
71
- }
72
- }
73
-
74
- let styleOverride: ComputedNode['style'] | undefined
75
- if (border !== undefined) {
76
- styleOverride = { border }
77
- }
78
- if (opacity !== undefined) {
79
- styleOverride = { ...styleOverride, opacity }
80
- }
81
- if (multiple !== undefined) {
82
- styleOverride = { ...styleOverride, multiple }
83
- }
84
- if (padding !== undefined) {
85
- styleOverride = { ...styleOverride, padding }
86
- }
87
- if (size !== undefined) {
88
- styleOverride = { ...styleOverride, size }
89
- }
90
- if (textSize !== undefined) {
91
- styleOverride = { ...styleOverride, textSize }
92
- }
93
- if (styleOverride) {
94
- node = {
95
- ...node,
96
- isCustomized: true,
97
- style: {
98
- ...node.style,
99
- ...styleOverride,
100
- },
101
- }
102
- }
103
- nodes[i] = node
104
- })
105
- }
106
- return nodes
107
- }
@@ -1,58 +0,0 @@
1
- import { isNullish, omitBy, pick } from 'remeda'
2
- import { type AnyAux, type ComputedEdge, type ComputedNode, type ElementViewRule, ModelRelationExpr } from '../../types'
3
- import { flattenGroupRules } from './applyCustomElementProperties'
4
- import { relationExpressionToPredicates } from './relationExpressionToPredicates'
5
-
6
- export function applyCustomRelationProperties<A extends AnyAux>(
7
- _rules: ElementViewRule<A>[],
8
- nodes: ComputedNode<A>[],
9
- _edges: Iterable<ComputedEdge<A>>,
10
- ): ComputedEdge<A>[] {
11
- const rules = _rules.flatMap(flattenGroupRules(ModelRelationExpr.isCustom))
12
- const edges = Array.from(_edges)
13
- if (rules.length === 0 || edges.length === 0) {
14
- return edges
15
- }
16
- for (
17
- const {
18
- customRelation: {
19
- expr,
20
- title,
21
- description,
22
- notes,
23
- ...customprops
24
- },
25
- } of rules
26
- ) {
27
- const props = omitBy(customprops, isNullish)
28
- const satisfies = relationExpressionToPredicates(expr)
29
- edges.forEach((edge, i) => {
30
- let source, target
31
- for (const node of nodes) {
32
- if (node.id === edge.source) {
33
- source = node
34
- }
35
- if (node.id === edge.target) {
36
- target = node
37
- }
38
- if (source && target) {
39
- break
40
- }
41
- }
42
- if (!source || !target) {
43
- return
44
- }
45
- if (satisfies({ source, target, ...pick(edge, ['kind', 'tags']) })) {
46
- edges[i] = {
47
- ...edge,
48
- ...props,
49
- ...description && { description: { txt: description } },
50
- ...notes && { notes: { txt: notes } },
51
- label: title ?? edge.label,
52
- isCustomized: true,
53
- }
54
- }
55
- })
56
- }
57
- return edges
58
- }
@@ -1,73 +0,0 @@
1
- import { anyPass, filter, forEach, isDefined, isNot, pipe } from 'remeda'
2
- import {
3
- type AnyAux,
4
- type AnyViewRuleStyle,
5
- type ComputedNode,
6
- type ElementViewRule,
7
- isGroupElementKind,
8
- isViewRuleStyle,
9
- } from '../../types'
10
- import { elementExprToPredicate } from './elementExpressionToPredicate'
11
-
12
- type Predicate<T> = (x: T) => boolean
13
-
14
- export function applyViewRuleStyle<A extends AnyAux>(
15
- rule: Pick<AnyViewRuleStyle<A>, 'style' | 'notation'>,
16
- predicates: Predicate<ComputedNode<A>>[],
17
- nodes: ComputedNode<A>[],
18
- ): void {
19
- pipe(
20
- nodes,
21
- filter(isNot(isGroupElementKind)),
22
- filter(anyPass(predicates)),
23
- forEach(n => {
24
- n.shape = rule.style.shape ?? n.shape
25
- n.color = rule.style.color ?? n.color
26
- if (isDefined(rule.style.icon)) {
27
- n.icon = rule.style.icon
28
- }
29
- if (isDefined(rule.notation)) {
30
- n.notation = rule.notation
31
- }
32
- let styleOverride: ComputedNode['style'] | undefined
33
- if (isDefined(rule.style.border)) {
34
- styleOverride = { border: rule.style.border }
35
- }
36
- if (isDefined(rule.style.opacity)) {
37
- styleOverride = { ...styleOverride, opacity: rule.style.opacity }
38
- }
39
- if (isDefined(rule.style.multiple)) {
40
- styleOverride = { ...styleOverride, multiple: rule.style.multiple }
41
- }
42
- if (isDefined(rule.style.padding)) {
43
- styleOverride = { ...styleOverride, padding: rule.style.padding }
44
- }
45
- if (isDefined(rule.style.size)) {
46
- styleOverride = { ...styleOverride, size: rule.style.size }
47
- }
48
- if (isDefined(rule.style.textSize)) {
49
- styleOverride = { ...styleOverride, textSize: rule.style.textSize }
50
- }
51
- if (styleOverride) {
52
- n.style = {
53
- ...n.style,
54
- ...styleOverride,
55
- }
56
- }
57
- }),
58
- )
59
- }
60
-
61
- export function applyViewRuleStyles<A extends AnyAux, N extends ComputedNode<A>[]>(
62
- rules: ElementViewRule<A>[],
63
- nodes: N,
64
- ): N {
65
- for (const rule of rules) {
66
- if (!isViewRuleStyle(rule) || rule.targets.length === 0) {
67
- continue
68
- }
69
- const predicates = rule.targets.map(elementExprToPredicate)
70
- applyViewRuleStyle(rule, predicates, nodes)
71
- }
72
- return nodes
73
- }
@@ -1,153 +0,0 @@
1
- import type { Simplify } from 'type-fest'
2
- import type { ElementModel } from '../../model'
3
- import {
4
- type AnyAux,
5
- type aux,
6
- type ComputedNode,
7
- type Element,
8
- type scalar,
9
- type Unknown,
10
- DefaultElementShape,
11
- DefaultThemeColor,
12
- GroupElementKind,
13
- } from '../../types'
14
- import { nonNullable } from '../../utils'
15
- import { compareByFqnHierarchically, parentFqn } from '../../utils/fqn'
16
- import { NodesGroup } from '../element-view/memory'
17
-
18
- function updateDepthOfAncestors(node: ComputedNode, nodes: ReadonlyMap<string, ComputedNode>) {
19
- let parentNd
20
- while (!!node.parent && (parentNd = nodes.get(node.parent))) {
21
- const depth = parentNd.depth ?? 1
22
- parentNd.depth = Math.max(depth, (node.depth ?? 0) + 1)
23
- if (parentNd.depth === depth) {
24
- // stop if we didn't change depth
25
- break
26
- }
27
- node = parentNd
28
- }
29
- }
30
-
31
- export type ComputedNodeSource<A extends AnyAux = Unknown> = Simplify<
32
- & Pick<ComputedNode<A>, 'id' | 'title' | 'description' | 'kind' | 'deploymentRef' | 'modelRef'>
33
- & Partial<Omit<Element<A>, 'id' | 'title' | 'description' | 'kind'>>
34
- >
35
-
36
- export function elementModelToNodeSource<A extends AnyAux>(el: ElementModel<A>): ComputedNodeSource<A> {
37
- return {
38
- ...el.$element,
39
- tags: [...el.tags],
40
- id: el.id as scalar.NodeId,
41
- modelRef: el.id,
42
- }
43
- }
44
-
45
- export function buildComputedNodes<A extends AnyAux>(
46
- elements: ReadonlyArray<ComputedNodeSource<A>>,
47
- groups?: ReadonlyArray<NodesGroup<A>>,
48
- ): ReadonlyMap<scalar.NodeId, ComputedNode<A>> {
49
- const nodesMap = new Map<scalar.NodeId, ComputedNode<A>>()
50
-
51
- const elementToGroup = new Map<aux.StrictFqn<A>, scalar.NodeId>()
52
-
53
- groups?.forEach(({ id, parent, viewRule, elements }) => {
54
- if (parent) {
55
- nonNullable(nodesMap.get(parent), `Parent group node ${parent} not found`).children.push(id)
56
- }
57
- nodesMap.set(id, {
58
- id,
59
- parent,
60
- kind: GroupElementKind,
61
- title: viewRule.title ?? '',
62
- description: null,
63
- technology: null,
64
- color: viewRule.color ?? 'muted',
65
- shape: 'rectangle',
66
- children: [],
67
- inEdges: [],
68
- outEdges: [],
69
- level: 0,
70
- depth: 0,
71
- tags: [],
72
- style: {
73
- border: viewRule.border ?? 'dashed',
74
- opacity: viewRule.opacity ?? 0,
75
- size: viewRule.size ?? 'md',
76
- multiple: viewRule.multiple ?? false,
77
- padding: viewRule.padding ?? 'md',
78
- textSize: viewRule.textSize ?? 'md',
79
- },
80
- })
81
- for (const e of elements) {
82
- elementToGroup.set(e.id, id)
83
- }
84
- })
85
-
86
- // Ensure that parent nodes are created before child nodes
87
- Array.from(elements)
88
- .sort(compareByFqnHierarchically)
89
- .forEach(({ id, style, kind, title, color, shape, tags, notation, ...el }) => {
90
- let parent = parentFqn(id)
91
- let level = 0
92
- let parentNd: ComputedNode<A> | undefined
93
- // Find the first ancestor that is already in the map
94
- while (parent) {
95
- parentNd = nodesMap.get(parent)
96
- if (parentNd) {
97
- break
98
- }
99
- parent = parentFqn(parent)
100
- }
101
- const fqn = el.modelRef ?? id as unknown as aux.StrictFqn<A>
102
- // If parent is not found in the map, check if it is in a group
103
- if (!parentNd && elementToGroup.has(fqn)) {
104
- const parentGroupId = nonNullable(elementToGroup.get(fqn))
105
- parentNd = nodesMap.get(parentGroupId)
106
- parent = parentGroupId
107
- }
108
- if (parentNd) {
109
- // if parent has no children and we are about to add first one
110
- // we need to set its depth to 1
111
- if (parentNd.children.length == 0) {
112
- parentNd.depth = 1
113
- // go up the tree and update depth of all parents
114
- updateDepthOfAncestors(parentNd, nodesMap)
115
- }
116
- parentNd.children.push(id)
117
- level = parentNd.level + 1
118
- }
119
- const node: ComputedNode<A> = {
120
- id,
121
- parent,
122
- kind,
123
- title,
124
- description: null,
125
- technology: null,
126
- level,
127
- color: color ?? DefaultThemeColor,
128
- shape: shape ?? DefaultElementShape,
129
- tags: tags ?? [],
130
- children: [],
131
- inEdges: [],
132
- outEdges: [],
133
- ...notation && { notation },
134
- ...el,
135
- style: {
136
- ...style,
137
- },
138
- }
139
- nodesMap.set(id, node)
140
- })
141
-
142
- // Create new map and add elements in the same order as they were in the input
143
- const orderedMap = new Map<aux.NodeId, ComputedNode<A>>()
144
-
145
- groups?.forEach(({ id }) => {
146
- orderedMap.set(id, nonNullable(nodesMap.get(id)))
147
- })
148
- elements.forEach(({ id }) => {
149
- orderedMap.set(id, nonNullable(nodesMap.get(id)))
150
- })
151
-
152
- return orderedMap
153
- }
@@ -1,63 +0,0 @@
1
- import { entries, flatMap, groupBy, map, mapValues, pipe, piped, prop, sortBy, unique } from 'remeda'
2
- import type { ComputedNode, NodeNotation } from '../../types'
3
-
4
- /**
5
- * Build element notations from computed nodes:
6
- * 1. Group by notation
7
- * 2. Group by shape
8
- * 3. Group by color
9
- * 4. For each group get unique kinds
10
- * 5. Unwind the groups
11
- */
12
- export function buildElementNotations(nodes: ComputedNode<any>[]): NodeNotation[] {
13
- return pipe(
14
- nodes,
15
- groupBy(prop('notation')),
16
- mapValues(
17
- piped(
18
- groupBy(prop('shape')),
19
- mapValues(
20
- piped(
21
- groupBy(prop('color')),
22
- mapValues(
23
- piped(
24
- map(prop('kind')),
25
- unique(),
26
- ),
27
- ),
28
- entries(),
29
- map(([color, kinds]) => ({
30
- kinds,
31
- color,
32
- })),
33
- ),
34
- ),
35
- entries(),
36
- flatMap(([shape, colors]) =>
37
- colors.map(({ color, kinds }) => ({
38
- shape,
39
- color,
40
- kinds,
41
- }))
42
- ),
43
- ),
44
- ),
45
- entries(),
46
- flatMap(([title, shapes]) =>
47
- shapes.map(({ shape, color, kinds }) => ({
48
- title,
49
- shape,
50
- color,
51
- kinds,
52
- }))
53
- ),
54
- sortBy(
55
- prop('shape'),
56
- prop('title'),
57
- [
58
- n => n.kinds.length,
59
- 'desc',
60
- ],
61
- ),
62
- )
63
- }
@@ -1,50 +0,0 @@
1
- import {
2
- FqnRef,
3
- ModelFqnExpr,
4
- whereOperatorAsPredicate,
5
- } from '../../types'
6
- import { nonexhaustive, parentFqn } from '../../utils'
7
-
8
- type Predicate<T> = (x: T) => boolean
9
-
10
- export function elementExprToPredicate<T extends { id: string; tags: readonly string[]; kind: string }>(
11
- target: ModelFqnExpr.Any,
12
- ): Predicate<T> {
13
- if (ModelFqnExpr.isCustom(target)) {
14
- return elementExprToPredicate(target.custom.expr)
15
- }
16
- if (ModelFqnExpr.isWhere(target)) {
17
- const predicate = elementExprToPredicate(target.where.expr)
18
- const where = whereOperatorAsPredicate(target.where.condition)
19
- return n => predicate(n) && where(n)
20
- }
21
- if (ModelFqnExpr.isElementKindExpr(target)) {
22
- return target.isEqual ? n => n.kind === target.elementKind : n => n.kind !== target.elementKind
23
- }
24
- if (ModelFqnExpr.isElementTagExpr(target)) {
25
- return target.isEqual
26
- ? ({ tags }) => tags.includes(target.elementTag)
27
- : ({ tags }) => !tags.includes(target.elementTag)
28
- }
29
- if (ModelFqnExpr.isWildcard(target)) {
30
- return () => true
31
- }
32
- if (ModelFqnExpr.isModelRef(target)) {
33
- const fqn = FqnRef.flatten(target.ref)
34
- if (target.selector === 'expanded') {
35
- return (n) => {
36
- return n.id === fqn || parentFqn(n.id) === fqn
37
- }
38
- }
39
- if (target.selector === 'descendants' || target.selector === 'children') {
40
- const fqnWithDot = fqn + '.'
41
- return (n) => {
42
- return n.id.startsWith(fqnWithDot)
43
- }
44
- }
45
- return (n) => {
46
- return n.id === fqn
47
- }
48
- }
49
- nonexhaustive(target)
50
- }
@@ -1,56 +0,0 @@
1
- import { last, reverse } from 'remeda'
2
- import type { AnyAux, ComputedEdge, ComputedNode } from '../../types'
3
- import { invariant } from '../../utils'
4
- import { commonHead } from '../../utils/common-head'
5
- import { ancestorsOfNode } from './ancestorsOfNode'
6
-
7
- /**
8
- * Update `inEdges` and `outEdges` props of nodes based on the edges
9
- * Mutates nodes and updates their in/out edges
10
- */
11
- export function linkNodesWithEdges<A extends AnyAux>(
12
- nodesMap: ReadonlyMap<any, ComputedNode<A>>,
13
- edges: ComputedEdge<A>[],
14
- ) {
15
- for (const edge of edges) {
16
- const source = nodesMap.get(edge.source)
17
- const target = nodesMap.get(edge.target)
18
- invariant(source, `Source node ${edge.source} not found`)
19
- invariant(target, `Target node ${edge.target} not found`)
20
-
21
- source.outEdges.push(edge.id)
22
- target.inEdges.push(edge.id)
23
-
24
- // These ancestors are reversed: from bottom to top
25
- // Ensure that ancestors are in computed nodes
26
- const sourceAncestors = ancestorsOfNode(source, nodesMap)
27
- const targetAncestors = ancestorsOfNode(target, nodesMap)
28
-
29
- const hasAncestors = sourceAncestors.length > 0 && targetAncestors.length > 0
30
-
31
- const edgeParent = hasAncestors
32
- ? last(
33
- commonHead(
34
- reverse(sourceAncestors),
35
- reverse(targetAncestors),
36
- ),
37
- )
38
- : null
39
- edge.parent = edgeParent ? edgeParent.id : null
40
-
41
- // Process edge source ancestors
42
- for (const sourceAncestor of sourceAncestors) {
43
- if (sourceAncestor === edgeParent) {
44
- break
45
- }
46
- sourceAncestor.outEdges.push(edge.id)
47
- }
48
- // Process target hierarchy
49
- for (const targetAncestor of targetAncestors) {
50
- if (targetAncestor === edgeParent) {
51
- break
52
- }
53
- targetAncestor.inEdges.push(edge.id)
54
- }
55
- }
56
- }