@likec4/language-server 1.18.0 → 1.19.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 (220) hide show
  1. package/dist/LikeC4FileSystem.d.ts +13 -0
  2. package/dist/LikeC4FileSystem.js +27 -0
  3. package/dist/Rpc.d.ts +9 -0
  4. package/dist/Rpc.js +126 -0
  5. package/dist/ast.d.ts +200 -0
  6. package/dist/ast.js +276 -0
  7. package/dist/browser.d.ts +6 -20
  8. package/dist/browser.js +13 -0
  9. package/dist/formatting/LikeC4Formatter.d.ts +27 -0
  10. package/dist/formatting/LikeC4Formatter.js +261 -0
  11. package/dist/formatting/utils.d.ts +6 -0
  12. package/dist/formatting/utils.js +15 -0
  13. package/dist/generated/ast.d.ts +1242 -0
  14. package/dist/generated/ast.js +1945 -0
  15. package/dist/generated/grammar.d.ts +6 -0
  16. package/dist/generated/grammar.js +3 -0
  17. package/dist/generated/module.d.ts +9 -0
  18. package/dist/generated/module.js +23 -0
  19. package/dist/generated-lib/icons.d.ts +1 -0
  20. package/dist/{likec4lib.mjs → generated-lib/icons.js} +1 -6
  21. package/dist/index.d.ts +8 -31
  22. package/dist/index.js +13 -0
  23. package/dist/like-c4.langium +845 -0
  24. package/dist/likec4lib.d.ts +4 -6
  25. package/dist/likec4lib.js +4 -0
  26. package/dist/logger.d.ts +7 -0
  27. package/dist/logger.js +73 -0
  28. package/dist/lsp/CodeLensProvider.d.ts +9 -0
  29. package/dist/lsp/CodeLensProvider.js +40 -0
  30. package/dist/lsp/CompletionProvider.d.ts +6 -0
  31. package/dist/lsp/CompletionProvider.js +135 -0
  32. package/dist/lsp/DocumentHighlightProvider.d.ts +9 -0
  33. package/dist/lsp/DocumentHighlightProvider.js +10 -0
  34. package/dist/lsp/DocumentLinkProvider.d.ts +11 -0
  35. package/dist/lsp/DocumentLinkProvider.js +49 -0
  36. package/dist/lsp/DocumentSymbolProvider.d.ts +23 -0
  37. package/dist/lsp/DocumentSymbolProvider.js +202 -0
  38. package/dist/lsp/HoverProvider.d.ts +10 -0
  39. package/dist/lsp/HoverProvider.js +69 -0
  40. package/dist/lsp/RenameProvider.d.ts +5 -0
  41. package/dist/lsp/RenameProvider.js +6 -0
  42. package/dist/lsp/SemanticTokenProvider.d.ts +7 -0
  43. package/dist/lsp/SemanticTokenProvider.js +297 -0
  44. package/dist/lsp/index.d.ts +7 -0
  45. package/dist/lsp/index.js +7 -0
  46. package/dist/model/deployments-index.d.ts +60 -0
  47. package/dist/model/deployments-index.js +181 -0
  48. package/dist/model/fqn-computation.d.ts +3 -0
  49. package/dist/model/fqn-computation.js +72 -0
  50. package/dist/model/fqn-index.d.ts +25 -0
  51. package/dist/model/fqn-index.js +96 -0
  52. package/dist/model/index.d.ts +6 -0
  53. package/dist/model/index.js +6 -0
  54. package/dist/model/model-builder.d.ts +32 -0
  55. package/dist/model/model-builder.js +598 -0
  56. package/dist/model/model-locator.d.ts +23 -0
  57. package/dist/model/model-locator.js +126 -0
  58. package/dist/model/model-parser-where.d.ts +3 -0
  59. package/dist/model/model-parser-where.js +70 -0
  60. package/dist/model/model-parser.d.ts +292 -0
  61. package/dist/model/model-parser.js +72 -0
  62. package/dist/model/parser/Base.d.ts +28 -0
  63. package/dist/model/parser/Base.js +87 -0
  64. package/dist/model/parser/DeploymentModelParser.d.ts +33 -0
  65. package/dist/model/parser/DeploymentModelParser.js +162 -0
  66. package/dist/model/parser/DeploymentViewParser.d.ts +38 -0
  67. package/dist/model/parser/DeploymentViewParser.js +98 -0
  68. package/dist/model/parser/FqnRefParser.d.ts +29 -0
  69. package/dist/model/parser/FqnRefParser.js +108 -0
  70. package/dist/model/parser/GlobalsParser.d.ts +66 -0
  71. package/dist/model/parser/GlobalsParser.js +80 -0
  72. package/dist/model/parser/ModelParser.d.ts +27 -0
  73. package/dist/model/parser/ModelParser.js +122 -0
  74. package/dist/model/parser/PredicatesParser.d.ts +34 -0
  75. package/dist/model/parser/PredicatesParser.js +272 -0
  76. package/dist/model/parser/SpecificationParser.d.ts +27 -0
  77. package/dist/model/parser/SpecificationParser.js +120 -0
  78. package/dist/model/parser/ViewsParser.d.ts +64 -0
  79. package/dist/model/parser/ViewsParser.js +377 -0
  80. package/dist/model-change/ModelChanges.d.ts +15 -0
  81. package/dist/model-change/ModelChanges.js +89 -0
  82. package/dist/model-change/changeElementStyle.d.ts +16 -0
  83. package/dist/model-change/changeElementStyle.js +136 -0
  84. package/dist/model-change/changeViewLayout.d.ts +12 -0
  85. package/dist/model-change/changeViewLayout.js +32 -0
  86. package/dist/model-change/saveManualLayout.d.ts +11 -0
  87. package/dist/model-change/saveManualLayout.js +27 -0
  88. package/dist/module.d.ts +62 -0
  89. package/dist/module.js +123 -0
  90. package/dist/protocol.d.ts +20 -23
  91. package/dist/protocol.js +14 -0
  92. package/dist/references/index.d.ts +3 -0
  93. package/dist/references/index.js +3 -0
  94. package/dist/references/name-provider.d.ts +9 -0
  95. package/dist/references/name-provider.js +33 -0
  96. package/dist/references/scope-computation.d.ts +20 -0
  97. package/dist/references/scope-computation.js +281 -0
  98. package/dist/references/scope-provider.d.ts +16 -0
  99. package/dist/references/scope-provider.js +165 -0
  100. package/dist/shared/NodeKindProvider.d.ts +15 -0
  101. package/dist/shared/NodeKindProvider.js +108 -0
  102. package/dist/shared/WorkspaceManager.d.ts +18 -0
  103. package/dist/shared/WorkspaceManager.js +36 -0
  104. package/dist/shared/WorkspaceSymbolProvider.d.ts +3 -0
  105. package/dist/shared/WorkspaceSymbolProvider.js +3 -0
  106. package/dist/shared/index.d.ts +3 -0
  107. package/dist/shared/index.js +3 -0
  108. package/dist/test/index.d.ts +1 -0
  109. package/dist/test/index.js +1 -0
  110. package/dist/test/setup.d.ts +1 -0
  111. package/dist/test/setup.js +7 -0
  112. package/dist/test/testServices.d.ts +22 -0
  113. package/dist/test/testServices.js +119 -0
  114. package/dist/utils/elementRef.d.ts +11 -0
  115. package/dist/utils/elementRef.js +15 -0
  116. package/dist/utils/fqnRef.d.ts +8 -0
  117. package/dist/utils/fqnRef.js +46 -0
  118. package/dist/utils/index.d.ts +1 -0
  119. package/dist/utils/index.js +1 -0
  120. package/dist/utils/printDocs.d.ts +2 -0
  121. package/dist/utils/printDocs.js +1 -0
  122. package/dist/utils/stringHash.d.ts +1 -0
  123. package/dist/utils/stringHash.js +5 -0
  124. package/dist/validation/_shared.d.ts +3 -0
  125. package/dist/validation/_shared.js +22 -0
  126. package/dist/validation/deployment-checks.d.ts +6 -0
  127. package/dist/validation/deployment-checks.js +114 -0
  128. package/dist/validation/dynamic-view-rule.d.ts +4 -0
  129. package/dist/validation/dynamic-view-rule.js +16 -0
  130. package/dist/validation/dynamic-view-step.d.ts +4 -0
  131. package/dist/validation/dynamic-view-step.js +33 -0
  132. package/dist/validation/element.d.ts +4 -0
  133. package/dist/validation/element.js +49 -0
  134. package/dist/validation/index.d.ts +15 -0
  135. package/dist/validation/index.js +152 -0
  136. package/dist/validation/property-checks.d.ts +6 -0
  137. package/dist/validation/property-checks.js +38 -0
  138. package/dist/validation/relation.d.ts +5 -0
  139. package/dist/validation/relation.js +56 -0
  140. package/dist/validation/specification.d.ts +11 -0
  141. package/dist/validation/specification.js +136 -0
  142. package/dist/validation/view-predicates/element-with.d.ts +4 -0
  143. package/dist/validation/view-predicates/element-with.js +30 -0
  144. package/dist/validation/view-predicates/expanded-element.d.ts +4 -0
  145. package/dist/validation/view-predicates/expanded-element.js +11 -0
  146. package/dist/validation/view-predicates/expression-v2.d.ts +5 -0
  147. package/dist/validation/view-predicates/expression-v2.js +83 -0
  148. package/dist/validation/view-predicates/incoming.d.ts +4 -0
  149. package/dist/validation/view-predicates/incoming.js +15 -0
  150. package/dist/validation/view-predicates/index.d.ts +6 -0
  151. package/dist/validation/view-predicates/index.js +6 -0
  152. package/dist/validation/view-predicates/outgoing.d.ts +4 -0
  153. package/dist/validation/view-predicates/outgoing.js +15 -0
  154. package/dist/validation/view-predicates/relation-with.d.ts +4 -0
  155. package/dist/validation/view-predicates/relation-with.js +12 -0
  156. package/dist/validation/view.d.ts +4 -0
  157. package/dist/validation/view.js +23 -0
  158. package/dist/view-utils/assignNavigateTo.d.ts +2 -0
  159. package/dist/view-utils/assignNavigateTo.js +25 -0
  160. package/dist/view-utils/index.d.ts +2 -0
  161. package/dist/view-utils/index.js +2 -0
  162. package/dist/view-utils/manual-layout.d.ts +7 -0
  163. package/dist/view-utils/manual-layout.js +99 -0
  164. package/dist/view-utils/resolve-relative-paths.d.ts +2 -0
  165. package/dist/view-utils/resolve-relative-paths.js +78 -0
  166. package/package.json +36 -53
  167. package/src/LikeC4FileSystem.ts +22 -21
  168. package/src/ast.ts +44 -133
  169. package/src/browser.ts +10 -11
  170. package/src/generated/ast.ts +177 -177
  171. package/src/generated/grammar.ts +1 -1
  172. package/src/index.ts +10 -8
  173. package/src/like-c4.langium +37 -34
  174. package/src/logger.ts +34 -55
  175. package/src/lsp/CompletionProvider.ts +4 -4
  176. package/src/lsp/HoverProvider.ts +5 -3
  177. package/src/lsp/SemanticTokenProvider.ts +2 -2
  178. package/src/model/deployments-index.ts +18 -14
  179. package/src/model/model-builder.ts +10 -8
  180. package/src/model/model-parser.ts +62 -1574
  181. package/src/model/parser/Base.ts +107 -0
  182. package/src/model/parser/DeploymentModelParser.ts +192 -0
  183. package/src/model/parser/DeploymentViewParser.ts +116 -0
  184. package/src/model/parser/FqnRefParser.ts +118 -0
  185. package/src/model/parser/GlobalsParser.ts +96 -0
  186. package/src/model/parser/ModelParser.ts +141 -0
  187. package/src/model/parser/PredicatesParser.ts +291 -0
  188. package/src/model/parser/SpecificationParser.ts +133 -0
  189. package/src/model/parser/ViewsParser.ts +428 -0
  190. package/src/module.ts +17 -18
  191. package/src/references/scope-provider.ts +13 -7
  192. package/src/utils/{deploymentRef.ts → fqnRef.ts} +27 -2
  193. package/src/validation/_shared.ts +0 -1
  194. package/src/validation/deployment-checks.ts +49 -62
  195. package/src/validation/index.ts +100 -9
  196. package/src/validation/view-predicates/expression-v2.ts +101 -0
  197. package/src/validation/view-predicates/index.ts +1 -1
  198. package/src/view-utils/assignNavigateTo.ts +1 -1
  199. package/src/view-utils/manual-layout.ts +25 -0
  200. package/dist/browser.cjs +0 -25
  201. package/dist/browser.d.cts +0 -23
  202. package/dist/browser.d.mts +0 -23
  203. package/dist/browser.mjs +0 -20
  204. package/dist/index.cjs +0 -53
  205. package/dist/index.d.cts +0 -34
  206. package/dist/index.d.mts +0 -34
  207. package/dist/index.mjs +0 -46
  208. package/dist/likec4lib.cjs +0 -1546
  209. package/dist/likec4lib.d.cts +0 -6
  210. package/dist/likec4lib.d.mts +0 -6
  211. package/dist/protocol.cjs +0 -25
  212. package/dist/protocol.d.cts +0 -48
  213. package/dist/protocol.d.mts +0 -48
  214. package/dist/protocol.mjs +0 -17
  215. package/dist/shared/language-server.CO_nmHiL.cjs +0 -7689
  216. package/dist/shared/language-server.Da6ey08o.d.cts +0 -1619
  217. package/dist/shared/language-server.De7S3e5Z.d.ts +0 -1619
  218. package/dist/shared/language-server.Dj4iDjtB.d.mts +0 -1619
  219. package/dist/shared/language-server.oO_9JoAG.mjs +0 -7666
  220. package/src/validation/view-predicates/deployments.ts +0 -56
