@likec4/language-server 1.42.1 → 1.44.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/browser/package.json +1 -1
- package/browser-worker/package.json +1 -1
- package/dist/LikeC4LanguageServices.d.ts +12 -19
- package/dist/LikeC4LanguageServices.js +182 -0
- package/dist/Rpc.js +245 -0
- package/dist/ast.d.ts +10 -6
- package/dist/ast.js +253 -0
- package/dist/browser-worker.js +4 -0
- package/dist/browser.js +35 -0
- package/dist/bundled.js +42 -0
- package/dist/bundled.mjs +3830 -4172
- package/dist/documentation/documentation-provider.js +51 -0
- package/dist/documentation/index.js +1 -0
- package/dist/empty.js +2 -0
- package/dist/filesystem/ChokidarWatcher.js +97 -0
- package/dist/filesystem/FileSystemWatcher.js +14 -0
- package/dist/filesystem/LikeC4FileSystem.d.ts +1 -2
- package/dist/filesystem/LikeC4FileSystem.js +126 -0
- package/dist/filesystem/index.d.ts +26 -0
- package/dist/filesystem/index.js +29 -0
- package/dist/formatting/LikeC4Formatter.js +637 -0
- package/dist/formatting/utils.js +18 -0
- package/dist/generated/ast.d.ts +19 -3
- package/dist/generated/ast.js +2155 -0
- package/dist/generated/grammar.js +7 -0
- package/dist/generated/module.d.ts +6 -1
- package/dist/generated/module.js +27 -0
- package/dist/generated-lib/{icons.mjs → icons.js} +11 -7
- package/dist/index.d.ts +7 -0
- package/dist/index.js +53 -0
- package/dist/{likec4lib.mjs → likec4lib.js} +3 -3
- package/dist/logger.js +81 -0
- package/dist/lsp/CodeActionProvider.d.ts +14 -0
- package/dist/lsp/CodeActionProvider.js +33 -0
- package/dist/lsp/CodeLensProvider.js +44 -0
- package/dist/lsp/CompletionProvider.d.ts +3 -1
- package/dist/lsp/CompletionProvider.js +200 -0
- package/dist/lsp/DocumentHighlightProvider.js +10 -0
- package/dist/lsp/DocumentLinkProvider.js +58 -0
- package/dist/lsp/DocumentSymbolProvider.js +306 -0
- package/dist/lsp/HoverProvider.js +106 -0
- package/dist/lsp/RenameProvider.js +6 -0
- package/dist/lsp/SemanticTokenProvider.d.ts +5 -0
- package/dist/lsp/SemanticTokenProvider.js +257 -0
- package/dist/lsp/index.d.ts +1 -0
- package/dist/lsp/index.js +9 -0
- package/dist/mcp/MCPServerFactory.js +73 -0
- package/dist/mcp/NoopLikeC4MCPServer.js +17 -0
- package/dist/mcp/interfaces.js +5 -0
- package/dist/mcp/server/StdioLikeC4MCPServer.js +47 -0
- package/dist/mcp/server/StreamableLikeC4MCPServer.js +145 -0
- package/dist/mcp/server/WithMCPServer.js +56 -0
- package/dist/mcp/tools/_common.d.ts +8 -7
- package/dist/mcp/tools/_common.js +49 -0
- package/dist/mcp/tools/find-relationships.d.ts +7 -8
- package/dist/mcp/tools/find-relationships.js +150 -0
- package/dist/mcp/tools/list-projects.d.ts +3 -3
- package/dist/mcp/tools/list-projects.js +62 -0
- package/dist/mcp/tools/open-view.d.ts +6 -7
- package/dist/mcp/tools/open-view.js +52 -0
- package/dist/mcp/tools/read-deployment.d.ts +6 -7
- package/dist/mcp/tools/read-deployment.js +132 -0
- package/dist/mcp/tools/read-element.d.ts +6 -7
- package/dist/mcp/tools/read-element.js +194 -0
- package/dist/mcp/tools/read-project-summary.d.ts +5 -6
- package/dist/mcp/tools/read-project-summary.js +176 -0
- package/dist/mcp/tools/read-view.d.ts +6 -7
- package/dist/mcp/tools/read-view.js +203 -0
- package/dist/mcp/tools/search-element.d.ts +3 -3
- package/dist/mcp/tools/search-element.js +177 -0
- package/dist/mcp/utils.d.ts +2 -2
- package/dist/mcp/utils.js +48 -0
- package/dist/model/builder/MergedExtends.d.ts +2 -1
- package/dist/model/builder/MergedExtends.js +74 -0
- package/dist/model/builder/MergedSpecification.js +175 -0
- package/dist/model/builder/buildModel.js +176 -0
- package/dist/model/deployments-index.js +102 -0
- package/dist/model/fqn-index.js +250 -0
- package/dist/model/index.js +6 -0
- package/dist/model/model-builder.d.ts +13 -11
- package/dist/model/model-builder.js +234 -0
- package/dist/model/model-locator.d.ts +6 -5
- package/dist/model/model-locator.js +240 -0
- package/dist/model/model-parser-where.js +81 -0
- package/dist/model/model-parser.d.ts +318 -313
- package/dist/model/model-parser.js +119 -0
- package/dist/model/parser/Base.d.ts +3 -3
- package/dist/model/parser/Base.js +367 -0
- package/dist/model/parser/DeploymentModelParser.d.ts +3 -3
- package/dist/model/parser/DeploymentModelParser.js +176 -0
- package/dist/model/parser/DeploymentViewParser.d.ts +4 -4
- package/dist/model/parser/DeploymentViewParser.js +86 -0
- package/dist/model/parser/FqnRefParser.d.ts +3 -3
- package/dist/model/parser/FqnRefParser.js +382 -0
- package/dist/model/parser/GlobalsParser.d.ts +7 -7
- package/dist/model/parser/GlobalsParser.js +84 -0
- package/dist/model/parser/ImportsParser.d.ts +12 -13
- package/dist/model/parser/ImportsParser.js +24 -0
- package/dist/model/parser/ModelParser.d.ts +3 -3
- package/dist/model/parser/ModelParser.js +165 -0
- package/dist/model/parser/PredicatesParser.d.ts +3 -3
- package/dist/model/parser/PredicatesParser.js +45 -0
- package/dist/model/parser/SpecificationParser.d.ts +3 -3
- package/dist/model/parser/SpecificationParser.js +109 -0
- package/dist/model/parser/ValueConverter.js +12 -0
- package/dist/model/parser/ViewsParser.d.ts +4 -4
- package/dist/model/parser/ViewsParser.js +477 -0
- package/dist/model-change/ModelChanges.d.ts +6 -3
- package/dist/model-change/ModelChanges.js +102 -0
- package/dist/model-change/changeElementStyle.js +134 -0
- package/dist/model-change/changeViewLayout.d.ts +2 -2
- package/dist/model-change/changeViewLayout.js +28 -0
- package/dist/model-change/removeManualLayoutV1.d.ts +7 -0
- package/dist/model-change/removeManualLayoutV1.js +27 -0
- package/dist/module.d.ts +10 -5
- package/dist/module.js +143 -0
- package/dist/protocol.d.ts +1 -17
- package/dist/protocol.js +114 -0
- package/dist/references/index.js +3 -0
- package/dist/references/name-provider.js +37 -0
- package/dist/references/scope-computation.js +288 -0
- package/dist/references/scope-provider.d.ts +3 -3
- package/dist/references/scope-provider.js +242 -0
- package/dist/shared/NodeKindProvider.js +57 -0
- package/dist/shared/{WorkspaceSymbolProvider.mjs → WorkspaceSymbolProvider.js} +1 -1
- package/dist/shared/index.js +2 -0
- package/dist/test/index.js +1 -0
- package/dist/test/testServices.d.ts +16 -16
- package/dist/test/testServices.js +210 -0
- package/dist/utils/disposable.js +26 -0
- package/dist/utils/elementRef.d.ts +1 -1
- package/dist/utils/elementRef.js +27 -0
- package/dist/utils/fqnRef.js +63 -0
- package/dist/utils/index.js +35 -0
- package/dist/utils/printDocs.js +1 -0
- package/dist/utils/projectId.js +16 -0
- package/dist/utils/stringHash.js +5 -0
- package/dist/validation/DocumentValidator.js +17 -0
- package/dist/validation/_shared.js +26 -0
- package/dist/validation/deployment-checks.js +140 -0
- package/dist/validation/dynamic-view.js +67 -0
- package/dist/validation/element-ref.js +12 -0
- package/dist/validation/element.js +49 -0
- package/dist/validation/imports.js +46 -0
- package/dist/validation/index.d.ts +1 -1
- package/dist/validation/index.js +157 -0
- package/dist/validation/property-checks.js +108 -0
- package/dist/validation/relation.js +55 -0
- package/dist/validation/specification.js +190 -0
- package/dist/validation/view-predicates/fqn-expr-with.js +43 -0
- package/dist/validation/view-predicates/fqn-ref-expr.js +51 -0
- package/dist/validation/view-predicates/incoming.js +16 -0
- package/dist/validation/view-predicates/index.js +6 -0
- package/dist/validation/view-predicates/outgoing.js +20 -0
- package/dist/validation/view-predicates/relation-expr.js +46 -0
- package/dist/validation/view-predicates/relation-with.js +16 -0
- package/dist/validation/view.d.ts +1 -1
- package/dist/validation/view.js +42 -0
- package/dist/view-utils/assignNavigateTo.js +27 -0
- package/dist/view-utils/index.d.ts +1 -0
- package/dist/view-utils/index.js +2 -0
- package/dist/view-utils/manual-layout.d.ts +6 -0
- package/dist/view-utils/manual-layout.js +151 -0
- package/dist/views/ConfigurableLayouter.js +51 -0
- package/dist/views/LikeC4ManualLayouts.d.ts +28 -0
- package/dist/views/LikeC4ManualLayouts.js +132 -0
- package/dist/views/{likec4-views.d.ts → LikeC4Views.d.ts} +9 -8
- package/dist/views/LikeC4Views.js +200 -0
- package/dist/views/index.d.ts +4 -1
- package/dist/views/index.js +11 -0
- package/dist/workspace/AstNodeDescriptionProvider.js +15 -0
- package/dist/workspace/IndexManager.js +21 -0
- package/dist/workspace/LangiumDocuments.d.ts +1 -1
- package/dist/workspace/LangiumDocuments.js +58 -0
- package/dist/workspace/ProjectsManager.d.ts +8 -3
- package/dist/workspace/ProjectsManager.js +373 -0
- package/dist/workspace/WorkspaceManager.d.ts +3 -2
- package/dist/workspace/WorkspaceManager.js +93 -0
- package/dist/workspace/index.js +5 -0
- package/likec4lib/package.json +1 -1
- package/package.json +32 -31
- package/protocol/package.json +1 -1
- package/dist/LikeC4LanguageServices.mjs +0 -197
- package/dist/Rpc.mjs +0 -296
- package/dist/ast.mjs +0 -221
- package/dist/browser-worker.mjs +0 -2
- package/dist/browser.mjs +0 -32
- package/dist/documentation/documentation-provider.mjs +0 -48
- package/dist/documentation/index.mjs +0 -1
- package/dist/empty.mjs +0 -1
- package/dist/filesystem/ChokidarWatcher.mjs +0 -68
- package/dist/filesystem/FileSystemWatcher.mjs +0 -11
- package/dist/filesystem/LikeC4FileSystem.mjs +0 -64
- package/dist/filesystem/index.mjs +0 -19
- package/dist/formatting/LikeC4Formatter.mjs +0 -511
- package/dist/formatting/utils.mjs +0 -15
- package/dist/generated/ast.mjs +0 -2118
- package/dist/generated/grammar.mjs +0 -3
- package/dist/generated/module.mjs +0 -23
- package/dist/index.mjs +0 -50
- package/dist/logger.mjs +0 -82
- package/dist/lsp/CodeLensProvider.mjs +0 -42
- package/dist/lsp/CompletionProvider.mjs +0 -208
- package/dist/lsp/DocumentHighlightProvider.mjs +0 -10
- package/dist/lsp/DocumentLinkProvider.mjs +0 -53
- package/dist/lsp/DocumentSymbolProvider.mjs +0 -287
- package/dist/lsp/HoverProvider.mjs +0 -104
- package/dist/lsp/RenameProvider.mjs +0 -6
- package/dist/lsp/SemanticTokenProvider.mjs +0 -350
- package/dist/lsp/index.mjs +0 -7
- package/dist/mcp/MCPServerFactory.mjs +0 -70
- package/dist/mcp/NoopLikeC4MCPServer.mjs +0 -17
- package/dist/mcp/interfaces.mjs +0 -4
- package/dist/mcp/server/StdioLikeC4MCPServer.mjs +0 -46
- package/dist/mcp/server/StreamableLikeC4MCPServer.mjs +0 -153
- package/dist/mcp/server/WithMCPServer.mjs +0 -58
- package/dist/mcp/tools/_common.mjs +0 -42
- package/dist/mcp/tools/find-relationships.mjs +0 -151
- package/dist/mcp/tools/list-projects.mjs +0 -62
- package/dist/mcp/tools/open-view.mjs +0 -52
- package/dist/mcp/tools/read-deployment.mjs +0 -130
- package/dist/mcp/tools/read-element.mjs +0 -198
- package/dist/mcp/tools/read-project-summary.mjs +0 -178
- package/dist/mcp/tools/read-view.mjs +0 -205
- package/dist/mcp/tools/search-element.mjs +0 -171
- package/dist/mcp/utils.mjs +0 -47
- package/dist/model/builder/MergedExtends.mjs +0 -67
- package/dist/model/builder/MergedSpecification.mjs +0 -205
- package/dist/model/builder/assignTagColors.d.ts +0 -7
- package/dist/model/builder/assignTagColors.mjs +0 -51
- package/dist/model/builder/buildModel.mjs +0 -226
- package/dist/model/deployments-index.mjs +0 -100
- package/dist/model/fqn-index.mjs +0 -243
- package/dist/model/index.mjs +0 -6
- package/dist/model/model-builder.mjs +0 -285
- package/dist/model/model-locator.mjs +0 -239
- package/dist/model/model-parser-where.mjs +0 -81
- package/dist/model/model-parser.mjs +0 -127
- package/dist/model/parser/Base.mjs +0 -342
- package/dist/model/parser/DeploymentModelParser.mjs +0 -212
- package/dist/model/parser/DeploymentViewParser.mjs +0 -95
- package/dist/model/parser/FqnRefParser.mjs +0 -398
- package/dist/model/parser/GlobalsParser.mjs +0 -82
- package/dist/model/parser/ImportsParser.mjs +0 -28
- package/dist/model/parser/ModelParser.mjs +0 -190
- package/dist/model/parser/PredicatesParser.mjs +0 -45
- package/dist/model/parser/SpecificationParser.mjs +0 -120
- package/dist/model/parser/ValueConverter.mjs +0 -12
- package/dist/model/parser/ViewsParser.mjs +0 -490
- package/dist/model-change/ModelChanges.mjs +0 -89
- package/dist/model-change/changeElementStyle.mjs +0 -143
- package/dist/model-change/changeViewLayout.mjs +0 -32
- package/dist/model-change/saveManualLayout.d.ts +0 -11
- package/dist/model-change/saveManualLayout.mjs +0 -27
- package/dist/module.mjs +0 -180
- package/dist/protocol.mjs +0 -65
- package/dist/references/index.mjs +0 -3
- package/dist/references/name-provider.mjs +0 -39
- package/dist/references/scope-computation.mjs +0 -312
- package/dist/references/scope-provider.mjs +0 -239
- package/dist/shared/NodeKindProvider.mjs +0 -110
- package/dist/shared/index.mjs +0 -2
- package/dist/test/index.mjs +0 -1
- package/dist/test/testServices.mjs +0 -200
- package/dist/utils/disposable.mjs +0 -25
- package/dist/utils/elementRef.mjs +0 -20
- package/dist/utils/fqnRef.mjs +0 -57
- package/dist/utils/index.mjs +0 -33
- package/dist/utils/printDocs.mjs +0 -1
- package/dist/utils/projectId.mjs +0 -16
- package/dist/utils/stringHash.mjs +0 -5
- package/dist/validation/DocumentValidator.mjs +0 -16
- package/dist/validation/_shared.mjs +0 -25
- package/dist/validation/deployment-checks.mjs +0 -146
- package/dist/validation/dynamic-view.mjs +0 -67
- package/dist/validation/element-ref.mjs +0 -12
- package/dist/validation/element.mjs +0 -50
- package/dist/validation/imports.mjs +0 -25
- package/dist/validation/index.mjs +0 -180
- package/dist/validation/property-checks.mjs +0 -107
- package/dist/validation/relation.mjs +0 -53
- package/dist/validation/specification.mjs +0 -173
- package/dist/validation/view-predicates/fqn-expr-with.mjs +0 -43
- package/dist/validation/view-predicates/fqn-ref-expr.mjs +0 -53
- package/dist/validation/view-predicates/incoming.mjs +0 -16
- package/dist/validation/view-predicates/index.mjs +0 -6
- package/dist/validation/view-predicates/outgoing.mjs +0 -20
- package/dist/validation/view-predicates/relation-expr.mjs +0 -39
- package/dist/validation/view-predicates/relation-with.mjs +0 -16
- package/dist/validation/view.mjs +0 -25
- package/dist/view-utils/assignNavigateTo.mjs +0 -25
- package/dist/view-utils/index.mjs +0 -1
- package/dist/view-utils/manual-layout.mjs +0 -99
- package/dist/views/configurable-layouter.mjs +0 -51
- package/dist/views/index.mjs +0 -1
- package/dist/views/likec4-views.mjs +0 -166
- package/dist/workspace/AstNodeDescriptionProvider.mjs +0 -17
- package/dist/workspace/IndexManager.mjs +0 -17
- package/dist/workspace/LangiumDocuments.mjs +0 -53
- package/dist/workspace/ProjectsManager.mjs +0 -360
- package/dist/workspace/WorkspaceManager.mjs +0 -83
- package/dist/workspace/index.mjs +0 -5
- /package/dist/views/{configurable-layouter.d.ts → ConfigurableLayouter.d.ts} +0 -0
|
@@ -0,0 +1,373 @@
|
|
|
1
|
+
import { isLikeC4Config, validateProjectConfig, } from '@likec4/config';
|
|
2
|
+
import { BiMap, delay, invariant, memoizeProp, nonNullable } from '@likec4/core/utils';
|
|
3
|
+
import { deepEqual } from 'fast-equals';
|
|
4
|
+
import { interruptAndCheck, URI, WorkspaceCache, } from 'langium';
|
|
5
|
+
import picomatch from 'picomatch';
|
|
6
|
+
import { hasAtLeast, isNullish, map, pipe, prop, sortBy } from 'remeda';
|
|
7
|
+
import { joinRelativeURL, parseFilename, withoutProtocol, withTrailingSlash, } from 'ufo';
|
|
8
|
+
import { logger as mainLogger } from '../logger';
|
|
9
|
+
const logger = mainLogger.getChild('ProjectsManager');
|
|
10
|
+
function normalizeUri(uri) {
|
|
11
|
+
if (URI.isUri(uri)) {
|
|
12
|
+
return uri.toString();
|
|
13
|
+
}
|
|
14
|
+
else if (typeof uri === 'string') {
|
|
15
|
+
// TODO: handle non-file URIs, i.e. vscode-remote://
|
|
16
|
+
return uri.startsWith('file://') ? uri : URI.file(uri).toString();
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
return uri.uri.toString();
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
export function ProjectFolder(folder) {
|
|
23
|
+
folder = normalizeUri(folder);
|
|
24
|
+
return withTrailingSlash(folder);
|
|
25
|
+
}
|
|
26
|
+
const DefaultProject = {
|
|
27
|
+
id: 'default',
|
|
28
|
+
config: {
|
|
29
|
+
name: 'default',
|
|
30
|
+
exclude: ['**/node_modules/**'],
|
|
31
|
+
},
|
|
32
|
+
exclude: picomatch('**/node_modules/**', { dot: true }),
|
|
33
|
+
};
|
|
34
|
+
export class ProjectsManager {
|
|
35
|
+
services;
|
|
36
|
+
/**
|
|
37
|
+
* The global project ID used for all documents
|
|
38
|
+
* that are not part of a specific project.
|
|
39
|
+
*/
|
|
40
|
+
static DefaultProjectId = DefaultProject.id;
|
|
41
|
+
/**
|
|
42
|
+
* Configured default project ID.
|
|
43
|
+
* (it is used in CLI and Vite plugin)
|
|
44
|
+
*/
|
|
45
|
+
#defaultProjectId = undefined;
|
|
46
|
+
/**
|
|
47
|
+
* The mapping between project config files and project IDs.
|
|
48
|
+
*/
|
|
49
|
+
#projectIdToFolder = new BiMap();
|
|
50
|
+
/**
|
|
51
|
+
* Registered projects.
|
|
52
|
+
* Sorted descending by the number of segments in the folder path.
|
|
53
|
+
* This ensures that the most specific project is used for a document.
|
|
54
|
+
*/
|
|
55
|
+
#projects = [];
|
|
56
|
+
#excludedDocuments = new WeakMap();
|
|
57
|
+
constructor(services) {
|
|
58
|
+
this.services = services;
|
|
59
|
+
logger.debug `created`;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Returns:
|
|
63
|
+
* - configured default project ID if set
|
|
64
|
+
* - the default project ID if there are no projects.
|
|
65
|
+
* - the ID of the only project
|
|
66
|
+
* - undefined if there are multiple projects.
|
|
67
|
+
*/
|
|
68
|
+
get defaultProjectId() {
|
|
69
|
+
if (this.#defaultProjectId) {
|
|
70
|
+
return this.#defaultProjectId;
|
|
71
|
+
}
|
|
72
|
+
if (this.#projects.length > 1) {
|
|
73
|
+
return undefined;
|
|
74
|
+
}
|
|
75
|
+
return this.#projects[0]?.id ?? ProjectsManager.DefaultProjectId;
|
|
76
|
+
}
|
|
77
|
+
set defaultProjectId(id) {
|
|
78
|
+
if (id === this.#defaultProjectId) {
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
if (!id || id === ProjectsManager.DefaultProjectId) {
|
|
82
|
+
logger.debug `reset default project ID`;
|
|
83
|
+
this.#defaultProjectId = undefined;
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
invariant(this.#projects.find(p => p.id === id), `Project "${id}" not found`);
|
|
87
|
+
logger.debug `set default project ID to ${id}`;
|
|
88
|
+
this.#defaultProjectId = id;
|
|
89
|
+
}
|
|
90
|
+
get all() {
|
|
91
|
+
if (hasAtLeast(this.#projects, 1)) {
|
|
92
|
+
const ids = [
|
|
93
|
+
...map(this.#projects, prop('id')),
|
|
94
|
+
DefaultProject.id,
|
|
95
|
+
];
|
|
96
|
+
// if default project is set, ensure it is first
|
|
97
|
+
if (this.#defaultProjectId) {
|
|
98
|
+
const idx = ids.findIndex(p => p === this.#defaultProjectId);
|
|
99
|
+
if (idx > 0) {
|
|
100
|
+
const [defaultProject] = ids.splice(idx, 1);
|
|
101
|
+
return [defaultProject, ...ids];
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return ids;
|
|
105
|
+
}
|
|
106
|
+
return [DefaultProject.id];
|
|
107
|
+
}
|
|
108
|
+
getProject(arg) {
|
|
109
|
+
const id = typeof arg === 'string' ? arg : (arg.likec4ProjectId || this.belongsTo(arg));
|
|
110
|
+
if (id === DefaultProject.id) {
|
|
111
|
+
let folderUri;
|
|
112
|
+
try {
|
|
113
|
+
folderUri = this.services.workspace.WorkspaceManager.workspaceUri;
|
|
114
|
+
}
|
|
115
|
+
catch (error) {
|
|
116
|
+
logger.warn('Failed to get workspace URI, using default folder', { error });
|
|
117
|
+
folderUri = URI.file('');
|
|
118
|
+
// ignore - workspace not initialized
|
|
119
|
+
}
|
|
120
|
+
return {
|
|
121
|
+
id: ProjectsManager.DefaultProjectId,
|
|
122
|
+
config: DefaultProject.config,
|
|
123
|
+
folderUri,
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
const { config, folderUri, } = nonNullable(this.#projects.find(p => p.id === id), `Project "${id}" not found`);
|
|
127
|
+
return {
|
|
128
|
+
id,
|
|
129
|
+
folderUri,
|
|
130
|
+
config,
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Validates and ensures the project ID.
|
|
135
|
+
* If no project ID is specified, returns default project ID
|
|
136
|
+
* If there are multiple projects and default project is not set, throws an error
|
|
137
|
+
*/
|
|
138
|
+
ensureProjectId(projectId) {
|
|
139
|
+
if (projectId === ProjectsManager.DefaultProjectId) {
|
|
140
|
+
return this.defaultProjectId ?? ProjectsManager.DefaultProjectId;
|
|
141
|
+
}
|
|
142
|
+
if (projectId) {
|
|
143
|
+
invariant(this.#projectIdToFolder.has(projectId), `Project ID ${projectId} is not registered`);
|
|
144
|
+
return projectId;
|
|
145
|
+
}
|
|
146
|
+
return nonNullable(this.defaultProjectId, () => `Specify exact project, known: [${[...this.#projectIdToFolder.keys()].join(', ')}]`);
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Validates and ensures the project.
|
|
150
|
+
*/
|
|
151
|
+
ensureProject(projectId) {
|
|
152
|
+
projectId = this.ensureProjectId(projectId);
|
|
153
|
+
return this.getProject(projectId);
|
|
154
|
+
}
|
|
155
|
+
hasMultipleProjects() {
|
|
156
|
+
return this.#projects.length > 1;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Checks if the specified document should be excluded from processing.
|
|
160
|
+
*/
|
|
161
|
+
isExcluded(document) {
|
|
162
|
+
if (typeof document === 'string' || URI.isUri(document)) {
|
|
163
|
+
let docUriAsString = normalizeUri(document);
|
|
164
|
+
const project = this.findProjectForDocument(docUriAsString);
|
|
165
|
+
return project.exclude ? project.exclude(withoutProtocol(docUriAsString)) : false;
|
|
166
|
+
}
|
|
167
|
+
let isExcluded = this.#excludedDocuments.get(document);
|
|
168
|
+
if (isExcluded === undefined) {
|
|
169
|
+
isExcluded = this.isExcluded(document.uri);
|
|
170
|
+
this.#excludedDocuments.set(document, isExcluded);
|
|
171
|
+
}
|
|
172
|
+
return isExcluded;
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Checks if it is a config file and it is not excluded by default exclude pattern
|
|
176
|
+
*
|
|
177
|
+
* @param entry The file system entry to check
|
|
178
|
+
*/
|
|
179
|
+
isConfigFile(entry) {
|
|
180
|
+
const filename = parseFilename(entry.toString(), { strict: false })?.toLowerCase();
|
|
181
|
+
const isConfigFile = !!filename && isLikeC4Config(filename);
|
|
182
|
+
if (isConfigFile) {
|
|
183
|
+
if (DefaultProject.exclude(entry.path)) {
|
|
184
|
+
logger.debug `exclude config file ${entry.path}`;
|
|
185
|
+
return false;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
return isConfigFile;
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Checks if the provided file system entry is a valid project config file.
|
|
192
|
+
*
|
|
193
|
+
* @param entry The file system entry to check
|
|
194
|
+
*/
|
|
195
|
+
async registerConfigFile(configFile) {
|
|
196
|
+
if (this.isConfigFile(configFile)) {
|
|
197
|
+
try {
|
|
198
|
+
return await this.registerProject(configFile);
|
|
199
|
+
}
|
|
200
|
+
catch (error) {
|
|
201
|
+
this.services.lsp.Connection?.window.showErrorMessage(`LikeC4: Failed to register project at ${configFile.fsPath}`);
|
|
202
|
+
logger.warn('Failed to register project at {uri}', { uri: configFile.fsPath, error });
|
|
203
|
+
return undefined;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
return undefined;
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Registers (or reloads) likec4 project by config file or config object.
|
|
210
|
+
* If there is some project registered at same folder, it will be reloaded.
|
|
211
|
+
*/
|
|
212
|
+
async registerProject(opts) {
|
|
213
|
+
if (URI.isUri(opts)) {
|
|
214
|
+
const configFile = opts;
|
|
215
|
+
const config = await this.services.workspace.FileSystemProvider.loadProjectConfig(configFile);
|
|
216
|
+
const path = joinRelativeURL(configFile.path, '..');
|
|
217
|
+
const folderUri = configFile.with({ path });
|
|
218
|
+
return this._registerProject({ config, folderUri });
|
|
219
|
+
}
|
|
220
|
+
return this._registerProject(opts);
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Registers (or reloads) likec4 project by config file or config object.
|
|
224
|
+
* If there is some project registered at same folder, it will be reloaded.
|
|
225
|
+
*/
|
|
226
|
+
_registerProject(opts) {
|
|
227
|
+
const config = validateProjectConfig(opts.config);
|
|
228
|
+
const folder = ProjectFolder(opts.folderUri);
|
|
229
|
+
let project = this.#projects.find(p => p.folder === folder);
|
|
230
|
+
if (project && deepEqual(project.config, config)) {
|
|
231
|
+
return project;
|
|
232
|
+
}
|
|
233
|
+
let mustReset = false;
|
|
234
|
+
let id;
|
|
235
|
+
if (!project) {
|
|
236
|
+
if (this.#projectIdToFolder.has(config.name)) {
|
|
237
|
+
logger.warn `Project "${config.name}" already exists, generating unique ID`;
|
|
238
|
+
}
|
|
239
|
+
id = this.uniqueProjectId(config.name);
|
|
240
|
+
project = {
|
|
241
|
+
id,
|
|
242
|
+
config,
|
|
243
|
+
folder,
|
|
244
|
+
folderUri: URI.parse(folder),
|
|
245
|
+
};
|
|
246
|
+
// if there is any project within subfolder or parent folder
|
|
247
|
+
// we need to reset assigned to documents project IDs
|
|
248
|
+
mustReset = this.#projects.some(p => p.folder.startsWith(folder) || folder.startsWith(p.folder));
|
|
249
|
+
this.#projects = pipe([...this.#projects, project], sortBy([({ folder }) => withoutProtocol(folder).split('/').length, 'desc']));
|
|
250
|
+
logger.info `register project ${project.id} folder: ${folder}`;
|
|
251
|
+
}
|
|
252
|
+
else {
|
|
253
|
+
// Project exists but configs are different (deepEqual check above)
|
|
254
|
+
mustReset = true;
|
|
255
|
+
if (project.config.name !== config.name) {
|
|
256
|
+
this.#projectIdToFolder.delete(project.id);
|
|
257
|
+
logger.info `unregister project ${project.id} folder: ${folder}`;
|
|
258
|
+
id = this.uniqueProjectId(config.name);
|
|
259
|
+
project.id = id;
|
|
260
|
+
logger.info `re-register project ${project.id} folder: ${folder}`;
|
|
261
|
+
}
|
|
262
|
+
else {
|
|
263
|
+
id = project.id;
|
|
264
|
+
logger.info `update project ${project.id} on config change`;
|
|
265
|
+
}
|
|
266
|
+
project.config = config;
|
|
267
|
+
}
|
|
268
|
+
if (isNullish(config.exclude)) {
|
|
269
|
+
project.exclude = DefaultProject.exclude;
|
|
270
|
+
}
|
|
271
|
+
else if (hasAtLeast(config.exclude, 1)) {
|
|
272
|
+
project.exclude = picomatch(config.exclude, { dot: true });
|
|
273
|
+
}
|
|
274
|
+
this.#projectIdToFolder.set(project.id, folder);
|
|
275
|
+
if (mustReset) {
|
|
276
|
+
this.resetProjectIds();
|
|
277
|
+
}
|
|
278
|
+
return project;
|
|
279
|
+
}
|
|
280
|
+
belongsTo(document) {
|
|
281
|
+
const documentUri = normalizeUri(document);
|
|
282
|
+
return this.findProjectForDocument(documentUri).id;
|
|
283
|
+
}
|
|
284
|
+
#activeReload = null;
|
|
285
|
+
async reloadProjects() {
|
|
286
|
+
try {
|
|
287
|
+
if (!this.#activeReload) {
|
|
288
|
+
logger.debug `schedule reload projects`;
|
|
289
|
+
this.#activeReload = this._reloadProjects();
|
|
290
|
+
}
|
|
291
|
+
else {
|
|
292
|
+
logger.debug `reload projects is already in progress, waiting`;
|
|
293
|
+
}
|
|
294
|
+
await this.#activeReload;
|
|
295
|
+
}
|
|
296
|
+
finally {
|
|
297
|
+
this.#activeReload = null;
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
async _reloadProjects() {
|
|
301
|
+
// debounce reload projects
|
|
302
|
+
await delay(200);
|
|
303
|
+
const folders = this.services.workspace.WorkspaceManager.workspaceFolders;
|
|
304
|
+
if (!folders) {
|
|
305
|
+
logger.warn('No workspace folders found');
|
|
306
|
+
return;
|
|
307
|
+
}
|
|
308
|
+
await this.services.workspace.WorkspaceLock.write(async (cancelToken) => {
|
|
309
|
+
const configFiles = [];
|
|
310
|
+
for (const folder of folders) {
|
|
311
|
+
try {
|
|
312
|
+
const files = await this.services.workspace.FileSystemProvider.scanProjectFiles(URI.parse(folder.uri));
|
|
313
|
+
for (const file of files) {
|
|
314
|
+
if (file.isFile && this.isConfigFile(file.uri)) {
|
|
315
|
+
configFiles.push(file);
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
catch (error) {
|
|
320
|
+
logger.error('Failed to scanProjectFiles, {folder}', { folder: folder.uri, error });
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
if (configFiles.length === 0 && this.#projects.length !== 0) {
|
|
324
|
+
logger.warning('No config files found, but some projects were registered before');
|
|
325
|
+
}
|
|
326
|
+
await interruptAndCheck(cancelToken);
|
|
327
|
+
logger.debug `start reload projects`;
|
|
328
|
+
this.#projects = [];
|
|
329
|
+
this.#projectIdToFolder.clear();
|
|
330
|
+
for (const entry of configFiles) {
|
|
331
|
+
try {
|
|
332
|
+
await this.registerConfigFile(entry.uri);
|
|
333
|
+
}
|
|
334
|
+
catch (error) {
|
|
335
|
+
logger.error('Failed to load config file {uri}', { uri: entry.uri.toString(), error });
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
this.resetProjectIds();
|
|
339
|
+
await this.rebuidDocuments(cancelToken);
|
|
340
|
+
});
|
|
341
|
+
}
|
|
342
|
+
uniqueProjectId(name) {
|
|
343
|
+
let id = name;
|
|
344
|
+
let i = 1;
|
|
345
|
+
while (this.#projectIdToFolder.has(id)) {
|
|
346
|
+
id = `${name}-${i++}`;
|
|
347
|
+
}
|
|
348
|
+
return id;
|
|
349
|
+
}
|
|
350
|
+
resetProjectIds() {
|
|
351
|
+
if (this.#defaultProjectId && !this.#projectIdToFolder.has(this.#defaultProjectId)) {
|
|
352
|
+
this.#defaultProjectId = undefined;
|
|
353
|
+
}
|
|
354
|
+
this.mappingsToProject.clear();
|
|
355
|
+
this.#excludedDocuments = new WeakMap();
|
|
356
|
+
this.services.workspace.LangiumDocuments.resetProjectIds();
|
|
357
|
+
}
|
|
358
|
+
async rebuidDocuments(cancelToken) {
|
|
359
|
+
await this.services.workspace.WorkspaceManager.rebuildAll(cancelToken);
|
|
360
|
+
}
|
|
361
|
+
findProjectForDocument(documentUri) {
|
|
362
|
+
return this.mappingsToProject.get(documentUri, () => {
|
|
363
|
+
const project = this.#projects.find(({ folder }) => documentUri.startsWith(folder));
|
|
364
|
+
// If the document is not part of any project, assign it to the global project ID
|
|
365
|
+
return project ?? DefaultProject;
|
|
366
|
+
});
|
|
367
|
+
}
|
|
368
|
+
// The mapping between document URIs and their corresponding project ID
|
|
369
|
+
// Lazy-created due to initialization order of the LanguageServer
|
|
370
|
+
get mappingsToProject() {
|
|
371
|
+
return memoizeProp(this, '_mappingsToProject', () => new WorkspaceCache(this.services));
|
|
372
|
+
}
|
|
373
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { BuildOptions, FileSelector, FileSystemNode, LangiumDocument, LangiumDocumentFactory } from 'langium';
|
|
1
|
+
import type { BuildOptions, Cancellation, FileSelector, FileSystemNode, LangiumDocument, LangiumDocumentFactory } from 'langium';
|
|
2
2
|
import { DefaultWorkspaceManager } from 'langium';
|
|
3
3
|
import type { WorkspaceFolder } from 'vscode-languageserver';
|
|
4
4
|
import { URI } from 'vscode-uri';
|
|
@@ -24,7 +24,8 @@ export declare class LikeC4WorkspaceManager extends DefaultWorkspaceManager {
|
|
|
24
24
|
* Determine whether the given folder entry shall be included while indexing the workspace.
|
|
25
25
|
*/
|
|
26
26
|
protected includeEntry(_workspaceFolder: WorkspaceFolder, entry: FileSystemNode, selector: FileSelector): boolean;
|
|
27
|
-
workspace():
|
|
27
|
+
workspace(): WorkspaceFolder | null;
|
|
28
|
+
rebuildAll(cancelToken?: Cancellation.CancellationToken): Promise<void>;
|
|
28
29
|
get workspaceUri(): URI;
|
|
29
30
|
get workspaceURL(): URL;
|
|
30
31
|
}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { invariant } from '@likec4/core';
|
|
2
|
+
import { DefaultWorkspaceManager } from 'langium';
|
|
3
|
+
import { hasAtLeast } from 'remeda';
|
|
4
|
+
import { URI } from 'vscode-uri';
|
|
5
|
+
import * as BuiltIn from '../likec4lib';
|
|
6
|
+
import { logger, logWarnError } from '../logger';
|
|
7
|
+
export class LikeC4WorkspaceManager extends DefaultWorkspaceManager {
|
|
8
|
+
services;
|
|
9
|
+
documentFactory;
|
|
10
|
+
fileSystemProvider;
|
|
11
|
+
initialBuildOptions = {
|
|
12
|
+
eagerLinking: true,
|
|
13
|
+
validation: true,
|
|
14
|
+
};
|
|
15
|
+
constructor(services) {
|
|
16
|
+
super(services);
|
|
17
|
+
this.services = services;
|
|
18
|
+
this.documentFactory = services.workspace.LangiumDocumentFactory;
|
|
19
|
+
this.fileSystemProvider = services.workspace.FileSystemProvider;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* First load all project config files, then load all documents in the workspace.
|
|
23
|
+
*/
|
|
24
|
+
async performStartup(folders) {
|
|
25
|
+
this.folders ??= folders;
|
|
26
|
+
const configFiles = [];
|
|
27
|
+
for (const folder of folders) {
|
|
28
|
+
try {
|
|
29
|
+
const uri = URI.parse(folder.uri);
|
|
30
|
+
const found = await this.fileSystemProvider.scanProjectFiles(uri);
|
|
31
|
+
configFiles.push(...found);
|
|
32
|
+
this.services.workspace.FileSystemWatcher.watch(uri.fsPath);
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
logWarnError(error);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
// Project config files
|
|
39
|
+
const projects = this.services.workspace.ProjectsManager;
|
|
40
|
+
for (const entry of configFiles) {
|
|
41
|
+
try {
|
|
42
|
+
await projects.registerConfigFile(entry.uri);
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
logWarnError(error);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return await super.performStartup(folders);
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Load all additional documents that shall be visible in the context of the given workspace
|
|
52
|
+
* folders and add them to the collector. This can be used to include built-in libraries of
|
|
53
|
+
* your language, which can be either loaded from provided files or constructed in memory.
|
|
54
|
+
*/
|
|
55
|
+
async loadAdditionalDocuments(folders, collector) {
|
|
56
|
+
collector(this.documentFactory.fromString(BuiltIn.Content, URI.parse(BuiltIn.Uri)));
|
|
57
|
+
await super.loadAdditionalDocuments(folders, collector);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Determine whether the given folder entry shall be included while indexing the workspace.
|
|
61
|
+
*/
|
|
62
|
+
includeEntry(_workspaceFolder, entry, selector) {
|
|
63
|
+
if (this.services.workspace.ProjectsManager.isConfigFile(entry.uri)) {
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
if (entry.isFile) {
|
|
67
|
+
return !this.services.workspace.ProjectsManager.isExcluded(entry.uri);
|
|
68
|
+
}
|
|
69
|
+
return super.includeEntry(_workspaceFolder, entry, selector);
|
|
70
|
+
}
|
|
71
|
+
workspace() {
|
|
72
|
+
if (this.folders && hasAtLeast(this.folders, 1)) {
|
|
73
|
+
return this.folders[0];
|
|
74
|
+
}
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
async rebuildAll(cancelToken) {
|
|
78
|
+
const docs = this.services.workspace.LangiumDocuments.all.map(d => d.uri).toArray();
|
|
79
|
+
logger.info('invalidate and rebuild all {docs} documents', { docs: docs.length });
|
|
80
|
+
this.services.workspace.Cache.clear();
|
|
81
|
+
await this.documentBuilder.update(docs, [], cancelToken);
|
|
82
|
+
}
|
|
83
|
+
get workspaceUri() {
|
|
84
|
+
const workspace = this.workspace();
|
|
85
|
+
invariant(workspace, 'Workspace not initialized');
|
|
86
|
+
return URI.parse(workspace.uri);
|
|
87
|
+
}
|
|
88
|
+
get workspaceURL() {
|
|
89
|
+
const workspace = this.workspace();
|
|
90
|
+
invariant(workspace, 'Workspace not initialized');
|
|
91
|
+
return new URL(workspace.uri);
|
|
92
|
+
}
|
|
93
|
+
}
|
package/likec4lib/package.json
CHANGED
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.
|
|
4
|
+
"version": "1.44.0",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"bugs": "https://github.com/likec4/likec4/issues",
|
|
7
7
|
"homepage": "https://likec4.dev",
|
|
@@ -34,39 +34,39 @@
|
|
|
34
34
|
"sources": "./src/index.ts",
|
|
35
35
|
"default": {
|
|
36
36
|
"types": "./dist/index.d.ts",
|
|
37
|
-
"default": "./dist/index.
|
|
37
|
+
"default": "./dist/index.js"
|
|
38
38
|
}
|
|
39
39
|
},
|
|
40
40
|
"./likec4lib": {
|
|
41
41
|
"sources": "./src/likec4lib.ts",
|
|
42
42
|
"default": {
|
|
43
43
|
"types": "./dist/likec4lib.d.ts",
|
|
44
|
-
"import": "./dist/likec4lib.
|
|
45
|
-
"default": "./dist/likec4lib.
|
|
44
|
+
"import": "./dist/likec4lib.js",
|
|
45
|
+
"default": "./dist/likec4lib.js"
|
|
46
46
|
}
|
|
47
47
|
},
|
|
48
48
|
"./browser-worker": {
|
|
49
49
|
"sources": "./src/browser-worker.ts",
|
|
50
50
|
"default": {
|
|
51
51
|
"types": "./dist/browser-worker.d.ts",
|
|
52
|
-
"import": "./dist/browser-worker.
|
|
53
|
-
"default": "./dist/browser-worker.
|
|
52
|
+
"import": "./dist/browser-worker.js",
|
|
53
|
+
"default": "./dist/browser-worker.js"
|
|
54
54
|
}
|
|
55
55
|
},
|
|
56
56
|
"./browser": {
|
|
57
57
|
"sources": "./src/browser.ts",
|
|
58
58
|
"default": {
|
|
59
59
|
"types": "./dist/browser.d.ts",
|
|
60
|
-
"import": "./dist/browser.
|
|
61
|
-
"default": "./dist/browser.
|
|
60
|
+
"import": "./dist/browser.js",
|
|
61
|
+
"default": "./dist/browser.js"
|
|
62
62
|
}
|
|
63
63
|
},
|
|
64
64
|
"./protocol": {
|
|
65
65
|
"sources": "./src/protocol.ts",
|
|
66
66
|
"default": {
|
|
67
67
|
"types": "./dist/protocol.d.ts",
|
|
68
|
-
"import": "./dist/protocol.
|
|
69
|
-
"default": "./dist/protocol.
|
|
68
|
+
"import": "./dist/protocol.js",
|
|
69
|
+
"default": "./dist/protocol.js"
|
|
70
70
|
}
|
|
71
71
|
},
|
|
72
72
|
"./bundled": "./dist/bundled.mjs"
|
|
@@ -76,47 +76,48 @@
|
|
|
76
76
|
"access": "public"
|
|
77
77
|
},
|
|
78
78
|
"dependencies": {
|
|
79
|
-
"@hpcc-js/wasm-graphviz": "1.
|
|
79
|
+
"@hpcc-js/wasm-graphviz": "1.15.0",
|
|
80
80
|
"bundle-require": "^5.1.0",
|
|
81
|
-
"esbuild": "0.25.
|
|
81
|
+
"esbuild": "0.25.11"
|
|
82
82
|
},
|
|
83
83
|
"devDependencies": {
|
|
84
|
-
"@hono/node-server": "^1.19.
|
|
85
|
-
"@modelcontextprotocol/sdk": "^1.
|
|
84
|
+
"@hono/node-server": "^1.19.5",
|
|
85
|
+
"@modelcontextprotocol/sdk": "^1.20.1",
|
|
86
86
|
"@msgpack/msgpack": "^3.1.2",
|
|
87
|
-
"@smithy/util-base64": "^4.
|
|
87
|
+
"@smithy/util-base64": "^4.3.0",
|
|
88
88
|
"@types/natural-compare-lite": "^1.4.2",
|
|
89
|
-
"@types/node": "~20.19.
|
|
89
|
+
"@types/node": "~20.19.22",
|
|
90
90
|
"@types/picomatch": "^4.0.2",
|
|
91
91
|
"@types/vscode": "^1.84.0",
|
|
92
92
|
"@types/which": "^3.0.4",
|
|
93
93
|
"chokidar": "^4.0.3",
|
|
94
94
|
"defu": "^6.1.4",
|
|
95
95
|
"esm-env": "^1.2.2",
|
|
96
|
-
"fast-equals": "^5.
|
|
96
|
+
"fast-equals": "^5.3.2",
|
|
97
97
|
"fdir": "6.4.0",
|
|
98
98
|
"fetch-to-node": "^2.1.0",
|
|
99
|
-
"hono": "^4.
|
|
99
|
+
"hono": "^4.10.2",
|
|
100
100
|
"indent-string": "^5.0.0",
|
|
101
101
|
"json5": "^2.2.3",
|
|
102
102
|
"langium": "3.5.0",
|
|
103
103
|
"langium-cli": "3.5.2",
|
|
104
|
+
"nano-spawn": "^1.0.3",
|
|
104
105
|
"natural-compare-lite": "^1.4.0",
|
|
105
|
-
"oxlint": "1.
|
|
106
|
+
"oxlint": "1.28.0",
|
|
106
107
|
"p-debounce": "4.0.0",
|
|
107
108
|
"p-queue": "8.1.1",
|
|
108
109
|
"p-timeout": "6.1.4",
|
|
109
110
|
"picomatch": "^4.0.3",
|
|
110
111
|
"pretty-ms": "^9.2.0",
|
|
111
|
-
"remeda": "^2.
|
|
112
|
-
"strip-indent": "^4.
|
|
112
|
+
"remeda": "^2.32.0",
|
|
113
|
+
"strip-indent": "^4.1.1",
|
|
113
114
|
"tsx": "4.20.6",
|
|
114
|
-
"turbo": "2.
|
|
115
|
+
"turbo": "2.6.0",
|
|
115
116
|
"type-fest": "^4.41.0",
|
|
116
|
-
"typescript": "5.9.
|
|
117
|
+
"typescript": "5.9.3",
|
|
117
118
|
"ufo": "1.6.1",
|
|
118
119
|
"unbuild": "3.5.0",
|
|
119
|
-
"vitest": "
|
|
120
|
+
"vitest": "4.0.8",
|
|
120
121
|
"vscode-jsonrpc": "8.2.1",
|
|
121
122
|
"vscode-languageserver": "9.0.1",
|
|
122
123
|
"vscode-languageserver-protocol": "3.17.5",
|
|
@@ -124,12 +125,12 @@
|
|
|
124
125
|
"vscode-uri": "3.1.0",
|
|
125
126
|
"which": "^5.0.0",
|
|
126
127
|
"zod": "^3.25.76",
|
|
127
|
-
"@likec4/core": "1.
|
|
128
|
-
"@likec4/config": "1.
|
|
129
|
-
"@likec4/
|
|
130
|
-
"@likec4/log": "1.
|
|
131
|
-
"@likec4/
|
|
132
|
-
"@likec4/tsconfig": "1.
|
|
128
|
+
"@likec4/core": "1.44.0",
|
|
129
|
+
"@likec4/config": "1.44.0",
|
|
130
|
+
"@likec4/layouts": "1.44.0",
|
|
131
|
+
"@likec4/log": "1.44.0",
|
|
132
|
+
"@likec4/icons": "1.44.0",
|
|
133
|
+
"@likec4/tsconfig": "1.44.0",
|
|
133
134
|
"@likec4/devops": "1.42.0"
|
|
134
135
|
},
|
|
135
136
|
"scripts": {
|
|
@@ -151,5 +152,5 @@
|
|
|
151
152
|
"test:watch": "vitest"
|
|
152
153
|
},
|
|
153
154
|
"types": "dist/index.d.ts",
|
|
154
|
-
"module": "dist/index.
|
|
155
|
+
"module": "dist/index.js"
|
|
155
156
|
}
|
package/protocol/package.json
CHANGED