@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.
Files changed (116) hide show
  1. package/README.md +1 -1
  2. package/out/domain-lang-module.js +5 -1
  3. package/out/domain-lang-module.js.map +1 -1
  4. package/out/generated/ast.d.ts +24 -0
  5. package/out/generated/ast.js.map +1 -1
  6. package/out/generated/grammar.js +22 -32
  7. package/out/generated/grammar.js.map +1 -1
  8. package/out/index.d.ts +2 -5
  9. package/out/index.js +10 -6
  10. package/out/index.js.map +1 -1
  11. package/out/lsp/domain-lang-code-actions.js +14 -8
  12. package/out/lsp/domain-lang-code-actions.js.map +1 -1
  13. package/out/lsp/domain-lang-completion.d.ts +3 -0
  14. package/out/lsp/domain-lang-completion.js +41 -13
  15. package/out/lsp/domain-lang-completion.js.map +1 -1
  16. package/out/lsp/domain-lang-formatter.js +24 -18
  17. package/out/lsp/domain-lang-formatter.js.map +1 -1
  18. package/out/lsp/domain-lang-index-manager.d.ts +170 -0
  19. package/out/lsp/domain-lang-index-manager.js +389 -0
  20. package/out/lsp/domain-lang-index-manager.js.map +1 -0
  21. package/out/lsp/domain-lang-scope-provider.d.ts +67 -0
  22. package/out/lsp/domain-lang-scope-provider.js +95 -0
  23. package/out/lsp/domain-lang-scope-provider.js.map +1 -0
  24. package/out/lsp/domain-lang-scope.js +31 -17
  25. package/out/lsp/domain-lang-scope.js.map +1 -1
  26. package/out/lsp/domain-lang-workspace-manager.d.ts +76 -9
  27. package/out/lsp/domain-lang-workspace-manager.js +176 -54
  28. package/out/lsp/domain-lang-workspace-manager.js.map +1 -1
  29. package/out/lsp/hover/domain-lang-hover.d.ts +45 -1
  30. package/out/lsp/hover/domain-lang-hover.js +308 -232
  31. package/out/lsp/hover/domain-lang-hover.js.map +1 -1
  32. package/out/lsp/hover/domain-lang-keywords.d.ts +3 -7
  33. package/out/lsp/hover/domain-lang-keywords.js +115 -38
  34. package/out/lsp/hover/domain-lang-keywords.js.map +1 -1
  35. package/out/lsp/manifest-diagnostics.js +95 -50
  36. package/out/lsp/manifest-diagnostics.js.map +1 -1
  37. package/out/main.js +204 -17
  38. package/out/main.js.map +1 -1
  39. package/out/services/import-resolver.d.ts +39 -2
  40. package/out/services/import-resolver.js +77 -12
  41. package/out/services/import-resolver.js.map +1 -1
  42. package/out/services/types.d.ts +2 -2
  43. package/out/services/workspace-manager.d.ts +33 -31
  44. package/out/services/workspace-manager.js +92 -148
  45. package/out/services/workspace-manager.js.map +1 -1
  46. package/out/utils/document-utils.d.ts +41 -0
  47. package/out/utils/document-utils.js +64 -0
  48. package/out/utils/document-utils.js.map +1 -0
  49. package/out/utils/import-utils.d.ts +0 -17
  50. package/out/utils/import-utils.js +2 -32
  51. package/out/utils/import-utils.js.map +1 -1
  52. package/out/utils/manifest-utils.d.ts +56 -0
  53. package/out/utils/manifest-utils.js +119 -0
  54. package/out/utils/manifest-utils.js.map +1 -0
  55. package/out/validation/constants.d.ts +13 -0
  56. package/out/validation/constants.js +18 -0
  57. package/out/validation/constants.js.map +1 -1
  58. package/out/validation/import.d.ts +12 -2
  59. package/out/validation/import.js +95 -22
  60. package/out/validation/import.js.map +1 -1
  61. package/out/validation/maps.js +51 -2
  62. package/out/validation/maps.js.map +1 -1
  63. package/package.json +1 -1
  64. package/src/domain-lang-module.ts +6 -1
  65. package/src/domain-lang.langium +37 -13
  66. package/src/generated/ast.ts +24 -0
  67. package/src/generated/grammar.ts +22 -32
  68. package/src/index.ts +12 -6
  69. package/src/lsp/domain-lang-code-actions.ts +13 -8
  70. package/src/lsp/domain-lang-completion.ts +61 -13
  71. package/src/lsp/domain-lang-formatter.ts +28 -23
  72. package/src/lsp/domain-lang-index-manager.ts +447 -0
  73. package/src/lsp/domain-lang-scope-provider.ts +134 -0
  74. package/src/lsp/domain-lang-scope.ts +29 -17
  75. package/src/lsp/domain-lang-workspace-manager.ts +201 -53
  76. package/src/lsp/hover/domain-lang-hover.ts +332 -226
  77. package/src/lsp/hover/domain-lang-keywords.ts +129 -43
  78. package/src/lsp/manifest-diagnostics.ts +100 -59
  79. package/src/main.ts +258 -16
  80. package/src/services/import-resolver.ts +91 -12
  81. package/src/services/types.ts +2 -2
  82. package/src/services/workspace-manager.ts +101 -175
  83. package/src/utils/document-utils.ts +80 -0
  84. package/src/utils/import-utils.ts +2 -40
  85. package/src/utils/manifest-utils.ts +132 -0
  86. package/src/validation/constants.ts +24 -0
  87. package/src/validation/import.ts +107 -24
  88. package/src/validation/maps.ts +59 -2
  89. package/out/lsp/hover/ddd-pattern-explanations.d.ts +0 -50
  90. package/out/lsp/hover/ddd-pattern-explanations.js +0 -196
  91. package/out/lsp/hover/ddd-pattern-explanations.js.map +0 -1
  92. package/out/services/dependency-analyzer.d.ts +0 -58
  93. package/out/services/dependency-analyzer.js +0 -254
  94. package/out/services/dependency-analyzer.js.map +0 -1
  95. package/out/services/dependency-resolver.d.ts +0 -146
  96. package/out/services/dependency-resolver.js +0 -452
  97. package/out/services/dependency-resolver.js.map +0 -1
  98. package/out/services/git-url-resolver.browser.d.ts +0 -10
  99. package/out/services/git-url-resolver.browser.js +0 -19
  100. package/out/services/git-url-resolver.browser.js.map +0 -1
  101. package/out/services/git-url-resolver.d.ts +0 -158
  102. package/out/services/git-url-resolver.js +0 -416
  103. package/out/services/git-url-resolver.js.map +0 -1
  104. package/out/services/governance-validator.d.ts +0 -44
  105. package/out/services/governance-validator.js +0 -153
  106. package/out/services/governance-validator.js.map +0 -1
  107. package/out/services/semver.d.ts +0 -98
  108. package/out/services/semver.js +0 -195
  109. package/out/services/semver.js.map +0 -1
  110. package/src/lsp/hover/ddd-pattern-explanations.ts +0 -237
  111. package/src/services/dependency-analyzer.ts +0 -321
  112. package/src/services/dependency-resolver.ts +0 -551
  113. package/src/services/git-url-resolver.browser.ts +0 -26
  114. package/src/services/git-url-resolver.ts +0 -517
  115. package/src/services/governance-validator.ts +0 -177
  116. 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 on connection
