@likec4/language-server 1.43.0 → 1.45.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 (301) hide show
  1. package/browser/package.json +1 -1
  2. package/browser-worker/package.json +1 -1
  3. package/dist/LikeC4LanguageServices.d.ts +13 -34
  4. package/dist/LikeC4LanguageServices.js +152 -0
  5. package/dist/Rpc.js +257 -0
  6. package/dist/ast.d.ts +5 -1
  7. package/dist/ast.js +257 -0
  8. package/dist/browser-worker.js +4 -0
  9. package/dist/browser.js +35 -0
  10. package/dist/bundled.js +44 -0
  11. package/dist/bundled.mjs +3568 -3900
  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.d.ts +2 -0
  16. package/dist/filesystem/ChokidarWatcher.js +108 -0
  17. package/dist/filesystem/FileSystemWatcher.js +14 -0
  18. package/dist/filesystem/LikeC4FileSystem.d.ts +1 -2
  19. package/dist/filesystem/LikeC4FileSystem.js +126 -0
  20. package/dist/filesystem/index.d.ts +26 -0
  21. package/dist/filesystem/index.js +29 -0
  22. package/dist/formatting/LikeC4Formatter.js +637 -0
  23. package/dist/formatting/utils.js +18 -0
  24. package/dist/generated/ast.js +2155 -0
  25. package/dist/generated/{grammar.mjs → grammar.js} +6 -2
  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 +10 -1
  30. package/dist/index.js +55 -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.js +257 -0
  44. package/dist/lsp/index.d.ts +1 -0
  45. package/dist/lsp/index.js +9 -0
  46. package/dist/mcp/MCPServerFactory.js +73 -0
  47. package/dist/mcp/NoopLikeC4MCPServer.js +17 -0
  48. package/dist/mcp/interfaces.js +5 -0
  49. package/dist/mcp/server/StdioLikeC4MCPServer.js +51 -0
  50. package/dist/mcp/server/StreamableLikeC4MCPServer.js +145 -0
  51. package/dist/mcp/server/WithMCPServer.js +56 -0
  52. package/dist/mcp/tools/_common.d.ts +8 -7
  53. package/dist/mcp/tools/_common.js +49 -0
  54. package/dist/mcp/tools/find-relationships.d.ts +7 -8
  55. package/dist/mcp/tools/find-relationships.js +150 -0
  56. package/dist/mcp/tools/list-projects.d.ts +3 -3
  57. package/dist/mcp/tools/list-projects.js +62 -0
  58. package/dist/mcp/tools/open-view.d.ts +6 -7
  59. package/dist/mcp/tools/open-view.js +52 -0
  60. package/dist/mcp/tools/read-deployment.d.ts +6 -7
  61. package/dist/mcp/tools/read-deployment.js +132 -0
  62. package/dist/mcp/tools/read-element.d.ts +6 -7
  63. package/dist/mcp/tools/read-element.js +194 -0
  64. package/dist/mcp/tools/read-project-summary.d.ts +5 -6
  65. package/dist/mcp/tools/read-project-summary.js +176 -0
  66. package/dist/mcp/tools/read-view.d.ts +6 -7
  67. package/dist/mcp/tools/read-view.js +203 -0
  68. package/dist/mcp/tools/search-element.d.ts +3 -3
  69. package/dist/mcp/tools/search-element.js +177 -0
  70. package/dist/mcp/utils.d.ts +2 -2
  71. package/dist/mcp/utils.js +48 -0
  72. package/dist/model/builder/MergedExtends.js +74 -0
  73. package/dist/model/builder/MergedSpecification.js +175 -0
  74. package/dist/model/builder/buildModel.js +176 -0
  75. package/dist/model/deployments-index.js +102 -0
  76. package/dist/model/fqn-index.d.ts +1 -2
  77. package/dist/model/fqn-index.js +247 -0
  78. package/dist/model/index.js +6 -0
  79. package/dist/model/model-builder.d.ts +13 -11
  80. package/dist/model/model-builder.js +232 -0
  81. package/dist/model/model-locator.d.ts +6 -5
  82. package/dist/model/model-locator.js +240 -0
  83. package/dist/model/model-parser-where.js +81 -0
  84. package/dist/model/model-parser.d.ts +309 -304
  85. package/dist/model/model-parser.js +126 -0
  86. package/dist/model/parser/Base.d.ts +2 -2
  87. package/dist/model/parser/Base.js +367 -0
  88. package/dist/model/parser/DeploymentModelParser.d.ts +2 -2
  89. package/dist/model/parser/DeploymentModelParser.js +176 -0
  90. package/dist/model/parser/DeploymentViewParser.d.ts +3 -3
  91. package/dist/model/parser/DeploymentViewParser.js +86 -0
  92. package/dist/model/parser/FqnRefParser.d.ts +2 -2
  93. package/dist/model/parser/FqnRefParser.js +382 -0
  94. package/dist/model/parser/GlobalsParser.d.ts +6 -6
  95. package/dist/model/parser/GlobalsParser.js +84 -0
  96. package/dist/model/parser/ImportsParser.d.ts +11 -12
  97. package/dist/model/parser/ImportsParser.js +24 -0
  98. package/dist/model/parser/ModelParser.d.ts +2 -2
  99. package/dist/model/parser/ModelParser.js +165 -0
  100. package/dist/model/parser/PredicatesParser.d.ts +2 -2
  101. package/dist/model/parser/PredicatesParser.js +45 -0
  102. package/dist/model/parser/SpecificationParser.d.ts +2 -2
  103. package/dist/model/parser/SpecificationParser.js +113 -0
  104. package/dist/model/parser/ValueConverter.js +12 -0
  105. package/dist/model/parser/ViewsParser.d.ts +3 -3
  106. package/dist/model/parser/ViewsParser.js +479 -0
  107. package/dist/model-change/ModelChanges.d.ts +8 -5
  108. package/dist/model-change/ModelChanges.js +129 -0
  109. package/dist/model-change/changeElementStyle.js +134 -0
  110. package/dist/model-change/changeViewLayout.d.ts +2 -2
  111. package/dist/model-change/changeViewLayout.js +28 -0
  112. package/dist/model-change/removeManualLayoutV1.d.ts +7 -0
  113. package/dist/model-change/removeManualLayoutV1.js +27 -0
  114. package/dist/module.d.ts +10 -5
  115. package/dist/module.js +143 -0
  116. package/dist/protocol.d.ts +34 -27
  117. package/dist/protocol.js +123 -0
  118. package/dist/references/index.js +3 -0
  119. package/dist/references/name-provider.js +37 -0
  120. package/dist/references/scope-computation.js +288 -0
  121. package/dist/references/scope-provider.d.ts +3 -3
  122. package/dist/references/scope-provider.js +242 -0
  123. package/dist/shared/NodeKindProvider.js +57 -0
  124. package/dist/shared/{WorkspaceSymbolProvider.mjs → WorkspaceSymbolProvider.js} +1 -1
  125. package/dist/shared/index.js +2 -0
  126. package/dist/test/index.js +1 -0
  127. package/dist/test/testServices.d.ts +16 -16
  128. package/dist/test/testServices.js +210 -0
  129. package/dist/utils/disposable.js +26 -0
  130. package/dist/utils/elementRef.d.ts +1 -1
  131. package/dist/utils/elementRef.js +27 -0
  132. package/dist/utils/fqnRef.js +63 -0
  133. package/dist/utils/index.js +35 -0
  134. package/dist/utils/printDocs.js +1 -0
  135. package/dist/utils/projectId.js +16 -0
  136. package/dist/utils/stringHash.js +5 -0
  137. package/dist/validation/DocumentValidator.js +17 -0
  138. package/dist/validation/_shared.js +26 -0
  139. package/dist/validation/deployment-checks.js +140 -0
  140. package/dist/validation/dynamic-view.js +67 -0
  141. package/dist/validation/element-ref.js +12 -0
  142. package/dist/validation/element.js +49 -0
  143. package/dist/validation/imports.js +46 -0
  144. package/dist/validation/index.d.ts +1 -1
  145. package/dist/validation/index.js +157 -0
  146. package/dist/validation/property-checks.js +108 -0
  147. package/dist/validation/relation.js +55 -0
  148. package/dist/validation/specification.js +190 -0
  149. package/dist/validation/view-predicates/fqn-expr-with.js +43 -0
  150. package/dist/validation/view-predicates/fqn-ref-expr.js +51 -0
  151. package/dist/validation/view-predicates/incoming.js +16 -0
  152. package/dist/validation/view-predicates/index.js +6 -0
  153. package/dist/validation/view-predicates/outgoing.js +20 -0
  154. package/dist/validation/view-predicates/relation-expr.js +46 -0
  155. package/dist/validation/view-predicates/relation-with.js +16 -0
  156. package/dist/validation/view.d.ts +1 -1
  157. package/dist/validation/view.js +42 -0
  158. package/dist/view-utils/assignNavigateTo.js +27 -0
  159. package/dist/view-utils/index.d.ts +1 -0
  160. package/dist/view-utils/index.js +2 -0
  161. package/dist/view-utils/manual-layout.d.ts +6 -0
  162. package/dist/view-utils/manual-layout.js +149 -0
  163. package/dist/views/ConfigurableLayouter.js +51 -0
  164. package/dist/views/LikeC4ManualLayouts.d.ts +42 -0
  165. package/dist/views/LikeC4ManualLayouts.js +209 -0
  166. package/dist/views/{likec4-views.d.ts → LikeC4Views.d.ts} +32 -10
  167. package/dist/views/LikeC4Views.js +216 -0
  168. package/dist/views/index.d.ts +4 -1
  169. package/dist/views/index.js +11 -0
  170. package/dist/workspace/AstNodeDescriptionProvider.js +18 -0
  171. package/dist/workspace/IndexManager.js +21 -0
  172. package/dist/workspace/LangiumDocuments.d.ts +4 -3
  173. package/dist/workspace/LangiumDocuments.js +72 -0
  174. package/dist/workspace/ProjectsManager.d.ts +25 -16
  175. package/dist/workspace/ProjectsManager.js +469 -0
  176. package/dist/workspace/WorkspaceManager.d.ts +3 -2
  177. package/dist/workspace/WorkspaceManager.js +98 -0
  178. package/dist/workspace/index.js +5 -0
  179. package/likec4lib/package.json +1 -1
  180. package/package.json +30 -28
  181. package/protocol/package.json +1 -1
  182. package/dist/LikeC4LanguageServices.mjs +0 -197
  183. package/dist/Rpc.mjs +0 -296
  184. package/dist/ast.mjs +0 -221
  185. package/dist/browser-worker.mjs +0 -2
  186. package/dist/browser.mjs +0 -32
  187. package/dist/documentation/documentation-provider.mjs +0 -48
  188. package/dist/documentation/index.mjs +0 -1
  189. package/dist/empty.mjs +0 -1
  190. package/dist/filesystem/ChokidarWatcher.mjs +0 -68
  191. package/dist/filesystem/FileSystemWatcher.mjs +0 -11
  192. package/dist/filesystem/LikeC4FileSystem.mjs +0 -64
  193. package/dist/filesystem/index.mjs +0 -19
  194. package/dist/formatting/LikeC4Formatter.mjs +0 -511
  195. package/dist/formatting/utils.mjs +0 -15
  196. package/dist/generated/ast.mjs +0 -2150
  197. package/dist/generated/module.mjs +0 -23
  198. package/dist/index.mjs +0 -50
  199. package/dist/logger.mjs +0 -82
  200. package/dist/lsp/CodeLensProvider.mjs +0 -42
  201. package/dist/lsp/CompletionProvider.mjs +0 -208
  202. package/dist/lsp/DocumentHighlightProvider.mjs +0 -10
  203. package/dist/lsp/DocumentLinkProvider.mjs +0 -53
  204. package/dist/lsp/DocumentSymbolProvider.mjs +0 -287
  205. package/dist/lsp/HoverProvider.mjs +0 -104
  206. package/dist/lsp/RenameProvider.mjs +0 -6
  207. package/dist/lsp/SemanticTokenProvider.mjs +0 -276
  208. package/dist/lsp/index.mjs +0 -7
  209. package/dist/mcp/MCPServerFactory.mjs +0 -70
  210. package/dist/mcp/NoopLikeC4MCPServer.mjs +0 -17
  211. package/dist/mcp/interfaces.mjs +0 -4
  212. package/dist/mcp/server/StdioLikeC4MCPServer.mjs +0 -46
  213. package/dist/mcp/server/StreamableLikeC4MCPServer.mjs +0 -153
  214. package/dist/mcp/server/WithMCPServer.mjs +0 -58
  215. package/dist/mcp/tools/_common.mjs +0 -42
  216. package/dist/mcp/tools/find-relationships.mjs +0 -151
  217. package/dist/mcp/tools/list-projects.mjs +0 -62
  218. package/dist/mcp/tools/open-view.mjs +0 -52
  219. package/dist/mcp/tools/read-deployment.mjs +0 -130
  220. package/dist/mcp/tools/read-element.mjs +0 -198
  221. package/dist/mcp/tools/read-project-summary.mjs +0 -178
  222. package/dist/mcp/tools/read-view.mjs +0 -205
  223. package/dist/mcp/tools/search-element.mjs +0 -171
  224. package/dist/mcp/utils.mjs +0 -47
  225. package/dist/model/builder/MergedExtends.mjs +0 -76
  226. package/dist/model/builder/MergedSpecification.mjs +0 -205
  227. package/dist/model/builder/assignTagColors.d.ts +0 -7
  228. package/dist/model/builder/assignTagColors.mjs +0 -51
  229. package/dist/model/builder/buildModel.mjs +0 -226
  230. package/dist/model/deployments-index.mjs +0 -100
  231. package/dist/model/fqn-index.mjs +0 -243
  232. package/dist/model/index.mjs +0 -6
  233. package/dist/model/model-builder.mjs +0 -285
  234. package/dist/model/model-locator.mjs +0 -239
  235. package/dist/model/model-parser-where.mjs +0 -81
  236. package/dist/model/model-parser.mjs +0 -127
  237. package/dist/model/parser/Base.mjs +0 -376
  238. package/dist/model/parser/DeploymentModelParser.mjs +0 -212
  239. package/dist/model/parser/DeploymentViewParser.mjs +0 -95
  240. package/dist/model/parser/FqnRefParser.mjs +0 -398
  241. package/dist/model/parser/GlobalsParser.mjs +0 -82
  242. package/dist/model/parser/ImportsParser.mjs +0 -28
  243. package/dist/model/parser/ModelParser.mjs +0 -190
  244. package/dist/model/parser/PredicatesParser.mjs +0 -45
  245. package/dist/model/parser/SpecificationParser.mjs +0 -120
  246. package/dist/model/parser/ValueConverter.mjs +0 -12
  247. package/dist/model/parser/ViewsParser.mjs +0 -490
  248. package/dist/model-change/ModelChanges.mjs +0 -89
  249. package/dist/model-change/changeElementStyle.mjs +0 -143
  250. package/dist/model-change/changeViewLayout.mjs +0 -32
  251. package/dist/model-change/saveManualLayout.d.ts +0 -11
  252. package/dist/model-change/saveManualLayout.mjs +0 -27
  253. package/dist/module.mjs +0 -180
  254. package/dist/protocol.mjs +0 -65
  255. package/dist/references/index.mjs +0 -3
  256. package/dist/references/name-provider.mjs +0 -39
  257. package/dist/references/scope-computation.mjs +0 -312
  258. package/dist/references/scope-provider.mjs +0 -239
  259. package/dist/shared/NodeKindProvider.mjs +0 -110
  260. package/dist/shared/index.mjs +0 -2
  261. package/dist/test/index.mjs +0 -1
  262. package/dist/test/testServices.mjs +0 -200
  263. package/dist/utils/disposable.mjs +0 -25
  264. package/dist/utils/elementRef.mjs +0 -20
  265. package/dist/utils/fqnRef.mjs +0 -57
  266. package/dist/utils/index.mjs +0 -33
  267. package/dist/utils/printDocs.mjs +0 -1
  268. package/dist/utils/projectId.mjs +0 -16
  269. package/dist/utils/stringHash.mjs +0 -5
  270. package/dist/validation/DocumentValidator.mjs +0 -16
  271. package/dist/validation/_shared.mjs +0 -25
  272. package/dist/validation/deployment-checks.mjs +0 -146
  273. package/dist/validation/dynamic-view.mjs +0 -67
  274. package/dist/validation/element-ref.mjs +0 -12
  275. package/dist/validation/element.mjs +0 -50
  276. package/dist/validation/imports.mjs +0 -25
  277. package/dist/validation/index.mjs +0 -180
  278. package/dist/validation/property-checks.mjs +0 -107
  279. package/dist/validation/relation.mjs +0 -53
  280. package/dist/validation/specification.mjs +0 -173
  281. package/dist/validation/view-predicates/fqn-expr-with.mjs +0 -43
  282. package/dist/validation/view-predicates/fqn-ref-expr.mjs +0 -53
  283. package/dist/validation/view-predicates/incoming.mjs +0 -16
  284. package/dist/validation/view-predicates/index.mjs +0 -6
  285. package/dist/validation/view-predicates/outgoing.mjs +0 -20
  286. package/dist/validation/view-predicates/relation-expr.mjs +0 -39
  287. package/dist/validation/view-predicates/relation-with.mjs +0 -16
  288. package/dist/validation/view.mjs +0 -25
  289. package/dist/view-utils/assignNavigateTo.mjs +0 -25
  290. package/dist/view-utils/index.mjs +0 -1
  291. package/dist/view-utils/manual-layout.mjs +0 -99
  292. package/dist/views/configurable-layouter.mjs +0 -51
  293. package/dist/views/index.mjs +0 -1
  294. package/dist/views/likec4-views.mjs +0 -166
  295. package/dist/workspace/AstNodeDescriptionProvider.mjs +0 -17
  296. package/dist/workspace/IndexManager.mjs +0 -17
  297. package/dist/workspace/LangiumDocuments.mjs +0 -53
  298. package/dist/workspace/ProjectsManager.mjs +0 -360
  299. package/dist/workspace/WorkspaceManager.mjs +0 -83
  300. package/dist/workspace/index.mjs +0 -5
  301. /package/dist/views/{configurable-layouter.d.ts → ConfigurableLayouter.d.ts} +0 -0
