@likec4/language-server 1.2.0 → 1.2.2

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 (173) hide show
  1. package/package.json +8 -10
  2. package/src/Rpc.ts +108 -0
  3. package/src/ast.ts +443 -0
  4. package/src/browser/index.ts +30 -0
  5. package/src/elementRef.ts +26 -0
  6. package/src/generated/ast.ts +1632 -0
  7. package/src/generated/grammar.ts +10 -0
  8. package/src/generated/module.ts +32 -0
  9. package/src/index.ts +4 -0
  10. package/src/like-c4.langium +395 -0
  11. package/src/logger.ts +54 -0
  12. package/src/lsp/CodeLensProvider.ts +51 -0
  13. package/src/lsp/DocumentHighlightProvider.ts +12 -0
  14. package/src/lsp/DocumentLinkProvider.test.ts +66 -0
  15. package/src/lsp/DocumentLinkProvider.ts +53 -0
  16. package/src/lsp/DocumentSymbolProvider.ts +201 -0
  17. package/src/lsp/HoverProvider.ts +58 -0
  18. package/{dist/lsp/SemanticTokenProvider.js → src/lsp/SemanticTokenProvider.ts} +57 -42
  19. package/src/lsp/index.ts +6 -0
  20. package/src/model/fqn-computation.ts +47 -0
  21. package/src/model/fqn-index.ts +161 -0
  22. package/src/model/index.ts +5 -0
  23. package/src/model/model-builder.ts +447 -0
  24. package/src/model/model-locator.ts +130 -0
  25. package/src/model/model-parser.ts +580 -0
  26. package/src/model-change/ModelChanges.ts +120 -0
  27. package/src/model-change/changeElementStyle.ts +176 -0
  28. package/src/model-change/changeViewLayout.ts +41 -0
  29. package/src/module.ts +197 -0
  30. package/src/node/index.ts +20 -0
  31. package/src/protocol.ts +87 -0
  32. package/src/references/index.ts +2 -0
  33. package/src/references/scope-computation.ts +142 -0
  34. package/src/references/scope-provider.ts +166 -0
  35. package/src/shared/NodeKindProvider.ts +67 -0
  36. package/src/shared/WorkspaceManager.ts +39 -0
  37. package/src/shared/WorkspaceSymbolProvider.ts +3 -0
  38. package/src/shared/index.ts +3 -0
  39. package/src/test/index.ts +1 -0
  40. package/src/test/testServices.ts +119 -0
  41. package/src/utils/index.ts +1 -0
  42. package/src/utils/printDocs.ts +3 -0
  43. package/src/utils/stringHash.ts +6 -0
  44. package/{dist/validation/dynamic-view-rule.js → src/validation/dynamic-view-rule.ts} +14 -11
  45. package/src/validation/dynamic-view-step.ts +39 -0
  46. package/src/validation/element.ts +52 -0
  47. package/{dist/validation/index.js → src/validation/index.ts} +22 -18
  48. package/src/validation/property-checks.ts +17 -0
  49. package/src/validation/relation.ts +57 -0
  50. package/src/validation/specification.ts +118 -0
  51. package/src/validation/view-predicates/custom-element-expr.ts +21 -0
  52. package/{dist/validation/view-predicates/expanded-element.js → src/validation/view-predicates/expanded-element.ts} +18 -13
  53. package/src/validation/view-predicates/incoming.ts +19 -0
  54. package/src/validation/view-predicates/index.ts +4 -0
  55. package/src/validation/view-predicates/outgoing.ts +19 -0
  56. package/src/validation/view.ts +26 -0
  57. package/src/view-utils/assignNavigateTo.ts +30 -0
  58. package/src/view-utils/index.ts +3 -0
  59. package/src/view-utils/resolve-extended-views.ts +57 -0
  60. package/src/view-utils/resolve-relative-paths.ts +84 -0
  61. package/dist/Rpc.d.ts +0 -10
  62. package/dist/Rpc.js +0 -98
  63. package/dist/ast.d.ts +0 -149
  64. package/dist/ast.js +0 -271
  65. package/dist/browser/index.d.ts +0 -9
  66. package/dist/browser/index.js +0 -16
  67. package/dist/elementRef.d.ts +0 -12
  68. package/dist/elementRef.js +0 -15
  69. package/dist/generated/ast.d.ts +0 -615
  70. package/dist/generated/ast.js +0 -957
  71. package/dist/generated/grammar.d.ts +0 -7
  72. package/dist/generated/grammar.js +0 -3
  73. package/dist/generated/module.d.ts +0 -14
  74. package/dist/generated/module.js +0 -22
  75. package/dist/index.d.ts +0 -5
  76. package/dist/index.js +0 -2
  77. package/dist/logger.d.ts +0 -12
  78. package/dist/logger.js +0 -51
  79. package/dist/lsp/CodeLensProvider.d.ts +0 -10
  80. package/dist/lsp/CodeLensProvider.js +0 -40
  81. package/dist/lsp/DocumentHighlightProvider.d.ts +0 -10
  82. package/dist/lsp/DocumentHighlightProvider.js +0 -10
  83. package/dist/lsp/DocumentLinkProvider.d.ts +0 -11
  84. package/dist/lsp/DocumentLinkProvider.js +0 -41
  85. package/dist/lsp/DocumentLinkProvider.test.d.ts +0 -2
  86. package/dist/lsp/DocumentLinkProvider.test.js +0 -54
  87. package/dist/lsp/DocumentSymbolProvider.d.ts +0 -22
  88. package/dist/lsp/DocumentSymbolProvider.js +0 -189
  89. package/dist/lsp/HoverProvider.d.ts +0 -10
  90. package/dist/lsp/HoverProvider.js +0 -36
  91. package/dist/lsp/SemanticTokenProvider.d.ts +0 -8
  92. package/dist/lsp/index.d.ts +0 -7
  93. package/dist/lsp/index.js +0 -6
  94. package/dist/model/fqn-computation.d.ts +0 -4
  95. package/dist/model/fqn-computation.js +0 -43
  96. package/dist/model/fqn-index.d.ts +0 -26
  97. package/dist/model/fqn-index.js +0 -114
  98. package/dist/model/index.d.ts +0 -6
  99. package/dist/model/index.js +0 -5
  100. package/dist/model/model-builder.d.ts +0 -20
  101. package/dist/model/model-builder.js +0 -365
  102. package/dist/model/model-locator.d.ts +0 -22
  103. package/dist/model/model-locator.js +0 -115
  104. package/dist/model/model-parser.d.ts +0 -29
  105. package/dist/model/model-parser.js +0 -520
  106. package/dist/model-change/ModelChanges.d.ts +0 -16
  107. package/dist/model-change/ModelChanges.js +0 -106
  108. package/dist/model-change/changeElementStyle.d.ts +0 -18
  109. package/dist/model-change/changeElementStyle.js +0 -141
  110. package/dist/model-change/changeViewLayout.d.ts +0 -13
  111. package/dist/model-change/changeViewLayout.js +0 -29
  112. package/dist/module.d.ts +0 -59
  113. package/dist/module.js +0 -121
  114. package/dist/node/index.d.ts +0 -6
  115. package/dist/node/index.js +0 -13
  116. package/dist/protocol.d.ts +0 -58
  117. package/dist/protocol.js +0 -14
  118. package/dist/references/index.d.ts +0 -3
  119. package/dist/references/index.js +0 -2
  120. package/dist/references/scope-computation.d.ts +0 -11
  121. package/dist/references/scope-computation.js +0 -111
  122. package/dist/references/scope-provider.d.ts +0 -18
  123. package/dist/references/scope-provider.js +0 -136
  124. package/dist/shared/NodeKindProvider.d.ts +0 -16
  125. package/dist/shared/NodeKindProvider.js +0 -60
  126. package/dist/shared/WorkspaceManager.d.ts +0 -17
  127. package/dist/shared/WorkspaceManager.js +0 -29
  128. package/dist/shared/WorkspaceSymbolProvider.d.ts +0 -4
  129. package/dist/shared/WorkspaceSymbolProvider.js +0 -3
  130. package/dist/shared/index.d.ts +0 -4
  131. package/dist/shared/index.js +0 -3
  132. package/dist/test/index.d.ts +0 -2
  133. package/dist/test/index.js +0 -1
  134. package/dist/test/testServices.d.ts +0 -23
  135. package/dist/test/testServices.js +0 -102
  136. package/dist/utils/index.d.ts +0 -2
  137. package/dist/utils/index.js +0 -1
  138. package/dist/utils/printDocs.d.ts +0 -3
  139. package/dist/utils/printDocs.js +0 -1
  140. package/dist/utils/stringHash.d.ts +0 -2
  141. package/dist/utils/stringHash.js +0 -5
  142. package/dist/validation/dynamic-view-rule.d.ts +0 -5
  143. package/dist/validation/dynamic-view-step.d.ts +0 -5
  144. package/dist/validation/dynamic-view-step.js +0 -33
  145. package/dist/validation/element.d.ts +0 -6
  146. package/dist/validation/element.js +0 -38
  147. package/dist/validation/index.d.ts +0 -3
  148. package/dist/validation/property-checks.d.ts +0 -5
  149. package/dist/validation/property-checks.js +0 -11
  150. package/dist/validation/relation.d.ts +0 -5
  151. package/dist/validation/relation.js +0 -50
  152. package/dist/validation/specification.d.ts +0 -10
  153. package/dist/validation/specification.js +0 -97
  154. package/dist/validation/view-predicates/custom-element-expr.d.ts +0 -5
  155. package/dist/validation/view-predicates/custom-element-expr.js +0 -16
  156. package/dist/validation/view-predicates/expanded-element.d.ts +0 -5
  157. package/dist/validation/view-predicates/incoming.d.ts +0 -5
  158. package/dist/validation/view-predicates/incoming.js +0 -14
  159. package/dist/validation/view-predicates/index.d.ts +0 -5
  160. package/dist/validation/view-predicates/index.js +0 -4
  161. package/dist/validation/view-predicates/outgoing.d.ts +0 -5
  162. package/dist/validation/view-predicates/outgoing.js +0 -14
  163. package/dist/validation/view.d.ts +0 -5
  164. package/dist/validation/view.js +0 -16
  165. package/dist/view-utils/assignNavigateTo.d.ts +0 -3
  166. package/dist/view-utils/assignNavigateTo.js +0 -24
  167. package/dist/view-utils/index.d.ts +0 -4
  168. package/dist/view-utils/index.js +0 -3
  169. package/dist/view-utils/resolve-extended-views.d.ts +0 -7
  170. package/dist/view-utils/resolve-extended-views.js +0 -41
  171. package/dist/view-utils/resolve-relative-paths.d.ts +0 -3
  172. package/dist/view-utils/resolve-relative-paths.js +0 -75
  173. /package/{dist → src}/reset.d.ts +0 -0