12
- connection.onInitialize(async (params) => {
13
- const workspaceRoot = params.rootUri ? URI.parse(params.rootUri).fsPath : undefined;
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
- try {
16
- // Initialize workspace manager
17
- const workspaceManager = DomainLang.imports.WorkspaceManager;
18
- await workspaceManager.initialize(workspaceRoot);
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
- return {
28
- capabilities: {
29
- // Language server capabilities are configured by Langium
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().finally(() => startLanguageServer(shared));
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":"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"}
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 Manifest dependencies
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
- * NEW FORMAT (PRS-010): Import specifier is owner/package format.
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 Manifest dependencies
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
- return this.resolveFrom(baseDir, specifier);
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
- * NEW FORMAT (PRS-010): Import specifier is owner/package format.
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
- const mapped = await this.workspaceManager.resolveDependencyImport(specifier);
115
- if (!mapped) {
116
- throw new Error(`Dependency '${specifier}' not found in model.yaml.\n` +
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
- const git = await this.workspaceManager.getGitResolver();
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}'.\\n` +
236
- `Resolved path: ${filePath}\\n` +
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":"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"}
1
+ {"version":3,"file":"import-resolver.js","sourceRoot":"","sources":["../../src/services/import-resolver.ts"],"names":[],"mappings":"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"}
@@ -156,8 +156,8 @@ export interface LockedDependency {
156
156
  * @example
157
157
  * ```yaml
158
158
  * paths:
159
- * "@/": "./src/"
160
- * "@shared/": "./libs/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 { GitUrlResolver } from './git-url-resolver.js';
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, lock file lifecycle management, and git resolver configuration.
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, loads any existing lock file, and prepares the git resolver.
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
- * Returns the cached lock file or triggers resolution when missing.
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, updating the git resolver.
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
- private normalizeDependency;
85
+ normalizeDependency(key: string, dep: DependencySpec): ExtendedDependencySpec;
86
86
  /**
87
- * Resolves a manifest dependency to its git import string.
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 Resolved git import string or undefined when not found
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
- resolveDependencyImport(specifier: string): Promise<string | undefined>;
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
  }