@likec4/language-server 1.42.1 → 1.44.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 (303) hide show
  1. package/browser/package.json +1 -1
  2. package/browser-worker/package.json +1 -1
  3. package/dist/LikeC4LanguageServices.d.ts +12 -19
  4. package/dist/LikeC4LanguageServices.js +182 -0
  5. package/dist/Rpc.js +245 -0
  6. package/dist/ast.d.ts +10 -6
  7. package/dist/ast.js +253 -0
  8. package/dist/browser-worker.js +4 -0
  9. package/dist/browser.js +35 -0
  10. package/dist/bundled.js +42 -0
  11. package/dist/bundled.mjs +3830 -4172
  12. package/dist/documentation/documentation-provider.js +51 -0
  13. package/dist/documentation/index.js +1 -0
  14. package/dist/empty.js +2 -0
  15. package/dist/filesystem/ChokidarWatcher.js +97 -0
  16. package/dist/filesystem/FileSystemWatcher.js +14 -0
  17. package/dist/filesystem/LikeC4FileSystem.d.ts +1 -2
  18. package/dist/filesystem/LikeC4FileSystem.js +126 -0
  19. package/dist/filesystem/index.d.ts +26 -0
  20. package/dist/filesystem/index.js +29 -0
  21. package/dist/formatting/LikeC4Formatter.js +637 -0
  22. package/dist/formatting/utils.js +18 -0
  23. package/dist/generated/ast.d.ts +19 -3
  24. package/dist/generated/ast.js +2155 -0
  25. package/dist/generated/grammar.js +7 -0
  26. package/dist/generated/module.d.ts +6 -1
  27. package/dist/generated/module.js +27 -0
  28. package/dist/generated-lib/{icons.mjs → icons.js} +11 -7
  29. package/dist/index.d.ts +7 -0
  30. package/dist/index.js +53 -0
  31. package/dist/{likec4lib.mjs → likec4lib.js} +3 -3
  32. package/dist/logger.js +81 -0
  33. package/dist/lsp/CodeActionProvider.d.ts +14 -0
  34. package/dist/lsp/CodeActionProvider.js +33 -0
  35. package/dist/lsp/CodeLensProvider.js +44 -0
  36. package/dist/lsp/CompletionProvider.d.ts +3 -1
  37. package/dist/lsp/CompletionProvider.js +200 -0
  38. package/dist/lsp/DocumentHighlightProvider.js +10 -0
  39. package/dist/lsp/DocumentLinkProvider.js +58 -0
  40. package/dist/lsp/DocumentSymbolProvider.js +306 -0
  41. package/dist/lsp/HoverProvider.js +106 -0
  42. package/dist/lsp/RenameProvider.js +6 -0
  43. package/dist/lsp/SemanticTokenProvider.d.ts +5 -0
  44. package/dist/lsp/SemanticTokenProvider.js +257 -0
  45. package/dist/lsp/index.d.ts +1 -0
  46. package/dist/lsp/index.js +9 -0
  47. package/dist/mcp/MCPServerFactory.js +73 -0
  48. package/dist/mcp/NoopLikeC4MCPServer.js +17 -0
  49. package/dist/mcp/interfaces.js +5 -0
  50. package/dist/mcp/server/StdioLikeC4MCPServer.js +47 -0
  51. package/dist/mcp/server/StreamableLikeC4MCPServer.js +145 -0
  52. package/dist/mcp/server/WithMCPServer.js +56 -0
  53. package/dist/mcp/tools/_common.d.ts +8 -7
  54. package/dist/mcp/tools/_common.js +49 -0
  55. package/dist/mcp/tools/find-relationships.d.ts +7 -8
  56. package/dist/mcp/tools/find-relationships.js +150 -0
  57. package/dist/mcp/tools/list-projects.d.ts +3 -3
  58. package/dist/mcp/tools/list-projects.js +62 -0
  59. package/dist/mcp/tools/open-view.d.ts +6 -7
  60. package/dist/mcp/tools/open-view.js +52 -0
  61. package/dist/mcp/tools/read-deployment.d.ts +6 -7
  62. package/dist/mcp/tools/read-deployment.js +132 -0
  63. package/dist/mcp/tools/read-element.d.ts +6 -7
  64. package/dist/mcp/tools/read-element.js +194 -0
  65. package/dist/mcp/tools/read-project-summary.d.ts +5 -6
  66. package/dist/mcp/tools/read-project-summary.js +176 -0
  67. package/dist/mcp/tools/read-view.d.ts +6 -7
  68. package/dist/mcp/tools/read-view.js +203 -0
  69. package/dist/mcp/tools/search-element.d.ts +3 -3
  70. package/dist/mcp/tools/search-element.js +177 -0
  71. package/dist/mcp/utils.d.ts +2 -2
  72. package/dist/mcp/utils.js +48 -0
  73. package/dist/model/builder/MergedExtends.d.ts +2 -1
  74. package/dist/model/builder/MergedExtends.js +74 -0
  75. package/dist/model/builder/MergedSpecification.js +175 -0
  76. package/dist/model/builder/buildModel.js +176 -0
  77. package/dist/model/deployments-index.js +102 -0
  78. package/dist/model/fqn-index.js +250 -0
  79. package/dist/model/index.js +6 -0
  80. package/dist/model/model-builder.d.ts +13 -11
  81. package/dist/model/model-builder.js +234 -0
  82. package/dist/model/model-locator.d.ts +6 -5
  83. package/dist/model/model-locator.js +240 -0
  84. package/dist/model/model-parser-where.js +81 -0
  85. package/dist/model/model-parser.d.ts +318 -313
  86. package/dist/model/model-parser.js +119 -0
  87. package/dist/model/parser/Base.d.ts +3 -3
  88. package/dist/model/parser/Base.js +367 -0
  89. package/dist/model/parser/DeploymentModelParser.d.ts +3 -3
  90. package/dist/model/parser/DeploymentModelParser.js +176 -0
  91. package/dist/model/parser/DeploymentViewParser.d.ts +4 -4
  92. package/dist/model/parser/DeploymentViewParser.js +86 -0
  93. package/dist/model/parser/FqnRefParser.d.ts +3 -3
  94. package/dist/model/parser/FqnRefParser.js +382 -0
  95. package/dist/model/parser/GlobalsParser.d.ts +7 -7
  96. package/dist/model/parser/GlobalsParser.js +84 -0
  97. package/dist/model/parser/ImportsParser.d.ts +12 -13
  98. package/dist/model/parser/ImportsParser.js +24 -0
  99. package/dist/model/parser/ModelParser.d.ts +3 -3
  100. package/dist/model/parser/ModelParser.js +165 -0
  101. package/dist/model/parser/PredicatesParser.d.ts +3 -3
  102. package/dist/model/parser/PredicatesParser.js +45 -0
  103. package/dist/model/parser/SpecificationParser.d.ts +3 -3
  104. package/dist/model/parser/SpecificationParser.js +109 -0
  105. package/dist/model/parser/ValueConverter.js +12 -0
  106. package/dist/model/parser/ViewsParser.d.ts +4 -4
  107. package/dist/model/parser/ViewsParser.js +477 -0
  108. package/dist/model-change/ModelChanges.d.ts +6 -3
  109. package/dist/model-change/ModelChanges.js +102 -0
  110. package/dist/model-change/changeElementStyle.js +134 -0
  111. package/dist/model-change/changeViewLayout.d.ts +2 -2
  112. package/dist/model-change/changeViewLayout.js +28 -0
  113. package/dist/model-change/removeManualLayoutV1.d.ts +7 -0
  114. package/dist/model-change/removeManualLayoutV1.js +27 -0
  115. package/dist/module.d.ts +10 -5
  116. package/dist/module.js +143 -0
  117. package/dist/protocol.d.ts +1 -17
  118. package/dist/protocol.js +114 -0
  119. package/dist/references/index.js +3 -0
  120. package/dist/references/name-provider.js +37 -0
  121. package/dist/references/scope-computation.js +288 -0
  122. package/dist/references/scope-provider.d.ts +3 -3
  123. package/dist/references/scope-provider.js +242 -0
  124. package/dist/shared/NodeKindProvider.js +57 -0
  125. package/dist/shared/{WorkspaceSymbolProvider.mjs → WorkspaceSymbolProvider.js} +1 -1
  126. package/dist/shared/index.js +2 -0
  127. package/dist/test/index.js +1 -0
  128. package/dist/test/testServices.d.ts +16 -16
  129. package/dist/test/testServices.js +210 -0
  130. package/dist/utils/disposable.js +26 -0
  131. package/dist/utils/elementRef.d.ts +1 -1
  132. package/dist/utils/elementRef.js +27 -0
  133. package/dist/utils/fqnRef.js +63 -0
  134. package/dist/utils/index.js +35 -0
  135. package/dist/utils/printDocs.js +1 -0
  136. package/dist/utils/projectId.js +16 -0
  137. package/dist/utils/stringHash.js +5 -0
  138. package/dist/validation/DocumentValidator.js +17 -0
  139. package/dist/validation/_shared.js +26 -0
  140. package/dist/validation/deployment-checks.js +140 -0
  141. package/dist/validation/dynamic-view.js +67 -0
  142. package/dist/validation/element-ref.js +12 -0
  143. package/dist/validation/element.js +49 -0
  144. package/dist/validation/imports.js +46 -0
  145. package/dist/validation/index.d.ts +1 -1
  146. package/dist/validation/index.js +157 -0
  147. package/dist/validation/property-checks.js +108 -0
  148. package/dist/validation/relation.js +55 -0
  149. package/dist/validation/specification.js +190 -0
  150. package/dist/validation/view-predicates/fqn-expr-with.js +43 -0
  151. package/dist/validation/view-predicates/fqn-ref-expr.js +51 -0
  152. package/dist/validation/view-predicates/incoming.js +16 -0
  153. package/dist/validation/view-predicates/index.js +6 -0
  154. package/dist/validation/view-predicates/outgoing.js +20 -0
  155. package/dist/validation/view-predicates/relation-expr.js +46 -0
  156. package/dist/validation/view-predicates/relation-with.js +16 -0
  157. package/dist/validation/view.d.ts +1 -1
  158. package/dist/validation/view.js +42 -0
  159. package/dist/view-utils/assignNavigateTo.js +27 -0
  160. package/dist/view-utils/index.d.ts +1 -0
  161. package/dist/view-utils/index.js +2 -0
  162. package/dist/view-utils/manual-layout.d.ts +6 -0
  163. package/dist/view-utils/manual-layout.js +151 -0
  164. package/dist/views/ConfigurableLayouter.js +51 -0
  165. package/dist/views/LikeC4ManualLayouts.d.ts +28 -0
  166. package/dist/views/LikeC4ManualLayouts.js +132 -0
  167. package/dist/views/{likec4-views.d.ts → LikeC4Views.d.ts} +9 -8
  168. package/dist/views/LikeC4Views.js +200 -0
  169. package/dist/views/index.d.ts +4 -1
  170. package/dist/views/index.js +11 -0
  171. package/dist/workspace/AstNodeDescriptionProvider.js +15 -0
  172. package/dist/workspace/IndexManager.js +21 -0
  173. package/dist/workspace/LangiumDocuments.d.ts +1 -1
  174. package/dist/workspace/LangiumDocuments.js +58 -0
  175. package/dist/workspace/ProjectsManager.d.ts +8 -3
  176. package/dist/workspace/ProjectsManager.js +373 -0
  177. package/dist/workspace/WorkspaceManager.d.ts +3 -2
  178. package/dist/workspace/WorkspaceManager.js +93 -0
  179. package/dist/workspace/index.js +5 -0
  180. package/likec4lib/package.json +1 -1
  181. package/package.json +32 -31
  182. package/protocol/package.json +1 -1
  183. package/dist/LikeC4LanguageServices.mjs +0 -197
  184. package/dist/Rpc.mjs +0 -296
  185. package/dist/ast.mjs +0 -221
  186. package/dist/browser-worker.mjs +0 -2
  187. package/dist/browser.mjs +0 -32
  188. package/dist/documentation/documentation-provider.mjs +0 -48
  189. package/dist/documentation/index.mjs +0 -1
  190. package/dist/empty.mjs +0 -1
  191. package/dist/filesystem/ChokidarWatcher.mjs +0 -68
  192. package/dist/filesystem/FileSystemWatcher.mjs +0 -11
  193. package/dist/filesystem/LikeC4FileSystem.mjs +0 -64
  194. package/dist/filesystem/index.mjs +0 -19
  195. package/dist/formatting/LikeC4Formatter.mjs +0 -511
  196. package/dist/formatting/utils.mjs +0 -15
  197. package/dist/generated/ast.mjs +0 -2118
  198. package/dist/generated/grammar.mjs +0 -3
  199. package/dist/generated/module.mjs +0 -23
  200. package/dist/index.mjs +0 -50
  201. package/dist/logger.mjs +0 -82
  202. package/dist/lsp/CodeLensProvider.mjs +0 -42
  203. package/dist/lsp/CompletionProvider.mjs +0 -208
  204. package/dist/lsp/DocumentHighlightProvider.mjs +0 -10
  205. package/dist/lsp/DocumentLinkProvider.mjs +0 -53
  206. package/dist/lsp/DocumentSymbolProvider.mjs +0 -287
  207. package/dist/lsp/HoverProvider.mjs +0 -104
  208. package/dist/lsp/RenameProvider.mjs +0 -6
  209. package/dist/lsp/SemanticTokenProvider.mjs +0 -350
  210. package/dist/lsp/index.mjs +0 -7
  211. package/dist/mcp/MCPServerFactory.mjs +0 -70
  212. package/dist/mcp/NoopLikeC4MCPServer.mjs +0 -17
  213. package/dist/mcp/interfaces.mjs +0 -4
  214. package/dist/mcp/server/StdioLikeC4MCPServer.mjs +0 -46
  215. package/dist/mcp/server/StreamableLikeC4MCPServer.mjs +0 -153
  216. package/dist/mcp/server/WithMCPServer.mjs +0 -58
  217. package/dist/mcp/tools/_common.mjs +0 -42
  218. package/dist/mcp/tools/find-relationships.mjs +0 -151
  219. package/dist/mcp/tools/list-projects.mjs +0 -62
  220. package/dist/mcp/tools/open-view.mjs +0 -52
  221. package/dist/mcp/tools/read-deployment.mjs +0 -130
  222. package/dist/mcp/tools/read-element.mjs +0 -198
  223. package/dist/mcp/tools/read-project-summary.mjs +0 -178
  224. package/dist/mcp/tools/read-view.mjs +0 -205
  225. package/dist/mcp/tools/search-element.mjs +0 -171
  226. package/dist/mcp/utils.mjs +0 -47
  227. package/dist/model/builder/MergedExtends.mjs +0 -67
  228. package/dist/model/builder/MergedSpecification.mjs +0 -205
  229. package/dist/model/builder/assignTagColors.d.ts +0 -7
  230. package/dist/model/builder/assignTagColors.mjs +0 -51
  231. package/dist/model/builder/buildModel.mjs +0 -226
  232. package/dist/model/deployments-index.mjs +0 -100
  233. package/dist/model/fqn-index.mjs +0 -243
  234. package/dist/model/index.mjs +0 -6
  235. package/dist/model/model-builder.mjs +0 -285
  236. package/dist/model/model-locator.mjs +0 -239
  237. package/dist/model/model-parser-where.mjs +0 -81
  238. package/dist/model/model-parser.mjs +0 -127
  239. package/dist/model/parser/Base.mjs +0 -342
  240. package/dist/model/parser/DeploymentModelParser.mjs +0 -212
  241. package/dist/model/parser/DeploymentViewParser.mjs +0 -95
  242. package/dist/model/parser/FqnRefParser.mjs +0 -398
  243. package/dist/model/parser/GlobalsParser.mjs +0 -82
  244. package/dist/model/parser/ImportsParser.mjs +0 -28
  245. package/dist/model/parser/ModelParser.mjs +0 -190
  246. package/dist/model/parser/PredicatesParser.mjs +0 -45
  247. package/dist/model/parser/SpecificationParser.mjs +0 -120
  248. package/dist/model/parser/ValueConverter.mjs +0 -12
  249. package/dist/model/parser/ViewsParser.mjs +0 -490
  250. package/dist/model-change/ModelChanges.mjs +0 -89
  251. package/dist/model-change/changeElementStyle.mjs +0 -143
  252. package/dist/model-change/changeViewLayout.mjs +0 -32
  253. package/dist/model-change/saveManualLayout.d.ts +0 -11
  254. package/dist/model-change/saveManualLayout.mjs +0 -27
  255. package/dist/module.mjs +0 -180
  256. package/dist/protocol.mjs +0 -65
  257. package/dist/references/index.mjs +0 -3
  258. package/dist/references/name-provider.mjs +0 -39
  259. package/dist/references/scope-computation.mjs +0 -312
  260. package/dist/references/scope-provider.mjs +0 -239
  261. package/dist/shared/NodeKindProvider.mjs +0 -110
  262. package/dist/shared/index.mjs +0 -2
  263. package/dist/test/index.mjs +0 -1
  264. package/dist/test/testServices.mjs +0 -200
  265. package/dist/utils/disposable.mjs +0 -25
  266. package/dist/utils/elementRef.mjs +0 -20
  267. package/dist/utils/fqnRef.mjs +0 -57
  268. package/dist/utils/index.mjs +0 -33
  269. package/dist/utils/printDocs.mjs +0 -1
  270. package/dist/utils/projectId.mjs +0 -16
  271. package/dist/utils/stringHash.mjs +0 -5
  272. package/dist/validation/DocumentValidator.mjs +0 -16
  273. package/dist/validation/_shared.mjs +0 -25
  274. package/dist/validation/deployment-checks.mjs +0 -146
  275. package/dist/validation/dynamic-view.mjs +0 -67
  276. package/dist/validation/element-ref.mjs +0 -12
  277. package/dist/validation/element.mjs +0 -50
  278. package/dist/validation/imports.mjs +0 -25
  279. package/dist/validation/index.mjs +0 -180
  280. package/dist/validation/property-checks.mjs +0 -107
  281. package/dist/validation/relation.mjs +0 -53
  282. package/dist/validation/specification.mjs +0 -173
  283. package/dist/validation/view-predicates/fqn-expr-with.mjs +0 -43
  284. package/dist/validation/view-predicates/fqn-ref-expr.mjs +0 -53
  285. package/dist/validation/view-predicates/incoming.mjs +0 -16
  286. package/dist/validation/view-predicates/index.mjs +0 -6
  287. package/dist/validation/view-predicates/outgoing.mjs +0 -20
  288. package/dist/validation/view-predicates/relation-expr.mjs +0 -39
  289. package/dist/validation/view-predicates/relation-with.mjs +0 -16
  290. package/dist/validation/view.mjs +0 -25
  291. package/dist/view-utils/assignNavigateTo.mjs +0 -25
  292. package/dist/view-utils/index.mjs +0 -1
  293. package/dist/view-utils/manual-layout.mjs +0 -99
  294. package/dist/views/configurable-layouter.mjs +0 -51
  295. package/dist/views/index.mjs +0 -1
  296. package/dist/views/likec4-views.mjs +0 -166
  297. package/dist/workspace/AstNodeDescriptionProvider.mjs +0 -17
  298. package/dist/workspace/IndexManager.mjs +0 -17
  299. package/dist/workspace/LangiumDocuments.mjs +0 -53
  300. package/dist/workspace/ProjectsManager.mjs +0 -360
  301. package/dist/workspace/WorkspaceManager.mjs +0 -83
  302. package/dist/workspace/index.mjs +0 -5
  303. /package/dist/views/{configurable-layouter.d.ts → ConfigurableLayouter.d.ts} +0 -0