@@ -1,97 +0,0 @@
1
- import { AstUtils } from "langium";
2
- import { ast } from "../ast.js";
3
- export const specificationRuleChecks = (_) => {
4
- return (node, accept) => {
5
- if (node.$containerIndex && node.$containerIndex > 0) {
6
- accept("error", `Only one specification per document is allowed`, {
7
- node,
8
- property: "name"
9
- });
10
- }
11
- };
12
- };
13
- export const modelRuleChecks = (_) => {
14
- return (node, accept) => {
15
- if (node.$containerIndex && node.$containerIndex > 0) {
16
- accept("error", `Only one model per document is allowed`, {
17
- node,
18
- property: "name"
19
- });
20
- }
21
- };
22
- };
23
- export const modelViewsChecks = (_) => {
24
- return (node, accept) => {
25
- if (node.$containerIndex && node.$containerIndex > 0) {
26
- accept("error", `Only one views block per document is allowed`, {
27
- node,
28
- property: "name"
29
- });
30
- }
31
- };
32
- };
33
- export const elementKindChecks = (services) => {
34
- const index = services.shared.workspace.IndexManager;
35
- return (node, accept) => {
36
- const sameKind = index.allElements(ast.ElementKind).filter((n) => n.name === node.name && n.node !== node).head();
37
- if (sameKind) {
38
- const isAnotherDoc = sameKind.documentUri !== AstUtils.getDocument(node).uri;
39
- accept("error", `Duplicate element kind '${node.name}'`, {
40
- node,
41
- property: "name",
42
- ...isAnotherDoc && {
43
- relatedInformation: [
44
- {
45
- location: {
46
- range: sameKind.nameSegment.range,
47
- uri: sameKind.documentUri.toString()
48
- },
49
- message: `conflicting definition`
50
- }
51
- ]
52
- }
53
- });
54
- }
55
- };
56
- };
57
- export const tagChecks = (services) => {
58
- const index = services.shared.workspace.IndexManager;
59
- return (node, accept) => {
60
- const tagname = "#" + node.name;
61
- const sameTag = index.allElements(ast.Tag).filter((n) => n.name === tagname && n.node !== node).head();
62
- if (sameTag) {
63
- const isAnotherDoc = sameTag.documentUri !== AstUtils.getDocument(node).uri;
64
- accept(
65
- "error",
66
- `Duplicate tag '${node.name}'`,
67
- {
68
- node,
69
- property: "name",
70
- ...isAnotherDoc && {
71
- relatedInformation: [
72
- {
73
- location: {
74
- range: sameTag.nameSegment.range,
75
- uri: sameTag.documentUri.toString()
76
- },
77
- message: `conflicting definition`
78
- }
79
- ]
80
- }
81
- }
82
- );
83
- }
84
- };
85
- };
86
- export const relationshipChecks = (services) => {
87
- const index = services.shared.workspace.IndexManager;
88
- return (node, accept) => {
89
- const sameKinds = index.allElements(ast.RelationshipKind).filter((n) => n.name === node.name).limit(2).count();
90
- if (sameKinds > 1) {
91
- accept("error", `Duplicate RelationshipKind '${node.name}'`, {
92
- node,
93
- property: "name"
94
- });
95
- }
96
- };
97
- };
@@ -1,5 +0,0 @@
1
- import type { ValidationCheck } from 'langium';
2
- import { ast } from '../../ast';
3
- import type { LikeC4Services } from '../../module';
4
- export declare const customElementExprChecks: (_services: LikeC4Services) => ValidationCheck<ast.CustomElementExpr>;
5
- //# sourceMappingURL=custom-element-expr.d.ts.map
@@ -1,16 +0,0 @@
1
- import { ast } from "../../ast.js";
2
- export const customElementExprChecks = (_services) => {
3
- return (el, accept) => {
4
- if (ast.isExcludePredicate(el.$container)) {
5
- accept("error", 'Invalid inside "exclude"', {
6
- node: el
7
- });
8
- }
9
- if (!ast.isElementRef(el.target)) {
10
- accept("error", "Invalid target for customization", {
11
- node: el,
12
- property: "target"
13
- });
14
- }
15
- };
16
- };
@@ -1,5 +0,0 @@
1
- import type { ValidationCheck } from 'langium';
2
- import { ast } from '../../ast';
3
- import type { LikeC4Services } from '../../module';
4
- export declare const expandElementExprChecks: (_services: LikeC4Services) => ValidationCheck<ast.ExpandElementExpr>;
5
- //# sourceMappingURL=expanded-element.d.ts.map
@@ -1,5 +0,0 @@
1
- import type { ValidationCheck } from 'langium';
2
- import { ast } from '../../ast';
3
- import type { LikeC4Services } from '../../module';
4
- export declare const incomingExpressionChecks: (_services: LikeC4Services) => ValidationCheck<ast.IncomingExpr>;
5
- //# sourceMappingURL=incoming.d.ts.map
@@ -1,14 +0,0 @@
1
- import { isNullish } from "remeda";
2
- import { ast } from "../../ast.js";
3
- export const incomingExpressionChecks = (_services) => {
4
- return (el, accept) => {
5
- if (ast.isWildcardExpr(el.to) && ast.isViewRulePredicate(el.$container)) {
6
- const view = el.$container.$container.$container;
7
- if (isNullish(view.viewOf)) {
8
- accept("warning", "Predicate is ignored as it concerns all relationships", {
9
- node: el
10
- });
11
- }
12
- }
13
- };
14
- };
@@ -1,5 +0,0 @@
1
- export * from './custom-element-expr';
2
- export * from './expanded-element';
3
- export * from './incoming';
4
- export * from './outgoing';
5
- //# sourceMappingURL=index.d.ts.map
@@ -1,4 +0,0 @@
1
- export * from "./custom-element-expr.js";
2
- export * from "./expanded-element.js";
3
- export * from "./incoming.js";
4
- export * from "./outgoing.js";
@@ -1,5 +0,0 @@
1
- import type { ValidationCheck } from 'langium';
2
- import { ast } from '../../ast';
3
- import type { LikeC4Services } from '../../module';
4
- export declare const outgoingExpressionChecks: (_services: LikeC4Services) => ValidationCheck<ast.OutgoingExpr>;
5
- //# sourceMappingURL=outgoing.d.ts.map
@@ -1,14 +0,0 @@
1
- import { isNullish } from "remeda";
2
- import { ast } from "../../ast.js";
3
- export const outgoingExpressionChecks = (_services) => {
4
- return (el, accept) => {
5
- if (ast.isWildcardExpr(el.from)) {
6
- const view = el.$container.$container.$container;
7
- if (view.$type === "ElementView" && isNullish(view.viewOf)) {
8
- accept("warning", "Predicate is ignored as it concerns all relationships", {
9
- node: el
10
- });
11
- }
12
- }
13
- };
14
- };
@@ -1,5 +0,0 @@
1
- import type { ValidationCheck } from 'langium';
2
- import { ast } from '../ast';
3
- import type { LikeC4Services } from '../module';
4
- export declare const viewChecks: (services: LikeC4Services) => ValidationCheck<ast.LikeC4View>;
5
- //# sourceMappingURL=view.d.ts.map
@@ -1,16 +0,0 @@
1
- import { ast } from "../ast.js";
2
- export const viewChecks = (services) => {
3
- const index = services.shared.workspace.IndexManager;
4
- return (el, accept) => {
5
- if (!el.name) {
6
- return;
7
- }
8
- const anotherViews = index.allElements(ast.LikeC4View).filter((n) => n.name === el.name).limit(2).count();
9
- if (anotherViews > 1) {
10
- accept("error", `Duplicate view '${el.name}'`, {
11
- node: el,
12
- property: "name"
13
- });
14
- }
15
- };
16
- };
@@ -1,3 +0,0 @@
1
- import { type ComputedView } from '@likec4/core';
2
- export declare function assignNavigateTo<R extends Iterable<ComputedView>>(views: R): R;
3
- //# sourceMappingURL=assignNavigateTo.d.ts.map
@@ -1,24 +0,0 @@
1
- import { isComputedElementView } from "@likec4/core";
2
- import { find } from "remeda";
3
- export function assignNavigateTo(views) {
4
- const allElementViews = /* @__PURE__ */ new Map();
5
- for (const v of views) {
6
- if (isComputedElementView(v) && v.viewOf && !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
- if (node.navigateTo) {
15
- continue;
16
- }
17
- const navigateTo = find(allElementViews.get(node.id) ?? [], (v) => v !== id);
18
- if (navigateTo) {
19
- node.navigateTo = navigateTo;
20
- }
21
- }
22
- }
23
- return views;
24
- }
@@ -1,4 +0,0 @@
1
- export * from './assignNavigateTo';
2
- export * from './resolve-extended-views';
3
- export * from './resolve-relative-paths';
4
- //# sourceMappingURL=index.d.ts.map
@@ -1,3 +0,0 @@
1
- export * from "./assignNavigateTo.js";
2
- export * from "./resolve-extended-views.js";
3
- export * from "./resolve-relative-paths.js";
@@ -1,7 +0,0 @@
1
- import { type View } from '@likec4/core';
2
- /**
3
- * Resolve rules of extended views
4
- * (Removes invalid views)
5
- */
6
- export declare function resolveRulesExtendedViews<V extends Record<any, View>>(unresolvedViews: V): V;
7
- //# sourceMappingURL=resolve-extended-views.d.ts.map
@@ -1,41 +0,0 @@
1
- import graphlib from "@dagrejs/graphlib";
2
- import { isExtendsElementView } from "@likec4/core";
3
- const { Graph, alg } = graphlib;
4
- export function resolveRulesExtendedViews(unresolvedViews) {
5
- const g = new Graph({
6
- directed: true,
7
- multigraph: false,
8
- compound: false
9
- });
10
- for (const view of Object.values(unresolvedViews)) {
11
- g.setNode(view.id);
12
- if (isExtendsElementView(view)) {
13
- g.setEdge(view.id, view.extends);
14
- }
15
- }
16
- const cycles = alg.findCycles(g);
17
- if (cycles.length > 0) {
18
- cycles.flat().forEach((id) => g.removeNode(id));
19
- }
20
- const ordered = alg.postorder(g, g.sources());
21
- return ordered.reduce((acc, id) => {
22
- const view = unresolvedViews[id];
23
- if (!view) {
24
- return acc;
25
- }
26
- if (isExtendsElementView(view)) {
27
- const extendsFrom = acc[view.extends];
28
- if (!extendsFrom) {
29
- return acc;
30
- }
31
- return Object.assign(acc, {
32
- [view.id]: {
33
- ...extendsFrom,
34
- ...view,
35
- rules: [...extendsFrom.rules, ...view.rules]
36
- }
37
- });
38
- }
39
- return Object.assign(acc, { [view.id]: view });
40
- }, {});
41
- }
@@ -1,3 +0,0 @@
1
- import type { View } from '@likec4/core';
2
- export declare function resolveRelativePaths(views: View[]): View[];
3
- //# sourceMappingURL=resolve-relative-paths.d.ts.map
@@ -1,75 +0,0 @@
1
- import { invariant } from "@likec4/core";
2
- import { hasAtLeast, unique, zip } from "remeda";
3
- function commonAncestorPath(views, sep = "/") {
4
- if (views.length <= 1)
5
- return "";
6
- const uniqURIs = unique(views.flatMap(({ docUri }) => docUri ? [docUri] : []));
7
- if (uniqURIs.length === 0)
8
- return "";
9
- if (uniqURIs.length === 1) {
10
- invariant(hasAtLeast(uniqURIs, 1));
11
- return new URL(uniqURIs[0]).pathname;
12
- }
13
- invariant(hasAtLeast(uniqURIs, 2), "Expected at least 2 unique URIs");
14
- const [baseUri, ...tail] = uniqURIs;
15
- const parts = new URL(baseUri).pathname.split(sep);
16
- let endOfPrefix = parts.length;
17
- for (const uri of tail) {
18
- if (uri === baseUri) {
19
- continue;
20
- }
21
- const compare = new URL(uri).pathname.split(sep);
22
- for (let i = 0; i < endOfPrefix; i++) {
23
- if (compare[i] !== parts[i]) {
24
- endOfPrefix = i;
25
- }
26
- }
27
- if (endOfPrefix === 0)
28
- return "";
29
- }
30
- const prefix = parts.slice(0, endOfPrefix).join(sep);
31
- return prefix.endsWith(sep) ? prefix : prefix + sep;
32
- }
33
- export function resolveRelativePaths(views) {
34
- const commonPrefix = commonAncestorPath(views);
35
- return views.map((view) => {
36
- if (!view.docUri) {
37
- return {
38
- ...view,
39
- parts: []
40
- };
41
- }
42
- const path = new URL(view.docUri).pathname;
43
- const parts = path.replace(commonPrefix, "").split("/");
44
- parts.pop();
45
- return {
46
- ...view,
47
- parts
48
- };
49
- }).sort((a, b) => {
50
- if (a.parts.length === b.parts.length) {
51
- if (a.parts.length === 0) {
52
- return 0;
53
- }
54
- if (a.parts.length === 1 && hasAtLeast(a.parts, 1) && hasAtLeast(b.parts, 1)) {
55
- return a.parts[0].localeCompare(b.parts[0]);
56
- }
57
- for (const [_a, _b] of zip(a.parts, b.parts)) {
58
- const compare = _a.localeCompare(_b);
59
- if (compare !== 0) {
60
- return compare;
61
- }
62
- }
63
- return 0;
64
- }
65
- return a.parts.length - b.parts.length;
66
- }).map(({ parts, ...view }) => {
67
- if (view.docUri) {
68
- return {
69
- ...view,
70
- relativePath: parts.join("/")
71
- };
72
- }
73
- return view;
74
- });
75
- }
File without changes