@@ -0,0 +1,25 @@
1
+ import { ComputedNode, ComputedView } from "@likec4/core";
2
+ import { find, isNullish } from "remeda";
3
+ export function assignNavigateTo(views) {
4
+ const allElementViews = /* @__PURE__ */ new Map();
5
+ for (const v of views) {
6
+ if (ComputedView.isElement(v) && v.viewOf && isNullish(v.extends)) {
7
+ const viewsOf = allElementViews.get(v.viewOf) ?? [];
8
+ viewsOf.push(v.id);
9
+ allElementViews.set(v.viewOf, viewsOf);
10
+ }
11
+ }
12
+ for (const { id, nodes } of views) {
13
+ for (const node of nodes) {
14
+ const modelRef = ComputedNode.modelRef(node);
15
+ if (node.navigateTo || !modelRef) {
16
+ continue;
17
+ }
18
+ const navigateTo = find(allElementViews.get(modelRef) ?? [], (v) => v !== id);
19
+ if (navigateTo) {
20
+ node.navigateTo = navigateTo;
21
+ }
22
+ }
23
+ }
24
+ return views;
25
+ }
@@ -0,0 +1,2 @@
1
+ export * from './assignNavigateTo';
2
+ export * from './resolve-relative-paths';
@@ -0,0 +1,2 @@
1
+ export * from "./assignNavigateTo.js";
2
+ export * from "./resolve-relative-paths.js";
@@ -0,0 +1,7 @@
1
+ import type * as c4 from '@likec4/core';
2
+ import { type ViewManualLayout } from '@likec4/core';
3
+ import type { ast } from '../ast';
4
+ export declare function serializeToComment(layout: ViewManualLayout): string;
5
+ export declare function hasManualLayout(comment: string): boolean;
6
+ export declare function deserializeFromComment(comment: string): ViewManualLayout;
7
+ export declare function parseViewManualLayout(node: ast.LikeC4View): c4.ViewManualLayout | undefined;
@@ -0,0 +1,99 @@
1
+ import { isAutoLayoutDirection } from "@likec4/core";
2
+ import { decode, encode } from "@msgpack/msgpack";
3
+ import { fromBase64, toBase64 } from "@smithy/util-base64";
4
+ import { AstUtils, CstUtils } from "langium";
5
+ import { mapValues } from "remeda";
6
+ import { logger } from "../logger.js";
7
+ const { getDocument } = AstUtils;
8
+ function pack({
9
+ nodes,
10
+ edges,
11
+ ...rest
12
+ }) {
13
+ return {
14
+ ...rest,
15
+ nodes: mapValues(nodes, ({ x, y, width, height, isCompound, ...n }) => ({
16
+ ...n,
17
+ b: [x, y, width, height],
18
+ c: isCompound
19
+ })),
20
+ edges: mapValues(edges, ({ points, controlPoints, labelBBox, dotpos, ...e }) => ({
21
+ ...!!controlPoints && { cp: controlPoints },
22
+ ...!!labelBBox && { l: labelBBox },
23
+ ...!!dotpos && { dp: dotpos },
24
+ ...e,
25
+ p: points
26
+ }))
27
+ };
28
+ }
29
+ function unpack({
30
+ nodes,
31
+ edges,
32
+ autoLayout,
33
+ ...rest
34
+ }) {
35
+ return {
36
+ ...rest,
37
+ /// Try to parse the old format for backward compatibility
38
+ autoLayout: isAutoLayoutDirection(autoLayout) ? { direction: autoLayout } : autoLayout,
39
+ nodes: mapValues(nodes, ({ b, c, ...n }) => ({
40
+ x: b[0],
41
+ y: b[1],
42
+ width: b[2],
43
+ height: b[3],
44
+ isCompound: c,
45
+ ...n
46
+ })),
47
+ edges: mapValues(edges, ({ p, cp, l, dp, ...e }) => ({
48
+ ...!!cp && { controlPoints: cp },
49
+ ...!!l && { labelBBox: l },
50
+ ...!!dp && { dotpos: dp },
51
+ ...e,
52
+ points: p
53
+ }))
54
+ };
55
+ }
56
+ const MAX_LINE_LENGTH = 500;
57
+ export function serializeToComment(layout) {
58
+ const bytes = encode(pack(layout));
59
+ const base64 = toBase64(bytes);
60
+ const lines = [];
61
+ let offset = 0;
62
+ while (offset < base64.length) {
63
+ lines.push(" * " + base64.slice(offset, Math.min(offset + MAX_LINE_LENGTH, base64.length)));
64
+ offset += MAX_LINE_LENGTH;
65
+ }
66
+ lines.unshift(
67
+ "/**",
68
+ " * @likec4-generated(v1)"
69
+ );
70
+ lines.push(" */");
71
+ return lines.join("\n");
72
+ }
73
+ export function hasManualLayout(comment) {
74
+ return comment.includes("@likec4-generated");
75
+ }
76
+ export function deserializeFromComment(comment) {
77
+ if (!hasManualLayout(comment)) {
78
+ throw new Error(`Not a likec4-generated comment: ${comment}`);
79
+ }
80
+ const b64 = comment.trim().split("\n").filter((l) => !l.includes("**") && !l.includes("@likec4-") && !l.includes("*/")).map((l) => l.replaceAll("*", "").trim()).join("");
81
+ const decodedb64 = fromBase64(b64);
82
+ return unpack(decode(decodedb64));
83
+ }
84
+ export function parseViewManualLayout(node) {
85
+ const commentNode = CstUtils.findCommentNode(node.$cstNode, ["BLOCK_COMMENT"]);
86
+ if (!commentNode || !hasManualLayout(commentNode.text)) {
87
+ return void 0;
88
+ }
89
+ try {
90
+ return deserializeFromComment(commentNode.text);
91
+ } catch (e) {
92
+ const doc = getDocument(node);
93
+ logger.warn(e);
94
+ logger.warn(
95
+ `Ignoring manual layout of "${node.name ?? "unnamed"}" at ${doc.uri.fsPath}:${1 + (commentNode.range.start.line || 0)}`
96
+ );
97
+ return void 0;
98
+ }
99
+ }
@@ -0,0 +1,2 @@
1
+ import type { LikeC4View } from '@likec4/core';
2
+ export declare function resolveRelativePaths(views: LikeC4View[]): LikeC4View[];
@@ -0,0 +1,78 @@
1
+ import { compareNatural, invariant } from "@likec4/core";
2
+ import { filter, hasAtLeast, isTruthy, map, pipe, unique } from "remeda";
3
+ import { parsePath } from "ufo";
4
+ function commonAncestorPath(views, sep = "/") {
5
+ const uniqURIs = pipe(
6
+ views,
7
+ map((v) => v.docUri),
8
+ filter(isTruthy),
9
+ unique()
10
+ );
11
+ if (uniqURIs.length === 0) return "";
12
+ if (uniqURIs.length === 1) {
13
+ const parts2 = parsePath(uniqURIs[0]).pathname.split(sep);
14
+ if (parts2.length <= 1) return sep;
15
+ parts2.pop();
16
+ return parts2.join(sep) + sep;
17
+ }
18
+ invariant(hasAtLeast(uniqURIs, 2), "Expected at least 2 unique URIs");
19
+ const [baseUri, ...tail] = uniqURIs;
20
+ const parts = parsePath(baseUri).pathname.split(sep);
21
+ let endOfPrefix = parts.length;
22
+ for (const uri of tail) {
23
+ if (uri === baseUri) {
24
+ continue;
25
+ }
26
+ const compare = parsePath(uri).pathname.split(sep);
27
+ for (let i = 0; i < endOfPrefix; i++) {
28
+ if (compare[i] !== parts[i]) {
29
+ endOfPrefix = i;
30
+ }
31
+ }
32
+ if (endOfPrefix === 0) return "";
33
+ }
34
+ const prefix = parts.slice(0, endOfPrefix).join(sep);
35
+ return prefix.endsWith(sep) ? prefix : prefix + sep;
36
+ }
37
+ export function resolveRelativePaths(views) {
38
+ const sep = "/";
39
+ const commonPrefix = commonAncestorPath(views, sep);
40
+ return views.map((view) => {
41
+ if (!view.docUri) {
42
+ return {
43
+ view,
44
+ parts: []
45
+ };
46
+ }
47
+ let path = parsePath(view.docUri).pathname;
48
+ if (commonPrefix.length > 0) {
49
+ invariant(
50
+ path.startsWith(commonPrefix),
51
+ `Expect path "${path}" to start with common prefix: "${commonPrefix}"`
52
+ );
53
+ path = path.slice(commonPrefix.length);
54
+ } else {
55
+ path = path.includes(sep) ? path.slice(path.lastIndexOf(sep) + 1) : path;
56
+ }
57
+ return {
58
+ view,
59
+ parts: path.split(sep)
60
+ };
61
+ }).sort((a, b) => {
62
+ if (a.parts.length !== b.parts.length) {
63
+ return a.parts.length - b.parts.length;
64
+ }
65
+ for (let i = 0; i < a.parts.length; i++) {
66
+ const compare = compareNatural(a.parts[i], b.parts[i]);
67
+ if (compare !== 0) {
68
+ return compare;
69
+ }
70
+ }
71
+ return compareNatural(a.view.title ?? a.view.id, b.view.title ?? b.view.id);
72
+ }).map(({ parts, view }) => {
73
+ return {
74
+ ...view,
75
+ relativePath: parts.join(sep)
76
+ };
77
+ });
78
+ }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@likec4/language-server",
3
3
  "description": "LikeC4 Language Server",
