@domainlang/language 0.1.81
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 +32 -0
- package/out/ast-augmentation.d.ts +6 -0
- package/out/ast-augmentation.js +2 -0
- package/out/ast-augmentation.js.map +1 -0
- package/out/domain-lang-module.d.ts +55 -0
- package/out/domain-lang-module.js +59 -0
- package/out/domain-lang-module.js.map +1 -0
- package/out/generated/ast.d.ts +770 -0
- package/out/generated/ast.js +565 -0
- package/out/generated/ast.js.map +1 -0
- package/out/generated/grammar.d.ts +6 -0
- package/out/generated/grammar.js +2502 -0
- package/out/generated/grammar.js.map +1 -0
- package/out/generated/module.d.ts +13 -0
- package/out/generated/module.js +21 -0
- package/out/generated/module.js.map +1 -0
- package/out/index.d.ts +13 -0
- package/out/index.js +17 -0
- package/out/index.js.map +1 -0
- package/out/lsp/domain-lang-completion.d.ts +37 -0
- package/out/lsp/domain-lang-completion.js +452 -0
- package/out/lsp/domain-lang-completion.js.map +1 -0
- package/out/lsp/domain-lang-formatter.d.ts +15 -0
- package/out/lsp/domain-lang-formatter.js +43 -0
- package/out/lsp/domain-lang-formatter.js.map +1 -0
- package/out/lsp/domain-lang-naming.d.ts +34 -0
- package/out/lsp/domain-lang-naming.js +49 -0
- package/out/lsp/domain-lang-naming.js.map +1 -0
- package/out/lsp/domain-lang-scope.d.ts +59 -0
- package/out/lsp/domain-lang-scope.js +102 -0
- package/out/lsp/domain-lang-scope.js.map +1 -0
- package/out/lsp/hover/ddd-pattern-explanations.d.ts +50 -0
- package/out/lsp/hover/ddd-pattern-explanations.js +196 -0
- package/out/lsp/hover/ddd-pattern-explanations.js.map +1 -0
- package/out/lsp/hover/domain-lang-hover.d.ts +19 -0
- package/out/lsp/hover/domain-lang-hover.js +306 -0
- package/out/lsp/hover/domain-lang-hover.js.map +1 -0
- package/out/lsp/hover/domain-lang-keywords.d.ts +13 -0
- package/out/lsp/hover/domain-lang-keywords.js +47 -0
- package/out/lsp/hover/domain-lang-keywords.js.map +1 -0
- package/out/main-browser.d.ts +1 -0
- package/out/main-browser.js +11 -0
- package/out/main-browser.js.map +1 -0
- package/out/main.d.ts +1 -0
- package/out/main.js +74 -0
- package/out/main.js.map +1 -0
- package/out/sdk/ast-augmentation.d.ts +136 -0
- package/out/sdk/ast-augmentation.js +62 -0
- package/out/sdk/ast-augmentation.js.map +1 -0
- package/out/sdk/index.d.ts +94 -0
- package/out/sdk/index.js +97 -0
- package/out/sdk/index.js.map +1 -0
- package/out/sdk/indexes.d.ts +16 -0
- package/out/sdk/indexes.js +97 -0
- package/out/sdk/indexes.js.map +1 -0
- package/out/sdk/loader-node.d.ts +47 -0
- package/out/sdk/loader-node.js +104 -0
- package/out/sdk/loader-node.js.map +1 -0
- package/out/sdk/loader.d.ts +49 -0
- package/out/sdk/loader.js +85 -0
- package/out/sdk/loader.js.map +1 -0
- package/out/sdk/patterns.d.ts +93 -0
- package/out/sdk/patterns.js +123 -0
- package/out/sdk/patterns.js.map +1 -0
- package/out/sdk/query.d.ts +90 -0
- package/out/sdk/query.js +679 -0
- package/out/sdk/query.js.map +1 -0
- package/out/sdk/resolution.d.ts +52 -0
- package/out/sdk/resolution.js +68 -0
- package/out/sdk/resolution.js.map +1 -0
- package/out/sdk/types.d.ts +301 -0
- package/out/sdk/types.js +8 -0
- package/out/sdk/types.js.map +1 -0
- package/out/services/dependency-analyzer.d.ts +94 -0
- package/out/services/dependency-analyzer.js +279 -0
- package/out/services/dependency-analyzer.js.map +1 -0
- package/out/services/dependency-resolver.d.ts +123 -0
- package/out/services/dependency-resolver.js +252 -0
- package/out/services/dependency-resolver.js.map +1 -0
- package/out/services/git-url-resolver.browser.d.ts +18 -0
- package/out/services/git-url-resolver.browser.js +15 -0
- package/out/services/git-url-resolver.browser.js.map +1 -0
- package/out/services/git-url-resolver.d.ts +192 -0
- package/out/services/git-url-resolver.js +382 -0
- package/out/services/git-url-resolver.js.map +1 -0
- package/out/services/governance-validator.d.ts +80 -0
- package/out/services/governance-validator.js +159 -0
- package/out/services/governance-validator.js.map +1 -0
- package/out/services/import-resolver.d.ts +18 -0
- package/out/services/import-resolver.js +22 -0
- package/out/services/import-resolver.js.map +1 -0
- package/out/services/performance-optimizer.d.ts +60 -0
- package/out/services/performance-optimizer.js +140 -0
- package/out/services/performance-optimizer.js.map +1 -0
- package/out/services/relationship-inference.d.ts +11 -0
- package/out/services/relationship-inference.js +98 -0
- package/out/services/relationship-inference.js.map +1 -0
- package/out/services/workspace-manager.d.ts +76 -0
- package/out/services/workspace-manager.js +323 -0
- package/out/services/workspace-manager.js.map +1 -0
- package/out/syntaxes/domain-lang.monarch.d.ts +76 -0
- package/out/syntaxes/domain-lang.monarch.js +29 -0
- package/out/syntaxes/domain-lang.monarch.js.map +1 -0
- package/out/utils/import-utils.d.ts +57 -0
- package/out/utils/import-utils.js +228 -0
- package/out/utils/import-utils.js.map +1 -0
- package/out/validation/bounded-context.d.ts +11 -0
- package/out/validation/bounded-context.js +79 -0
- package/out/validation/bounded-context.js.map +1 -0
- package/out/validation/classification.d.ts +3 -0
- package/out/validation/classification.js +3 -0
- package/out/validation/classification.js.map +1 -0
- package/out/validation/constants.d.ts +77 -0
- package/out/validation/constants.js +96 -0
- package/out/validation/constants.js.map +1 -0
- package/out/validation/domain-lang-validator.d.ts +2 -0
- package/out/validation/domain-lang-validator.js +27 -0
- package/out/validation/domain-lang-validator.js.map +1 -0
- package/out/validation/domain.d.ts +11 -0
- package/out/validation/domain.js +18 -0
- package/out/validation/domain.js.map +1 -0
- package/out/validation/import.d.ts +44 -0
- package/out/validation/import.js +135 -0
- package/out/validation/import.js.map +1 -0
- package/out/validation/maps.d.ts +21 -0
- package/out/validation/maps.js +56 -0
- package/out/validation/maps.js.map +1 -0
- package/out/validation/metadata.d.ts +7 -0
- package/out/validation/metadata.js +12 -0
- package/out/validation/metadata.js.map +1 -0
- package/out/validation/model.d.ts +12 -0
- package/out/validation/model.js +29 -0
- package/out/validation/model.js.map +1 -0
- package/out/validation/relationships.d.ts +12 -0
- package/out/validation/relationships.js +94 -0
- package/out/validation/relationships.js.map +1 -0
- package/out/validation/shared.d.ts +6 -0
- package/out/validation/shared.js +12 -0
- package/out/validation/shared.js.map +1 -0
- package/package.json +97 -0
- package/src/ast-augmentation.ts +5 -0
- package/src/domain-lang-module.ts +100 -0
- package/src/domain-lang.langium +356 -0
- package/src/generated/ast.ts +999 -0
- package/src/generated/grammar.ts +2504 -0
- package/src/generated/module.ts +25 -0
- package/src/index.ts +17 -0
- package/src/lsp/domain-lang-completion.ts +514 -0
- package/src/lsp/domain-lang-formatter.ts +51 -0
- package/src/lsp/domain-lang-naming.ts +56 -0
- package/src/lsp/domain-lang-scope.ts +137 -0
- package/src/lsp/hover/ddd-pattern-explanations.ts +237 -0
- package/src/lsp/hover/domain-lang-hover.ts +340 -0
- package/src/lsp/hover/domain-lang-keywords.ts +50 -0
- package/src/main-browser.ts +15 -0
- package/src/main.ts +85 -0
- package/src/sdk/README.md +297 -0
- package/src/sdk/ast-augmentation.ts +157 -0
- package/src/sdk/index.ts +128 -0
- package/src/sdk/indexes.ts +155 -0
- package/src/sdk/loader-node.ts +126 -0
- package/src/sdk/loader.ts +99 -0
- package/src/sdk/patterns.ts +147 -0
- package/src/sdk/query.ts +802 -0
- package/src/sdk/resolution.ts +78 -0
- package/src/sdk/types.ts +346 -0
- package/src/services/dependency-analyzer.ts +381 -0
- package/src/services/dependency-resolver.ts +334 -0
- package/src/services/git-url-resolver.browser.ts +31 -0
- package/src/services/git-url-resolver.ts +524 -0
- package/src/services/governance-validator.ts +219 -0
- package/src/services/import-resolver.ts +30 -0
- package/src/services/performance-optimizer.ts +170 -0
- package/src/services/relationship-inference.ts +121 -0
- package/src/services/workspace-manager.ts +416 -0
- package/src/syntaxes/domain-lang.monarch.ts +29 -0
- package/src/utils/import-utils.ts +274 -0
- package/src/validation/bounded-context.ts +99 -0
- package/src/validation/classification.ts +5 -0
- package/src/validation/constants.ts +124 -0
- package/src/validation/domain-lang-validator.ts +33 -0
- package/src/validation/domain.ts +24 -0
- package/src/validation/import.ts +171 -0
- package/src/validation/maps.ts +72 -0
- package/src/validation/metadata.ts +14 -0
- package/src/validation/model.ts +37 -0
- package/src/validation/relationships.ts +154 -0
- package/src/validation/shared.ts +14 -0
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dependency Analysis Service
|
|
3
|
+
*
|
|
4
|
+
* Provides tools for visualizing and analyzing dependency relationships:
|
|
5
|
+
* - Dependency tree visualization
|
|
6
|
+
* - Impact analysis (reverse dependencies)
|
|
7
|
+
* - Circular dependency detection
|
|
8
|
+
* - Version policy enforcement
|
|
9
|
+
*/
|
|
10
|
+
import path from 'node:path';
|
|
11
|
+
import fs from 'node:fs/promises';
|
|
12
|
+
import os from 'node:os';
|
|
13
|
+
import YAML from 'yaml';
|
|
14
|
+
/**
|
|
15
|
+
* Analyzes dependency relationships and provides visualization/analysis tools.
|
|
16
|
+
*/
|
|
17
|
+
export class DependencyAnalyzer {
|
|
18
|
+
/**
|
|
19
|
+
* Builds a dependency tree from a lock file.
|
|
20
|
+
*
|
|
21
|
+
* @param lockFile - The lock file to analyze
|
|
22
|
+
* @param workspaceRoot - Workspace root to load dependency metadata
|
|
23
|
+
* @returns Root nodes of the dependency tree
|
|
24
|
+
*/
|
|
25
|
+
async buildDependencyTree(lockFile, workspaceRoot) {
|
|
26
|
+
const manifestPath = path.join(workspaceRoot, 'model.yaml');
|
|
27
|
+
// Load root manifest to get direct dependencies
|
|
28
|
+
const rootDeps = {};
|
|
29
|
+
try {
|
|
30
|
+
const content = await fs.readFile(manifestPath, 'utf-8');
|
|
31
|
+
const manifest = YAML.parse(content);
|
|
32
|
+
if (manifest.dependencies) {
|
|
33
|
+
for (const [, dep] of Object.entries(manifest.dependencies)) {
|
|
34
|
+
rootDeps[dep.source] = dep.version;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
// No manifest or parse error
|
|
40
|
+
}
|
|
41
|
+
// Build tree for each direct dependency
|
|
42
|
+
const rootNodes = [];
|
|
43
|
+
const visited = new Set();
|
|
44
|
+
for (const packageKey of Object.keys(rootDeps)) {
|
|
45
|
+
const node = await this.buildTreeNode(packageKey, lockFile, workspaceRoot, 0, visited);
|
|
46
|
+
if (node) {
|
|
47
|
+
rootNodes.push(node);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return rootNodes;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Recursively builds a dependency tree node.
|
|
54
|
+
*/
|
|
55
|
+
async buildTreeNode(packageKey, lockFile, workspaceRoot, depth, visited) {
|
|
56
|
+
const locked = lockFile.dependencies[packageKey];
|
|
57
|
+
if (!locked) {
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
// Prevent infinite recursion
|
|
61
|
+
if (visited.has(packageKey)) {
|
|
62
|
+
return {
|
|
63
|
+
packageKey,
|
|
64
|
+
version: locked.version,
|
|
65
|
+
commit: locked.commit,
|
|
66
|
+
dependencies: [], // Don't recurse into already visited
|
|
67
|
+
depth,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
visited.add(packageKey);
|
|
71
|
+
// Load package dependencies from cache
|
|
72
|
+
const cacheDir = this.getCacheDir(packageKey, locked.commit);
|
|
73
|
+
const packageDeps = await this.loadPackageDependencies(cacheDir);
|
|
74
|
+
// Build child nodes
|
|
75
|
+
const children = [];
|
|
76
|
+
for (const depKey of Object.keys(packageDeps)) {
|
|
77
|
+
const childNode = await this.buildTreeNode(depKey, lockFile, workspaceRoot, depth + 1, new Set(visited));
|
|
78
|
+
if (childNode) {
|
|
79
|
+
children.push(childNode);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return {
|
|
83
|
+
packageKey,
|
|
84
|
+
version: locked.version,
|
|
85
|
+
commit: locked.commit,
|
|
86
|
+
dependencies: children,
|
|
87
|
+
depth,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Finds all packages that depend on a given package.
|
|
92
|
+
*
|
|
93
|
+
* @param targetPackage - Package to analyze
|
|
94
|
+
* @param lockFile - Lock file with all dependencies
|
|
95
|
+
* @param workspaceRoot - Workspace root
|
|
96
|
+
* @returns List of reverse dependencies
|
|
97
|
+
*/
|
|
98
|
+
async findReverseDependencies(targetPackage, lockFile, workspaceRoot) {
|
|
99
|
+
const reverseDeps = [];
|
|
100
|
+
const manifestPath = path.join(workspaceRoot, 'model.yaml');
|
|
101
|
+
// Check if target is a direct dependency of root
|
|
102
|
+
try {
|
|
103
|
+
const content = await fs.readFile(manifestPath, 'utf-8');
|
|
104
|
+
const manifest = YAML.parse(content);
|
|
105
|
+
if (manifest.dependencies) {
|
|
106
|
+
for (const [, dep] of Object.entries(manifest.dependencies)) {
|
|
107
|
+
if (dep.source === targetPackage) {
|
|
108
|
+
reverseDeps.push({
|
|
109
|
+
dependentPackage: 'root',
|
|
110
|
+
version: 'workspace',
|
|
111
|
+
type: 'direct',
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
// Ignore
|
|
119
|
+
}
|
|
120
|
+
// Check all other packages in lock file
|
|
121
|
+
for (const [packageKey, locked] of Object.entries(lockFile.dependencies)) {
|
|
122
|
+
if (packageKey === targetPackage) {
|
|
123
|
+
continue;
|
|
124
|
+
}
|
|
125
|
+
const cacheDir = this.getCacheDir(packageKey, locked.commit);
|
|
126
|
+
const packageDeps = await this.loadPackageDependencies(cacheDir);
|
|
127
|
+
if (packageDeps[targetPackage]) {
|
|
128
|
+
reverseDeps.push({
|
|
129
|
+
dependentPackage: packageKey,
|
|
130
|
+
version: locked.version,
|
|
131
|
+
type: 'direct',
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
return reverseDeps;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Formats a dependency tree as a readable string.
|
|
139
|
+
*/
|
|
140
|
+
formatDependencyTree(nodes, options = {}) {
|
|
141
|
+
const lines = [];
|
|
142
|
+
const formatNode = (node, prefix, isLast) => {
|
|
143
|
+
const branch = isLast ? '└── ' : '├── ';
|
|
144
|
+
const versionStr = options.showCommits
|
|
145
|
+
? `${node.version} (${node.commit.substring(0, 7)})`
|
|
146
|
+
: node.version;
|
|
147
|
+
lines.push(`${prefix}${branch}${node.packageKey}@${versionStr}`);
|
|
148
|
+
const childPrefix = prefix + (isLast ? ' ' : '│ ');
|
|
149
|
+
node.dependencies.forEach((child, index) => {
|
|
150
|
+
const isLastChild = index === node.dependencies.length - 1;
|
|
151
|
+
formatNode(child, childPrefix, isLastChild);
|
|
152
|
+
});
|
|
153
|
+
};
|
|
154
|
+
nodes.forEach((node, index) => {
|
|
155
|
+
formatNode(node, '', index === nodes.length - 1);
|
|
156
|
+
});
|
|
157
|
+
return lines.join('\n');
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Detects circular dependencies in a dependency graph.
|
|
161
|
+
*/
|
|
162
|
+
async detectCircularDependencies(lockFile) {
|
|
163
|
+
const cycles = [];
|
|
164
|
+
const visiting = new Set();
|
|
165
|
+
const completed = new Set();
|
|
166
|
+
const dfs = async (packageKey, path) => {
|
|
167
|
+
if (visiting.has(packageKey)) {
|
|
168
|
+
const cycleStart = path.indexOf(packageKey);
|
|
169
|
+
const cycle = cycleStart >= 0
|
|
170
|
+
? [...path.slice(cycleStart), packageKey]
|
|
171
|
+
: [...path, packageKey];
|
|
172
|
+
cycles.push(cycle);
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
if (completed.has(packageKey)) {
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
visiting.add(packageKey);
|
|
179
|
+
const locked = lockFile.dependencies[packageKey];
|
|
180
|
+
if (locked) {
|
|
181
|
+
const cacheDir = this.getCacheDir(packageKey, locked.commit);
|
|
182
|
+
const deps = await this.loadPackageDependencies(cacheDir);
|
|
183
|
+
for (const depKey of Object.keys(deps)) {
|
|
184
|
+
await dfs(depKey, [...path, packageKey]);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
visiting.delete(packageKey);
|
|
188
|
+
completed.add(packageKey);
|
|
189
|
+
};
|
|
190
|
+
for (const packageKey of Object.keys(lockFile.dependencies)) {
|
|
191
|
+
await dfs(packageKey, []);
|
|
192
|
+
}
|
|
193
|
+
return cycles;
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Resolves version policies (latest, stable) to concrete versions.
|
|
197
|
+
*/
|
|
198
|
+
async resolveVersionPolicy(packageKey, policy, availableVersions) {
|
|
199
|
+
if (policy === 'latest') {
|
|
200
|
+
// Return the most recent version
|
|
201
|
+
const sorted = this.sortVersions(availableVersions);
|
|
202
|
+
return {
|
|
203
|
+
policy: 'latest',
|
|
204
|
+
version: sorted[0] || 'main',
|
|
205
|
+
availableVersions: sorted,
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
if (policy === 'stable') {
|
|
209
|
+
// Return the most recent stable version (exclude pre-release)
|
|
210
|
+
const stable = availableVersions.filter(v => !this.isPreRelease(v));
|
|
211
|
+
const sorted = this.sortVersions(stable);
|
|
212
|
+
return {
|
|
213
|
+
policy: 'stable',
|
|
214
|
+
version: sorted[0] || 'main',
|
|
215
|
+
availableVersions: sorted,
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
// Pinned version
|
|
219
|
+
return {
|
|
220
|
+
policy: 'pinned',
|
|
221
|
+
version: policy,
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Gets the cache directory for a package.
|
|
226
|
+
*/
|
|
227
|
+
getCacheDir(packageKey, commit) {
|
|
228
|
+
const [owner, repo] = packageKey.split('/');
|
|
229
|
+
return path.join(os.homedir(), '.dlang', 'cache', 'github', // Assume GitHub for now
|
|
230
|
+
owner, repo, commit);
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Loads dependencies from a cached package.
|
|
234
|
+
*/
|
|
235
|
+
async loadPackageDependencies(cacheDir) {
|
|
236
|
+
const manifestPath = path.join(cacheDir, 'model.yaml');
|
|
237
|
+
try {
|
|
238
|
+
const content = await fs.readFile(manifestPath, 'utf-8');
|
|
239
|
+
const manifest = YAML.parse(content);
|
|
240
|
+
const deps = {};
|
|
241
|
+
if (manifest.dependencies) {
|
|
242
|
+
for (const [, dep] of Object.entries(manifest.dependencies)) {
|
|
243
|
+
deps[dep.source] = dep.version;
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
return deps;
|
|
247
|
+
}
|
|
248
|
+
catch {
|
|
249
|
+
return {};
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Sorts versions in descending order (newest first).
|
|
254
|
+
*/
|
|
255
|
+
sortVersions(versions) {
|
|
256
|
+
return versions.sort((a, b) => {
|
|
257
|
+
// Simple lexicographic sort (good enough for basic semver)
|
|
258
|
+
// Production: use semver library
|
|
259
|
+
const aParts = a.replace(/^v/, '').split('.').map(Number);
|
|
260
|
+
const bParts = b.replace(/^v/, '').split('.').map(Number);
|
|
261
|
+
for (let i = 0; i < Math.max(aParts.length, bParts.length); i++) {
|
|
262
|
+
const aNum = aParts[i] || 0;
|
|
263
|
+
const bNum = bParts[i] || 0;
|
|
264
|
+
if (aNum !== bNum) {
|
|
265
|
+
return bNum - aNum; // Descending
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
return 0;
|
|
269
|
+
});
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* Checks if a version is a pre-release.
|
|
273
|
+
*/
|
|
274
|
+
isPreRelease(version) {
|
|
275
|
+
const clean = version.replace(/^v/, '');
|
|
276
|
+
return /-(alpha|beta|rc|pre|dev)/.test(clean);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
//# sourceMappingURL=dependency-analyzer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dependency-analyzer.js","sourceRoot":"","sources":["../../src/services/dependency-analyzer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dependency Resolution Service
|
|
3
|
+
*
|
|
4
|
+
* Discovers and resolves transitive dependencies for DomainLang packages.
|
|
5
|
+
* Generates lock files for reproducible builds.
|
|
6
|
+
*
|
|
7
|
+
* Algorithm:
|
|
8
|
+
* 1. Parse root model.yaml
|
|
9
|
+
* 2. Download all direct dependencies
|
|
10
|
+
* 3. Parse each dependency's model.yaml
|
|
11
|
+
* 4. Recursively discover transitive dependencies
|
|
12
|
+
* 5. Resolve version constraints (simple: use latest satisfying version)
|
|
13
|
+
* 6. Generate lock file with pinned commit hashes
|
|
14
|
+
*/
|
|
15
|
+
import { GitUrlResolver, LockFile } from './git-url-resolver.js';
|
|
16
|
+
/**
|
|
17
|
+
* Dependency graph node representing a package and its dependencies.
|
|
18
|
+
*/
|
|
19
|
+
export interface DependencyNode {
|
|
20
|
+
/** Package identifier (owner/repo) */
|
|
21
|
+
packageKey: string;
|
|
22
|
+
/** Version constraint from parent (e.g., "^1.0.0") */
|
|
23
|
+
versionConstraint: string;
|
|
24
|
+
/** Resolved version */
|
|
25
|
+
resolvedVersion?: string;
|
|
26
|
+
/** Resolved commit hash */
|
|
27
|
+
commitHash?: string;
|
|
28
|
+
/** Full git URL */
|
|
29
|
+
repoUrl?: string;
|
|
30
|
+
/** Direct dependencies of this package */
|
|
31
|
+
dependencies: Record<string, string>;
|
|
32
|
+
/** Parent packages that depend on this one */
|
|
33
|
+
dependents: string[];
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Dependency graph for the entire workspace.
|
|
37
|
+
*/
|
|
38
|
+
export interface DependencyGraph {
|
|
39
|
+
/** All discovered packages, keyed by owner/repo */
|
|
40
|
+
nodes: Record<string, DependencyNode>;
|
|
41
|
+
/** Root package name */
|
|
42
|
+
root: string;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Resolves dependencies and generates lock files.
|
|
46
|
+
*/
|
|
47
|
+
export type { LockFile, PackageMetadata } from './git-url-resolver.js';
|
|
48
|
+
export declare class DependencyResolver {
|
|
49
|
+
private gitResolver;
|
|
50
|
+
private workspaceRoot;
|
|
51
|
+
constructor(workspaceRoot: string, gitResolver?: GitUrlResolver);
|
|
52
|
+
/**
|
|
53
|
+
* Resolves all dependencies for a workspace.
|
|
54
|
+
*
|
|
55
|
+
* Process:
|
|
56
|
+
* 1. Load root model.yaml
|
|
57
|
+
* 2. Build dependency graph (discover transitive deps)
|
|
58
|
+
* 3. Resolve version constraints
|
|
59
|
+
* 4. Generate lock file
|
|
60
|
+
* 5. Download all dependencies to cache
|
|
61
|
+
*
|
|
62
|
+
* @returns Generated lock file
|
|
63
|
+
*/
|
|
64
|
+
resolveDependencies(): Promise<LockFile>;
|
|
65
|
+
/**
|
|
66
|
+
* Builds the complete dependency graph by recursively discovering transitive dependencies.
|
|
67
|
+
*/
|
|
68
|
+
private buildDependencyGraph;
|
|
69
|
+
/**
|
|
70
|
+
* Resolves version constraints to specific versions.
|
|
71
|
+
*
|
|
72
|
+
* Simple algorithm: Use the latest version that satisfies all constraints.
|
|
73
|
+
* Future: Implement proper semantic versioning resolution.
|
|
74
|
+
*/
|
|
75
|
+
private resolveVersions;
|
|
76
|
+
/**
|
|
77
|
+
* Extracts a version from a constraint string.
|
|
78
|
+
*
|
|
79
|
+
* Examples:
|
|
80
|
+
* - "^1.0.0" → "1.0.0"
|
|
81
|
+
* - "~2.3.0" → "2.3.0"
|
|
82
|
+
* - "1.5.0" → "1.5.0"
|
|
83
|
+
* - "owner/repo@1.0.0" → "1.0.0"
|
|
84
|
+
*
|
|
85
|
+
* Future: Implement proper semver range parsing and resolution.
|
|
86
|
+
*/
|
|
87
|
+
private extractVersionFromConstraint;
|
|
88
|
+
/**
|
|
89
|
+
* Resolves a version (tag/branch) to a commit hash using git ls-remote.
|
|
90
|
+
*/
|
|
91
|
+
private resolveCommitHash;
|
|
92
|
+
/**
|
|
93
|
+
* Generates a lock file from the resolved dependency graph.
|
|
94
|
+
*/
|
|
95
|
+
private generateLockFile;
|
|
96
|
+
/**
|
|
97
|
+
* Loads and parses a package's model.yaml file.
|
|
98
|
+
*/
|
|
99
|
+
private loadPackageConfig;
|
|
100
|
+
/**
|
|
101
|
+
* Parses model.yaml content.
|
|
102
|
+
*
|
|
103
|
+
* Expected structure:
|
|
104
|
+
* model:
|
|
105
|
+
* name: package-name
|
|
106
|
+
* version: 1.0.0
|
|
107
|
+
* entry: index.dlang
|
|
108
|
+
*
|
|
109
|
+
* dependencies:
|
|
110
|
+
* package-name:
|
|
111
|
+
* source: owner/repo
|
|
112
|
+
* version: ^1.0.0
|
|
113
|
+
*/
|
|
114
|
+
private parseYaml;
|
|
115
|
+
/**
|
|
116
|
+
* Loads an existing lock file from disk.
|
|
117
|
+
*/
|
|
118
|
+
static loadLockFile(workspaceRoot: string): Promise<LockFile | undefined>;
|
|
119
|
+
/**
|
|
120
|
+
* Parses a lock file from JSON format.
|
|
121
|
+
*/
|
|
122
|
+
static parseLockFile(content: string): LockFile;
|
|
123
|
+
}
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dependency Resolution Service
|
|
3
|
+
*
|
|
4
|
+
* Discovers and resolves transitive dependencies for DomainLang packages.
|
|
5
|
+
* Generates lock files for reproducible builds.
|
|
6
|
+
*
|
|
7
|
+
* Algorithm:
|
|
8
|
+
* 1. Parse root model.yaml
|
|
9
|
+
* 2. Download all direct dependencies
|
|
10
|
+
* 3. Parse each dependency's model.yaml
|
|
11
|
+
* 4. Recursively discover transitive dependencies
|
|
12
|
+
* 5. Resolve version constraints (simple: use latest satisfying version)
|
|
13
|
+
* 6. Generate lock file with pinned commit hashes
|
|
14
|
+
*/
|
|
15
|
+
import path from 'node:path';
|
|
16
|
+
import fs from 'node:fs/promises';
|
|
17
|
+
import YAML from 'yaml';
|
|
18
|
+
import { GitUrlParser, GitUrlResolver } from './git-url-resolver.js';
|
|
19
|
+
export class DependencyResolver {
|
|
20
|
+
constructor(workspaceRoot, gitResolver) {
|
|
21
|
+
this.workspaceRoot = workspaceRoot;
|
|
22
|
+
this.gitResolver = gitResolver || new GitUrlResolver();
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Resolves all dependencies for a workspace.
|
|
26
|
+
*
|
|
27
|
+
* Process:
|
|
28
|
+
* 1. Load root model.yaml
|
|
29
|
+
* 2. Build dependency graph (discover transitive deps)
|
|
30
|
+
* 3. Resolve version constraints
|
|
31
|
+
* 4. Generate lock file
|
|
32
|
+
* 5. Download all dependencies to cache
|
|
33
|
+
*
|
|
34
|
+
* @returns Generated lock file
|
|
35
|
+
*/
|
|
36
|
+
async resolveDependencies() {
|
|
37
|
+
// Load root package config
|
|
38
|
+
const rootConfig = await this.loadPackageConfig(this.workspaceRoot);
|
|
39
|
+
if (!rootConfig.dependencies || Object.keys(rootConfig.dependencies).length === 0) {
|
|
40
|
+
// No dependencies
|
|
41
|
+
return { version: '1', dependencies: {} };
|
|
42
|
+
}
|
|
43
|
+
// Build dependency graph
|
|
44
|
+
const graph = await this.buildDependencyGraph(rootConfig);
|
|
45
|
+
// Resolve version constraints
|
|
46
|
+
await this.resolveVersions(graph);
|
|
47
|
+
// Generate and return lock file (caller writes to disk)
|
|
48
|
+
return this.generateLockFile(graph);
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Builds the complete dependency graph by recursively discovering transitive dependencies.
|
|
52
|
+
*/
|
|
53
|
+
async buildDependencyGraph(rootConfig) {
|
|
54
|
+
const graph = {
|
|
55
|
+
nodes: {},
|
|
56
|
+
root: rootConfig.name || 'root',
|
|
57
|
+
};
|
|
58
|
+
// Process root dependencies
|
|
59
|
+
const queue = [];
|
|
60
|
+
for (const [depName, versionConstraint] of Object.entries(rootConfig.dependencies || {})) {
|
|
61
|
+
queue.push({
|
|
62
|
+
packageKey: depName,
|
|
63
|
+
versionConstraint,
|
|
64
|
+
parent: graph.root
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
// BFS to discover all transitive dependencies
|
|
68
|
+
const visited = new Set();
|
|
69
|
+
while (queue.length > 0) {
|
|
70
|
+
const entry = queue.shift();
|
|
71
|
+
if (!entry)
|
|
72
|
+
break;
|
|
73
|
+
const { packageKey, versionConstraint, parent } = entry;
|
|
74
|
+
// Skip if already processed
|
|
75
|
+
if (visited.has(packageKey)) {
|
|
76
|
+
// Update dependents list
|
|
77
|
+
if (!graph.nodes[packageKey].dependents.includes(parent)) {
|
|
78
|
+
graph.nodes[packageKey].dependents.push(parent);
|
|
79
|
+
}
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
visited.add(packageKey);
|
|
83
|
+
// Parse package identifier
|
|
84
|
+
const gitInfo = GitUrlParser.parse(packageKey);
|
|
85
|
+
// Download package to get its dlang.toml
|
|
86
|
+
const packageUri = await this.gitResolver.resolve(packageKey);
|
|
87
|
+
const packageDir = path.dirname(packageUri.fsPath);
|
|
88
|
+
// Load package config
|
|
89
|
+
const packageConfig = await this.loadPackageConfig(packageDir);
|
|
90
|
+
// Add to graph
|
|
91
|
+
graph.nodes[packageKey] = {
|
|
92
|
+
packageKey,
|
|
93
|
+
versionConstraint,
|
|
94
|
+
repoUrl: gitInfo.repoUrl,
|
|
95
|
+
dependencies: packageConfig.dependencies || {},
|
|
96
|
+
dependents: [parent],
|
|
97
|
+
};
|
|
98
|
+
// Queue transitive dependencies
|
|
99
|
+
for (const [transDepName, transVersionConstraint] of Object.entries(packageConfig.dependencies || {})) {
|
|
100
|
+
queue.push({
|
|
101
|
+
packageKey: transDepName,
|
|
102
|
+
versionConstraint: transVersionConstraint,
|
|
103
|
+
parent: packageKey,
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return graph;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Resolves version constraints to specific versions.
|
|
111
|
+
*
|
|
112
|
+
* Simple algorithm: Use the latest version that satisfies all constraints.
|
|
113
|
+
* Future: Implement proper semantic versioning resolution.
|
|
114
|
+
*/
|
|
115
|
+
async resolveVersions(graph) {
|
|
116
|
+
for (const [packageKey, node] of Object.entries(graph.nodes)) {
|
|
117
|
+
// Parse package to get repo info
|
|
118
|
+
const gitInfo = GitUrlParser.parse(packageKey);
|
|
119
|
+
// For now, resolve to the version specified in the constraint
|
|
120
|
+
// Future: Implement proper semver range resolution
|
|
121
|
+
const version = this.extractVersionFromConstraint(node.versionConstraint);
|
|
122
|
+
// Resolve version to commit hash
|
|
123
|
+
const commitHash = await this.resolveCommitHash(gitInfo.repoUrl, version);
|
|
124
|
+
node.resolvedVersion = version;
|
|
125
|
+
node.commitHash = commitHash;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Extracts a version from a constraint string.
|
|
130
|
+
*
|
|
131
|
+
* Examples:
|
|
132
|
+
* - "^1.0.0" → "1.0.0"
|
|
133
|
+
* - "~2.3.0" → "2.3.0"
|
|
134
|
+
* - "1.5.0" → "1.5.0"
|
|
135
|
+
* - "owner/repo@1.0.0" → "1.0.0"
|
|
136
|
+
*
|
|
137
|
+
* Future: Implement proper semver range parsing and resolution.
|
|
138
|
+
*/
|
|
139
|
+
extractVersionFromConstraint(constraint) {
|
|
140
|
+
// Remove semver operators
|
|
141
|
+
let version = constraint.replace(/^[\^~>=<]/, '');
|
|
142
|
+
// Extract version from full import URL if present
|
|
143
|
+
if (version.includes('@')) {
|
|
144
|
+
version = version.split('@')[1];
|
|
145
|
+
}
|
|
146
|
+
return version || 'main';
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Resolves a version (tag/branch) to a commit hash using git ls-remote.
|
|
150
|
+
*/
|
|
151
|
+
async resolveCommitHash(repoUrl, version) {
|
|
152
|
+
// This is a placeholder - the actual implementation is in GitUrlResolver
|
|
153
|
+
// We need to extract it or call the resolver
|
|
154
|
+
const gitInfo = GitUrlParser.parse(`${repoUrl}@${version}`);
|
|
155
|
+
const uri = await this.gitResolver.resolve(gitInfo.original);
|
|
156
|
+
// Extract commit hash from cache path
|
|
157
|
+
// Cache format: ~/.dlang/cache/{platform}/{owner}/{repo}/{commit-hash}/
|
|
158
|
+
const pathParts = uri.fsPath.split(path.sep);
|
|
159
|
+
const commitHashIndex = pathParts.length - 2; // Second to last segment
|
|
160
|
+
return pathParts[commitHashIndex];
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Generates a lock file from the resolved dependency graph.
|
|
164
|
+
*/
|
|
165
|
+
generateLockFile(graph) {
|
|
166
|
+
const dependencies = {};
|
|
167
|
+
for (const [packageKey, node] of Object.entries(graph.nodes)) {
|
|
168
|
+
if (!node.resolvedVersion || !node.commitHash) {
|
|
169
|
+
throw new Error(`Failed to resolve version for ${packageKey}`);
|
|
170
|
+
}
|
|
171
|
+
dependencies[packageKey] = {
|
|
172
|
+
version: node.resolvedVersion,
|
|
173
|
+
resolved: node.repoUrl || '',
|
|
174
|
+
commit: node.commitHash,
|
|
175
|
+
// Future: Calculate integrity hash
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
return {
|
|
179
|
+
version: '1',
|
|
180
|
+
dependencies,
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Loads and parses a package's model.yaml file.
|
|
185
|
+
*/
|
|
186
|
+
async loadPackageConfig(packageDir) {
|
|
187
|
+
const yamlPath = path.join(packageDir, 'model.yaml');
|
|
188
|
+
try {
|
|
189
|
+
const yamlContent = await fs.readFile(yamlPath, 'utf-8');
|
|
190
|
+
return this.parseYaml(yamlContent);
|
|
191
|
+
}
|
|
192
|
+
catch {
|
|
193
|
+
// No model.yaml found
|
|
194
|
+
return {};
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Parses model.yaml content.
|
|
199
|
+
*
|
|
200
|
+
* Expected structure:
|
|
201
|
+
* model:
|
|
202
|
+
* name: package-name
|
|
203
|
+
* version: 1.0.0
|
|
204
|
+
* entry: index.dlang
|
|
205
|
+
*
|
|
206
|
+
* dependencies:
|
|
207
|
+
* package-name:
|
|
208
|
+
* source: owner/repo
|
|
209
|
+
* version: ^1.0.0
|
|
210
|
+
*/
|
|
211
|
+
parseYaml(content) {
|
|
212
|
+
const parsed = YAML.parse(content);
|
|
213
|
+
const config = {};
|
|
214
|
+
if (parsed.model) {
|
|
215
|
+
config.name = parsed.model.name;
|
|
216
|
+
config.version = parsed.model.version;
|
|
217
|
+
config.main = parsed.model.entry;
|
|
218
|
+
}
|
|
219
|
+
if (parsed.dependencies) {
|
|
220
|
+
config.dependencies = {};
|
|
221
|
+
for (const [, depInfo] of Object.entries(parsed.dependencies)) {
|
|
222
|
+
if (depInfo.source) {
|
|
223
|
+
const versionConstraint = depInfo.version || 'main';
|
|
224
|
+
// Store as "source@version" for consistency with import resolution
|
|
225
|
+
config.dependencies[depInfo.source] = versionConstraint;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
return config;
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Loads an existing lock file from disk.
|
|
233
|
+
*/
|
|
234
|
+
static async loadLockFile(workspaceRoot) {
|
|
235
|
+
const lockPath = path.join(workspaceRoot, 'model.lock');
|
|
236
|
+
try {
|
|
237
|
+
const content = await fs.readFile(lockPath, 'utf-8');
|
|
238
|
+
return JSON.parse(content);
|
|
239
|
+
}
|
|
240
|
+
catch {
|
|
241
|
+
// No lock file
|
|
242
|
+
return undefined;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Parses a lock file from JSON format.
|
|
247
|
+
*/
|
|
248
|
+
static parseLockFile(content) {
|
|
249
|
+
return JSON.parse(content);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
//# sourceMappingURL=dependency-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dependency-resolver.js","sourceRoot":"","sources":["../../src/services/dependency-resolver.ts"],"names":[],"mappings":"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"}
|