package/dist/ast.js ADDED
@@ -0,0 +1,257 @@
1
+ import { invariant, MultiMap, nonexhaustive } from '@likec4/core/utils';
2
+ import { AstUtils, DocumentState } from 'langium';
3
+ import { clamp, isNullish, isTruthy } from 'remeda';
4
+ import * as ast from './generated/ast';
5
+ import { LikeC4LanguageMetaData } from './generated/module';
6
+ export { ast };
7
+ const idattr = Symbol.for('idattr');
8
+ export const ViewOps = {
9
+ writeId(node, id) {
10
+ node[idattr] = id;
11
+ return node;
12
+ },
13
+ readId(node) {
14
+ return node[idattr];
15
+ },
16
+ };
17
+ export const ElementOps = {
18
+ writeId(node, id) {
19
+ if (isNullish(id)) {
20
+ node[idattr] = undefined;
21
+ }
22
+ else {
23
+ node[idattr] = id;
24
+ }
25
+ return node;
26
+ },
27
+ readId(node) {
28
+ return node[idattr];
29
+ },
30
+ };
31
+ export function isLikeC4LangiumDocument(doc) {
32
+ if (doc.textDocument.languageId === LikeC4LanguageMetaData.languageId) {
33
+ invariant(isTruthy(doc.likec4ProjectId), `LikeC4Document must have projectId defined: ${doc.uri.fsPath}`);
34
+ return true;
35
+ }
36
+ return false;
37
+ }
38
+ export function isParsedLikeC4LangiumDocument(doc) {
39
+ return (isLikeC4LangiumDocument(doc)
40
+ && doc.state == DocumentState.Validated
41
+ && !!doc.c4Specification
42
+ && !!doc.c4Elements
43
+ && !!doc.c4ExtendElements
44
+ && !!doc.c4ExtendDeployments
45
+ && !!doc.c4Relations
46
+ && !!doc.c4Views
47
+ && !!doc.c4Deployments
48
+ && !!doc.c4DeploymentRelations
49
+ && !!doc.c4Imports);
50
+ }
51
+ export function parseMarkdownAsString(node) {
52
+ return node?.markdown || node?.text;
53
+ }
54
+ export function parseAstPercent(value) {
55
+ const opacity = parseFloat(value);
56
+ return isNaN(opacity) ? 100 : clamp(opacity, { min: 0, max: 100 });
57
+ }
58
+ export function parseAstOpacityProperty({ value }) {
59
+ return parseAstPercent(value);
60
+ }
61
+ export function parseAstSizeValue({ value }) {
62
+ switch (value) {
63
+ case 'xs':
64
+ case 'sm':
65
+ case 'md':
66
+ case 'lg':
67
+ case 'xl':
68
+ return value;
69
+ case 'xsmall':
70
+ return 'xs';
71
+ case 'small':
72
+ return 'sm';
73
+ case 'medium':
74
+ return 'md';
75
+ case 'large':
76
+ return 'lg';
77
+ case 'xlarge':
78
+ return 'xl';
79
+ default:
80
+ nonexhaustive(value);
81
+ }
82
+ }
83
+ export function toRelationshipStyle(props, isValid) {
84
+ const result = {};
85
+ if (!props || props.length === 0) {
86
+ return result;
87
+ }
88
+ for (const prop of props) {
89
+ if (!isValid(prop)) {
90
+ continue;
91
+ }
92
+ switch (true) {
93
+ case ast.isColorProperty(prop): {
94
+ const color = toColor(prop);
95
+ if (isTruthy(color)) {
96
+ result.color = color;
97
+ }
98
+ break;
99
+ }
100
+ case ast.isLineProperty(prop): {
101
+ result.line = prop.value;
102
+ break;
103
+ }
104
+ case ast.isArrowProperty(prop): {
105
+ switch (prop.key) {
106
+ case 'head': {
107
+ result.head = prop.value;
108
+ break;
109
+ }
110
+ case 'tail': {
111
+ result.tail = prop.value;
112
+ break;
113
+ }
114
+ default: {
115
+ nonexhaustive(prop);
116
+ }
117
+ }
118
+ break;
119
+ }
120
+ default: {
121
+ nonexhaustive(prop);
122
+ }
123
+ }
124
+ }
125
+ return result;
126
+ }
127
+ export function toColor(astNode) {
128
+ return astNode?.themeColor ?? astNode?.customColor?.$refText;
129
+ }
130
+ export function toAutoLayout(rule) {
131
+ const rankSep = rule.rankSep;
132
+ const nodeSep = rule.nodeSep;
133
+ let direction;
134
+ switch (rule.direction) {
135
+ case 'TopBottom': {
136
+ direction = 'TB';
137
+ break;
138
+ }
139
+ case 'BottomTop': {
140
+ direction = 'BT';
141
+ break;
142
+ }
143
+ case 'LeftRight': {
144
+ direction = 'LR';
145
+ break;
146
+ }
147
+ case 'RightLeft': {
148
+ direction = 'RL';
149
+ break;
150
+ }
151
+ default:
152
+ nonexhaustive(rule.direction);
153
+ }
154
+ return {
155
+ direction,
156
+ ...(nodeSep && { nodeSep }),
157
+ ...(rankSep && { rankSep }),
158
+ };
159
+ }
160
+ export function toAstViewLayoutDirection(c4) {
161
+ switch (c4) {
162
+ case 'TB': {
163
+ return 'TopBottom';
164
+ }
165
+ case 'BT': {
166
+ return 'BottomTop';
167
+ }
168
+ case 'LR': {
169
+ return 'LeftRight';
170
+ }
171
+ case 'RL': {
172
+ return 'RightLeft';
173
+ }
174
+ default:
175
+ nonexhaustive(c4);
176
+ }
177
+ }
178
+ // export function elementExpressionFromPredicate(predicate: ast.ElementPredicate): ast.ElementExpression {
179
+ // if (ast.isElementExpression(predicate)) {
180
+ // return predicate
181
+ // }
182
+ // if (ast.isElementPredicateWhere(predicate)) {
183
+ // return predicate.subject
184
+ // }
185
+ // if (ast.isElementPredicateWith(predicate)) {
186
+ // return elementExpressionFromPredicate(predicate.subject)
187
+ // }
188
+ // nonexhaustive(predicate)
189
+ // }
190
+ export function getViewRulePredicateContainer(el) {
191
+ return AstUtils.getContainerOfType(el, (n) => {
192
+ return ast.isViewRulePredicate(n) || ast.isDeploymentViewRulePredicate(n) || ast.isDynamicViewIncludePredicate(n);
193
+ });
194
+ }
195
+ const _isModel = (astNode) => {
196
+ return ast.isModel(astNode) ||
197
+ ast.isElementBody(astNode) ||
198
+ ast.isExtendElementBody(astNode) ||
199
+ ast.isElementViewBody(astNode) ||
200
+ ast.isDynamicViewBody(astNode) ||
201
+ ast.isElementRef(astNode);
202
+ };
203
+ const _isDeployment = (astNode) => {
204
+ return ast.isModelDeployments(astNode) ||
205
+ ast.isDeploymentViewBody(astNode) ||
206
+ ast.isDeploymentNodeBody(astNode) ||
207
+ ast.isExtendDeploymentBody(astNode) ||
208
+ ast.isDeployedInstanceBody(astNode);
209
+ };
210
+ export function isFqnRefInsideGlobals(astNode) {
211
+ while (true) {
212
+ if (_isDeployment(astNode) || _isModel(astNode)) {
213
+ return false;
214
+ }
215
+ if (ast.isGlobals(astNode) || ast.isModelViews(astNode)) {
216
+ return true;
217
+ }
218
+ if (astNode.$container) {
219
+ astNode = astNode.$container;
220
+ }
221
+ else {
222
+ return false;
223
+ }
224
+ }
225
+ }
226
+ export function isFqnRefInsideModel(astNode) {
227
+ while (true) {
228
+ if (_isDeployment(astNode)) {
229
+ return false;
230
+ }
231
+ if (_isModel(astNode)) {
232
+ return true;
233
+ }
234
+ if (astNode.$container) {
235
+ astNode = astNode.$container;
236
+ }
237
+ else {
238
+ return false;
239
+ }
240
+ }
241
+ }
242
+ export function isFqnRefInsideDeployment(astNode) {
243
+ while (true) {
244
+ if (_isModel(astNode)) {
245
+ return false;
246
+ }
247
+ if (_isDeployment(astNode)) {
248
+ return true;
249
+ }
250
+ if (astNode.$container) {
251
+ astNode = astNode.$container;
252
+ }
253
+ else {
254
+ return false;
255
+ }
256
+ }
257
+ }
@@ -0,0 +1,4 @@
1
+ // This is an example copied as is from here:
2
+ // https://github.com/microsoft/vscode-extension-samples/blob/main/lsp-web-extension-sample/server/src/browserServerMain.ts
3
+ import { startLanguageServer } from './browser';
4
+ startLanguageServer(self);
@@ -0,0 +1,35 @@
1
+ import { configureLogger, getConsoleSink, getTextFormatter } from '@likec4/log';
2
+ import { startLanguageServer as startLanguim } from 'langium/lsp';
3
+ import { BrowserMessageReader, BrowserMessageWriter, createConnection } from 'vscode-languageserver/browser';
4
+ import { createLanguageServices } from './module';
5
+ export { logger as lspLogger } from './logger';
6
+ export { createLanguageServices } from './module';
7
+ export function startLanguageServer(port) {
8
+ /* browser specific setup code */
9
+ const messageReader = new BrowserMessageReader(port);
10
+ const messageWriter = new BrowserMessageWriter(port);
11
+ const connection = createConnection(messageReader, messageWriter);
12
+ configureLogger({
13
+ sinks: {
14
+ console: getConsoleSink({
15
+ formatter: getTextFormatter({
16
+ format: ({ level, category, message }) => {
17
+ return `${level} ${category} ${message}`;
18
+ },
19
+ }),
20
+ }),
21
+ },
22
+ loggers: [
23
+ {
24
+ category: 'likec4',
25
+ sinks: ['console'],
26
+ lowestLevel: 'debug',
27
+ },
28
+ ],
29
+ });
30
+ // Inject the shared services and language-specific services
31
+ const services = createLanguageServices({ connection });
32
+ // Start the language server with the shared services
33
+ startLanguim(services.shared);
34
+ return services;
35
+ }
@@ -0,0 +1,44 @@
1
+ import { configureLogger, getConsoleStderrSink } from '@likec4/log';
2
+ import { startLanguageServer as startLanguim } from 'langium/lsp';
3
+ import { createConnection, ProposedFeatures } from 'vscode-languageserver/node';
4
+ import { LikeC4FileSystem } from './filesystem/LikeC4FileSystem';
5
+ import { getLspConnectionSink, logger } from './logger';
6
+ import { WithMCPServer } from './mcp/server/WithMCPServer';
7
+ import { createLanguageServices } from './module';
8
+ import { ConfigurableLayouter } from './views/ConfigurableLayouter';
9
+ import { WithLikeC4ManualLayouts } from './views/LikeC4ManualLayouts';
10
+ /**
11
+ * This is used as `bin` entry point to start the language server.
12
+ */
13
+ export function startLanguageServer() {
14
+ const connection = createConnection(ProposedFeatures.all);
15
+ configureLogger({
16
+ sinks: {
17
+ // Name it as console to override internal logger
18
+ lsp: getLspConnectionSink(connection),
19
+ console: getConsoleStderrSink(),
20
+ },
21
+ loggers: [
22
+ {
23
+ category: ['likec4'],
24
+ sinks: ['console', 'lsp'],
25
+ },
26
+ ],
27
+ });
28
+ process.on('uncaughtException', (err) => {
29
+ logger.error('uncaughtException', { err });
30
+ });
31
+ process.on('unhandledRejection', (err) => {
32
+ logger.error('unhandledRejection', { err });
33
+ });
34
+ // Inject the shared services and language-specific services
35
+ const services = createLanguageServices({
36
+ connection,
37
+ ...LikeC4FileSystem(false),
38
+ ...WithMCPServer('sse'),
39
+ ...WithLikeC4ManualLayouts,
40
+ }, ConfigurableLayouter);
41
+ // Start the language server with the shared services
42
+ startLanguim(services.shared);
43
+ return services;
44
+ }