4
- "version": "1.18.0",
4
+ "version": "1.19.0",
5
5
  "license": "MIT",
6
6
  "bugs": "https://github.com/likec4/likec4/issues",
7
7
  "homepage": "https://likec4.dev",
@@ -24,65 +24,46 @@
24
24
  "sideEffects": false,
25
25
  "exports": {
26
26
  ".": {
27
- "browser": {
28
- "types": "./dist/browser.d.ts",
29
- "import": "./dist/browser.mjs",
30
- "require": "./dist/browser.cjs"
27
+ "development": "./src/index.ts",
28
+ "node": {
29
+ "types": "./dist/index.d.ts",
30
+ "import": "./dist/index.js",
31
+ "default": "./dist/index.js"
31
32
  },
32
33
  "default": {
33
- "types": "./dist/index.d.ts",
34
- "import": "./dist/index.mjs",
35
- "require": "./dist/index.cjs"
34
+ "types": "./dist/browser.d.ts",
35
+ "import": "./dist/browser.js",
36
+ "default": "./dist/browser.js"
36
37
  }
37
38
  },
38
39
  "./likec4lib": {
39
- "types": "./dist/likec4lib.d.ts",
40
- "import": "./dist/likec4lib.mjs",
41
- "require": "./dist/likec4lib.cjs"
40
+ "development": "./src/likec4lib.ts",
41
+ "default": {
42
+ "types": "./dist/likec4lib.d.ts",
43
+ "import": "./dist/likec4lib.js",
44
+ "default": "./dist/likec4lib.js"
45
+ }
42
46
  },
43
47
  "./browser": {
44
- "types": "./dist/browser.d.ts",
45
- "import": "./dist/browser.mjs",
46
- "require": "./dist/browser.cjs"
48
+ "development": "./src/browser.ts",
49
+ "default": {
50
+ "types": "./dist/browser.d.ts",
51
+ "import": "./dist/browser.js",
52
+ "default": "./dist/browser.js"
53
+ }
47
54
  },
48
55
  "./protocol": {
49
- "types": "./dist/protocol.d.ts",
50
- "import": "./dist/protocol.mjs",
51
- "require": "./dist/protocol.cjs"
56
+ "development": "./src/protocol.ts",
57
+ "default": {
58
+ "types": "./dist/protocol.d.ts",
59
+ "import": "./dist/protocol.js",
60
+ "default": "./dist/protocol.js"
61
+ }
52
62
  }
53
63
  },
54
64
  "publishConfig": {
55
65
  "registry": "https://registry.npmjs.org",
56
- "access": "public",
57
- "exports": {
58
- ".": {
59
- "browser": {
60
- "types": "./dist/browser.d.ts",
61
- "import": "./dist/browser.mjs",
62
- "require": "./dist/browser.cjs"
63
- },
64
- "default": {
65
- "types": "./dist/index.d.ts",
66
- "import": "./dist/index.mjs",
67
- "require": "./dist/index.cjs"
68
- }
69
- },
70
- "./likec4lib": {
71
- "types": "./dist/likec4lib.d.ts",
72
- "import": "./dist/likec4lib.mjs",
73
- "require": "./dist/likec4lib.cjs"
74
- },
75
- "./browser": {
76
- "types": "./dist/browser.d.ts",
77
- "import": "./dist/browser.mjs",
78
- "require": "./dist/browser.cjs"
79
- },
80
- "./protocol": {
81
- "types": "./dist/protocol.d.ts",
82
- "import": "./dist/protocol.mjs",
83
- "require": "./dist/protocol.cjs"
84
- }
85
- }
66
+ "access": "public"
86
67
  },
87
68
  "scripts": {
88
69
  "typecheck": "tsc --noEmit",
@@ -101,12 +82,13 @@
101
82
  "test:watch": "vitest"
102
83
  },
103
84
  "dependencies": {
104
- "@likec4/core": "1.18.0",
105
- "@likec4/log": "1.18.0",
85
+ "@likec4/core": "1.19.0",
86
+ "@likec4/log": "1.19.0",
106
87
  "@msgpack/msgpack": "^3.0.0-beta2",
107
88
  "@smithy/util-base64": "^3.0.0",
108
89
  "esm-env": "^1.2.1",
109
90
  "fast-equals": "^5.0.1",
91
+ "fdir": "^6.4.2",
110
92
  "indent-string": "^5.0.0",
111
93
  "json5": "^2.2.3",
112
94
  "langium": "3.3.0",
@@ -121,17 +103,18 @@
121
103
  "vscode-uri": "3.0.8"
122
104
  },
123
105
  "devDependencies": {
124
- "@likec4/icons": "1.18.0",
125
- "@likec4/tsconfig": "1.18.0",
106
+ "@likec4/icons": "1.19.0",
107
+ "@likec4/tsconfig": "1.19.0",
126
108
  "@types/node": "^20.17.7",
127
109
  "@vitest/coverage-v8": "^2.1.8",
128
110
  "execa": "^9.3.1",
129
111
  "langium-cli": "3.3.0",
112
+ "natural-compare-lite": "^1.4.0",
130
113
  "npm-run-all2": "^7.0.1",
131
- "tsx": "~4.9.3",
114
+ "tsx": "~4.19.2",
132
115
  "turbo": "^2.3.3",
133
116
  "typescript": "^5.7.2",
134
- "unbuild": "^3.0.0-rc.11",
117
+ "unbuild": "^3.1.0",
135
118
  "vitest": "^2.1.8"
136
119
  },
137
120
  "packageManager": "yarn@4.5.3"
@@ -1,11 +1,11 @@
1
- import { type FileSystemNode, URI, UriUtils } from 'langium'
1
+ import { fdir } from 'fdir'
2
+ import { type FileSystemNode, URI } from 'langium'
2
3
  import { NodeFileSystemProvider } from 'langium/node'
3
- import { lstatSync, readlinkSync } from 'node:fs'
4
- import { readdir } from 'node:fs/promises'
5
- import { dirname, resolve } from 'node:path'
4
+ import { stat } from 'node:fs/promises'
5
+ import { logger } from './logger'
6
6
 
7
7
  export const LikeC4FileSystem = {
8
- fileSystemProvider: () => new SymLinkTraversingFileSystemProvider()
8
+ fileSystemProvider: () => new SymLinkTraversingFileSystemProvider(),
9
9
  }
10
10
 
11
11
  /**
@@ -14,23 +14,24 @@ export const LikeC4FileSystem = {
14
14
  */
15
15
  class SymLinkTraversingFileSystemProvider extends NodeFileSystemProvider {
16
16
  override async readDirectory(folderPath: URI): Promise<FileSystemNode[]> {
17
- const dirents = await readdir(folderPath.fsPath, { withFileTypes: true })
18
- return dirents.map(dirent => (this.followUri(UriUtils.joinPath(folderPath, dirent.name))))
19
- }
20
-
21
- followUri(uri: URI): FileSystemNode {
22
- const directoryPath = dirname(uri.fsPath)
23
- const stat = lstatSync(uri.fsPath)
24
- if (stat.isSymbolicLink()) {
25
- const resolved_link = readlinkSync(uri.fsPath)
26
- const linked_path = resolve(directoryPath, resolved_link)
27
- return this.followUri(URI.file(linked_path))
28
- } else {
29
- return {
30
- isFile: stat.isFile(),
31
- isDirectory: stat.isDirectory(),
32
- uri
17
+ const crawled = await new fdir()
18
+ .withSymlinks()
19
+ .withFullPaths()
20
+ .crawl(folderPath.fsPath)
21
+ .withPromise()
22
+ const entries = [] as FileSystemNode[]
23
+ for (const path of crawled) {
24
+ try {
25
+ const stats = await stat(path)
26
+ entries.push({
27
+ isFile: stats.isFile(),
28
+ isDirectory: stats.isDirectory(),
29
+ uri: URI.file(path),
30
+ })
31
+ } catch (error) {
32
+ logger.error(error)
33
33
  }
34
34
  }
35
+ return entries
35
36
  }
36
37
  }