@likec4/language-server 1.36.1 → 1.37.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/dist/LikeC4LanguageServices.d.ts +38 -5
- package/dist/LikeC4LanguageServices.js +40 -10
- package/dist/Rpc.js +22 -6
- package/dist/bundled.mjs +2467 -2451
- package/dist/config/schema.d.ts +1 -1
- package/dist/config/schema.js +1 -1
- package/dist/likec4lib.d.ts +1 -1
- package/dist/lsp/DocumentLinkProvider.js +3 -3
- package/dist/lsp/DocumentSymbolProvider.js +1 -1
- package/dist/mcp/tools/list-projects.js +2 -2
- package/dist/mcp/tools/read-project-summary.js +2 -2
- package/dist/model/builder/buildModel.d.ts +1 -1
- package/dist/model/builder/buildModel.js +4 -6
- package/dist/model/model-parser.d.ts +9 -9
- package/dist/model/model-parser.js +3 -0
- package/dist/model/parser/Base.d.ts +1 -1
- package/dist/model/parser/Base.js +1 -1
- package/dist/model/parser/DeploymentModelParser.d.ts +1 -1
- package/dist/model/parser/DeploymentViewParser.d.ts +1 -1
- package/dist/model/parser/DeploymentViewParser.js +2 -2
- package/dist/model/parser/FqnRefParser.d.ts +1 -1
- package/dist/model/parser/FqnRefParser.js +8 -1
- package/dist/model/parser/GlobalsParser.d.ts +1 -1
- package/dist/model/parser/ImportsParser.d.ts +1 -1
- package/dist/model/parser/ModelParser.d.ts +1 -1
- package/dist/model/parser/PredicatesParser.d.ts +1 -1
- package/dist/model/parser/SpecificationParser.d.ts +1 -1
- package/dist/model/parser/ViewsParser.d.ts +1 -1
- package/dist/model/parser/ViewsParser.js +3 -3
- package/dist/module.d.ts +4 -0
- package/dist/module.js +4 -1
- package/dist/protocol.d.ts +18 -4
- package/dist/protocol.js +5 -1
- package/dist/test/testServices.d.ts +5 -2
- package/dist/test/testServices.js +4 -1
- package/dist/validation/DocumentValidator.d.ts +11 -0
- package/dist/validation/DocumentValidator.js +16 -0
- package/dist/validation/index.d.ts +1 -1
- package/dist/validation/index.js +1 -0
- package/dist/workspace/LangiumDocuments.d.ts +1 -0
- package/dist/workspace/LangiumDocuments.js +10 -1
- package/dist/workspace/ProjectsManager.d.ts +35 -17
- package/dist/workspace/ProjectsManager.js +164 -53
- package/dist/workspace/WorkspaceManager.js +1 -1
- package/package.json +6 -6
|
@@ -1,14 +1,27 @@
|
|
|
1
1
|
import type { NonEmptyReadonlyArray, ProjectId } from '@likec4/core';
|
|
2
|
-
import { type FileSystemNode, type LangiumDocument, URI, WorkspaceCache } from 'langium';
|
|
3
|
-
import picomatch from 'picomatch
|
|
2
|
+
import { type Cancellation, type FileSystemNode, type LangiumDocument, URI, WorkspaceCache } from 'langium';
|
|
3
|
+
import picomatch from 'picomatch';
|
|
4
|
+
import type { Tagged } from 'type-fest';
|
|
4
5
|
import { ProjectConfig } from '../config';
|
|
5
6
|
import type { LikeC4SharedServices } from '../module';
|
|
6
|
-
|
|
7
|
+
/**
|
|
8
|
+
* A tagged string that represents a project folder.
|
|
9
|
+
* Always has trailing slash.
|
|
10
|
+
*/
|
|
11
|
+
export type ProjectFolder = Tagged<string, 'ProjectFolder'>;
|
|
12
|
+
export declare function ProjectFolder(folder: URI | string): ProjectFolder;
|
|
13
|
+
interface ProjectData {
|
|
7
14
|
id: ProjectId;
|
|
8
15
|
config: ProjectConfig;
|
|
9
|
-
folder:
|
|
16
|
+
folder: ProjectFolder;
|
|
17
|
+
folderUri: URI;
|
|
10
18
|
exclude?: picomatch.Matcher;
|
|
11
19
|
}
|
|
20
|
+
export interface Project {
|
|
21
|
+
id: ProjectId;
|
|
22
|
+
folderUri: URI;
|
|
23
|
+
config: ProjectConfig;
|
|
24
|
+
}
|
|
12
25
|
export declare class ProjectsManager {
|
|
13
26
|
protected services: LikeC4SharedServices;
|
|
14
27
|
/**
|
|
@@ -27,7 +40,9 @@ export declare class ProjectsManager {
|
|
|
27
40
|
* This ensures that the most specific project is used for a document.
|
|
28
41
|
*/
|
|
29
42
|
private _projects;
|
|
43
|
+
private excludedDocuments;
|
|
30
44
|
private defaultGlobalProject;
|
|
45
|
+
private reloadProjectsLimiter;
|
|
31
46
|
constructor(services: LikeC4SharedServices);
|
|
32
47
|
/**
|
|
33
48
|
* Returns:
|
|
@@ -37,29 +52,32 @@ export declare class ProjectsManager {
|
|
|
37
52
|
*/
|
|
38
53
|
get defaultProjectId(): ProjectId | undefined;
|
|
39
54
|
get all(): NonEmptyReadonlyArray<ProjectId>;
|
|
40
|
-
getProject(arg: ProjectId | LangiumDocument):
|
|
41
|
-
id: ProjectId;
|
|
42
|
-
folder: URI;
|
|
43
|
-
config: Readonly<ProjectConfig>;
|
|
44
|
-
};
|
|
55
|
+
getProject(arg: ProjectId | LangiumDocument): Project;
|
|
45
56
|
ensureProjectId(projectId?: ProjectId | undefined): ProjectId;
|
|
46
57
|
hasMultipleProjects(): boolean;
|
|
47
|
-
checkIfExcluded(
|
|
48
|
-
|
|
58
|
+
checkIfExcluded(document: LangiumDocument | URI | string): boolean;
|
|
59
|
+
/**
|
|
60
|
+
* Checks if it is a config file and it is not excluded by default exclude pattern
|
|
61
|
+
*
|
|
62
|
+
* @param entry The file system entry to check
|
|
63
|
+
*/
|
|
64
|
+
isConfigFile(entry: URI): boolean;
|
|
49
65
|
/**
|
|
50
66
|
* Checks if the provided file system entry is a valid project config file.
|
|
51
67
|
*
|
|
52
68
|
* @param entry The file system entry to check
|
|
53
69
|
*/
|
|
54
|
-
loadConfigFile(entry: FileSystemNode): Promise<
|
|
55
|
-
registerProject(configFile: URI): Promise<
|
|
70
|
+
loadConfigFile(entry: FileSystemNode): Promise<ProjectData | undefined>;
|
|
71
|
+
registerProject(configFile: URI): Promise<ProjectData>;
|
|
56
72
|
registerProject(opts: {
|
|
57
73
|
config: ProjectConfig;
|
|
58
74
|
folderUri: URI | string;
|
|
59
|
-
}): Promise<
|
|
75
|
+
}): Promise<ProjectData>;
|
|
60
76
|
belongsTo(document: LangiumDocument | URI | string): ProjectId;
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
protected
|
|
77
|
+
reloadProjects(token?: Cancellation.CancellationToken): Promise<void>;
|
|
78
|
+
protected uniqueProjectId(name: string): ProjectId;
|
|
79
|
+
protected resetProjectIds(): void;
|
|
80
|
+
protected findProjectForDocument(documentUri: string): any;
|
|
81
|
+
protected get mappingsToProject(): WorkspaceCache<string, Pick<ProjectData, 'id' | 'config' | 'exclude'>>;
|
|
64
82
|
}
|
|
65
83
|
export {};
|
|
@@ -1,18 +1,33 @@
|
|
|
1
|
-
import { BiMap, invariant, nonNullable } from "@likec4/core";
|
|
1
|
+
import { BiMap, delay, invariant, memoizeProp, nonNullable } from "@likec4/core";
|
|
2
2
|
import { loggable } from "@likec4/log";
|
|
3
|
-
import {
|
|
4
|
-
import
|
|
5
|
-
|
|
3
|
+
import { deepEqual } from "fast-equals";
|
|
4
|
+
import {
|
|
5
|
+
interruptAndCheck,
|
|
6
|
+
URI,
|
|
7
|
+
WorkspaceCache
|
|
8
|
+
} from "langium";
|
|
9
|
+
import PQueue from "p-queue";
|
|
10
|
+
import picomatch from "picomatch";
|
|
11
|
+
import { hasAtLeast, isNullish, isTruthy, map, pickBy, pipe, prop, sortBy } from "remeda";
|
|
6
12
|
import {
|
|
7
13
|
hasProtocol,
|
|
8
14
|
joinRelativeURL,
|
|
15
|
+
normalizeURL,
|
|
9
16
|
parseFilename,
|
|
10
17
|
withoutProtocol,
|
|
11
|
-
withProtocol
|
|
18
|
+
withProtocol,
|
|
19
|
+
withTrailingSlash
|
|
12
20
|
} from "ufo";
|
|
13
21
|
import { parseConfigJson, validateConfig } from "../config/index.js";
|
|
14
22
|
import { logger as mainLogger } from "../logger.js";
|
|
15
23
|
const logger = mainLogger.getChild("ProjectsManager");
|
|
24
|
+
export function ProjectFolder(folder) {
|
|
25
|
+
if (URI.isUri(folder)) {
|
|
26
|
+
folder = folder.toString();
|
|
27
|
+
}
|
|
28
|
+
folder = hasProtocol(folder) ? folder : withProtocol(folder, "file://");
|
|
29
|
+
return withTrailingSlash(normalizeURL(folder));
|
|
30
|
+
}
|
|
16
31
|
export class ProjectsManager {
|
|
17
32
|
constructor(services) {
|
|
18
33
|
this.services = services;
|
|
@@ -38,16 +53,19 @@ export class ProjectsManager {
|
|
|
38
53
|
* This ensures that the most specific project is used for a document.
|
|
39
54
|
*/
|
|
40
55
|
_projects = [];
|
|
56
|
+
excludedDocuments = /* @__PURE__ */ new WeakMap();
|
|
41
57
|
defaultGlobalProject = {
|
|
42
58
|
id: ProjectsManager.DefaultProjectId,
|
|
43
59
|
config: {
|
|
44
60
|
name: ProjectsManager.DefaultProjectId,
|
|
45
|
-
exclude: ["**/node_modules
|
|
61
|
+
exclude: ["**/node_modules/**"]
|
|
46
62
|
},
|
|
47
|
-
exclude: picomatch("**/node_modules
|
|
48
|
-
dot: true
|
|
49
|
-
})
|
|
63
|
+
exclude: picomatch("**/node_modules/**", { dot: true })
|
|
50
64
|
};
|
|
65
|
+
reloadProjectsLimiter = new PQueue({
|
|
66
|
+
concurrency: 1,
|
|
67
|
+
timeout: 2e4
|
|
68
|
+
});
|
|
51
69
|
/**
|
|
52
70
|
* Returns:
|
|
53
71
|
* - the default project ID if there are no projects.
|
|
@@ -72,26 +90,26 @@ export class ProjectsManager {
|
|
|
72
90
|
getProject(arg) {
|
|
73
91
|
const id = typeof arg === "string" ? arg : arg.likec4ProjectId || this.belongsTo(arg);
|
|
74
92
|
if (id === ProjectsManager.DefaultProjectId) {
|
|
75
|
-
let
|
|
93
|
+
let folderUri2;
|
|
76
94
|
try {
|
|
77
|
-
|
|
95
|
+
folderUri2 = this.services.workspace.WorkspaceManager.workspaceUri;
|
|
78
96
|
} catch (error) {
|
|
79
97
|
logger.warn("Failed to get workspace URI, using default folder", { error });
|
|
80
|
-
|
|
98
|
+
folderUri2 = URI.file("");
|
|
81
99
|
}
|
|
82
100
|
return {
|
|
83
101
|
id: ProjectsManager.DefaultProjectId,
|
|
84
102
|
config: this.defaultGlobalProject.config,
|
|
85
|
-
|
|
103
|
+
folderUri: folderUri2
|
|
86
104
|
};
|
|
87
105
|
}
|
|
88
106
|
const {
|
|
89
107
|
config,
|
|
90
|
-
|
|
108
|
+
folderUri
|
|
91
109
|
} = nonNullable(this._projects.find((p) => p.id === id), `Project "${id}" not found`);
|
|
92
110
|
return {
|
|
93
111
|
id,
|
|
94
|
-
|
|
112
|
+
folderUri,
|
|
95
113
|
config
|
|
96
114
|
};
|
|
97
115
|
}
|
|
@@ -111,14 +129,34 @@ export class ProjectsManager {
|
|
|
111
129
|
hasMultipleProjects() {
|
|
112
130
|
return this._projects.length > 1;
|
|
113
131
|
}
|
|
114
|
-
checkIfExcluded(
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
132
|
+
checkIfExcluded(document) {
|
|
133
|
+
if (typeof document === "string" || URI.isUri(document)) {
|
|
134
|
+
let docUriAsString = typeof document === "string" ? document : document.toString();
|
|
135
|
+
const project = this.findProjectForDocument(docUriAsString);
|
|
136
|
+
return project.exclude ? project.exclude(withoutProtocol(docUriAsString)) : false;
|
|
137
|
+
}
|
|
138
|
+
let isExcluded = this.excludedDocuments.get(document);
|
|
139
|
+
if (isExcluded === void 0) {
|
|
140
|
+
isExcluded = this.checkIfExcluded(document.uri);
|
|
141
|
+
this.excludedDocuments.set(document, isExcluded);
|
|
142
|
+
}
|
|
143
|
+
return isExcluded;
|
|
118
144
|
}
|
|
145
|
+
/**
|
|
146
|
+
* Checks if it is a config file and it is not excluded by default exclude pattern
|
|
147
|
+
*
|
|
148
|
+
* @param entry The file system entry to check
|
|
149
|
+
*/
|
|
119
150
|
isConfigFile(entry) {
|
|
120
|
-
const filename = parseFilename(entry.
|
|
121
|
-
|
|
151
|
+
const filename = parseFilename(entry.toString(), { strict: false })?.toLowerCase();
|
|
152
|
+
const isConfigFile = !!filename && ProjectsManager.ConfigFileNames.includes(filename);
|
|
153
|
+
if (isConfigFile) {
|
|
154
|
+
if (this.defaultGlobalProject.exclude(entry.path)) {
|
|
155
|
+
logger.debug`exclude config file ${entry.path}`;
|
|
156
|
+
return false;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
return isConfigFile;
|
|
122
160
|
}
|
|
123
161
|
/**
|
|
124
162
|
* Checks if the provided file system entry is a valid project config file.
|
|
@@ -129,7 +167,7 @@ export class ProjectsManager {
|
|
|
129
167
|
if (entry.isDirectory) {
|
|
130
168
|
return void 0;
|
|
131
169
|
}
|
|
132
|
-
if (this.isConfigFile(entry)) {
|
|
170
|
+
if (this.isConfigFile(entry.uri)) {
|
|
133
171
|
try {
|
|
134
172
|
return await this.registerProject(entry.uri);
|
|
135
173
|
} catch (error) {
|
|
@@ -151,42 +189,55 @@ ${loggable(error)}`
|
|
|
151
189
|
const config2 = parseConfigJson(cfg);
|
|
152
190
|
const path = joinRelativeURL(configFile.path, "..");
|
|
153
191
|
const folderUri2 = configFile.with({ path });
|
|
154
|
-
return this.registerProject({ config: config2, folderUri: folderUri2 });
|
|
192
|
+
return await this.registerProject({ config: config2, folderUri: folderUri2 });
|
|
155
193
|
}
|
|
156
|
-
const config = validateConfig(opts.config);
|
|
194
|
+
const config = pickBy(validateConfig(opts.config), isTruthy);
|
|
157
195
|
const { folderUri } = opts;
|
|
158
|
-
|
|
159
|
-
let
|
|
160
|
-
|
|
161
|
-
|
|
196
|
+
const folder = ProjectFolder(folderUri);
|
|
197
|
+
let project = this._projects.find((p) => p.folder === folder);
|
|
198
|
+
if (project && deepEqual(project.config, config)) {
|
|
199
|
+
return project;
|
|
162
200
|
}
|
|
163
|
-
let
|
|
164
|
-
|
|
165
|
-
|
|
201
|
+
let mustReset = !!project && !deepEqual(project.config, config);
|
|
202
|
+
let id;
|
|
203
|
+
if (!project) {
|
|
204
|
+
id = this.uniqueProjectId(config.name);
|
|
205
|
+
project = {
|
|
206
|
+
id,
|
|
207
|
+
config,
|
|
208
|
+
folder,
|
|
209
|
+
folderUri: URI.parse(folder)
|
|
210
|
+
};
|
|
211
|
+
mustReset = this._projects.some((p) => p.folder.startsWith(folder) || folder.startsWith(p.folder));
|
|
212
|
+
this._projects = pipe(
|
|
213
|
+
[...this._projects, project],
|
|
214
|
+
sortBy(
|
|
215
|
+
[({ folder: folder2 }) => withoutProtocol(folder2).split("/").length, "desc"]
|
|
216
|
+
)
|
|
217
|
+
);
|
|
218
|
+
logger.info`register project ${project.id} folder: ${folder}`;
|
|
166
219
|
} else {
|
|
167
|
-
|
|
220
|
+
if (project.config.name !== config.name) {
|
|
221
|
+
this.projectIdToFolder.delete(project.id);
|
|
222
|
+
logger.info`unregister project ${project.id} folder: ${folder}`;
|
|
223
|
+
id = this.uniqueProjectId(config.name);
|
|
224
|
+
project.id = id;
|
|
225
|
+
logger.info`re-register project ${project.id} folder: ${folder}`;
|
|
226
|
+
} else {
|
|
227
|
+
id = project.id;
|
|
228
|
+
logger.info`update project ${project.id} on config change`;
|
|
229
|
+
}
|
|
230
|
+
project.config = config;
|
|
168
231
|
}
|
|
169
|
-
const project = {
|
|
170
|
-
id,
|
|
171
|
-
config,
|
|
172
|
-
folder
|
|
173
|
-
};
|
|
174
232
|
if (isNullish(config.exclude)) {
|
|
175
233
|
project.exclude = this.defaultGlobalProject.exclude;
|
|
176
234
|
} else if (hasAtLeast(config.exclude, 1)) {
|
|
177
|
-
project.exclude = picomatch(config.exclude, {
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
sortBy(
|
|
184
|
-
[({ folder: folder2 }) => withoutProtocol(folder2).split("/").length, "desc"]
|
|
185
|
-
)
|
|
186
|
-
);
|
|
187
|
-
this.projectIdToFolder.set(id, folder);
|
|
188
|
-
logger.info`register project ${id} folder: ${folder}`;
|
|
189
|
-
this.mappingsToProject.clear();
|
|
235
|
+
project.exclude = picomatch(config.exclude, { dot: true });
|
|
236
|
+
}
|
|
237
|
+
this.projectIdToFolder.set(project.id, folder);
|
|
238
|
+
if (mustReset) {
|
|
239
|
+
this.resetProjectIds();
|
|
240
|
+
}
|
|
190
241
|
return project;
|
|
191
242
|
}
|
|
192
243
|
belongsTo(document) {
|
|
@@ -200,6 +251,68 @@ ${loggable(error)}`
|
|
|
200
251
|
}
|
|
201
252
|
return this.findProjectForDocument(documentUri).id;
|
|
202
253
|
}
|
|
254
|
+
async reloadProjects(token) {
|
|
255
|
+
const folders = this.services.workspace.WorkspaceManager.workspaceFolders;
|
|
256
|
+
if (!folders) {
|
|
257
|
+
logger.warn("No workspace folders found");
|
|
258
|
+
return;
|
|
259
|
+
}
|
|
260
|
+
if (this.reloadProjectsLimiter.size + this.reloadProjectsLimiter.pending > 0) {
|
|
261
|
+
logger.debug`reload projects is already queued`;
|
|
262
|
+
return;
|
|
263
|
+
}
|
|
264
|
+
this.reloadProjectsLimiter.add(async () => {
|
|
265
|
+
await delay(100);
|
|
266
|
+
});
|
|
267
|
+
this.reloadProjectsLimiter.add(async () => {
|
|
268
|
+
if (token) {
|
|
269
|
+
await interruptAndCheck(token);
|
|
270
|
+
}
|
|
271
|
+
logger.debug`reload projects`;
|
|
272
|
+
const configFiles = [];
|
|
273
|
+
for (const folder of folders) {
|
|
274
|
+
try {
|
|
275
|
+
const files = await this.services.workspace.FileSystemProvider.readDirectory(URI.parse(folder.uri));
|
|
276
|
+
for (const file of files) {
|
|
277
|
+
if (file.isFile && this.isConfigFile(file.uri)) {
|
|
278
|
+
configFiles.push(file);
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
} catch (error) {
|
|
282
|
+
logger.error("Failed to load config file", { error });
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
if (configFiles.length === 0 && this._projects.length !== 0) {
|
|
286
|
+
logger.warning("No config files found, but some projects were registered before");
|
|
287
|
+
}
|
|
288
|
+
this._projects = [];
|
|
289
|
+
this.projectIdToFolder.clear();
|
|
290
|
+
for (const entry of configFiles) {
|
|
291
|
+
try {
|
|
292
|
+
await this.registerProject(entry.uri);
|
|
293
|
+
} catch (error) {
|
|
294
|
+
logger.error("Failed to load config file", { error });
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
this.resetProjectIds();
|
|
298
|
+
const docs = this.services.workspace.LangiumDocuments.all.map((d) => d.uri).toArray();
|
|
299
|
+
logger.info("invalidate and rebuild documents {docs}", { docs: docs.length });
|
|
300
|
+
await this.services.workspace.DocumentBuilder.update(docs, []);
|
|
301
|
+
});
|
|
302
|
+
}
|
|
303
|
+
uniqueProjectId(name) {
|
|
304
|
+
let id = name;
|
|
305
|
+
let i = 1;
|
|
306
|
+
while (this.projectIdToFolder.has(id)) {
|
|
307
|
+
id = `${name}-${i++}`;
|
|
308
|
+
}
|
|
309
|
+
return id;
|
|
310
|
+
}
|
|
311
|
+
resetProjectIds() {
|
|
312
|
+
this.mappingsToProject.clear();
|
|
313
|
+
this.excludedDocuments = /* @__PURE__ */ new WeakMap();
|
|
314
|
+
this.services.workspace.LangiumDocuments.resetProjectIds();
|
|
315
|
+
}
|
|
203
316
|
findProjectForDocument(documentUri) {
|
|
204
317
|
return this.mappingsToProject.get(documentUri, () => {
|
|
205
318
|
const project = this._projects.find(({ folder }) => documentUri.startsWith(folder));
|
|
@@ -208,9 +321,7 @@ ${loggable(error)}`
|
|
|
208
321
|
}
|
|
209
322
|
// The mapping between document URIs and their corresponding project ID
|
|
210
323
|
// Lazy-created due to initialization order of the LanguageServer
|
|
211
|
-
_mappingsToProject;
|
|
212
324
|
get mappingsToProject() {
|
|
213
|
-
this
|
|
214
|
-
return this._mappingsToProject;
|
|
325
|
+
return memoizeProp(this, "_mappingsToProject", () => new WorkspaceCache(this.services));
|
|
215
326
|
}
|
|
216
327
|
}
|
|
@@ -64,7 +64,7 @@ export class LikeC4WorkspaceManager extends DefaultWorkspaceManager {
|
|
|
64
64
|
* Determine whether the given folder entry shall be included while indexing the workspace.
|
|
65
65
|
*/
|
|
66
66
|
includeEntry(_workspaceFolder, entry, selector) {
|
|
67
|
-
if (this.services.workspace.ProjectsManager.isConfigFile(entry)) {
|
|
67
|
+
if (this.services.workspace.ProjectsManager.isConfigFile(entry.uri)) {
|
|
68
68
|
return false;
|
|
69
69
|
}
|
|
70
70
|
if (entry.isFile) {
|
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.37.0",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"bugs": "https://github.com/likec4/likec4/issues",
|
|
7
7
|
"homepage": "https://likec4.dev",
|
|
@@ -133,11 +133,11 @@
|
|
|
133
133
|
"vscode-uri": "3.1.0",
|
|
134
134
|
"which": "^5.0.0",
|
|
135
135
|
"zod": "3.25.67",
|
|
136
|
-
"@likec4/
|
|
137
|
-
"@likec4/
|
|
138
|
-
"@likec4/
|
|
139
|
-
"@likec4/log": "1.
|
|
140
|
-
"@likec4/tsconfig": "1.
|
|
136
|
+
"@likec4/core": "1.37.0",
|
|
137
|
+
"@likec4/icons": "1.37.0",
|
|
138
|
+
"@likec4/layouts": "1.37.0",
|
|
139
|
+
"@likec4/log": "1.37.0",
|
|
140
|
+
"@likec4/tsconfig": "1.37.0"
|
|
141
141
|
},
|
|
142
142
|
"scripts": {
|
|
143
143
|
"typecheck": "tsc -b --verbose",
|