@likec4/core 1.41.0 → 1.42.1

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 (255) 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 +13 -11
  5. package/dist/builder/index.mjs +111 -91
  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 +11 -11
  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.Ae86Y3tB.mjs → core.01VTr9qu.mjs} +8 -26
  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.DA5vzwZ9.mjs → core.BIqHjQiH.mjs} +56 -42
  25. package/dist/shared/core.BKlholso.mjs +3 -0
  26. package/dist/shared/core.BR4zXDH-.mjs +13 -0
  27. package/dist/shared/{core.CXy1NLUG.mjs → core.BYNkXQ8A.mjs} +21 -12
  28. package/dist/shared/{core.BuoXfSMj.mjs → core.BbE4y-yl.mjs} +1 -1
  29. package/dist/shared/core.BoYfZOBm.mjs +3 -0
  30. package/dist/shared/core.BsSXS-_R.mjs +7 -0
  31. package/dist/shared/{core.DJp8fgok.mjs → core.BzTakU3I.mjs} +14 -10
  32. package/dist/shared/{core.4u1dVmfX.mjs → core.C2TiyjI6.mjs} +2 -2
  33. package/dist/shared/{core.DLpidoWc.mjs → core.C3JowhaZ.mjs} +3 -3
  34. package/dist/shared/{core.CNGyqkJh.mjs → core.C4x8aaWa.mjs} +3 -1
  35. package/dist/shared/{core.BB6zA-UU.mjs → core.C8YY6Uub.mjs} +38 -9
  36. package/dist/shared/{core.Asc11Mjy.mjs → core.C8sl5Y8Z.mjs} +122 -58
  37. package/dist/shared/{core.BvMRMo7Z.mjs → core.CNgZvKb8.mjs} +3 -5198
  38. package/dist/shared/{core.CUG6vpyL.d.mts → core.CQngdcuj.d.mts} +85 -4
  39. package/dist/shared/{core.Be1n9a0i.mjs → core.C_Ni6yHl.mjs} +5 -4
  40. package/dist/shared/core.CbT8JVYL.mjs +5 -0
  41. package/dist/shared/core.CqAJJpK_.mjs +3 -0
  42. package/dist/shared/{core.BXsxn-hf.d.mts → core.D0PjZzIS.d.mts} +27 -15
  43. package/dist/shared/{core.DgesAwC8.d.mts → core.D5fzJWbF.d.mts} +2 -2
  44. package/dist/shared/{core.hfOE3RfK.d.mts → core.DACpKp35.d.mts} +5 -5
  45. package/dist/shared/core.DFi2dOTl.mjs +39548 -0
  46. package/dist/shared/{core.xSQO0XYD.d.mts → core.DIol3syK.d.mts} +2 -2
  47. package/dist/shared/{core.DlG1xWt2.mjs → core.DMMOWQqc.mjs} +3 -2
  48. package/dist/shared/core.DNbUPnve.mjs +3990 -0
  49. package/dist/shared/{core.CCD1ID81.mjs → core.DRJma0Ol.mjs} +4 -3
  50. package/dist/shared/{core.DgttqsJc.mjs → core.DRhg-gVU.mjs} +9 -9
  51. package/dist/shared/core.DSO_rTC2.mjs +5322 -0
  52. package/dist/shared/{core.FUPplpae.d.mts → core.D_vkffV4.d.mts} +4 -2
  53. package/dist/shared/core.DdMJk7nx.d.mts +476 -0
  54. package/dist/shared/{core.BhpgpOep.d.mts → core.Dgs6-nuz.d.mts} +2 -2
  55. package/dist/shared/{core.Be4Jy9Qx.mjs → core.FZ305VYd.mjs} +2 -2
  56. package/dist/shared/core.OHD4KXm9.mjs +5 -0
  57. package/dist/shared/{core.GTgsmXS_.mjs → core.QJD_fcrc.mjs} +2 -2
  58. package/dist/shared/core.RfnaEmgA.mjs +7 -0
  59. package/dist/shared/core.fHR_8Tnq.d.mts +450 -0
  60. package/dist/shared/{core.D0EgVMQK.mjs → core.lRvxPoao.mjs} +14 -12
  61. package/dist/shared/{core.CaT0SUUK.mjs → core.rCeaAqgW.mjs} +1 -84
  62. package/dist/shared/{core.zxTBF_PD.d.mts → core.s9uwOt60.d.mts} +4 -4
  63. package/dist/shared/core.yna0OdV5.d.mts +98 -0
  64. package/dist/styles/index.d.mts +106 -0
  65. package/dist/styles/index.mjs +1 -0
  66. package/dist/types/_aux.d.mts +2 -2
  67. package/dist/types/expression-model.d.mts +3 -4
  68. package/dist/types/expression.d.mts +3 -4
  69. package/dist/types/fqnRef.d.mts +2 -2
  70. package/dist/types/fqnRef.mjs +3 -3
  71. package/dist/types/index.d.mts +8 -8
  72. package/dist/types/index.mjs +150 -5
  73. package/dist/types/scalar.mjs +3 -2
  74. package/dist/utils/graphology/index.d.mts +1864 -0
  75. package/dist/utils/graphology/index.mjs +1 -0
  76. package/dist/utils/index.d.mts +11 -6
  77. package/dist/utils/index.mjs +21 -37
  78. package/dist/utils/iterable/index.d.mts +1 -1
  79. package/dist/utils/iterable/index.mjs +45 -7
  80. package/model/package.json +4 -0
  81. package/package.json +42 -24
  82. package/styles/package.json +4 -0
  83. package/types/package.json +4 -0
  84. package/utils/graphology/package.json +4 -0
  85. package/utils/package.json +4 -0
  86. package/dist/shared/core.6_Vp2iiN.mjs +0 -172
  87. package/dist/shared/core.CUw_2J9j.mjs +0 -47
  88. package/dist/shared/core.CzdwsPmY.d.mts +0 -69
  89. package/dist/shared/core.D-ZGWDDt.d.mts +0 -831
  90. package/dist/shared/core.DoM6aM9N.mjs +0 -7
  91. package/dist/shared/core.ILwny7BV.mjs +0 -38
  92. package/dist/theme/index.d.mts +0 -11
  93. package/dist/theme/index.mjs +0 -232
  94. package/src/builder/Builder.deployment.ts +0 -224
  95. package/src/builder/Builder.deploymentModel.ts +0 -449
  96. package/src/builder/Builder.element.ts +0 -241
  97. package/src/builder/Builder.model.ts +0 -494
  98. package/src/builder/Builder.ts +0 -946
  99. package/src/builder/Builder.view-common.ts +0 -273
  100. package/src/builder/Builder.view-deployment.ts +0 -135
  101. package/src/builder/Builder.view-element.ts +0 -202
  102. package/src/builder/Builder.views.ts +0 -399
  103. package/src/builder/Builder.with.ts +0 -156
  104. package/src/builder/_types.ts +0 -324
  105. package/src/builder/index.ts +0 -11
  106. package/src/compute-view/compute-view.ts +0 -80
  107. package/src/compute-view/deployment-view/_types.ts +0 -38
  108. package/src/compute-view/deployment-view/clean-connections.ts +0 -236
  109. package/src/compute-view/deployment-view/compute.ts +0 -94
  110. package/src/compute-view/deployment-view/memory/index.ts +0 -9
  111. package/src/compute-view/deployment-view/memory/memory.ts +0 -96
  112. package/src/compute-view/deployment-view/predicates/deploymentRefs-where.ts +0 -18
  113. package/src/compute-view/deployment-view/predicates/deploymentRefs.ts +0 -154
  114. package/src/compute-view/deployment-view/predicates/index.ts +0 -8
  115. package/src/compute-view/deployment-view/predicates/relation-direct.ts +0 -243
  116. package/src/compute-view/deployment-view/predicates/relation-in-out.ts +0 -70
  117. package/src/compute-view/deployment-view/predicates/relation-incoming.ts +0 -101
  118. package/src/compute-view/deployment-view/predicates/relation-outgoing.ts +0 -95
  119. package/src/compute-view/deployment-view/predicates/relation-where.ts +0 -18
  120. package/src/compute-view/deployment-view/predicates/utils.ts +0 -282
  121. package/src/compute-view/deployment-view/predicates/wildcard.ts +0 -41
  122. package/src/compute-view/deployment-view/stages/stage-exclude.ts +0 -5
  123. package/src/compute-view/deployment-view/stages/stage-final.ts +0 -245
  124. package/src/compute-view/deployment-view/stages/stage-include.ts +0 -95
  125. package/src/compute-view/deployment-view/utils.ts +0 -297
  126. package/src/compute-view/dynamic-view/compute.ts +0 -312
  127. package/src/compute-view/element-view/_types.ts +0 -47
  128. package/src/compute-view/element-view/clean-connections.ts +0 -117
  129. package/src/compute-view/element-view/compute.ts +0 -324
  130. package/src/compute-view/element-view/memory/NodeGroup.ts +0 -31
  131. package/src/compute-view/element-view/memory/index.ts +0 -10
  132. package/src/compute-view/element-view/memory/memory.ts +0 -178
  133. package/src/compute-view/element-view/memory/stage-exclude.ts +0 -59
  134. package/src/compute-view/element-view/memory/stage-final.ts +0 -129
  135. package/src/compute-view/element-view/memory/stage-include.ts +0 -130
  136. package/src/compute-view/element-view/predicates/_utils.ts +0 -91
  137. package/src/compute-view/element-view/predicates/element-expand.ts +0 -29
  138. package/src/compute-view/element-view/predicates/element-kind-tag.ts +0 -27
  139. package/src/compute-view/element-view/predicates/element-ref.ts +0 -24
  140. package/src/compute-view/element-view/predicates/relation-direct.ts +0 -321
  141. package/src/compute-view/element-view/predicates/relation-in-out.ts +0 -64
  142. package/src/compute-view/element-view/predicates/relation-in.ts +0 -115
  143. package/src/compute-view/element-view/predicates/relation-out.ts +0 -119
  144. package/src/compute-view/element-view/predicates/wildcard.ts +0 -88
  145. package/src/compute-view/element-view/utils.ts +0 -65
  146. package/src/compute-view/index.ts +0 -4
  147. package/src/compute-view/memory/AbstractMemory.ts +0 -45
  148. package/src/compute-view/memory/AbstractStageExclude.ts +0 -215
  149. package/src/compute-view/memory/AbstractStageInclude.ts +0 -200
  150. package/src/compute-view/memory/_types.ts +0 -148
  151. package/src/compute-view/memory/index.ts +0 -5
  152. package/src/compute-view/memory/ops.ts +0 -43
  153. package/src/compute-view/relationships-view/_types.ts +0 -16
  154. package/src/compute-view/relationships-view/compute.ts +0 -159
  155. package/src/compute-view/relationships-view/index.ts +0 -3
  156. package/src/compute-view/relationships-view/layout.ts +0 -358
  157. package/src/compute-view/relationships-view/utils.ts +0 -73
  158. package/src/compute-view/utils/ancestorsOfNode.ts +0 -19
  159. package/src/compute-view/utils/applyCustomElementProperties.ts +0 -107
  160. package/src/compute-view/utils/applyCustomRelationProperties.ts +0 -58
  161. package/src/compute-view/utils/applyViewRuleStyles.ts +0 -73
  162. package/src/compute-view/utils/buildComputedNodes.ts +0 -166
  163. package/src/compute-view/utils/buildElementNotations.ts +0 -64
  164. package/src/compute-view/utils/elementExpressionToPredicate.ts +0 -50
  165. package/src/compute-view/utils/link-nodes-with-edges.ts +0 -56
  166. package/src/compute-view/utils/merge-props-from-relationships.ts +0 -161
  167. package/src/compute-view/utils/relationExpressionToPredicates.ts +0 -55
  168. package/src/compute-view/utils/resolve-extended-views.ts +0 -85
  169. package/src/compute-view/utils/resolve-global-rules.ts +0 -88
  170. package/src/compute-view/utils/topological-sort.ts +0 -256
  171. package/src/compute-view/utils/view-hash.ts +0 -45
  172. package/src/compute-view/utils/with-readable-edges.ts +0 -40
  173. package/src/index.ts +0 -32
  174. package/src/model/DeploymentElementModel.ts +0 -712
  175. package/src/model/DeploymentModel.ts +0 -393
  176. package/src/model/ElementModel.ts +0 -316
  177. package/src/model/LikeC4Model.ts +0 -882
  178. package/src/model/RelationModel.ts +0 -152
  179. package/src/model/connection/Connection.ts +0 -72
  180. package/src/model/connection/deployment/DeploymentConnectionModel.ts +0 -185
  181. package/src/model/connection/deployment/find.ts +0 -120
  182. package/src/model/connection/deployment/index.ts +0 -8
  183. package/src/model/connection/index.ts +0 -22
  184. package/src/model/connection/model/ConnectionModel.ts +0 -158
  185. package/src/model/connection/model/find.ts +0 -117
  186. package/src/model/connection/model/index.ts +0 -8
  187. package/src/model/connection/ops.ts +0 -276
  188. package/src/model/guards.ts +0 -77
  189. package/src/model/index.ts +0 -72
  190. package/src/model/types.ts +0 -67
  191. package/src/model/utils.ts +0 -66
  192. package/src/model/view/EdgeModel.ts +0 -121
  193. package/src/model/view/LikeC4ViewModel.ts +0 -361
  194. package/src/model/view/LikeC4ViewsFolder.ts +0 -151
  195. package/src/model/view/NodeModel.ts +0 -247
  196. package/src/theme/element.ts +0 -61
  197. package/src/theme/index.ts +0 -127
  198. package/src/theme/relationships.ts +0 -54
  199. package/src/types/RichText.ts +0 -205
  200. package/src/types/_aux.ts +0 -317
  201. package/src/types/_common.ts +0 -102
  202. package/src/types/const.ts +0 -34
  203. package/src/types/expression-model.ts +0 -294
  204. package/src/types/expression.ts +0 -313
  205. package/src/types/fqnRef.ts +0 -91
  206. package/src/types/geometry.ts +0 -159
  207. package/src/types/global.ts +0 -21
  208. package/src/types/index.ts +0 -44
  209. package/src/types/model-data.ts +0 -77
  210. package/src/types/model-deployment.ts +0 -78
  211. package/src/types/model-dump.ts +0 -79
  212. package/src/types/model-logical.ts +0 -126
  213. package/src/types/model-spec.ts +0 -88
  214. package/src/types/operators.ts +0 -156
  215. package/src/types/project.ts +0 -14
  216. package/src/types/scalar.ts +0 -162
  217. package/src/types/styles.ts +0 -122
  218. package/src/types/view-changes.ts +0 -32
  219. package/src/types/view-common.ts +0 -157
  220. package/src/types/view-computed.ts +0 -126
  221. package/src/types/view-layouted.ts +0 -94
  222. package/src/types/view-parsed.deployment.ts +0 -39
  223. package/src/types/view-parsed.dynamic.ts +0 -89
  224. package/src/types/view-parsed.element.ts +0 -65
  225. package/src/types/view.ts +0 -113
  226. package/src/utils/common-head.ts +0 -22
  227. package/src/utils/compare-natural.ts +0 -60
  228. package/src/utils/const.ts +0 -1
  229. package/src/utils/fqn.ts +0 -302
  230. package/src/utils/getOrCreate.ts +0 -8
  231. package/src/utils/guards.ts +0 -9
  232. package/src/utils/index.ts +0 -68
  233. package/src/utils/invariant.ts +0 -29
  234. package/src/utils/iterable/_types.ts +0 -5
  235. package/src/utils/iterable/filter.ts +0 -55
  236. package/src/utils/iterable/find.ts +0 -38
  237. package/src/utils/iterable/first.ts +0 -48
  238. package/src/utils/iterable/flat.ts +0 -17
  239. package/src/utils/iterable/head.ts +0 -22
  240. package/src/utils/iterable/index.ts +0 -15
  241. package/src/utils/iterable/map.ts +0 -40
  242. package/src/utils/iterable/reduce.ts +0 -24
  243. package/src/utils/iterable/some.ts +0 -36
  244. package/src/utils/iterable/to.ts +0 -19
  245. package/src/utils/iterable/unique.ts +0 -23
  246. package/src/utils/markdown/index.ts +0 -2
  247. package/src/utils/markdown/to-html.ts +0 -32
  248. package/src/utils/markdown/to-text.ts +0 -14
  249. package/src/utils/memoize-prop.ts +0 -30
  250. package/src/utils/mnemonist.ts +0 -9
  251. package/src/utils/object-hash.ts +0 -14
  252. package/src/utils/promises.ts +0 -24
  253. package/src/utils/relations.ts +0 -36
  254. package/src/utils/set.ts +0 -83
  255. 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,166 +0,0 @@