@@ -1,95 +0,0 @@
1
- import * as c4 from "@likec4/core";
2
- import { invariant, isNonEmptyArray, nonexhaustive } from "@likec4/core";
3
- import { filter, isNonNullish, mapToObj, pipe } from "remeda";
4
- import { ast, parseMarkdownAsString, toAutoLayout, ViewOps } from "../../ast.mjs";
5
- import { logWarnError } from "../../logger.mjs";
6
- import { stringHash } from "../../utils/index.mjs";
7
- import { parseViewManualLayout } from "../../view-utils/manual-layout.mjs";
8
- import { removeIndent, toSingleLine } from "./Base.mjs";
9
- export function DeploymentViewParser(B) {
10
- return class DeploymentViewParser extends B {
11
- parseDeploymentView(astNode) {
12
- const body = astNode.body;
13
- invariant(body, "DynamicElementView body is not defined");
14
- const props = body.props.filter(this.isValid);
15
- const astPath = this.getAstNodePath(astNode);
16
- let id = astNode.name;
17
- if (!id) {
18
- id = "deployment_" + stringHash(
19
- this.doc.uri.toString(),
20
- astPath
21
- );
22
- }
23
- const {
24
- title = null,
25
- description = null
26
- } = this.parseBaseProps(
27
- pipe(
28
- props,
29
- filter(ast.isViewStringProperty),
30
- mapToObj((p) => [p.key, p.value])
31
- )
32
- );
33
- const tags = this.convertTags(body);
34
- const links = this.convertLinks(body);
35
- ViewOps.writeId(astNode, id);
36
- const manualLayout = parseViewManualLayout(astNode);
37
- return {
38
- [c4._type]: "deployment",
39
- id,
40
- astPath,
41
- title: toSingleLine(title) ?? null,
42
- description,
43
- tags,
44
- links: isNonEmptyArray(links) ? links : null,
45
- rules: body.rules.flatMap((n) => {
46
- try {
47
- return this.isValid(n) ? this.parseDeploymentViewRule(n) : [];
48
- } catch (e) {
49
- logWarnError(e);
50
- return [];
51
- }
52
- }),
53
- ...manualLayout && { manualLayout }
54
- };
55
- }
56
- parseDeploymentViewRule(astRule) {
57
- if (ast.isDeploymentViewRulePredicate(astRule)) {
58
- return this.parseDeploymentViewRulePredicate(astRule);
59
- }
60
- if (ast.isViewRuleAutoLayout(astRule)) {
61
- return toAutoLayout(astRule);
62
- }
63
- if (ast.isDeploymentViewRuleStyle(astRule)) {
64
- return this.parseDeploymentViewRuleStyle(astRule);
65
- }
66
- nonexhaustive(astRule);
67
- }
68
- parseDeploymentViewRulePredicate(astRule) {
69
- const exprs = [];
70
- let iterator = astRule.expr;
71
- while (iterator) {
72
- try {
73
- const expr = iterator.value;
74
- if (isNonNullish(expr) && this.isValid(expr)) {
75
- exprs.unshift(this.parseExpressionV2(expr));
76
- }
77
- } catch (e) {
78
- logWarnError(e);
79
- }
80
- iterator = iterator.prev;
81
- }
82
- return astRule.isInclude ? { include: exprs } : { exclude: exprs };
83
- }
84
- parseDeploymentViewRuleStyle(astRule) {
85
- const style = this.parseStyleProps(astRule.props.filter(ast.isStyleProperty));
86
- const notation = removeIndent(parseMarkdownAsString(astRule.props.find(ast.isNotationProperty)?.value));
87
- const targets = this.parseFqnExpressions(astRule.targets);
88
- return {
89
- targets,
90
- style,
91
- ...notation && { notation }
92
- };
93
- }
94
- };
95
- }
@@ -1,398 +0,0 @@
1
- import { invariant, nonexhaustive, nonNullable } from "@likec4/core";
2
- import { loggable } from "@likec4/log";
3
- import { AstUtils } from "langium";
4
- import { isBoolean, isDefined, isNonNullish, isTruthy } from "remeda";
5
- import { ast, parseAstOpacityProperty, parseAstSizeValue, parseMarkdownAsString, toColor } from "../../ast.mjs";
6
- import { serverLogger } from "../../logger.mjs";
7
- import { projectIdFrom } from "../../utils/index.mjs";
8
- import { importsRef, instanceRef } from "../../utils/fqnRef.mjs";
9
- import { createBinaryOperator, parseWhereClause } from "../model-parser-where.mjs";
10
- import { removeIndent } from "./Base.mjs";
11
- const logger = serverLogger.getChild("ExpressionV2Parser");
12
- const location = (astNode) => {
13
- const cst = astNode.$cstNode;
14
- const position = cst ? `:${cst.range.start.line + 1}:${cst.range.start.character + 1}` : "";
15
- return `${AstUtils.getDocument(astNode).uri.fsPath}${position}`;
16
- };
17
- export function ExpressionV2Parser(B) {
18
- return class ExpressionV2Parser extends B {
19
- parseFqnRef(astNode) {
20
- const refValue = nonNullable(
21
- astNode.value?.ref,
22
- () => `FqnRef "${astNode.$cstNode?.text}" is empty at ${location(astNode)}`
23
- );
24
- if (ast.isImported(refValue)) {
25
- const fqnRef = {
26
- project: projectIdFrom(refValue),
27
- model: this.resolveFqn(
28
- nonNullable(refValue.imported.ref, `FqnRef is empty of imported: ${refValue.$cstNode?.text}`)
29
- )
30
- };
31
- this.doc.c4Imports.set(fqnRef.project, fqnRef.model);
32
- return fqnRef;
33
- }
34
- if (ast.isElement(refValue)) {
35
- const imported = importsRef(astNode);
36
- if (imported) {
37
- const fqnRef = {
38
- project: projectIdFrom(imported),
39
- model: this.resolveFqn(refValue)
40
- };
41
- this.doc.c4Imports.set(fqnRef.project, fqnRef.model);
42
- return fqnRef;
43
- }
44
- const deployedInstanceAst = instanceRef(astNode);
45
- if (!deployedInstanceAst) {
46
- return {
47
- model: this.resolveFqn(refValue)
48
- };
49
- }
50
- const deployment = this.resolveFqn(deployedInstanceAst);
51
- const element = this.resolveFqn(refValue);
52
- return {
53
- deployment,
54
- element
55
- };
56
- }
57
- if (ast.isDeploymentElement(refValue)) {
58
- return {
59
- deployment: this.resolveFqn(refValue)
60
- };
61
- }
62
- nonexhaustive(refValue);
63
- }
64
- parseExpressionV2(astNode) {
65
- if (ast.isFqnExprOrWith(astNode)) {
66
- return this.parseFqnExprOrWith(astNode);
67
- }
68
- if (ast.isRelationExprOrWith(astNode)) {
69
- return this.parseRelationExprOrWith(astNode);
70
- }
71
- nonexhaustive(astNode);
72
- }
73
- parseFqnExprOrWith(astNode) {
74
- if (ast.isFqnExprWith(astNode)) {
75
- return this.parseFqnExprWith(astNode);
76
- }
77
- if (ast.isFqnExprOrWhere(astNode)) {
78
- return this.parseFqnExprOrWhere(astNode);
79
- }
80
- nonexhaustive(astNode);
81
- }
82
- parseFqnExprWith(astNode) {
83
- const expr = this.parseFqnExprOrWhere(astNode.subject);
84
- const props = astNode.custom?.props ?? [];
85
- return props.reduce(
86
- (acc, prop) => {
87
- if (!this.isValid(prop)) {
88
- return acc;
89
- }
90
- if (ast.isNavigateToProperty(prop)) {
91
- const viewId = prop.value.view.$refText;
92
- if (isTruthy(viewId)) {
93
- acc.custom.navigateTo = viewId;
94
- }
95
- return acc;
96
- }
97
- if (ast.isElementStringProperty(prop)) {
98
- if (isDefined(prop.value) && prop.key !== "summary") {
99
- if (prop.key === "description") {
100
- const parsed = this.parseMarkdownOrString(prop.value);
101
- if (parsed) {
102
- acc.custom["description"] = parsed;
103
- }
104
- } else {
105
- acc.custom[prop.key] = removeIndent(parseMarkdownAsString(prop.value)) || "";
106
- }
107
- }
108
- return acc;
109
- }
110
- if (ast.isIconProperty(prop)) {
111
- const value = this.parseIconProperty(prop);
112
- if (isDefined(value)) {
113
- acc.custom[prop.key] = value;
114
- }
115
- return acc;
116
- }
117
- if (ast.isColorProperty(prop)) {
118
- const value = toColor(prop);
119
- if (isDefined(value)) {
120
- acc.custom[prop.key] = value;
121
- }
122
- return acc;
123
- }
124
- if (ast.isShapeProperty(prop)) {
125
- if (isDefined(prop.value)) {
126
- acc.custom[prop.key] = prop.value;
127
- }
128
- return acc;
129
- }
130
- if (ast.isBorderProperty(prop)) {
131
- if (isDefined(prop.value)) {
132
- acc.custom[prop.key] = prop.value;
133
- }
134
- return acc;
135
- }
136
- if (ast.isOpacityProperty(prop)) {
137
- if (isDefined(prop.value)) {
138
- acc.custom[prop.key] = parseAstOpacityProperty(prop);
139
- }
140
- return acc;
141
- }
142
- if (ast.isNotationProperty(prop)) {
143
- const value = isTruthy(prop.value) ? removeIndent(parseMarkdownAsString(prop.value)) : void 0;
144
- if (value) {
145
- acc.custom[prop.key] = value;
146
- }
147
- return acc;
148
- }
149
- if (ast.isMultipleProperty(prop)) {
150
- if (isBoolean(prop.value)) {
151
- acc.custom[prop.key] = prop.value;
152
- }
153
- return acc;
154
- }
155
- if (ast.isShapeSizeProperty(prop)) {
156
- if (isTruthy(prop.value)) {
157
- acc.custom[prop.key] = parseAstSizeValue(prop);
158
- }
159
- return acc;
160
- }
161
- if (ast.isTextSizeProperty(prop)) {
162
- if (isTruthy(prop.value)) {
163
- acc.custom[prop.key] = parseAstSizeValue(prop);
164
- }
165
- return acc;
166
- }
167
- if (ast.isPaddingSizeProperty(prop)) {
168
- if (isTruthy(prop.value)) {
169
- acc.custom[prop.key] = parseAstSizeValue(prop);
170
- }
171
- return acc;
172
- }
173
- nonexhaustive(prop);
174
- },
175
- {
176
- custom: {
177
- expr
178
- }
179
- }
180
- );
181
- }
182
- parseFqnExprOrWhere(astNode) {
183
- if (ast.isFqnExprWhere(astNode)) {
184
- return this.parseFqnExprWhere(astNode);
185
- }
186
- if (ast.isFqnExpr(astNode)) {
187
- return this.parseFqnExpr(astNode);
188
- }
189
- nonexhaustive(astNode);
190
- }
191
- parseFqnExprWhere(astNode) {
192
- invariant(!ast.isFqnExprWhere(astNode.subject), "FqnExprWhere is not allowed as subject of FqnExprWhere");
193
- return {
194
- where: {
195
- expr: this.parseFqnExpr(astNode.subject),
196
- condition: astNode.where ? parseWhereClause(astNode.where) : {
197
- kind: { neq: "--always-true--" }
198
- }
199
- }
200
- };
201
- }
202
- parseFqnExpr(astNode) {
203
- if (ast.isWildcardExpression(astNode)) {
204
- return {
205
- wildcard: true
206
- };
207
- }
208
- if (ast.isElementKindExpression(astNode)) {
209
- invariant(astNode.kind?.ref, "ElementKindExpr kind is not resolved: " + astNode.$cstNode?.text);
210
- return {
211
- elementKind: astNode.kind.ref.name,
212
- isEqual: astNode.isEqual
213
- };
214
- }
215
- if (ast.isElementTagExpression(astNode)) {
216
- invariant(astNode.tag.tag.ref, "ElementTagExpr tag is not resolved: " + astNode.$cstNode?.text);
217
- let elementTag = astNode.tag.tag.$refText;
218
- return {
219
- elementTag,
220
- isEqual: astNode.isEqual
221
- };
222
- }
223
- if (ast.isFqnRefExpr(astNode)) {
224
- return this.parseFqnRefExpr(astNode);
225
- }
226
- nonexhaustive(astNode);
227
- }
228
- parseFqnRefExpr(astNode) {
229
- const ref = this.parseFqnRef(astNode.ref);
230
- switch (true) {
231
- case astNode.selector === "._":
232
- return {
233
- ref,
234
- selector: "expanded"
235
- };
236
- case astNode.selector === ".**":
237
- return {
238
- ref,
239
- selector: "descendants"
240
- };
241
- case astNode.selector === ".*":
242
- return {
243
- ref,
244
- selector: "children"
245
- };
246
- default:
247
- return { ref };
248
- }
249
- }
250
- parseFqnExpressions(astNode) {
251
- const exprs = [];
252
- let iter = astNode;
253
- while (iter) {
254
- try {
255
- if (isNonNullish(iter.value) && this.isValid(iter.value)) {
256
- exprs.push(this.parseFqnExpr(iter.value));
257
- }
258
- } catch (e) {
259
- logger.warn(loggable(e));
260
- }
261
- iter = iter.prev;
262
- }
263
- return exprs.reverse();
264
- }
265
- parseRelationExprOrWith(astNode) {
266
- if (ast.isRelationExprWith(astNode)) {
267
- return this.parseRelationExprWith(astNode);
268
- }
269
- if (ast.isRelationExprOrWhere(astNode)) {
270
- return this.parseRelationExprOrWhere(astNode);
271
- }
272
- nonexhaustive(astNode);
273
- }
274
- parseRelationExprWith(astNode) {
275
- const expr = this.parseRelationExprOrWhere(astNode.subject);
276
- const customProps = this.parseCustomRelationProperties(astNode.custom);
277
- return {
278
- customRelation: {
279
- ...customProps,
280
- expr
281
- }
282
- };
283
- }
284
- parseCustomRelationProperties(custom) {
285
- const props = custom?.props ?? [];
286
- return props.reduce(
287
- (acc, prop) => {
288
- if (ast.isRelationStringProperty(prop) || ast.isNotationProperty(prop) || ast.isNotesProperty(prop)) {
289
- const value = isTruthy(prop.value) ? removeIndent(parseMarkdownAsString(prop.value)) : void 0;
290
- if (value) {
291
- acc[prop.key] = value;
292
- }
293
- return acc;
294
- }
295
- if (ast.isArrowProperty(prop)) {
296
- if (isTruthy(prop.value)) {
297
- acc[prop.key] = prop.value;
298
- }
299
- return acc;
300
- }
301
- if (ast.isColorProperty(prop)) {
302
- const value = toColor(prop);
303
- if (isTruthy(value)) {
304
- acc[prop.key] = value;
305
- }
306
- return acc;
307
- }
308
- if (ast.isLineProperty(prop)) {
309
- if (isTruthy(prop.value)) {
310
- acc[prop.key] = prop.value;
311
- }
312
- return acc;
313
- }
314
- if (ast.isRelationNavigateToProperty(prop)) {
315
- const viewId = prop.value.view.ref?.name;
316
- if (isTruthy(viewId)) {
317
- acc[prop.key] = viewId;
318
- }
319
- return acc;
320
- }
321
- nonexhaustive(prop);
322
- },
323
- {}
324
- );
325
- }
326
- parseRelationExprOrWhere(astNode) {
327
- if (ast.isRelationExprWhere(astNode)) {
328
- return this.parseRelationExprWhere(astNode);
329
- }
330
- if (ast.isRelationExpr(astNode)) {
331
- return this.parseRelationExpr(astNode);
332
- }
333
- nonexhaustive(astNode);
334
- }
335
- parseRelationExprWhere(astNode) {
336
- invariant(
337
- !ast.isRelationExprWhere(astNode.subject),
338
- "RelationExprWhere is not allowed as subject of RelationExprWhere"
339
- );
340
- const relationOrWhereExpr = this.parseRelationExpr(astNode.subject);
341
- const expr = relationOrWhereExpr.where?.expr ?? relationOrWhereExpr;
342
- const kindCondition = relationOrWhereExpr.where?.condition;
343
- const whereCondition = astNode.where ? parseWhereClause(astNode.where) : null;
344
- let condition;
345
- if (whereCondition && kindCondition) {
346
- condition = createBinaryOperator(
347
- "and",
348
- kindCondition,
349
- whereCondition
350
- );
351
- } else {
352
- condition = whereCondition ?? kindCondition ?? { kind: { neq: "--always-true--" } };
353
- }
354
- return {
355
- where: {
356
- expr,
357
- condition
358
- }
359
- };
360
- }
361
- parseRelationExpr(astNode) {
362
- switch (astNode.$type) {
363
- case "DirectedRelationExpr":
364
- return this.wrapInWhere({
365
- source: this.parseFqnExpr(astNode.source.from),
366
- target: this.parseFqnExpr(astNode.target),
367
- isBidirectional: astNode.source.isBidirectional
368
- }, this.parseInlineKindCondition(astNode.source));
369
- case "InOutRelationExpr":
370
- return {
371
- inout: this.parseFqnExpr(astNode.inout.to)
372
- };
373
- case "OutgoingRelationExpr":
374
- return this.wrapInWhere(
375
- { outgoing: this.parseFqnExpr(astNode.from) },
376
- this.parseInlineKindCondition(astNode)
377
- );
378
- case "IncomingRelationExpr":
379
- return {
380
- incoming: this.parseFqnExpr(astNode.to)
381
- };
382
- default:
383
- nonexhaustive(astNode);
384
- }
385
- }
386
- parseInlineKindCondition(astNode) {
387
- const kind = astNode.kind ?? astNode.dotKind?.kind;
388
- if (kind) {
389
- invariant(kind.ref, "Kind is not resolved: " + astNode.$cstNode?.text);
390
- return { kind: { eq: kind.ref?.name } };
391
- }
392
- return null;
393
- }
394
- wrapInWhere(expr, condition) {
395
- return condition ? { where: { expr, condition } } : expr;
396
- }
397
- };
398
- }
@@ -1,82 +0,0 @@
1
- import { nonexhaustive } from "@likec4/core";
2
- import { loggable } from "@likec4/log";
3
- import { hasAtLeast, isTruthy } from "remeda";
4
- import { ast } from "../../ast.mjs";
5
- import { serverLogger } from "../../logger.mjs";
6
- const logger = serverLogger.getChild("GlobalsParser");
7
- export function GlobalsParser(B) {
8
- return class GlobalsParser extends B {
9
- parseGlobals() {
10
- const { parseResult, c4Globals } = this.doc;
11
- const isValid = this.isValid;
12
- const globals = parseResult.value.globals.filter(isValid);
13
- const elRelPredicates = globals.flatMap((r) => r.predicates.filter(isValid));
14
- for (const predicate of elRelPredicates) {
15
- try {
16
- const globalPredicateId = predicate.name;
17
- if (!isTruthy(globalPredicateId)) {
18
- continue;
19
- }
20
- if (globalPredicateId in c4Globals.predicates) {
21
- logger.warn(`Global predicate named "${globalPredicateId}" is already defined`);
22
- continue;
23
- }
24
- this.parseAndStoreGlobalPredicateGroupOrDynamic(predicate, globalPredicateId, c4Globals);
25
- } catch (e) {
26
- logger.warn(loggable(e));
27
- }
28
- }
29
- const styles = globals.flatMap((r) => r.styles.filter(isValid));
30
- for (const style of styles) {
31
- try {
32
- const globalStyleId = style.id.name;
33
- if (!isTruthy(globalStyleId)) {
34
- continue;
35
- }
36
- if (globalStyleId in c4Globals.styles) {
37
- logger.warn(`Global style named "${globalStyleId}" is already defined`);
38
- continue;
39
- }
40
- const styles2 = this.parseGlobalStyleOrGroup(style);
41
- if (hasAtLeast(styles2, 1)) {
42
- c4Globals.styles[globalStyleId] = styles2;
43
- }
44
- } catch (e) {
45
- logger.warn(loggable(e));
46
- }
47
- }
48
- }
49
- parseAndStoreGlobalPredicateGroupOrDynamic(astRule, id, c4Globals) {
50
- if (ast.isGlobalPredicateGroup(astRule)) {
51
- const predicates = this.parseGlobalPredicateGroup(astRule);
52
- if (hasAtLeast(predicates, 1)) {
53
- c4Globals.predicates[id] = predicates;
54
- }
55
- return;
56
- }
57
- if (ast.isGlobalDynamicPredicateGroup(astRule)) {
58
- const predicates = this.parseGlobalDynamicPredicateGroup(astRule);
59
- if (hasAtLeast(predicates, 1)) {
60
- c4Globals.dynamicPredicates[id] = predicates;
61
- }
62
- return;
63
- }
64
- nonexhaustive(astRule);
65
- }
66
- parseGlobalPredicateGroup(astRule) {
67
- return astRule.predicates.map((p) => this.parseViewRulePredicate(p));
68
- }
69
- parseGlobalDynamicPredicateGroup(astRule) {
70
- return astRule.predicates.map((p) => this.parseDynamicViewIncludePredicate(p));
71
- }
72
- parseGlobalStyleOrGroup(astRule) {
73
- if (ast.isGlobalStyle(astRule)) {
74
- return [this.parseViewRuleStyle(astRule)];
75
- }
76
- if (ast.isGlobalStyleGroup(astRule)) {
77
- return astRule.styles.map((s) => this.parseViewRuleStyle(s));
78
- }
79
- nonexhaustive(astRule);
80
- }
81
- };
82
- }
@@ -1,28 +0,0 @@
1
- import { nonNullable } from "@likec4/core";
2
- import { loggable } from "@likec4/log";
3
- import { serverLogger } from "../../logger.mjs";
4
- const logger = serverLogger.getChild("ImportsParser");
5
- export function ImportsParser(B) {
6
- return class ImportsParser extends B {
7
- parseImports() {
8
- const imports = this.doc.parseResult.value.imports ?? [];
9
- for (const importsFromPoject of imports) {
10
- const project = importsFromPoject.project;
11
- let imported = importsFromPoject.imports;
12
- while (imported) {
13
- try {
14
- this.doc.c4Imports.set(
15
- project,
16
- this.resolveFqn(
17
- nonNullable(imported.imported.ref, `ElementRef is empty of imported: ${imported.imported.$refText}`)
18
- )
19
- );
20
- } catch (e) {
21
- logger.warn(loggable(e));
22
- }
23
- imported = imported.prev;
24
- }
25
- }
26
- }
27
- };
28
- }