@domainlang/language 0.5.2 → 0.7.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/README.md +1 -1
- package/out/domain-lang-module.js +5 -1
- package/out/domain-lang-module.js.map +1 -1
- package/out/generated/ast.d.ts +24 -0
- package/out/generated/ast.js.map +1 -1
- package/out/generated/grammar.js +22 -32
- package/out/generated/grammar.js.map +1 -1
- package/out/index.d.ts +2 -5
- package/out/index.js +10 -6
- package/out/index.js.map +1 -1
- package/out/lsp/domain-lang-code-actions.js +14 -8
- package/out/lsp/domain-lang-code-actions.js.map +1 -1
- package/out/lsp/domain-lang-completion.d.ts +3 -0
- package/out/lsp/domain-lang-completion.js +41 -13
- package/out/lsp/domain-lang-completion.js.map +1 -1
- package/out/lsp/domain-lang-formatter.js +24 -18
- package/out/lsp/domain-lang-formatter.js.map +1 -1
- package/out/lsp/domain-lang-index-manager.d.ts +170 -0
- package/out/lsp/domain-lang-index-manager.js +389 -0
- package/out/lsp/domain-lang-index-manager.js.map +1 -0
- package/out/lsp/domain-lang-scope-provider.d.ts +67 -0
- package/out/lsp/domain-lang-scope-provider.js +95 -0
- package/out/lsp/domain-lang-scope-provider.js.map +1 -0
- package/out/lsp/domain-lang-scope.js +31 -17
- package/out/lsp/domain-lang-scope.js.map +1 -1
- package/out/lsp/domain-lang-workspace-manager.d.ts +76 -9
- package/out/lsp/domain-lang-workspace-manager.js +176 -54
- package/out/lsp/domain-lang-workspace-manager.js.map +1 -1
- package/out/lsp/hover/domain-lang-hover.d.ts +45 -1
- package/out/lsp/hover/domain-lang-hover.js +308 -232
- package/out/lsp/hover/domain-lang-hover.js.map +1 -1
- package/out/lsp/hover/domain-lang-keywords.d.ts +3 -7
- package/out/lsp/hover/domain-lang-keywords.js +115 -38
- package/out/lsp/hover/domain-lang-keywords.js.map +1 -1
- package/out/lsp/manifest-diagnostics.js +95 -50
- package/out/lsp/manifest-diagnostics.js.map +1 -1
- package/out/main.js +204 -17
- package/out/main.js.map +1 -1
- package/out/services/import-resolver.d.ts +39 -2
- package/out/services/import-resolver.js +77 -12
- package/out/services/import-resolver.js.map +1 -1
- package/out/services/types.d.ts +2 -2
- package/out/services/workspace-manager.d.ts +33 -31
- package/out/services/workspace-manager.js +92 -148
- package/out/services/workspace-manager.js.map +1 -1
- package/out/utils/document-utils.d.ts +41 -0
- package/out/utils/document-utils.js +64 -0
- package/out/utils/document-utils.js.map +1 -0
- package/out/utils/import-utils.d.ts +0 -17
- package/out/utils/import-utils.js +2 -32
- package/out/utils/import-utils.js.map +1 -1
- package/out/utils/manifest-utils.d.ts +56 -0
- package/out/utils/manifest-utils.js +119 -0
- package/out/utils/manifest-utils.js.map +1 -0
- package/out/validation/constants.d.ts +13 -0
- package/out/validation/constants.js +18 -0
- package/out/validation/constants.js.map +1 -1
- package/out/validation/import.d.ts +12 -2
- package/out/validation/import.js +95 -22
- package/out/validation/import.js.map +1 -1
- package/out/validation/maps.js +51 -2
- package/out/validation/maps.js.map +1 -1
- package/package.json +1 -1
- package/src/domain-lang-module.ts +6 -1
- package/src/domain-lang.langium +37 -13
- package/src/generated/ast.ts +24 -0
- package/src/generated/grammar.ts +22 -32
- package/src/index.ts +12 -6
- package/src/lsp/domain-lang-code-actions.ts +13 -8
- package/src/lsp/domain-lang-completion.ts +61 -13
- package/src/lsp/domain-lang-formatter.ts +28 -23
- package/src/lsp/domain-lang-index-manager.ts +447 -0
- package/src/lsp/domain-lang-scope-provider.ts +134 -0
- package/src/lsp/domain-lang-scope.ts +29 -17
- package/src/lsp/domain-lang-workspace-manager.ts +201 -53
- package/src/lsp/hover/domain-lang-hover.ts +332 -226
- package/src/lsp/hover/domain-lang-keywords.ts +129 -43
- package/src/lsp/manifest-diagnostics.ts +100 -59
- package/src/main.ts +258 -16
- package/src/services/import-resolver.ts +91 -12
- package/src/services/types.ts +2 -2
- package/src/services/workspace-manager.ts +101 -175
- package/src/utils/document-utils.ts +80 -0
- package/src/utils/import-utils.ts +2 -40
- package/src/utils/manifest-utils.ts +132 -0
- package/src/validation/constants.ts +24 -0
- package/src/validation/import.ts +107 -24
- package/src/validation/maps.ts +59 -2
- package/out/lsp/hover/ddd-pattern-explanations.d.ts +0 -50
- package/out/lsp/hover/ddd-pattern-explanations.js +0 -196
- package/out/lsp/hover/ddd-pattern-explanations.js.map +0 -1
- package/out/services/dependency-analyzer.d.ts +0 -58
- package/out/services/dependency-analyzer.js +0 -254
- package/out/services/dependency-analyzer.js.map +0 -1
- package/out/services/dependency-resolver.d.ts +0 -146
- package/out/services/dependency-resolver.js +0 -452
- package/out/services/dependency-resolver.js.map +0 -1
- package/out/services/git-url-resolver.browser.d.ts +0 -10
- package/out/services/git-url-resolver.browser.js +0 -19
- package/out/services/git-url-resolver.browser.js.map +0 -1
- package/out/services/git-url-resolver.d.ts +0 -158
- package/out/services/git-url-resolver.js +0 -416
- package/out/services/git-url-resolver.js.map +0 -1
- package/out/services/governance-validator.d.ts +0 -44
- package/out/services/governance-validator.js +0 -153
- package/out/services/governance-validator.js.map +0 -1
- package/out/services/semver.d.ts +0 -98
- package/out/services/semver.js +0 -195
- package/out/services/semver.js.map +0 -1
- package/src/lsp/hover/ddd-pattern-explanations.ts +0 -237
- package/src/services/dependency-analyzer.ts +0 -321
- package/src/services/dependency-resolver.ts +0 -551
- package/src/services/git-url-resolver.browser.ts +0 -26
- package/src/services/git-url-resolver.ts +0 -517
- package/src/services/governance-validator.ts +0 -177
- package/src/services/semver.ts +0 -213
package/out/main.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { startLanguageServer } from 'langium/lsp';
|
|
2
2
|
import { NodeFileSystem } from 'langium/node';
|
|
3
|
-
import { createConnection, ProposedFeatures } from 'vscode-languageserver/node.js';
|
|
3
|
+
import { createConnection, ProposedFeatures, FileChangeType } from 'vscode-languageserver/node.js';
|
|
4
4
|
import { createDomainLangServices } from './domain-lang-module.js';
|
|
5
5
|
import { ensureImportGraphFromEntryFile } from './utils/import-utils.js';
|
|
6
6
|
import { URI } from 'langium';
|
|
@@ -8,28 +8,214 @@ import { URI } from 'langium';
|
|
|
8
8
|
const connection = createConnection(ProposedFeatures.all);
|
|
9
9
|
// Inject the shared services and language-specific services
|
|
10
10
|
const { shared, DomainLang } = createDomainLangServices({ connection, ...NodeFileSystem });
|
|
11
|
-
// Initialize workspace
|
|
12
|
-
|
|
13
|
-
|
|
11
|
+
// Initialize workspace manager when language server initializes
|
|
12
|
+
// Uses Langium's LanguageServer.onInitialize hook (not raw connection handler)
|
|
13
|
+
// This integrates properly with Langium's initialization flow
|
|
14
|
+
shared.lsp.LanguageServer.onInitialize((params) => {
|
|
15
|
+
// Use workspaceFolders (preferred) over deprecated rootUri
|
|
16
|
+
const folders = params.workspaceFolders;
|
|
17
|
+
const workspaceRoot = folders?.[0]?.uri
|
|
18
|
+
? URI.parse(folders[0].uri).fsPath
|
|
19
|
+
: undefined;
|
|
14
20
|
if (workspaceRoot) {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
console.warn(`DomainLang workspace initialized: ${workspaceRoot}`);
|
|
20
|
-
}
|
|
21
|
-
catch (error) {
|
|
21
|
+
// Initialize workspace manager synchronously (just sets root path)
|
|
22
|
+
// Heavy work happens in initializeWorkspace() called by Langium later
|
|
23
|
+
const workspaceManager = DomainLang.imports.WorkspaceManager;
|
|
24
|
+
workspaceManager.initialize(workspaceRoot).catch(error => {
|
|
22
25
|
const message = error instanceof Error ? error.message : String(error);
|
|
23
26
|
console.warn(`Failed to initialize workspace: ${message}`);
|
|
24
27
|
// Continue without workspace - local imports will still work
|
|
28
|
+
});
|
|
29
|
+
console.warn(`DomainLang workspace root: ${workspaceRoot}`);
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
// Handle file changes for model.yaml and model.lock (PRS-010)
|
|
33
|
+
// Uses Langium's built-in file watcher which already watches **/* in workspace
|
|
34
|
+
// This invalidates caches when config files change externally
|
|
35
|
+
shared.lsp.DocumentUpdateHandler?.onWatchedFilesChange(async (params) => {
|
|
36
|
+
try {
|
|
37
|
+
await handleFileChanges(params, DomainLang.imports.WorkspaceManager, shared, DomainLang);
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
41
|
+
console.error(`Error handling file change notification: ${message}`);
|
|
42
|
+
// Continue - don't crash the server
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
/**
|
|
46
|
+
* Categorizes file changes by type.
|
|
47
|
+
*/
|
|
48
|
+
function categorizeChanges(params, workspaceManager, langServices, indexManager) {
|
|
49
|
+
const result = {
|
|
50
|
+
manifestChanged: false,
|
|
51
|
+
lockFileChanged: false,
|
|
52
|
+
changedDlangUris: new Set(),
|
|
53
|
+
deletedDlangUris: new Set(),
|
|
54
|
+
createdDlangUris: new Set()
|
|
55
|
+
};
|
|
56
|
+
for (const change of params.changes) {
|
|
57
|
+
const uri = URI.parse(change.uri);
|
|
58
|
+
const fileName = uri.path.split('/').pop() ?? '';
|
|
59
|
+
const uriString = change.uri;
|
|
60
|
+
if (fileName === 'model.yaml') {
|
|
61
|
+
console.warn(`model.yaml changed: ${uriString}`);
|
|
62
|
+
workspaceManager.invalidateManifestCache();
|
|
63
|
+
langServices.imports.ImportResolver.clearCache();
|
|
64
|
+
indexManager.clearImportDependencies();
|
|
65
|
+
result.manifestChanged = true;
|
|
25
66
|
}
|
|
67
|
+
else if (fileName === 'model.lock') {
|
|
68
|
+
console.warn(`model.lock changed: ${uriString}`);
|
|
69
|
+
langServices.imports.ImportResolver.clearCache();
|
|
70
|
+
result.lockFileChanged = true;
|
|
71
|
+
}
|
|
72
|
+
else if (fileName.endsWith('.dlang')) {
|
|
73
|
+
if (change.type === FileChangeType.Deleted) {
|
|
74
|
+
result.deletedDlangUris.add(uriString);
|
|
75
|
+
console.warn(`DomainLang file deleted: ${uriString}`);
|
|
76
|
+
}
|
|
77
|
+
else if (change.type === FileChangeType.Created) {
|
|
78
|
+
result.createdDlangUris.add(uriString);
|
|
79
|
+
console.warn(`DomainLang file created: ${uriString}`);
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
result.changedDlangUris.add(uriString);
|
|
83
|
+
console.warn(`DomainLang file changed: ${uriString}`);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return result;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Rebuilds documents that depend on changed/deleted/created .dlang files.
|
|
91
|
+
*/
|
|
92
|
+
async function rebuildAffectedDocuments(changes, indexManager, sharedServices, langServices) {
|
|
93
|
+
const hasChanges = changes.changedDlangUris.size > 0 ||
|
|
94
|
+
changes.deletedDlangUris.size > 0 ||
|
|
95
|
+
changes.createdDlangUris.size > 0;
|
|
96
|
+
if (!hasChanges) {
|
|
97
|
+
return;
|
|
26
98
|
}
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
99
|
+
// CRITICAL: Clear ImportResolver cache BEFORE rebuilding.
|
|
100
|
+
// The WorkspaceCache only clears AFTER linking, but resolution happens
|
|
101
|
+
// DURING linking. Without this, stale cached resolutions would be used.
|
|
102
|
+
langServices.imports.ImportResolver.clearCache();
|
|
103
|
+
const affectedUris = collectAffectedDocuments(changes, indexManager);
|
|
104
|
+
if (affectedUris.size === 0) {
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
console.warn(`Rebuilding ${affectedUris.size} documents affected by file changes`);
|
|
108
|
+
const langiumDocuments = sharedServices.workspace.LangiumDocuments;
|
|
109
|
+
const affectedDocs = [];
|
|
110
|
+
for (const uriString of affectedUris) {
|
|
111
|
+
const uri = URI.parse(uriString);
|
|
112
|
+
if (langiumDocuments.hasDocument(uri)) {
|
|
113
|
+
affectedDocs.push(uri);
|
|
114
|
+
indexManager.markForReprocessing(uriString);
|
|
30
115
|
}
|
|
31
|
-
}
|
|
32
|
-
|
|
116
|
+
}
|
|
117
|
+
const deletedUriObjects = [...changes.deletedDlangUris].map(u => URI.parse(u));
|
|
118
|
+
if (affectedDocs.length > 0 || deletedUriObjects.length > 0) {
|
|
119
|
+
await sharedServices.workspace.DocumentBuilder.update(affectedDocs, deletedUriObjects);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Collects all document URIs that should be rebuilt based on the changes.
|
|
124
|
+
*
|
|
125
|
+
* Uses targeted matching to avoid expensive full rebuilds:
|
|
126
|
+
* - For edits: rebuild documents that import the changed file (by resolved URI)
|
|
127
|
+
* - For all changes: rebuild documents whose import specifiers match the path
|
|
128
|
+
*
|
|
129
|
+
* The specifier matching handles renamed/moved/created files by comparing
|
|
130
|
+
* import specifiers against path segments (filename, parent/filename, etc.).
|
|
131
|
+
*/
|
|
132
|
+
function collectAffectedDocuments(changes, indexManager) {
|
|
133
|
+
const allChangedUris = new Set([
|
|
134
|
+
...changes.changedDlangUris,
|
|
135
|
+
...changes.deletedDlangUris,
|
|
136
|
+
...changes.createdDlangUris
|
|
137
|
+
]);
|
|
138
|
+
// Get documents affected by resolved URI changes (edits to imported files)
|
|
139
|
+
const affectedByUri = indexManager.getAllAffectedDocuments(allChangedUris);
|
|
140
|
+
// Get documents with import specifiers that match changed paths
|
|
141
|
+
// This catches:
|
|
142
|
+
// - File moves/renames: specifiers that previously resolved but now won't
|
|
143
|
+
// - File creations: specifiers that previously failed but might now resolve
|
|
144
|
+
// Uses fuzzy matching on path segments rather than rebuilding all imports
|
|
145
|
+
const affectedBySpecifier = indexManager.getDocumentsWithPotentiallyAffectedImports(allChangedUris);
|
|
146
|
+
return new Set([...affectedByUri, ...affectedBySpecifier]);
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Handles all file changes including .dlang files, model.yaml, and model.lock.
|
|
150
|
+
*
|
|
151
|
+
* For .dlang files: rebuilds all documents that import the changed file.
|
|
152
|
+
* For config files: invalidates caches and rebuilds workspace as needed.
|
|
153
|
+
*/
|
|
154
|
+
async function handleFileChanges(params, workspaceManager, sharedServices, langServices) {
|
|
155
|
+
const indexManager = sharedServices.workspace.IndexManager;
|
|
156
|
+
// Categorize and process changes
|
|
157
|
+
const changes = categorizeChanges(params, workspaceManager, langServices, indexManager);
|
|
158
|
+
// Handle lock file changes
|
|
159
|
+
if (changes.lockFileChanged) {
|
|
160
|
+
const lockChange = params.changes.find(c => c.uri.endsWith('model.lock'));
|
|
161
|
+
if (lockChange) {
|
|
162
|
+
await handleLockFileChange(lockChange, workspaceManager);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
// Rebuild documents affected by .dlang file changes
|
|
166
|
+
await rebuildAffectedDocuments(changes, indexManager, sharedServices, langServices);
|
|
167
|
+
// Handle config file changes
|
|
168
|
+
if (changes.manifestChanged || changes.lockFileChanged) {
|
|
169
|
+
await rebuildWorkspace(sharedServices, workspaceManager, changes.manifestChanged);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Handles lock file creation, change, or deletion.
|
|
174
|
+
*/
|
|
175
|
+
async function handleLockFileChange(change, workspaceManager) {
|
|
176
|
+
if (change.type === FileChangeType.Changed || change.type === FileChangeType.Created) {
|
|
177
|
+
await workspaceManager.refreshLockFile();
|
|
178
|
+
}
|
|
179
|
+
else if (change.type === FileChangeType.Deleted) {
|
|
180
|
+
workspaceManager.invalidateLockCache();
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Rebuilds the workspace after config file changes.
|
|
185
|
+
* Uses incremental strategy: only full rebuild if dependencies changed.
|
|
186
|
+
*
|
|
187
|
+
* @param sharedServices - Shared Langium services
|
|
188
|
+
* @param workspaceManager - Workspace manager for manifest access
|
|
189
|
+
* @param manifestChanged - Whether model.yaml changed (vs just model.lock)
|
|
190
|
+
*/
|
|
191
|
+
async function rebuildWorkspace(sharedServices, workspaceManager, manifestChanged) {
|
|
192
|
+
try {
|
|
193
|
+
// If only lock file changed, caches are already invalidated - no rebuild needed
|
|
194
|
+
// Lock file changes mean resolved versions changed, but import resolver cache is cleared
|
|
195
|
+
// Documents will re-resolve imports on next access
|
|
196
|
+
if (!manifestChanged) {
|
|
197
|
+
console.warn('Lock file changed - caches invalidated, no rebuild needed');
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
// For manifest changes, check if dependencies section actually changed
|
|
201
|
+
// If only metadata changed (name, version, etc.), no rebuild needed
|
|
202
|
+
const manifest = await workspaceManager.getManifest();
|
|
203
|
+
const hasDependencies = manifest?.dependencies && Object.keys(manifest.dependencies).length > 0;
|
|
204
|
+
if (!hasDependencies) {
|
|
205
|
+
console.warn('Manifest changed but has no dependencies - skipping rebuild');
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
// Dependencies exist and manifest changed - do full rebuild
|
|
209
|
+
const documents = sharedServices.workspace.LangiumDocuments.all.toArray();
|
|
210
|
+
const uris = documents.map(doc => doc.uri);
|
|
211
|
+
await sharedServices.workspace.DocumentBuilder.update([], uris);
|
|
212
|
+
console.warn(`Workspace rebuilt: ${documents.length} documents revalidated`);
|
|
213
|
+
}
|
|
214
|
+
catch (error) {
|
|
215
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
216
|
+
console.error(`Failed to rebuild workspace: ${message}`);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
33
219
|
// Optionally start from a single entry file and follow imports.
|
|
34
220
|
// Configure via env DOMAINLANG_ENTRY (absolute or workspace-relative path)
|
|
35
221
|
const entryFile = process.env.DOMAINLANG_ENTRY;
|
|
@@ -52,7 +238,8 @@ if (entryFile) {
|
|
|
52
238
|
}
|
|
53
239
|
};
|
|
54
240
|
// Initial load from entry file, then start the server
|
|
55
|
-
reloadFromEntry()
|
|
241
|
+
await reloadFromEntry();
|
|
242
|
+
startLanguageServer(shared);
|
|
56
243
|
// Any change within the loaded graph should trigger a reload from the entry
|
|
57
244
|
shared.workspace.TextDocuments.onDidChangeContent(async (event) => {
|
|
58
245
|
const changed = event.document.uri;
|
package/out/main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,17 +7,51 @@ import type { LockFile } from './types.js';
|
|
|
7
7
|
* Import Types (PRS-010):
|
|
8
8
|
* - Local relative: ./path, ../path → Directory-first resolution
|
|
9
9
|
* - Path aliases: @/path, @alias/path → Configurable in model.yaml paths section
|
|
10
|
-
* - External: owner/package
|
|
10
|
+
* - External: dependency key → Manifest dependencies (key can be owner/package or an alias that maps to source)
|
|
11
11
|
*
|
|
12
12
|
* Directory-First Resolution:
|
|
13
13
|
* - ./types → ./types/index.dlang → ./types.dlang
|
|
14
14
|
* - Module entry defaults to index.dlang (no model.yaml required)
|
|
15
|
+
*
|
|
16
|
+
* Caching Strategy (uses Langium standard infrastructure):
|
|
17
|
+
* - LSP mode: Uses `WorkspaceCache` - clears on ANY document change in workspace
|
|
18
|
+
* This is necessary because file moves/deletes affect resolution of OTHER documents
|
|
19
|
+
* - Standalone mode: Uses `SimpleCache` - manual invalidation via clearCache()
|
|
20
|
+
*
|
|
21
|
+
* Why WorkspaceCache (not DocumentCache)?
|
|
22
|
+
* - DocumentCache only invalidates when the KEYED document changes
|
|
23
|
+
* - But import resolution can break when IMPORTED files are moved/deleted
|
|
24
|
+
* - Example: index.dlang imports @domains → domains/index.dlang
|
|
25
|
+
* If domains/index.dlang is moved, index.dlang's cache entry must be cleared
|
|
26
|
+
* DocumentCache wouldn't clear it (index.dlang didn't change)
|
|
27
|
+
* WorkspaceCache clears on ANY change, ensuring correct re-resolution
|
|
28
|
+
*
|
|
29
|
+
* @see https://langium.org/docs/recipes/caching/ for Langium caching patterns
|
|
15
30
|
*/
|
|
16
31
|
export declare class ImportResolver {
|
|
17
32
|
private readonly workspaceManager;
|
|
33
|
+
/**
|
|
34
|
+
* Workspace-level cache for resolved import URIs.
|
|
35
|
+
* In LSP mode: WorkspaceCache - clears when ANY document changes (correct for imports)
|
|
36
|
+
* In standalone mode: SimpleCache - manual invalidation via clearCache()
|
|
37
|
+
*/
|
|
38
|
+
private readonly resolverCache;
|
|
39
|
+
/**
|
|
40
|
+
* Creates an ImportResolver.
|
|
41
|
+
*
|
|
42
|
+
* @param services - DomainLang services. If `services.shared` is present, uses WorkspaceCache
|
|
43
|
+
* for automatic invalidation. Otherwise uses SimpleCache for standalone mode.
|
|
44
|
+
*/
|
|
18
45
|
constructor(services: DomainLangServices);
|
|
46
|
+
/**
|
|
47
|
+
* Clears the entire import resolution cache.
|
|
48
|
+
* In LSP mode, this is also triggered automatically by WorkspaceCache on any document change.
|
|
49
|
+
* Call explicitly when model.yaml or model.lock changes.
|
|
50
|
+
*/
|
|
51
|
+
clearCache(): void;
|
|
19
52
|
/**
|
|
20
53
|
* Resolve an import specifier relative to a Langium document.
|
|
54
|
+
* Results are cached using WorkspaceCache (clears on any workspace change).
|
|
21
55
|
*/
|
|
22
56
|
resolveForDocument(document: LangiumDocument, specifier: string): Promise<URI>;
|
|
23
57
|
/**
|
|
@@ -37,7 +71,10 @@ export declare class ImportResolver {
|
|
|
37
71
|
/**
|
|
38
72
|
* Resolves an external dependency via manifest.
|
|
39
73
|
*
|
|
40
|
-
|
|
74
|
+
* Import specifier is a dependency key from model.yaml.
|
|
75
|
+
* - Recommended: key is owner/package.
|
|
76
|
+
* - Optional: key is an alias with an explicit source.
|
|
77
|
+
* The LSP only resolves to cached packages - no network calls.
|
|
41
78
|
*/
|
|
42
79
|
private resolveExternalDependency;
|
|
43
80
|
/**
|
|
@@ -1,28 +1,89 @@
|
|
|
1
1
|
import fs from 'node:fs/promises';
|
|
2
2
|
import path from 'node:path';
|
|
3
|
-
import { URI } from 'langium';
|
|
3
|
+
import { DocumentState, SimpleCache, WorkspaceCache, URI } from 'langium';
|
|
4
4
|
/**
|
|
5
5
|
* ImportResolver resolves import statements using manifest-centric rules (PRS-010).
|
|
6
6
|
*
|
|
7
7
|
* Import Types (PRS-010):
|
|
8
8
|
* - Local relative: ./path, ../path → Directory-first resolution
|
|
9
9
|
* - Path aliases: @/path, @alias/path → Configurable in model.yaml paths section
|
|
10
|
-
* - External: owner/package
|
|
10
|
+
* - External: dependency key → Manifest dependencies (key can be owner/package or an alias that maps to source)
|
|
11
11
|
*
|
|
12
12
|
* Directory-First Resolution:
|
|
13
13
|
* - ./types → ./types/index.dlang → ./types.dlang
|
|
14
14
|
* - Module entry defaults to index.dlang (no model.yaml required)
|
|
15
|
+
*
|
|
16
|
+
* Caching Strategy (uses Langium standard infrastructure):
|
|
17
|
+
* - LSP mode: Uses `WorkspaceCache` - clears on ANY document change in workspace
|
|
18
|
+
* This is necessary because file moves/deletes affect resolution of OTHER documents
|
|
19
|
+
* - Standalone mode: Uses `SimpleCache` - manual invalidation via clearCache()
|
|
20
|
+
*
|
|
21
|
+
* Why WorkspaceCache (not DocumentCache)?
|
|
22
|
+
* - DocumentCache only invalidates when the KEYED document changes
|
|
23
|
+
* - But import resolution can break when IMPORTED files are moved/deleted
|
|
24
|
+
* - Example: index.dlang imports @domains → domains/index.dlang
|
|
25
|
+
* If domains/index.dlang is moved, index.dlang's cache entry must be cleared
|
|
26
|
+
* DocumentCache wouldn't clear it (index.dlang didn't change)
|
|
27
|
+
* WorkspaceCache clears on ANY change, ensuring correct re-resolution
|
|
28
|
+
*
|
|
29
|
+
* @see https://langium.org/docs/recipes/caching/ for Langium caching patterns
|
|
15
30
|
*/
|
|
16
31
|
export class ImportResolver {
|
|
32
|
+
/**
|
|
33
|
+
* Creates an ImportResolver.
|
|
34
|
+
*
|
|
35
|
+
* @param services - DomainLang services. If `services.shared` is present, uses WorkspaceCache
|
|
36
|
+
* for automatic invalidation. Otherwise uses SimpleCache for standalone mode.
|
|
37
|
+
*/
|
|
17
38
|
constructor(services) {
|
|
18
39
|
this.workspaceManager = services.imports.WorkspaceManager;
|
|
40
|
+
// Use Langium's WorkspaceCache when shared services are available (LSP mode)
|
|
41
|
+
// Fall back to SimpleCache for standalone utilities (SDK, CLI)
|
|
42
|
+
const shared = services.shared;
|
|
43
|
+
if (shared) {
|
|
44
|
+
// LSP mode: WorkspaceCache with DocumentState.Linked
|
|
45
|
+
//
|
|
46
|
+
// This follows the standard pattern used by TypeScript, rust-analyzer, gopls:
|
|
47
|
+
// - Cache is valid for a "workspace snapshot"
|
|
48
|
+
// - Invalidates after a batch of changes completes linking (debounced ~300ms)
|
|
49
|
+
// - Invalidates immediately on file deletion
|
|
50
|
+
// - Does NOT invalidate during typing (would be too expensive)
|
|
51
|
+
//
|
|
52
|
+
// DocumentState.Linked is the right phase because:
|
|
53
|
+
// - Import resolution is needed during linking
|
|
54
|
+
// - By the time linking completes, we know which files exist
|
|
55
|
+
// - File renames appear as delete+create, triggering immediate invalidation
|
|
56
|
+
this.resolverCache = new WorkspaceCache(shared, DocumentState.Linked);
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
// Standalone mode: simple key-value cache, manual invalidation
|
|
60
|
+
this.resolverCache = new SimpleCache();
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Clears the entire import resolution cache.
|
|
65
|
+
* In LSP mode, this is also triggered automatically by WorkspaceCache on any document change.
|
|
66
|
+
* Call explicitly when model.yaml or model.lock changes.
|
|
67
|
+
*/
|
|
68
|
+
clearCache() {
|
|
69
|
+
this.resolverCache.clear();
|
|
19
70
|
}
|
|
20
71
|
/**
|
|
21
72
|
* Resolve an import specifier relative to a Langium document.
|
|
73
|
+
* Results are cached using WorkspaceCache (clears on any workspace change).
|
|
22
74
|
*/
|
|
23
75
|
async resolveForDocument(document, specifier) {
|
|
76
|
+
// Cache key combines document URI + specifier for uniqueness
|
|
77
|
+
const cacheKey = `${document.uri.toString()}|${specifier}`;
|
|
78
|
+
const cached = this.resolverCache.get(cacheKey);
|
|
79
|
+
if (cached) {
|
|
80
|
+
return cached;
|
|
81
|
+
}
|
|
82
|
+
// Resolve and cache
|
|
24
83
|
const baseDir = path.dirname(document.uri.fsPath);
|
|
25
|
-
|
|
84
|
+
const result = await this.resolveFrom(baseDir, specifier);
|
|
85
|
+
this.resolverCache.set(cacheKey, result);
|
|
86
|
+
return result;
|
|
26
87
|
}
|
|
27
88
|
/**
|
|
28
89
|
* Resolve an import specifier from a base directory (non-LSP contexts).
|
|
@@ -95,7 +156,10 @@ export class ImportResolver {
|
|
|
95
156
|
/**
|
|
96
157
|
* Resolves an external dependency via manifest.
|
|
97
158
|
*
|
|
98
|
-
|
|
159
|
+
* Import specifier is a dependency key from model.yaml.
|
|
160
|
+
* - Recommended: key is owner/package.
|
|
161
|
+
* - Optional: key is an alias with an explicit source.
|
|
162
|
+
* The LSP only resolves to cached packages - no network calls.
|
|
99
163
|
*/
|
|
100
164
|
async resolveExternalDependency(specifier) {
|
|
101
165
|
const manifest = await this.workspaceManager.getManifest();
|
|
@@ -111,16 +175,17 @@ export class ImportResolver {
|
|
|
111
175
|
throw new Error(`Dependency '${specifier}' not installed.\n` +
|
|
112
176
|
`Hint: Run 'dlang install' to fetch dependencies and generate model.lock.`);
|
|
113
177
|
}
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
178
|
+
// Use WorkspaceManager to resolve from cache (read-only, no network)
|
|
179
|
+
const resolved = await this.workspaceManager.resolveDependencyPath(specifier);
|
|
180
|
+
if (!resolved) {
|
|
181
|
+
throw new Error(`Dependency '${specifier}' not found in model.yaml or not installed.\n` +
|
|
117
182
|
`Hint: Add it to your dependencies:\n` +
|
|
118
183
|
` dependencies:\n` +
|
|
119
184
|
` ${specifier}:\n` +
|
|
120
|
-
` ref: v1.0.0`
|
|
185
|
+
` ref: v1.0.0\n` +
|
|
186
|
+
`Then run 'dlang install' to fetch it.`);
|
|
121
187
|
}
|
|
122
|
-
|
|
123
|
-
return git.resolve(mapped, { allowNetwork: false });
|
|
188
|
+
return URI.file(resolved);
|
|
124
189
|
}
|
|
125
190
|
/**
|
|
126
191
|
* Resolves a local path using directory-first resolution.
|
|
@@ -232,8 +297,8 @@ async function assertFileExists(filePath, original) {
|
|
|
232
297
|
await fs.access(filePath);
|
|
233
298
|
}
|
|
234
299
|
catch {
|
|
235
|
-
throw new Error(`Import file not found: '${original}'
|
|
236
|
-
`Resolved path: ${filePath}
|
|
300
|
+
throw new Error(`Import file not found: '${original}'.\n` +
|
|
301
|
+
`Resolved path: ${filePath}\n` +
|
|
237
302
|
`Hint: Check that the file exists and the path is correct.`);
|
|
238
303
|
}
|
|
239
304
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"import-resolver.js","sourceRoot":"","sources":["../../src/services/import-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,GAAG,
|
|
1
|
+
{"version":3,"file":"import-resolver.js","sourceRoot":"","sources":["../../src/services/import-resolver.ts"],"names":[],"mappings":"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"}
|
package/out/services/types.d.ts
CHANGED
|
@@ -156,8 +156,8 @@ export interface LockedDependency {
|
|
|
156
156
|
* @example
|
|
157
157
|
* ```yaml
|
|
158
158
|
* paths:
|
|
159
|
-
* "
|
|
160
|
-
* "@shared
|
|
159
|
+
* "@": "./src"
|
|
160
|
+
* "@shared": "./libs/shared"
|
|
161
161
|
* ```
|
|
162
162
|
*/
|
|
163
163
|
export type PathAliases = Readonly<Record<string, string>>;
|
|
@@ -1,21 +1,27 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import type { LockFile, ModelManifest, PathAliases, WorkspaceManagerOptions } from './types.js';
|
|
1
|
+
import type { LockFile, ModelManifest, DependencySpec, ExtendedDependencySpec, PathAliases, WorkspaceManagerOptions } from './types.js';
|
|
3
2
|
/**
|
|
4
|
-
* Coordinates workspace discovery
|
|
3
|
+
* Coordinates workspace discovery and manifest/lock file reading.
|
|
4
|
+
*
|
|
5
|
+
* This is a read-only service for the LSP - it does NOT:
|
|
6
|
+
* - Generate lock files (use CLI: `dlang install`)
|
|
7
|
+
* - Download packages (use CLI: `dlang install`)
|
|
8
|
+
* - Make network requests
|
|
9
|
+
*
|
|
10
|
+
* The LSP uses this to:
|
|
11
|
+
* - Find the workspace root (where model.yaml is)
|
|
12
|
+
* - Read manifest configuration (path aliases, dependencies)
|
|
13
|
+
* - Read lock file (to resolve cached package locations)
|
|
5
14
|
*/
|
|
6
15
|
export declare class WorkspaceManager {
|
|
7
|
-
private readonly options;
|
|
8
16
|
private readonly manifestFiles;
|
|
9
17
|
private readonly lockFiles;
|
|
10
18
|
private workspaceRoot;
|
|
11
19
|
private lockFile;
|
|
12
|
-
private gitResolver;
|
|
13
|
-
private dependencyResolver;
|
|
14
20
|
private initializePromise;
|
|
15
21
|
private manifestCache;
|
|
16
22
|
constructor(options?: WorkspaceManagerOptions);
|
|
17
23
|
/**
|
|
18
|
-
* Finds the workspace root
|
|
24
|
+
* Finds the workspace root and loads any existing lock file.
|
|
19
25
|
* Repeated calls await the same initialization work.
|
|
20
26
|
*/
|
|
21
27
|
initialize(startPath: string): Promise<void>;
|
|
@@ -24,6 +30,11 @@ export declare class WorkspaceManager {
|
|
|
24
30
|
* @throws Error if {@link initialize} has not completed successfully.
|
|
25
31
|
*/
|
|
26
32
|
getWorkspaceRoot(): string;
|
|
33
|
+
/**
|
|
34
|
+
* Returns the project-local package cache directory.
|
|
35
|
+
* Per PRS-010: .dlang/packages/
|
|
36
|
+
*/
|
|
37
|
+
getCacheDir(): string;
|
|
27
38
|
/**
|
|
28
39
|
* Resolves the manifest file path within the workspace, if present.
|
|
29
40
|
*/
|
|
@@ -34,15 +45,12 @@ export declare class WorkspaceManager {
|
|
|
34
45
|
*/
|
|
35
46
|
getManifest(): Promise<ModelManifest | undefined>;
|
|
36
47
|
/**
|
|
37
|
-
*
|
|
38
|
-
|
|
39
|
-
ensureLockFile(): Promise<LockFile>;
|
|
40
|
-
/**
|
|
41
|
-
* Gets the currently cached lock file without refreshing from disk.
|
|
48
|
+
* Gets the currently cached lock file.
|
|
49
|
+
* Returns undefined if no lock file exists (run `dlang install` to create one).
|
|
42
50
|
*/
|
|
43
51
|
getLockFile(): Promise<LockFile | undefined>;
|
|
44
52
|
/**
|
|
45
|
-
* Reloads the lock file from disk
|
|
53
|
+
* Reloads the lock file from disk.
|
|
46
54
|
*/
|
|
47
55
|
refreshLockFile(): Promise<LockFile | undefined>;
|
|
48
56
|
/**
|
|
@@ -63,14 +71,6 @@ export declare class WorkspaceManager {
|
|
|
63
71
|
* Call this when model.lock changes.
|
|
64
72
|
*/
|
|
65
73
|
invalidateLockCache(): void;
|
|
66
|
-
/**
|
|
67
|
-
* Provides the shared git URL resolver configured with the current lock file.
|
|
68
|
-
*/
|
|
69
|
-
getGitResolver(): Promise<GitUrlResolver>;
|
|
70
|
-
/**
|
|
71
|
-
* Forces dependency resolution and regenerates lock files on disk.
|
|
72
|
-
*/
|
|
73
|
-
regenerateLockFile(): Promise<LockFile>;
|
|
74
74
|
/**
|
|
75
75
|
* Returns the path aliases from the manifest, if present.
|
|
76
76
|
*/
|
|
@@ -82,21 +82,20 @@ export declare class WorkspaceManager {
|
|
|
82
82
|
* In the new format, the key IS the owner/package, so source is derived from key
|
|
83
83
|
* ONLY for git dependencies (not for path-based local dependencies).
|
|
84
84
|
*/
|
|
85
|
-
|
|
85
|
+
normalizeDependency(key: string, dep: DependencySpec): ExtendedDependencySpec;
|
|
86
86
|
/**
|
|
87
|
-
* Resolves a
|
|
87
|
+
* Resolves a dependency import specifier to its cached package path.
|
|
88
88
|
*
|
|
89
|
-
* NEW FORMAT (PRS-010): Dependencies are keyed by owner/package directly
|
|
90
89
|
* @param specifier - Import specifier (owner/package format, may include subpaths)
|
|
91
|
-
* @returns
|
|
90
|
+
* @returns Path to the cached package entry point, or undefined if not found
|
|
91
|
+
*/
|
|
92
|
+
resolveDependencyPath(specifier: string): Promise<string | undefined>;
|
|
93
|
+
/**
|
|
94
|
+
* Reads the entry point from a cached package's model.yaml.
|
|
92
95
|
*/
|
|
93
|
-
|
|
96
|
+
private readPackageEntry;
|
|
94
97
|
private performInitialization;
|
|
95
98
|
private ensureInitialized;
|
|
96
|
-
private applyLockFile;
|
|
97
|
-
private generateLockFile;
|
|
98
|
-
private ensureDependencyResolver;
|
|
99
|
-
private writeJsonLockFile;
|
|
100
99
|
private loadLockFileFromDisk;
|
|
101
100
|
private tryReadLockFile;
|
|
102
101
|
private loadManifest;
|
|
@@ -117,7 +116,10 @@ export declare class WorkspaceManager {
|
|
|
117
116
|
*/
|
|
118
117
|
private validateLocalPath;
|
|
119
118
|
private parseJsonLockFile;
|
|
119
|
+
/**
|
|
120
|
+
* Finds workspace root by walking up from startPath looking for model.yaml.
|
|
121
|
+
* Uses configurable manifest files if specified in constructor options.
|
|
122
|
+
*/
|
|
120
123
|
private findWorkspaceRoot;
|
|
121
124
|
private containsManifest;
|
|
122
|
-
private fileExists;
|
|
123
125
|
}
|