1
- import type { Except } from 'type-fest'
2
- import type { ElementModel } from '../../model'
3
- import {
4
- type AnyAux,
5
- type aux,
6
- type ComputedNode,
7
- type scalar,
8
- type Unknown,
9
- DefaultElementShape,
10
- DefaultThemeColor,
11
- GroupElementKind,
12
- omitUndefined,
13
- preferSummary,
14
- } from '../../types'
15
- import { nonNullable } from '../../utils'
16
- import { compareByFqnHierarchically, parentFqn } from '../../utils/fqn'
17
- import { NodesGroup } from '../element-view/memory'
18
-
19
- function updateDepthOfAncestors(node: ComputedNode, nodes: ReadonlyMap<string, ComputedNode>) {
20
- let parentNd
21
- while (!!node.parent && (parentNd = nodes.get(node.parent))) {
22
- const depth = parentNd.depth ?? 1
23
- parentNd.depth = Math.max(depth, (node.depth ?? 0) + 1)
24
- if (parentNd.depth === depth) {
25
- // stop if we didn't change depth
26
- break
27
- }
28
- node = parentNd
29
- }
30
- }
31
-
32
- export type ComputedNodeSource<A extends AnyAux = Unknown> = Except<
33
- ComputedNode<A>,
34
- 'parent' | 'children' | 'inEdges' | 'outEdges' | 'level' | 'depth',
35
- { requireExactProps: true }
36
- >
37
-
38
- export function elementModelToNodeSource<A extends AnyAux>(el: ElementModel<A>): ComputedNodeSource<A> {
39
- const {
40
- id,
41
- summary, // omit
42
- style,
43
- metadata, // omit
44
- ...rest
45
- } = el.$element
46
- return omitUndefined({
47
- id: id as scalar.NodeId,
48
- modelRef: id,
49
- ...rest,
50
- style: { ...style },
51
- color: el.color,
52
- shape: el.shape,
53
- description: preferSummary(el.$element),
54
- tags: [...el.tags],
55
- })
56
- }
57
-
58
- export function buildComputedNodes<A extends AnyAux>(
59
- elements: ReadonlyArray<ComputedNodeSource<A>>,
60
- groups?: ReadonlyArray<NodesGroup<A>>,
61
- ): ReadonlyMap<scalar.NodeId, ComputedNode<A>> {
62
- const nodesMap = new Map<scalar.NodeId, ComputedNode<A>>()
63
-
64
- const elementToGroup = new Map<aux.StrictFqn<A>, scalar.NodeId>()
65
-
66
- groups?.forEach(({ id, parent, viewRule, elements }) => {
67
- if (parent) {
68
- nonNullable(nodesMap.get(parent), `Parent group node ${parent} not found`).children.push(id)
69
- }
70
- nodesMap.set(id, {
71
- id,
72
- parent,
73
- kind: GroupElementKind,
74
- title: viewRule.title ?? '',
75
- description: null,
76
- technology: null,
77
- color: viewRule.color ?? 'muted',
78
- shape: 'rectangle',
79
- children: [],
80
- inEdges: [],
81
- outEdges: [],
82
- level: 0,
83
- depth: 0,
84
- tags: [],
85
- style: {
86
- border: viewRule.border ?? 'dashed',
87
- opacity: viewRule.opacity ?? 0,
88
- size: viewRule.size ?? 'md',
89
- multiple: viewRule.multiple ?? false,
90
- padding: viewRule.padding ?? 'md',
91
- textSize: viewRule.textSize ?? 'md',
92
- },
93
- })
94
- for (const e of elements) {
95
- elementToGroup.set(e.id, id)
96
- }
97
- })
98
-
99
- // Ensure that parent nodes are created before child nodes
100
- Array.from(elements)
101
- .sort(compareByFqnHierarchically)
102
- .forEach(({ id, style, kind, title, color, shape, tags, notation, ...el }) => {
103
- let parent = parentFqn(id)
104
- let level = 0
105
- let parentNd: ComputedNode<A> | undefined
106
- // Find the first ancestor that is already in the map
107
- while (parent) {
108
- parentNd = nodesMap.get(parent)
109
- if (parentNd) {
110
- break
111
- }
112
- parent = parentFqn(parent)
113
- }
114
- const fqn = el.modelRef ?? id as unknown as aux.StrictFqn<A>
115
- // If parent is not found in the map, check if it is in a group
116
- if (!parentNd && elementToGroup.has(fqn)) {
117
- const parentGroupId = nonNullable(elementToGroup.get(fqn))
118
- parentNd = nodesMap.get(parentGroupId)
119
- parent = parentGroupId
120
- }
121
- if (parentNd) {
122
- // if parent has no children and we are about to add first one
123
- // we need to set its depth to 1
124
- if (parentNd.children.length == 0) {
125
- parentNd.depth = 1
126
- // go up the tree and update depth of all parents
127
- updateDepthOfAncestors(parentNd, nodesMap)
128
- }
129
- parentNd.children.push(id)
130
- level = parentNd.level + 1
131
- }
132
- const node: ComputedNode<A> = {
133
- id,
134
- parent,
135
- kind,
136
- title,
137
- description: null,
138
- technology: null,
139
- level,
140
- color: color ?? DefaultThemeColor,
141
- shape: shape ?? DefaultElementShape,
142
- tags: tags ?? [],
143
- children: [],
144
- inEdges: [],
145
- outEdges: [],
146
- ...notation && { notation },
147
- ...el,
148
- style: {
149
- ...style,
150
- },
151
- }
152
- nodesMap.set(id, node)
153
- })
154
-
155
- // Create new map and add elements in the same order as they were in the input
156
- const orderedMap = new Map<aux.NodeId, ComputedNode<A>>()
157
-
158
- groups?.forEach(({ id }) => {
159
- orderedMap.set(id, nonNullable(nodesMap.get(id)))
160
- })
161
- elements.forEach(({ id }) => {
162
- orderedMap.set(id, nonNullable(nodesMap.get(id)))
163
- })
164
-
165
- return orderedMap
166
- }
@@ -1,64 +0,0 @@
1
- import { entries, filter, 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
- filter((n): n is ComputedNode<any> & { notation: string } => !!n.notation),
16
- groupBy(prop('notation')),
17
- mapValues(
18
- piped(
19
- groupBy(prop('shape')),
20
- mapValues(
21
- piped(
22
- groupBy(prop('color')),
23
- mapValues(
24
- piped(
25
- map(prop('kind')),
26
- unique(),
27
- ),
28
- ),
29
- entries(),
30
- map(([color, kinds]) => ({
31
- kinds,
32
- color,
33
- })),
34
- ),
35
- ),
36
- entries(),
37
- flatMap(([shape, colors]) =>
38
- colors.map(({ color, kinds }) => ({
39
- shape,
40
- color,
41
- kinds,
42
- }))
43
- ),
44
- ),
45
- ),
46
- entries(),
47
- flatMap(([title, shapes]) =>
48
- shapes.map(({ shape, color, kinds }) => ({
49
- title,
50
- shape,
51
- color,
52
- kinds,
53
- }))
54
- ),
55
- sortBy(
56
- prop('shape'),
57
- prop('title'),
58
- [
59
- n => n.kinds.length,
60
- 'desc',
61
- ],
62
- ),
63
- )
64
- }
@@ -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
- }