@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/Rpc.mjs DELETED
@@ -1,296 +0,0 @@
1
- import { filter, flatMap, funnel, indexBy, keys, map, mapValues, pipe, sort } from "remeda";
2
- import { logger as rootLogger } from "./logger.mjs";
3
- import { serializableLikeC4ProjectConfig } from "@likec4/config";
4
- import {
5
- invariant,
6
- nonexhaustive
7
- } from "@likec4/core";
8
- import { LikeC4Model } from "@likec4/core/model";
9
- import { Disposable, interruptAndCheck, URI, UriUtils } from "langium";
10
- import { DiagnosticSeverity } from "vscode-languageserver-protocol";
11
- import {
12
- BuildDocuments,
13
- ChangeView,
14
- ComputeView,
15
- DidChangeModelNotification,
16
- DidRequestOpenViewNotification,
17
- FetchComputedModel,
18
- FetchLayoutedModel,
19
- FetchProjects,
20
- FetchTelemetryMetrics,
21
- FetchViewsFromAllProjects,
22
- GetDocumentTags,
23
- LayoutView,
24
- Locate,
25
- RegisterProject,
26
- ReloadProjects,
27
- ValidateLayout
28
- } from "./protocol.mjs";
29
- import { ADisposable } from "./utils/index.mjs";
30
- const logger = rootLogger.getChild("rpc");
31
- export class Rpc extends ADisposable {
32
- constructor(services) {
33
- super();
34
- this.services = services;
35
- }
36
- init() {
37
- const connection = this.services.shared.lsp.Connection;
38
- if (!connection) {
39
- logger.info(`[ServerRpc] no connection, not initializing`);
40
- return;
41
- }
42
- logger.info(`[ServerRpc] init`);
43
- const likec4Services = this.services.likec4;
44
- const projects = this.services.shared.workspace.ProjectsManager;
45
- const LangiumDocuments = this.services.shared.workspace.LangiumDocuments;
46
- const DocumentBuilder = this.services.shared.workspace.DocumentBuilder;
47
- const notifyModelParsed = funnel(
48
- () => {
49
- logger.debug`sendNotification ${"onDidChangeModel"}`;
50
- connection.sendNotification(DidChangeModelNotification.type, "").catch((error) => {
51
- logger.warn(`[ServerRpc] error sending onDidChangeModel:`, { error });
52
- return;
53
- });
54
- },
55
- {
56
- triggerAt: "end",
57
- minQuietPeriodMs: 150,
58
- maxBurstDurationMs: 500,
59
- minGapMs: 300
60
- }
61
- );
62
- let isFirstBuild = true;
63
- this.onDispose(
64
- likec4Services.ModelBuilder.onModelParsed(() => notifyModelParsed.call()),
65
- connection.onRequest(FetchComputedModel.req, async ({ projectId, cleanCaches }, cancelToken) => {
66
- logger.debug`received request ${"fetchComputedModel"} for project ${projectId}`;
67
- if (cleanCaches) {
68
- const docs = projectId ? LangiumDocuments.projectDocuments(projectId) : LangiumDocuments.allExcludingBuiltin;
69
- const uris = docs.toArray().map((d) => d.uri);
70
- await DocumentBuilder.update(uris, [], cancelToken);
71
- }
72
- const likec4model = await likec4Services.ModelBuilder.buildLikeC4Model(projectId, cancelToken);
73
- if (likec4model !== LikeC4Model.EMPTY) {
74
- return { model: likec4model.$model };
75
- }
76
- return { model: null };
77
- }),
78
- connection.onRequest(ComputeView.req, async ({ viewId, projectId }, cancelToken) => {
79
- const view = await likec4Services.ModelBuilder.computeView(viewId, projectId, cancelToken);
80
- return { view };
81
- }),
82
- connection.onRequest(FetchLayoutedModel.req, async ({ projectId }, cancelToken) => {
83
- const model = await likec4Services.ModelBuilder.parseModel(projectId, cancelToken);
84
- if (model === null) {
85
- return { model: null };
86
- }
87
- const diagrams = await likec4Services.Views.diagrams(projectId, cancelToken);
88
- return {
89
- model: {
90
- ...model.$data,
91
- _stage: "layouted",
92
- views: indexBy(diagrams, (d) => d.id)
93
- }
94
- };
95
- }),
96
- connection.onRequest(LayoutView.req, async ({ viewId, projectId }, cancelToken) => {
97
- logger.debug`received request ${"layoutView"} of ${viewId} from project ${projectId}`;
98
- const result = await likec4Services.Views.layoutView(viewId, projectId, cancelToken);
99
- return { result };
100
- }),
101
- connection.onRequest(ValidateLayout.Req, async ({ projectId }, cancelToken) => {
102
- const layouts = await likec4Services.Views.layoutAllViews(projectId, cancelToken);
103
- const result = reportLayoutDrift(layouts.map((l) => l.diagram));
104
- return { result };
105
- }),
106
- connection.onRequest(FetchProjects.req, async (_cancelToken) => {
107
- logger.debug`received request ${"FetchProjects"}`;
108
- const docsByProject = LangiumDocuments.groupedByProject();
109
- return {
110
- projects: mapValues(docsByProject, (docs, projectId) => {
111
- const {
112
- folderUri,
113
- config
114
- } = projects.getProject(projectId);
115
- return {
116
- folder: folderUri.toString(),
117
- config: serializableLikeC4ProjectConfig(config),
118
- docs: map(docs, (d) => d.uri.toString())
119
- };
120
- })
121
- };
122
- }),
123
- connection.onRequest(ReloadProjects.req, async () => {
124
- logger.debug`received request ${"ReloadProjects"}`;
125
- await projects.reloadProjects();
126
- return;
127
- }),
128
- connection.onRequest(RegisterProject.req, async (params) => {
129
- logger.debug`received request ${"RegisterProject"}`;
130
- const project = await projects.registerProject(params);
131
- return { id: project.id };
132
- }),
133
- connection.onRequest(FetchViewsFromAllProjects.req, async (cancelToken) => {
134
- logger.debug`received request ${"FetchViewsFromAllProjects"}`;
135
- const promises = projects.all.map(async (projectId) => {
136
- const computedViews = await likec4Services.Views.computedViews(projectId, cancelToken);
137
- return pipe(
138
- computedViews,
139
- map((v) => ({
140
- id: v.id,
141
- title: v.title ?? v.id,
142
- projectId
143
- })),
144
- sort((a, b) => {
145
- if (a.id === "index") {
146
- return -1;
147
- }
148
- if (b.id === "index") {
149
- return 1;
150
- }
151
- return a.title.localeCompare(b.title);
152
- })
153
- );
154
- });
155
- const results = await Promise.allSettled(promises);
156
- await interruptAndCheck(cancelToken);
157
- return {
158
- views: pipe(
159
- results,
160
- filter((r) => r.status === "fulfilled"),
161
- flatMap((r) => r.value)
162
- )
163
- };
164
- }),
165
- connection.onRequest(BuildDocuments.Req, async ({ docs }, cancelToken) => {
166
- const changed = docs.map((d) => URI.parse(d));
167
- const notChanged = (uri) => changed.every((c) => !UriUtils.equals(c, uri));
168
- const deleted = LangiumDocuments.allExcludingBuiltin.toArray().filter((d) => notChanged(d.uri)).map((d) => d.uri);
169
- logger.debug(
170
- `[ServerRpc] received request to build:
171
- changed (total ${changed.length}):${docs.map((d) => "\n - " + d).join("")}
172
- deleted (total ${deleted.length}):${deleted.map((d) => "\n - " + d.toString()).join("\n")}`
173
- );
174
- if (!isFirstBuild && changed.length + deleted.length > 0) {
175
- await Promise.allSettled(
176
- [...changed, ...deleted].map(async (d) => {
177
- const uri = d.toString();
178
- logger.debug(`clear diagnostics for ${uri}`);
179
- try {
180
- await connection.sendDiagnostics({
181
- uri,
182
- diagnostics: []
183
- });
184
- } catch (e) {
185
- logger.warn(`error clearing diagnostics for ${uri}: ${e}`);
186
- }
187
- })
188
- );
189
- }
190
- isFirstBuild = false;
191
- await interruptAndCheck(cancelToken);
192
- await DocumentBuilder.update(changed, deleted, cancelToken);
193
- }),
194
- connection.onRequest(Locate.Req, (params) => {
195
- switch (true) {
196
- case "element" in params:
197
- return likec4Services.ModelLocator.locateElement(params.element, params.projectId);
198
- case "relation" in params:
199
- return likec4Services.ModelLocator.locateRelation(params.relation, params.projectId);
200
- case "astPath" in params:
201
- return likec4Services.ModelLocator.locateDynamicViewStep({
202
- view: params.view,
203
- astPath: params.astPath,
204
- projectId: params.projectId
205
- });
206
- case "view" in params:
207
- return likec4Services.ModelLocator.locateView(params.view, params.projectId);
208
- case "deployment" in params:
209
- return likec4Services.ModelLocator.locateDeploymentElement(params.deployment, params.projectId);
210
- default:
211
- nonexhaustive(params);
212
- }
213
- }),
214
- connection.onRequest(ChangeView.Req, async (request, _cancelToken) => {
215
- logger.debug`received request ${"changeView"} of ${request.viewId} from project ${request.projectId}`;
216
- return await likec4Services.ModelChanges.applyChange(request);
217
- }),
218
- connection.onRequest(FetchTelemetryMetrics.req, async (cancelToken) => {
219
- const projectsIds = [...projects.all];
220
- const promises = projectsIds.map(async (projectId) => {
221
- const model = await likec4Services.ModelBuilder.buildLikeC4Model(projectId, cancelToken);
222
- if (model === LikeC4Model.EMPTY) {
223
- return Promise.reject(new Error(`Model is empty`));
224
- }
225
- return {
226
- elementKinds: keys(model.specification.elements).length,
227
- deploymentKinds: keys(model.specification.deployments).length,
228
- relationshipKinds: keys(model.specification.relationships).length,
229
- tags: keys(model.specification.tags).length,
230
- customColors: keys(model.specification.customColors ?? {}).length,
231
- elements: keys(model.$data.elements).length,
232
- deploymentNodes: [...model.deployment.nodes()].length,
233
- relationships: keys(model.$data.relations).length,
234
- views: keys(model.$data.views).length,
235
- projects: 1
236
- };
237
- });
238
- const results = await Promise.allSettled(promises);
239
- await interruptAndCheck(cancelToken);
240
- const values = results.filter((r) => r.status === "fulfilled").map((r) => r.value);
241
- const metrics = values.length > 0 ? values.reduce((acc, r) => ({
242
- elementKinds: acc.elementKinds + r.elementKinds,
243
- deploymentKinds: acc.deploymentKinds + r.deploymentKinds,
244
- relationshipKinds: acc.relationshipKinds + r.relationshipKinds,
245
- tags: acc.tags + r.tags,
246
- customColors: acc.customColors + r.customColors,
247
- elements: acc.elements + r.elements,
248
- deploymentNodes: acc.deploymentNodes + r.deploymentNodes,
249
- relationships: acc.relationships + r.relationships,
250
- views: acc.views + r.views,
251
- projects: acc.projects + 1
252
- })) : null;
253
- return {
254
- metrics
255
- };
256
- }),
257
- connection.onRequest(GetDocumentTags.req, async ({ documentUri }, cancelToken) => {
258
- const tags = await likec4Services.ModelLocator.locateDocumentTags(URI.parse(documentUri), cancelToken);
259
- return {
260
- tags
261
- };
262
- }),
263
- Disposable.create(() => {
264
- notifyModelParsed.cancel();
265
- })
266
- );
267
- function reportLayoutDrift(diagrams) {
268
- return pipe(
269
- diagrams,
270
- filter((d) => !!d.hasLayoutDrift),
271
- map((d) => {
272
- const loc = likec4Services.ModelLocator.locateView(d.id);
273
- invariant(loc, `View ${d.id} not found`);
274
- return {
275
- uri: loc.uri,
276
- viewId: d.id,
277
- severity: DiagnosticSeverity.Warning,
278
- message: `Layout drift detected for view '${d.id}'`,
279
- range: loc.range
280
- };
281
- })
282
- );
283
- }
284
- }
285
- async openView(params) {
286
- const lspConnection = this.services.shared.lsp.Connection;
287
- if (!lspConnection) {
288
- logger.warn("No LSP connection");
289
- return;
290
- }
291
- await lspConnection.sendNotification(
292
- DidRequestOpenViewNotification.type,
293
- params
294
- );
295
- }
296
- }
package/dist/ast.mjs DELETED
@@ -1,221 +0,0 @@
1
- import { 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.mjs";
5
- import { LikeC4LanguageMetaData } from "./generated/module.mjs";
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] = void 0;
21
- } else {
22
- node[idattr] = id;
23
- }
24
- return node;
25
- },
26
- readId(node) {
27
- return node[idattr];
28
- }
29
- };
30
- export function isLikeC4LangiumDocument(doc) {
31
- return doc.textDocument.languageId === LikeC4LanguageMetaData.languageId;
32
- }
33
- export function isParsedLikeC4LangiumDocument(doc) {
34
- return isLikeC4LangiumDocument(doc) && doc.state == DocumentState.Validated && !!doc.c4Specification && !!doc.c4Elements && !!doc.c4ExtendElements && !!doc.c4ExtendDeployments && !!doc.c4Relations && !!doc.c4Views && !!doc.c4Deployments && !!doc.c4DeploymentRelations && !!doc.c4Imports;
35
- }
36
- export function parseMarkdownAsString(node) {
37
- return node?.markdown || node?.text;
38
- }
39
- export function parseAstPercent(value) {
40
- const opacity = parseFloat(value);
41
- return isNaN(opacity) ? 100 : clamp(opacity, { min: 0, max: 100 });
42
- }
43
- export function parseAstOpacityProperty({ value }) {
44
- return parseAstPercent(value);
45
- }
46
- export function parseAstSizeValue({ value }) {
47
- switch (value) {
48
- case "xs":
49
- case "sm":
50
- case "md":
51
- case "lg":
52
- case "xl":
53
- return value;
54
- case "xsmall":
55
- return "xs";
56
- case "small":
57
- return "sm";
58
- case "medium":
59
- return "md";
60
- case "large":
61
- return "lg";
62
- case "xlarge":
63
- return "xl";
64
- default:
65
- nonexhaustive(value);
66
- }
67
- }
68
- export function toRelationshipStyle(props, isValid) {
69
- const result = {};
70
- if (!props || props.length === 0) {
71
- return result;
72
- }
73
- for (const prop of props) {
74
- if (!isValid(prop)) {
75
- continue;
76
- }
77
- switch (true) {
78
- case ast.isColorProperty(prop): {
79
- const color = toColor(prop);
80
- if (isTruthy(color)) {
81
- result.color = color;
82
- }
83
- break;
84
- }
85
- case ast.isLineProperty(prop): {
86
- result.line = prop.value;
87
- break;
88
- }
89
- case ast.isArrowProperty(prop): {
90
- switch (prop.key) {
91
- case "head": {
92
- result.head = prop.value;
93
- break;
94
- }
95
- case "tail": {
96
- result.tail = prop.value;
97
- break;
98
- }
99
- default: {
100
- nonexhaustive(prop);
101
- }
102
- }
103
- break;
104
- }
105
- default: {
106
- nonexhaustive(prop);
107
- }
108
- }
109
- }
110
- return result;
111
- }
112
- export function toColor(astNode) {
113
- return astNode?.themeColor ?? astNode?.customColor?.$refText;
114
- }
115
- export function toAutoLayout(rule) {
116
- const rankSep = rule.rankSep;
117
- const nodeSep = rule.nodeSep;
118
- let direction;
119
- switch (rule.direction) {
120
- case "TopBottom": {
121
- direction = "TB";
122
- break;
123
- }
124
- case "BottomTop": {
125
- direction = "BT";
126
- break;
127
- }
128
- case "LeftRight": {
129
- direction = "LR";
130
- break;
131
- }
132
- case "RightLeft": {
133
- direction = "RL";
134
- break;
135
- }
136
- default:
137
- nonexhaustive(rule.direction);
138
- }
139
- return {
140
- direction,
141
- ...nodeSep && { nodeSep },
142
- ...rankSep && { rankSep }
143
- };
144
- }
145
- export function toAstViewLayoutDirection(c4) {
146
- switch (c4) {
147
- case "TB": {
148
- return "TopBottom";
149
- }
150
- case "BT": {
151
- return "BottomTop";
152
- }
153
- case "LR": {
154
- return "LeftRight";
155
- }
156
- case "RL": {
157
- return "RightLeft";
158
- }
159
- default:
160
- nonexhaustive(c4);
161
- }
162
- }
163
- export function getViewRulePredicateContainer(el) {
164
- return AstUtils.getContainerOfType(
165
- el,
166
- (n) => {
167
- return ast.isViewRulePredicate(n) || ast.isDeploymentViewRulePredicate(n) || ast.isDynamicViewIncludePredicate(n);
168
- }
169
- );
170
- }
171
- const _isModel = (astNode) => {
172
- return ast.isModel(astNode) || ast.isElementBody(astNode) || ast.isExtendElementBody(astNode) || ast.isElementViewBody(astNode) || ast.isDynamicViewBody(astNode) || ast.isElementRef(astNode);
173
- };
174
- const _isDeployment = (astNode) => {
175
- return ast.isModelDeployments(astNode) || ast.isDeploymentViewBody(astNode) || ast.isDeploymentNodeBody(astNode) || ast.isExtendDeploymentBody(astNode) || ast.isDeployedInstanceBody(astNode);
176
- };
177
- export function isFqnRefInsideGlobals(astNode) {
178
- while (true) {
179
- if (_isDeployment(astNode) || _isModel(astNode)) {
180
- return false;
181
- }
182
- if (ast.isGlobals(astNode) || ast.isModelViews(astNode)) {
183
- return true;
184
- }
185
- if (astNode.$container) {
186
- astNode = astNode.$container;
187
- } else {
188
- return false;
189
- }
190
- }
191
- }
192
- export function isFqnRefInsideModel(astNode) {
193
- while (true) {
194
- if (_isDeployment(astNode)) {
195
- return false;
196
- }
197
- if (_isModel(astNode)) {
198
- return true;
199
- }
200
- if (astNode.$container) {
201
- astNode = astNode.$container;
202
- } else {
203
- return false;
204
- }
205
- }
206
- }
207
- export function isFqnRefInsideDeployment(astNode) {
208
- while (true) {
209
- if (_isModel(astNode)) {
210
- return false;
211
- }
212
- if (_isDeployment(astNode)) {
213
- return true;
214
- }
215
- if (astNode.$container) {
216
- astNode = astNode.$container;
217
- } else {
218
- return false;
219
- }
220
- }
221
- }
@@ -1,2 +0,0 @@
1
- import { startLanguageServer } from "./browser.mjs";
2
- startLanguageServer(self);
package/dist/browser.mjs DELETED
@@ -1,32 +0,0 @@
1
- import { configureLogger, getAnsiColorFormatter, getConsoleSink } 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.mjs";
5
- export { logger as lspLogger } from "./logger.mjs";
6
- export { createLanguageServices } from "./module.mjs";
7
- export function startLanguageServer(port) {
8
- const messageReader = new BrowserMessageReader(port);
9
- const messageWriter = new BrowserMessageWriter(port);
10
- const connection = createConnection(messageReader, messageWriter);
11
- configureLogger({
12
- sinks: {
13
- console: getConsoleSink({
14
- formatter: getAnsiColorFormatter({
15
- format: ({ level, category, message }) => {
16
- return `${level} ${category} ${message}`;
17
- }
18
- })
19
- })
20
- },
21
- loggers: [
22
- {
23
- category: "likec4",
24
- sinks: ["console"],
25
- lowestLevel: "debug"
26
- }
27
- ]
28
- });
29
- const services = createLanguageServices({ connection });
30
- startLanguim(services.shared);
31
- return services;
32
- }
@@ -1,48 +0,0 @@
1
- import { FqnRef } from "@likec4/core";
2
- import { AstUtils } from "langium";
3
- import { ast } from "../ast.mjs";
4
- import { logWarnError } from "../logger.mjs";
5
- export class LikeC4DocumentationProvider {
6
- parser;
7
- locator;
8
- constructor(services) {
9
- this.parser = services.likec4.ModelParser;
10
- this.locator = services.likec4.ModelLocator;
11
- }
12
- getDocumentation(node) {
13
- try {
14
- if (ast.isDeploymentNode(node)) {
15
- const doc = AstUtils.getDocument(node);
16
- const el = this.parser.forDocument(doc).parseDeploymentNode(node);
17
- const lines = [el.id];
18
- if (el.title !== node.name) {
19
- lines.push(" ", `**${el.title}**`);
20
- }
21
- return lines.join(" \n");
22
- }
23
- if (ast.isDeployedInstance(node)) {
24
- const doc = AstUtils.getDocument(node);
25
- const instance = this.parser.forDocument(doc).parseDeployedInstance(node);
26
- const [projectId, fqn] = FqnRef.isImportRef(instance.element) ? [instance.element.project, instance.element.model] : [doc.likec4ProjectId, instance.element.model];
27
- const el = projectId ? this.locator.getParsedElement(fqn, projectId) : this.locator.getParsedElement(fqn);
28
- const lines = [instance.id, `_instance of_ ${fqn}`];
29
- if (el) {
30
- lines.push(" ", `**${el.title}**`);
31
- }
32
- return lines.join(" \n");
33
- }
34
- if (ast.isElement(node)) {
35
- const doc = AstUtils.getDocument(node);
36
- const el = this.parser.forDocument(doc).parseElement(node);
37
- if (!el) {
38
- return;
39
- }
40
- const lines = [el.id, " ", `**${el.title}**`];
41
- return lines.join(" \n");
42
- }
43
- } catch (e) {
44
- logWarnError(e);
45
- }
46
- return;
47
- }
48
- }
@@ -1 +0,0 @@
1
- export { LikeC4DocumentationProvider } from "./documentation-provider.mjs";
package/dist/empty.mjs DELETED
@@ -1 +0,0 @@
1
- export default {};
@@ -1,68 +0,0 @@
1
- import { isLikeC4Config } from "@likec4/config/node";
2
- import { loggable } from "@likec4/log";
3
- import chokidar from "chokidar";
4
- import { URI } from "langium";
5
- import { logger as mainLogger } from "../logger.mjs";
6
- import { isAnyLikeC4File, isLikeC4File } from "./LikeC4FileSystem.mjs";
7
- const logger = mainLogger.getChild("chokidar");
8
- export const chokidarFileSystemWatcher = {
9
- fileSystemWatcher: (services) => new ChokidarFileSystemWatcher(services)
10
- };
11
- export class ChokidarFileSystemWatcher {
12
- constructor(services) {
13
- this.services = services;
14
- }
15
- watcher;
16
- watch(folder) {
17
- if (this.watcher) {
18
- this.watcher.add(folder);
19
- } else {
20
- this.watcher = this.createWatcher(folder);
21
- }
22
- logger.debug`watching folder: ${folder}`;
23
- }
24
- async dispose() {
25
- if (this.watcher) {
26
- await this.watcher.close();
27
- this.watcher = void 0;
28
- }
29
- return;
30
- }
31
- createWatcher(folder) {
32
- let watcher = chokidar.watch(folder, {
33
- ignored: [
34
- (path) => path.includes("node_modules") || path.includes(".git"),
35
- (path, stats) => !!stats && stats.isFile() && !isAnyLikeC4File(path)
36
- ],
37
- ignoreInitial: true
38
- });
39
- const onAddOrChange = async (path) => {
40
- try {
41
- if (isLikeC4Config(path)) {
42
- logger.debug`project file changed: ${path}`;
43
- await this.services.workspace.ProjectsManager.reloadProjects();
44
- } else if (isLikeC4File(path)) {
45
- logger.debug`file changed: ${path}`;
46
- await this.services.workspace.DocumentBuilder.update([URI.file(path)], []);
47
- }
48
- } catch (error) {
49
- logger.error(loggable(error));
50
- }
51
- };
52
- const onRemove = async (path) => {
53
- try {
54
- if (isLikeC4Config(path)) {
55
- logger.debug`project file removed: ${path}`;
56
- await this.services.workspace.ProjectsManager.reloadProjects();
57
- } else if (isLikeC4File(path)) {
58
- logger.debug`file removed: ${path}`;
59
- await this.services.workspace.DocumentBuilder.update([], [URI.file(path)]);
60
- }
61
- } catch (error) {
62
- logger.error(loggable(error));
63
- }
64
- };
65
- watcher.on("add", onAddOrChange).on("change", onAddOrChange).on("unlink", onRemove);
66
- return watcher;
67
- }
68
- }
@@ -1,11 +0,0 @@
1
- export const noopFileSystemWatcher = {
2
- fileSystemWatcher: () => new NoopFileSystemWatcher()
3
- };
4
- export class NoopFileSystemWatcher {
5
- watch() {
6
- return;
7
- }
8
- dispose() {
9
- return Promise.resolve();
10
- }
11
- }