@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,190 +0,0 @@
1
- import { invariant, isNonEmptyArray, LinkedList, nonexhaustive, nonNullable } from "@likec4/core";
2
- import { exact, FqnRef } from "@likec4/core/types";
3
- import { loggable } from "@likec4/log";
4
- import { filter, first, isDefined, isEmpty, isTruthy, map, mapToObj, pipe } from "remeda";
5
- import {
6
- ast,
7
- toRelationshipStyle
8
- } from "../../ast.mjs";
9
- import { logger as mainLogger } from "../../logger.mjs";
10
- import { stringHash } from "../../utils/stringHash.mjs";
11
- const logger = mainLogger.getChild("ModelParser");
12
- function* streamModel(doc) {
13
- const traverseStack = LinkedList.from(doc.parseResult.value.models.flatMap((m) => m.elements));
14
- const relations = [];
15
- let el;
16
- while (el = traverseStack.shift()) {
17
- if (ast.isRelation(el)) {
18
- relations.push(el);
19
- continue;
20
- }
21
- if (el.body && el.body.elements && el.body.elements.length > 0) {
22
- for (const child of el.body.elements) {
23
- traverseStack.push(child);
24
- }
25
- }
26
- yield el;
27
- }
28
- yield* relations;
29
- return;
30
- }
31
- export function ModelParser(B) {
32
- return class ModelParser extends B {
33
- parseModel() {
34
- const doc = this.doc;
35
- for (const el of streamModel(doc)) {
36
- try {
37
- if (ast.isElement(el)) {
38
- doc.c4Elements.push(this.parseElement(el));
39
- continue;
40
- }
41
- if (ast.isRelation(el)) {
42
- if (this.isValid(el)) {
43
- doc.c4Relations.push(this.parseRelation(el));
44
- }
45
- continue;
46
- }
47
- if (ast.isExtendElement(el)) {
48
- const parsed = this.parseExtendElement(el);
49
- if (parsed) {
50
- doc.c4ExtendElements.push(parsed);
51
- }
52
- continue;
53
- }
54
- nonexhaustive(el);
55
- } catch (e) {
56
- const astPath = this.getAstNodePath(el);
57
- const error = loggable(e);
58
- const message = e instanceof Error ? e.message : String(error);
59
- logger.warn(`Error on {eltype}: ${message}
60
- document: {path}
61
- astpath: {astPath}
62
- ${error}`, {
63
- path: doc.uri.path,
64
- eltype: el.$type,
65
- astPath
66
- });
67
- }
68
- }
69
- }
70
- parseElement(astNode) {
71
- const isValid = this.isValid;
72
- const id = this.resolveFqn(astNode);
73
- const kind = nonNullable(astNode.kind.ref, "Element kind is not resolved").name;
74
- const tags = this.parseTags(astNode.body);
75
- const style = this.parseElementStyle(astNode.body?.props);
76
- const metadata = this.getMetadata(astNode.body?.props.find(ast.isMetadataProperty));
77
- const astPath = this.getAstNodePath(astNode);
78
- let [_title, _summary, _technology] = astNode.props ?? [];
79
- const bodyProps = pipe(
80
- astNode.body?.props ?? [],
81
- filter(isValid),
82
- filter(ast.isElementStringProperty),
83
- mapToObj((p) => [p.key, p.value])
84
- );
85
- const { title, ...descAndTech } = this.parseBaseProps(bodyProps, {
86
- title: _title,
87
- summary: _summary,
88
- technology: _technology
89
- });
90
- const links = this.parseLinks(astNode.body);
91
- return exact({
92
- id,
93
- kind,
94
- astPath,
95
- title: title ?? astNode.name,
96
- metadata,
97
- tags: tags ?? void 0,
98
- ...links && isNonEmptyArray(links) && { links },
99
- ...descAndTech,
100
- style
101
- });
102
- }
103
- parseExtendElement(astNode) {
104
- const id = this.resolveFqn(astNode);
105
- const tags = this.parseTags(astNode.body);
106
- const metadata = this.getMetadata(astNode.body?.props.find(ast.isMetadataProperty));
107
- const astPath = this.getAstNodePath(astNode);
108
- const links = this.parseLinks(astNode.body) ?? [];
109
- if (!tags && isEmpty(metadata ?? {}) && isEmpty(links)) {
110
- return null;
111
- }
112
- return exact({
113
- id,
114
- astPath,
115
- metadata,
116
- tags,
117
- links: isNonEmptyArray(links) ? links : null
118
- });
119
- }
120
- _resolveRelationSource(node) {
121
- if (isDefined(node.source)) {
122
- const source = this.parseFqnRef(node.source);
123
- invariant(FqnRef.isModelRef(source) || FqnRef.isImportRef(source), "Relation source must be a model reference");
124
- return source;
125
- }
126
- if (ast.isElementBody(node.$container)) {
127
- return {
128
- model: this.resolveFqn(node.$container.$container)
129
- };
130
- }
131
- if (ast.isExtendElementBody(node.$container)) {
132
- return {
133
- model: this.resolveFqn(node.$container.$container)
134
- };
135
- }
136
- throw new Error("RelationRefError: Invalid container for sourceless relation");
137
- }
138
- parseRelation(astNode) {
139
- const isValid = this.isValid;
140
- const source = this._resolveRelationSource(astNode);
141
- const target = this.parseFqnRef(astNode.target);
142
- invariant(FqnRef.isModelRef(target) || FqnRef.isImportRef(target), "Target must be a model reference");
143
- const tags = this.parseTags(astNode) ?? this.parseTags(astNode.body);
144
- const links = this.parseLinks(astNode.body);
145
- const kind = (astNode.kind ?? astNode.dotKind?.kind)?.ref?.name;
146
- const metadata = this.getMetadata(astNode.body?.props.find(ast.isMetadataProperty));
147
- const astPath = this.getAstNodePath(astNode);
148
- const bodyProps = pipe(
149
- astNode.body?.props ?? [],
150
- filter(ast.isRelationStringProperty),
151
- filter((p) => isTruthy(p.value)),
152
- mapToObj((p) => [p.key, p.value])
153
- );
154
- const navigateTo = pipe(
155
- astNode.body?.props ?? [],
156
- filter(ast.isRelationNavigateToProperty),
157
- map((p) => p.value.view.ref?.name),
158
- filter(isTruthy),
159
- first()
160
- );
161
- const { title = "", description, technology } = this.parseBaseProps(bodyProps, {
162
- // inline props
163
- title: astNode.title,
164
- description: astNode.description,
165
- technology: astNode.technology
166
- });
167
- const styleProp = astNode.body?.props.find(ast.isRelationStyleProperty);
168
- const id = stringHash(
169
- astPath,
170
- source.model,
171
- target.model
172
- );
173
- return exact({
174
- id,
175
- astPath,
176
- source,
177
- target,
178
- title,
179
- metadata,
180
- kind,
181
- tags: tags ?? void 0,
182
- links: isNonEmptyArray(links) ? links : void 0,
183
- navigateTo: navigateTo ? navigateTo : void 0,
184
- description,
185
- technology,
186
- ...toRelationshipStyle(styleProp?.props, isValid)
187
- });
188
- }
189
- };
190
- }
@@ -1,45 +0,0 @@
1
- import { nonexhaustive } from "@likec4/core";
2
- import { ast } from "../../ast.mjs";
3
- export function PredicatesParser(B) {
4
- return class PredicatesParser extends B {
5
- parsePredicate(astNode) {
6
- return this.parseExpressionV2(astNode);
7
- }
8
- parseElementPredicate(astNode) {
9
- if (ast.isFqnExprWith(astNode)) {
10
- return this.parseFqnExprWith(astNode);
11
- }
12
- if (ast.isFqnExprOrWhere(astNode)) {
13
- return this.parseFqnExprOrWhere(astNode);
14
- }
15
- nonexhaustive(astNode);
16
- }
17
- parseElementPredicateOrWhere(astNode) {
18
- return this.parseFqnExprOrWhere(astNode);
19
- }
20
- parseElementExpression(astNode) {
21
- return this.parseFqnExpr(astNode);
22
- }
23
- parseElementPredicateWhere(astNode) {
24
- return this.parseFqnExprWhere(astNode);
25
- }
26
- parseElementPredicateWith(astNode) {
27
- return this.parseFqnExprWith(astNode);
28
- }
29
- parseRelationPredicate(astNode) {
30
- return this.parseRelationExprOrWith(astNode);
31
- }
32
- parseRelationPredicateOrWhere(astNode) {
33
- return this.parseRelationExprOrWhere(astNode);
34
- }
35
- parseRelationPredicateWhere(astNode) {
36
- return this.parseRelationExprWhere(astNode);
37
- }
38
- parseRelationPredicateWith(astNode) {
39
- return this.parseRelationExprWith(astNode);
40
- }
41
- parseRelationExpression(astNode) {
42
- return this.parseRelationExpr(astNode);
43
- }
44
- };
45
- }
@@ -1,120 +0,0 @@
1
- import * as c4 from "@likec4/core";
2
- import { exact } from "@likec4/core";
3
- import { nonNullable } from "@likec4/core/utils";
4
- import { loggable } from "@likec4/log";
5
- import { filter, isNonNullish, isNullish, isTruthy, mapToObj, omitBy, pipe } from "remeda";
6
- import { ast, parseMarkdownAsString, toRelationshipStyle } from "../../ast.mjs";
7
- import { serverLogger } from "../../logger.mjs";
8
- import { removeIndent } from "./Base.mjs";
9
- const logger = serverLogger.getChild("SpecificationParser");
10
- export function SpecificationParser(B) {
11
- return class SpecificationParser extends B {
12
- parseSpecification() {
13
- const {
14
- parseResult: {
15
- value: {
16
- specifications
17
- }
18
- },
19
- c4Specification
20
- } = this.doc;
21
- const isValid = this.isValid;
22
- for (const elementSpec of specifications.flatMap((s) => s.elements.filter(isValid))) {
23
- try {
24
- Object.assign(c4Specification.elements, this.parseElementSpecificationNode(elementSpec));
25
- } catch (e) {
26
- logger.warn(loggable(e));
27
- }
28
- }
29
- for (const deploymentNodeSpec of specifications.flatMap((s) => s.deploymentNodes.filter(isValid))) {
30
- try {
31
- Object.assign(c4Specification.deployments, this.parseElementSpecificationNode(deploymentNodeSpec));
32
- } catch (e) {
33
- logger.warn(loggable(e));
34
- }
35
- }
36
- const relations_specs = specifications.flatMap((s) => s.relationships.filter(this.isValid));
37
- for (const { kind, props } of relations_specs) {
38
- try {
39
- const kindName = kind.name;
40
- if (!isTruthy(kindName)) {
41
- continue;
42
- }
43
- if (kindName in c4Specification.relationships) {
44
- logger.warn(`Relationship kind "${kindName}" is already defined`);
45
- continue;
46
- }
47
- const bodyProps = pipe(
48
- props.filter(ast.isSpecificationRelationshipStringProperty) ?? [],
49
- filter((p) => this.isValid(p) && isNonNullish(p.value)),
50
- mapToObj((p) => [p.key, removeIndent(parseMarkdownAsString(p.value))]),
51
- omitBy(isNullish)
52
- );
53
- c4Specification.relationships[kindName] = {
54
- ...bodyProps,
55
- ...toRelationshipStyle(props.filter(ast.isRelationshipStyleProperty), this.isValid)
56
- };
57
- } catch (e) {
58
- logger.warn(loggable(e));
59
- }
60
- }
61
- const tags_specs = specifications.flatMap((s) => s.tags.filter(this.isValid));
62
- for (const tagSpec of tags_specs) {
63
- try {
64
- const tag = tagSpec.tag.name;
65
- const astPath = this.getAstNodePath(tagSpec.tag);
66
- const color = tagSpec.color && this.parseColorLiteral(tagSpec.color);
67
- if (isTruthy(tag)) {
68
- c4Specification.tags[tag] = {
69
- astPath,
70
- ...color ? { color } : {}
71
- };
72
- }
73
- } catch (e) {
74
- logger.warn(loggable(e));
75
- }
76
- }
77
- const colors_specs = specifications.flatMap((s) => s.colors.filter(isValid));
78
- for (const { name, color } of colors_specs) {
79
- try {
80
- const colorName = name.name;
81
- if (colorName in c4Specification.colors) {
82
- logger.warn(`Custom color "${colorName}" is already defined`);
83
- continue;
84
- }
85
- c4Specification.colors[colorName] = {
86
- color: nonNullable(this.parseColorLiteral(color), `Color "${colorName}" is not valid: ${color}`)
87
- };
88
- } catch (e) {
89
- logger.warn(loggable(e));
90
- }
91
- }
92
- }
93
- parseElementSpecificationNode(specAst) {
94
- const { kind, props } = specAst;
95
- const kindName = kind.name;
96
- if (!isTruthy(kindName)) {
97
- throw new Error("DeploymentNodeKind name is not resolved");
98
- }
99
- const tags = this.parseTags(specAst);
100
- const style = this.parseElementStyle(props.find(ast.isElementStyleProperty));
101
- const links = this.parseLinks(specAst);
102
- const bodyProps = pipe(
103
- props.filter(ast.isSpecificationElementStringProperty) ?? [],
104
- filter((p) => this.isValid(p)),
105
- mapToObj((p) => [p.key, p.value])
106
- );
107
- const baseProps = this.parseBaseProps(bodyProps);
108
- const notation = removeIndent(parseMarkdownAsString(bodyProps.notation));
109
- return {
110
- [kindName]: exact({
111
- ...baseProps,
112
- notation,
113
- tags: tags ?? void 0,
114
- ...links && c4.isNonEmptyArray(links) && { links },
115
- style
116
- })
117
- };
118
- }
119
- };
120
- }
@@ -1,12 +0,0 @@
1
- import { DefaultValueConverter, ValueConverter } from "langium";
2
- export class LikeC4ValueConverter extends DefaultValueConverter {
3
- runConverter(rule, input, cstNode) {
4
- if (rule.name === "MarkdownString") {
5
- if (input.startsWith('"""') && input.endsWith('"""') || input.startsWith(`'''`) && input.endsWith(`'''`)) {
6
- input = input.slice(2, -2);
7
- }
8
- return ValueConverter.convertString(input);
9
- }
10
- return super.runConverter(rule, input, cstNode);
11
- }
12
- }