@untangle-code/file-graph 0.0.0-stage → 0.1.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/LICENSE +661 -0
- package/NOTICE +90 -0
- package/README.md +284 -2
- package/THIRD_PARTY_LICENSES.md +29 -0
- package/dist/assignment.d.ts +15 -0
- package/dist/assignment.d.ts.map +1 -0
- package/dist/assignment.js +75 -0
- package/dist/assignment.js.map +1 -0
- package/dist/boundaries/endpoints.d.ts +11 -0
- package/dist/boundaries/endpoints.d.ts.map +1 -0
- package/dist/boundaries/endpoints.js +195 -0
- package/dist/boundaries/endpoints.js.map +1 -0
- package/dist/boundaries/index.d.ts +9 -0
- package/dist/boundaries/index.d.ts.map +1 -0
- package/dist/boundaries/index.js +93 -0
- package/dist/boundaries/index.js.map +1 -0
- package/dist/boundaries/requests.d.ts +12 -0
- package/dist/boundaries/requests.d.ts.map +1 -0
- package/dist/boundaries/requests.js +311 -0
- package/dist/boundaries/requests.js.map +1 -0
- package/dist/edges.d.ts +49 -0
- package/dist/edges.d.ts.map +1 -0
- package/dist/edges.js +223 -0
- package/dist/edges.js.map +1 -0
- package/dist/file-index.d.ts +37 -0
- package/dist/file-index.d.ts.map +1 -0
- package/dist/file-index.js +103 -0
- package/dist/file-index.js.map +1 -0
- package/dist/graph.d.ts +160 -0
- package/dist/graph.d.ts.map +1 -0
- package/dist/graph.js +448 -0
- package/dist/graph.js.map +1 -0
- package/dist/index.d.ts +35 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +48 -0
- package/dist/index.js.map +1 -0
- package/dist/metrics.d.ts +67 -0
- package/dist/metrics.d.ts.map +1 -0
- package/dist/metrics.js +272 -0
- package/dist/metrics.js.map +1 -0
- package/dist/package-catalog.d.ts +43 -0
- package/dist/package-catalog.d.ts.map +1 -0
- package/dist/package-catalog.js +136 -0
- package/dist/package-catalog.js.map +1 -0
- package/dist/paths.d.ts +56 -0
- package/dist/paths.d.ts.map +1 -0
- package/dist/paths.js +129 -0
- package/dist/paths.js.map +1 -0
- package/dist/persistence.d.ts +83 -0
- package/dist/persistence.d.ts.map +1 -0
- package/dist/persistence.js +538 -0
- package/dist/persistence.js.map +1 -0
- package/dist/resolve/candidates.d.ts +52 -0
- package/dist/resolve/candidates.d.ts.map +1 -0
- package/dist/resolve/candidates.js +202 -0
- package/dist/resolve/candidates.js.map +1 -0
- package/dist/resolve/package-exports.d.ts +31 -0
- package/dist/resolve/package-exports.d.ts.map +1 -0
- package/dist/resolve/package-exports.js +229 -0
- package/dist/resolve/package-exports.js.map +1 -0
- package/dist/resolve/pipeline.d.ts +11 -0
- package/dist/resolve/pipeline.d.ts.map +1 -0
- package/dist/resolve/pipeline.js +109 -0
- package/dist/resolve/pipeline.js.map +1 -0
- package/dist/resolve/resolvers.d.ts +25 -0
- package/dist/resolve/resolvers.d.ts.map +1 -0
- package/dist/resolve/resolvers.js +367 -0
- package/dist/resolve/resolvers.js.map +1 -0
- package/dist/restore.d.ts +75 -0
- package/dist/restore.d.ts.map +1 -0
- package/dist/restore.js +136 -0
- package/dist/restore.js.map +1 -0
- package/dist/topology/compose.d.ts +27 -0
- package/dist/topology/compose.d.ts.map +1 -0
- package/dist/topology/compose.js +208 -0
- package/dist/topology/compose.js.map +1 -0
- package/dist/topology/jsonc.d.ts +38 -0
- package/dist/topology/jsonc.d.ts.map +1 -0
- package/dist/topology/jsonc.js +137 -0
- package/dist/topology/jsonc.js.map +1 -0
- package/dist/topology/load.d.ts +61 -0
- package/dist/topology/load.d.ts.map +1 -0
- package/dist/topology/load.js +436 -0
- package/dist/topology/load.js.map +1 -0
- package/dist/topology/manifest.d.ts +48 -0
- package/dist/topology/manifest.d.ts.map +1 -0
- package/dist/topology/manifest.js +109 -0
- package/dist/topology/manifest.js.map +1 -0
- package/dist/topology/project-config.d.ts +39 -0
- package/dist/topology/project-config.d.ts.map +1 -0
- package/dist/topology/project-config.js +150 -0
- package/dist/topology/project-config.js.map +1 -0
- package/dist/topology/workspace-definition.d.ts +26 -0
- package/dist/topology/workspace-definition.d.ts.map +1 -0
- package/dist/topology/workspace-definition.js +104 -0
- package/dist/topology/workspace-definition.js.map +1 -0
- package/dist/traverse.d.ts +49 -0
- package/dist/traverse.d.ts.map +1 -0
- package/dist/traverse.js +167 -0
- package/dist/traverse.js.map +1 -0
- package/dist/types.d.ts +332 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +63 -3
- package/src/assignment.ts +83 -0
- package/src/boundaries/endpoints.ts +273 -0
- package/src/boundaries/index.ts +118 -0
- package/src/boundaries/requests.ts +411 -0
- package/src/edges.ts +334 -0
- package/src/file-index.ts +127 -0
- package/src/graph.ts +591 -0
- package/src/index.ts +58 -0
- package/src/metrics.ts +350 -0
- package/src/package-catalog.ts +145 -0
- package/src/paths.ts +138 -0
- package/src/persistence.ts +746 -0
- package/src/resolve/candidates.ts +230 -0
- package/src/resolve/package-exports.ts +268 -0
- package/src/resolve/pipeline.ts +140 -0
- package/src/resolve/resolvers.ts +468 -0
- package/src/restore.ts +201 -0
- package/src/topology/compose.ts +268 -0
- package/src/topology/jsonc.ts +147 -0
- package/src/topology/load.ts +644 -0
- package/src/topology/manifest.ts +132 -0
- package/src/topology/project-config.ts +183 -0
- package/src/topology/workspace-definition.ts +115 -0
- package/src/traverse.ts +232 -0
- package/src/types.ts +372 -0
|
@@ -0,0 +1,436 @@
|
|
|
1
|
+
import { buildSkipLedgerEntry, compareCodepoints, summarizeSkipReasons, } from "@untangle-code/domain";
|
|
2
|
+
import { WorkspacePackageCatalog, comparePackages } from "../package-catalog.js";
|
|
3
|
+
import { dirnameOf, normalizePath, normalizeSeparators, relativeToRoot } from "../paths.js";
|
|
4
|
+
import { COMPOSE_FILE_NAMES, parseComposeFile } from "./compose.js";
|
|
5
|
+
import { DEPENDENCY_FIELDS, isWorkspaceProtocol, parseManifest } from "./manifest.js";
|
|
6
|
+
import { resolveProjectConfig } from "./project-config.js";
|
|
7
|
+
import { matchesGlobSelection, parsePnpmWorkspace, splitGlobs } from "./workspace-definition.js";
|
|
8
|
+
/** Verzeichnisnamen, die der Topologielauf nie betritt. */
|
|
9
|
+
export const DEFAULT_IGNORED_DIRECTORIES = [
|
|
10
|
+
".git",
|
|
11
|
+
".hg",
|
|
12
|
+
".svn",
|
|
13
|
+
".turbo",
|
|
14
|
+
"__pycache__",
|
|
15
|
+
"build",
|
|
16
|
+
"coverage",
|
|
17
|
+
"dist",
|
|
18
|
+
"node_modules",
|
|
19
|
+
"out",
|
|
20
|
+
"target",
|
|
21
|
+
"vendor",
|
|
22
|
+
];
|
|
23
|
+
/** Baut die Topologie eines Workspace aus den Dateien seiner Repositories. */
|
|
24
|
+
export async function loadWorkspaceTopology(fs, options) {
|
|
25
|
+
const ignored = new Set(options.ignoredDirectories ?? DEFAULT_IGNORED_DIRECTORIES);
|
|
26
|
+
const maxDepth = options.maxDepth ?? 12;
|
|
27
|
+
const maxDirectories = options.maxDirectories ?? 20_000;
|
|
28
|
+
const skipped = [];
|
|
29
|
+
const manifestFiles = [];
|
|
30
|
+
const configFiles = [];
|
|
31
|
+
const composeFiles = [];
|
|
32
|
+
const workspaceFiles = [];
|
|
33
|
+
for (const repository of options.repositories) {
|
|
34
|
+
const root = normalizeSeparators(repository.rootPath);
|
|
35
|
+
let visited = 0;
|
|
36
|
+
let budgetReported = false;
|
|
37
|
+
const queue = [{ absolutePath: root, depth: 0 }];
|
|
38
|
+
while (queue.length > 0) {
|
|
39
|
+
const current = queue.shift();
|
|
40
|
+
if (visited >= maxDirectories) {
|
|
41
|
+
if (!budgetReported) {
|
|
42
|
+
budgetReported = true;
|
|
43
|
+
skipped.push(buildSkipLedgerEntry({
|
|
44
|
+
stage: "file_graph",
|
|
45
|
+
subjectKind: "file",
|
|
46
|
+
path: relativeToRoot(root, current.absolutePath) ?? current.absolutePath,
|
|
47
|
+
repoId: repository.repoId,
|
|
48
|
+
refId: repository.refId,
|
|
49
|
+
reason: "time_budget_exceeded",
|
|
50
|
+
detail: `topology walk stopped after ${String(maxDirectories)} directories in repository ${repository.repoId}; raise maxDirectories to see the rest`,
|
|
51
|
+
recoverable: true,
|
|
52
|
+
}));
|
|
53
|
+
}
|
|
54
|
+
break;
|
|
55
|
+
}
|
|
56
|
+
visited += 1;
|
|
57
|
+
let entries;
|
|
58
|
+
try {
|
|
59
|
+
entries = await fs.readDir(current.absolutePath);
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
skipped.push(buildSkipLedgerEntry({
|
|
63
|
+
stage: "file_graph",
|
|
64
|
+
subjectKind: "file",
|
|
65
|
+
path: relativeToRoot(root, current.absolutePath) ?? current.absolutePath,
|
|
66
|
+
repoId: repository.repoId,
|
|
67
|
+
refId: repository.refId,
|
|
68
|
+
reason: "resolution_failed",
|
|
69
|
+
detail: `directory could not be read: ${messageOf(error)}`,
|
|
70
|
+
recoverable: true,
|
|
71
|
+
}));
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
for (const entry of [...entries].sort((left, right) => compareCodepoints(left.name, right.name))) {
|
|
75
|
+
const absolutePath = normalizeSeparators(entry.path);
|
|
76
|
+
const relative = relativeToRoot(root, absolutePath);
|
|
77
|
+
if (relative === null) {
|
|
78
|
+
// Ein Eintrag ausserhalb der Repositorywurzel kann nur ueber einen
|
|
79
|
+
// Symlink entstehen; er wird gemeldet, nicht verfolgt.
|
|
80
|
+
skipped.push(buildSkipLedgerEntry({
|
|
81
|
+
stage: "file_graph",
|
|
82
|
+
subjectKind: "file",
|
|
83
|
+
path: absolutePath,
|
|
84
|
+
repoId: repository.repoId,
|
|
85
|
+
refId: repository.refId,
|
|
86
|
+
reason: "excluded_by_configuration",
|
|
87
|
+
detail: `entry lies outside the repository root ${root} and was not followed`,
|
|
88
|
+
recoverable: false,
|
|
89
|
+
}));
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
if (entry.kind === "directory") {
|
|
93
|
+
if (ignored.has(entry.name))
|
|
94
|
+
continue;
|
|
95
|
+
if (current.depth + 1 > maxDepth) {
|
|
96
|
+
skipped.push(buildSkipLedgerEntry({
|
|
97
|
+
stage: "file_graph",
|
|
98
|
+
subjectKind: "file",
|
|
99
|
+
path: relative,
|
|
100
|
+
repoId: repository.repoId,
|
|
101
|
+
refId: repository.refId,
|
|
102
|
+
reason: "excluded_by_configuration",
|
|
103
|
+
detail: `directory depth ${String(current.depth + 1)} exceeds maxDepth ${String(maxDepth)}`,
|
|
104
|
+
recoverable: true,
|
|
105
|
+
}));
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
queue.push({ absolutePath, depth: current.depth + 1 });
|
|
109
|
+
continue;
|
|
110
|
+
}
|
|
111
|
+
if (entry.kind !== "file")
|
|
112
|
+
continue;
|
|
113
|
+
const found = { repoId: repository.repoId, path: relative, absolutePath };
|
|
114
|
+
const name = entry.name;
|
|
115
|
+
if (name === "package.json") {
|
|
116
|
+
manifestFiles.push(found);
|
|
117
|
+
}
|
|
118
|
+
else if (/^tsconfig(\..+)?\.json$/i.test(name) || /^jsconfig(\..+)?\.json$/i.test(name)) {
|
|
119
|
+
configFiles.push(found);
|
|
120
|
+
}
|
|
121
|
+
else if (COMPOSE_FILE_NAMES.includes(name)) {
|
|
122
|
+
composeFiles.push(found);
|
|
123
|
+
}
|
|
124
|
+
else if (name === "pnpm-workspace.yaml" || name === "pnpm-workspace.yml") {
|
|
125
|
+
workspaceFiles.push(found);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
const repositoriesById = new Map(options.repositories.map((repository) => [repository.repoId, repository]));
|
|
131
|
+
// ---- Projektkonfigurationen ------------------------------------------
|
|
132
|
+
const configTexts = new Map();
|
|
133
|
+
for (const file of configFiles) {
|
|
134
|
+
try {
|
|
135
|
+
configTexts.set(configKey(file.repoId, file.path), await fs.readTextFile(file.absolutePath));
|
|
136
|
+
}
|
|
137
|
+
catch (error) {
|
|
138
|
+
skipped.push(ledgerEntry(repositoriesById, file, "resolution_failed", `project configuration unreadable: ${messageOf(error)}`, true));
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
const projectConfigs = new Map();
|
|
142
|
+
for (const file of configFiles) {
|
|
143
|
+
const result = resolveProjectConfig(file.path, (path) => {
|
|
144
|
+
const text = configTexts.get(configKey(file.repoId, path));
|
|
145
|
+
if (text !== undefined)
|
|
146
|
+
return text;
|
|
147
|
+
// `extends`-Ziele koennen ausserhalb des Suchbereichs liegen (z. B. in
|
|
148
|
+
// node_modules). Sie werden nicht nachgeladen — das meldet
|
|
149
|
+
// `resolveProjectConfig` als Warnung, die hier ins Ledger geht.
|
|
150
|
+
return null;
|
|
151
|
+
});
|
|
152
|
+
if (!result.ok) {
|
|
153
|
+
skipped.push(ledgerEntry(repositoriesById, file, "resolution_failed", `project configuration could not be evaluated: ${result.error}`, false));
|
|
154
|
+
continue;
|
|
155
|
+
}
|
|
156
|
+
for (const warning of result.warnings) {
|
|
157
|
+
skipped.push(ledgerEntry(repositoriesById, file, "resolution_failed", `project configuration partially evaluated: ${warning}`, false));
|
|
158
|
+
}
|
|
159
|
+
projectConfigs.set(configKey(file.repoId, file.path), {
|
|
160
|
+
repoId: file.repoId,
|
|
161
|
+
config: result.config,
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
// ---- Workspace-Globs --------------------------------------------------
|
|
165
|
+
const globsByRepo = new Map();
|
|
166
|
+
for (const file of workspaceFiles) {
|
|
167
|
+
try {
|
|
168
|
+
const text = await fs.readTextFile(file.absolutePath);
|
|
169
|
+
const parsed = parsePnpmWorkspace(text);
|
|
170
|
+
if (!parsed.ok) {
|
|
171
|
+
skipped.push(ledgerEntry(repositoriesById, file, "resolution_failed", `workspace definition unreadable: ${parsed.error}`, false));
|
|
172
|
+
continue;
|
|
173
|
+
}
|
|
174
|
+
const existing = globsByRepo.get(file.repoId) ?? [];
|
|
175
|
+
globsByRepo.set(file.repoId, [...existing, ...parsed.globs]);
|
|
176
|
+
}
|
|
177
|
+
catch (error) {
|
|
178
|
+
skipped.push(ledgerEntry(repositoriesById, file, "resolution_failed", `workspace definition unreadable: ${messageOf(error)}`, true));
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
// ---- Manifeste --------------------------------------------------------
|
|
182
|
+
const manifests = [];
|
|
183
|
+
for (const file of manifestFiles) {
|
|
184
|
+
let text;
|
|
185
|
+
try {
|
|
186
|
+
text = await fs.readTextFile(file.absolutePath);
|
|
187
|
+
}
|
|
188
|
+
catch (error) {
|
|
189
|
+
skipped.push(ledgerEntry(repositoriesById, file, "resolution_failed", `manifest unreadable: ${messageOf(error)}`, true));
|
|
190
|
+
continue;
|
|
191
|
+
}
|
|
192
|
+
const parsed = parseManifest(text);
|
|
193
|
+
if (!parsed.ok) {
|
|
194
|
+
skipped.push(ledgerEntry(repositoriesById, file, "parse_failed", `manifest could not be parsed: ${parsed.error}`, false));
|
|
195
|
+
continue;
|
|
196
|
+
}
|
|
197
|
+
manifests.push({ file, manifest: parsed.manifest });
|
|
198
|
+
if (parsed.manifest.workspaceGlobs.length > 0 && dirnameOf(file.path) === "") {
|
|
199
|
+
const existing = globsByRepo.get(file.repoId) ?? [];
|
|
200
|
+
globsByRepo.set(file.repoId, [...existing, ...parsed.manifest.workspaceGlobs]);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
// ---- Pakete -----------------------------------------------------------
|
|
204
|
+
const packages = [];
|
|
205
|
+
const manifestByPackage = new Map();
|
|
206
|
+
for (const { file, manifest } of manifests) {
|
|
207
|
+
const packageDir = dirnameOf(file.path);
|
|
208
|
+
const globs = globsByRepo.get(file.repoId) ?? [];
|
|
209
|
+
const selection = splitGlobs(globs);
|
|
210
|
+
const isRoot = packageDir === "";
|
|
211
|
+
if (!isRoot && globs.length > 0 && !matchesGlobSelection(selection, packageDir)) {
|
|
212
|
+
skipped.push(ledgerEntry(repositoriesById, file, "excluded_by_configuration", `manifest directory "${packageDir}" matches no workspace glob (${globs.join(", ")})`, false));
|
|
213
|
+
continue;
|
|
214
|
+
}
|
|
215
|
+
if (manifest.name === undefined) {
|
|
216
|
+
skipped.push(ledgerEntry(repositoriesById, file, "resolution_failed", 'manifest has no "name" and can therefore not enter the package catalog', false));
|
|
217
|
+
continue;
|
|
218
|
+
}
|
|
219
|
+
const entry = {
|
|
220
|
+
name: manifest.name,
|
|
221
|
+
repoId: file.repoId,
|
|
222
|
+
packageDir,
|
|
223
|
+
manifestPath: file.path,
|
|
224
|
+
workspaceDependencies: [],
|
|
225
|
+
externalDependencies: {},
|
|
226
|
+
};
|
|
227
|
+
if (manifest.version !== undefined)
|
|
228
|
+
entry.version = manifest.version;
|
|
229
|
+
if (manifest.main !== undefined)
|
|
230
|
+
entry.main = manifest.main;
|
|
231
|
+
if (manifest.module !== undefined)
|
|
232
|
+
entry.module = manifest.module;
|
|
233
|
+
if (manifest.types !== undefined)
|
|
234
|
+
entry.types = manifest.types;
|
|
235
|
+
if (manifest.exports !== undefined)
|
|
236
|
+
entry.exports = manifest.exports;
|
|
237
|
+
if (manifest.imports !== undefined)
|
|
238
|
+
entry.imports = manifest.imports;
|
|
239
|
+
const configPath = packageDir === "" ? "tsconfig.json" : `${packageDir}/tsconfig.json`;
|
|
240
|
+
const config = projectConfigs.get(configKey(file.repoId, configPath))?.config;
|
|
241
|
+
if (config?.outDir !== undefined)
|
|
242
|
+
entry.outDir = config.outDir;
|
|
243
|
+
if (config?.rootDir !== undefined)
|
|
244
|
+
entry.rootDir = config.rootDir;
|
|
245
|
+
packages.push(entry);
|
|
246
|
+
// Das Manifest wird ueber die IDENTITAET des Pakets zurueckgehalten
|
|
247
|
+
// (Repository plus Manifestpfad), nicht ueber seinen Namen: gleichnamige
|
|
248
|
+
// Pakete zweier Repositories wuerden sonst einander verdecken, und ein
|
|
249
|
+
// Paket bekaeme die Abhaengigkeiten eines fremden.
|
|
250
|
+
manifestByPackage.set(packageKey(entry), manifest);
|
|
251
|
+
}
|
|
252
|
+
// Kanonische Ordnung: der Name allein ist bei gleichnamigen Paketen keine
|
|
253
|
+
// eindeutige Sortierung und damit kein Determinismus.
|
|
254
|
+
packages.sort(comparePackages);
|
|
255
|
+
const catalog = new WorkspacePackageCatalog(packages);
|
|
256
|
+
for (const name of catalog.ambiguousNames()) {
|
|
257
|
+
const owners = catalog.byPackageName(name);
|
|
258
|
+
// Der Massstab ist die Zahl der MANIFESTE, nicht die der Repositories:
|
|
259
|
+
// zwei gleichnamige Manifeste EINES Repositories machen jeden Import auf
|
|
260
|
+
// den Namen genauso unentscheidbar wie zwei Repositories — und dieser
|
|
261
|
+
// Fall blieb frueher ungemeldet, weil nur `repos.size > 1` gefragt wurde.
|
|
262
|
+
const repos = new Set(owners.map((owner) => owner.repoId));
|
|
263
|
+
const scope = repos.size === 1
|
|
264
|
+
? `within the single repository "${[...repos][0]}"`
|
|
265
|
+
: owners.length > repos.size
|
|
266
|
+
? "in different repositories, and more than once within at least one of them"
|
|
267
|
+
: "in different repositories";
|
|
268
|
+
skipped.push(buildSkipLedgerEntry({
|
|
269
|
+
stage: "file_graph",
|
|
270
|
+
subjectKind: "file",
|
|
271
|
+
reason: "ambiguous_resolution",
|
|
272
|
+
detail: `package name "${name}" is declared by ${String(owners.length)} manifests ${scope} (${owners
|
|
273
|
+
.map((owner) => `${owner.repoId}:${owner.manifestPath}`)
|
|
274
|
+
.join(", ")}); a reference to it is attributed to the declaring repository first and reported as ambiguous whenever it cannot be attributed to exactly one manifest`,
|
|
275
|
+
recoverable: false,
|
|
276
|
+
}));
|
|
277
|
+
}
|
|
278
|
+
// ---- Paketkanten ------------------------------------------------------
|
|
279
|
+
const packageEdges = [];
|
|
280
|
+
for (const entry of packages) {
|
|
281
|
+
const manifest = manifestByPackage.get(packageKey(entry));
|
|
282
|
+
if (manifest === undefined)
|
|
283
|
+
continue;
|
|
284
|
+
const workspaceDependencies = new Set();
|
|
285
|
+
const externalDependencies = {};
|
|
286
|
+
for (const field of DEPENDENCY_FIELDS) {
|
|
287
|
+
for (const [name, range] of Object.entries(manifest.dependencies[field])) {
|
|
288
|
+
// Aus der Sicht des DEKLARIERENDEN Repositories nachschlagen: das
|
|
289
|
+
// eigene `shared-lib` ist gemeint, nicht das gleichnamige nebenan.
|
|
290
|
+
const lookup = catalog.lookup(entry.repoId, name);
|
|
291
|
+
const target = lookup.status === "found" ? lookup.entry : null;
|
|
292
|
+
// Ein Paketname, der im Katalog steht, IST eine Workspace-Kante —
|
|
293
|
+
// auch ohne `workspace:`-Praefix. pnpm loest `"^1.0.0"` auf ein
|
|
294
|
+
// lokales Paket auf, wenn dessen Version passt; wer nur auf das
|
|
295
|
+
// Protokoll schaut, verliert genau diese Kanten.
|
|
296
|
+
if (target !== null && packageKey(target) !== packageKey(entry)) {
|
|
297
|
+
workspaceDependencies.add(name);
|
|
298
|
+
packageEdges.push({
|
|
299
|
+
fromPackage: entry.name,
|
|
300
|
+
toPackage: name,
|
|
301
|
+
kind: "workspace-dependency",
|
|
302
|
+
dependencyField: field,
|
|
303
|
+
rawRange: range,
|
|
304
|
+
});
|
|
305
|
+
continue;
|
|
306
|
+
}
|
|
307
|
+
if (lookup.status === "ambiguous") {
|
|
308
|
+
// Der Name steht im Workspace, aber nicht auf genau einem Manifest:
|
|
309
|
+
// entweder in mehreren fremden Repositories oder mehrfach im
|
|
310
|
+
// eigenen. Weder Workspace-Kante noch externe Abhaengigkeit waere
|
|
311
|
+
// belegbar — also wird der Fall benannt, nicht geraten.
|
|
312
|
+
skipped.push(buildSkipLedgerEntry({
|
|
313
|
+
stage: "file_graph",
|
|
314
|
+
subjectKind: "file",
|
|
315
|
+
path: entry.manifestPath,
|
|
316
|
+
repoId: entry.repoId,
|
|
317
|
+
...(repositoriesById.get(entry.repoId) === undefined
|
|
318
|
+
? {}
|
|
319
|
+
: { refId: repositoriesById.get(entry.repoId).refId }),
|
|
320
|
+
reason: "ambiguous_resolution",
|
|
321
|
+
detail: `package "${entry.name}" declares "${name}" in ${field}, but "${name}" is declared by ${String(lookup.candidates.length)} manifests [${lookup.candidates
|
|
322
|
+
.map((candidate) => `${candidate.repoId}:${candidate.manifestPath}`)
|
|
323
|
+
.join(", ")}] and none of them is the single candidate for repository "${entry.repoId}"; no package edge is recorded`,
|
|
324
|
+
recoverable: false,
|
|
325
|
+
}));
|
|
326
|
+
continue;
|
|
327
|
+
}
|
|
328
|
+
if (!isWorkspaceProtocol(range)) {
|
|
329
|
+
externalDependencies[name] = range;
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
entry.workspaceDependencies = [...workspaceDependencies].sort(compareCodepoints);
|
|
334
|
+
entry.externalDependencies = externalDependencies;
|
|
335
|
+
}
|
|
336
|
+
packageEdges.sort((left, right) => compareCodepoints(left.fromPackage, right.fromPackage) ||
|
|
337
|
+
compareCodepoints(left.toPackage, right.toPackage) ||
|
|
338
|
+
compareCodepoints(left.dependencyField, right.dependencyField));
|
|
339
|
+
// ---- Dienste ----------------------------------------------------------
|
|
340
|
+
const services = [];
|
|
341
|
+
const serviceEdges = [];
|
|
342
|
+
for (const file of composeFiles) {
|
|
343
|
+
let text;
|
|
344
|
+
try {
|
|
345
|
+
text = await fs.readTextFile(file.absolutePath);
|
|
346
|
+
}
|
|
347
|
+
catch (error) {
|
|
348
|
+
skipped.push(ledgerEntry(repositoriesById, file, "resolution_failed", `compose file unreadable: ${messageOf(error)}`, true));
|
|
349
|
+
continue;
|
|
350
|
+
}
|
|
351
|
+
const parsed = parseComposeFile(file.repoId, file.path, text);
|
|
352
|
+
if (!parsed.ok) {
|
|
353
|
+
skipped.push(ledgerEntry(repositoriesById, file, "parse_failed", `compose file could not be parsed: ${parsed.error}`, false));
|
|
354
|
+
continue;
|
|
355
|
+
}
|
|
356
|
+
for (const warning of parsed.result.warnings) {
|
|
357
|
+
skipped.push(ledgerEntry(repositoriesById, file, "resolution_failed", `compose file partially read: ${warning}`, false));
|
|
358
|
+
}
|
|
359
|
+
services.push(...parsed.result.services);
|
|
360
|
+
serviceEdges.push(...parsed.result.edges);
|
|
361
|
+
}
|
|
362
|
+
services.sort((left, right) => compareCodepoints(left.composeFile, right.composeFile) ||
|
|
363
|
+
compareCodepoints(left.name, right.name));
|
|
364
|
+
const workspaceGlobs = [...new Set([...globsByRepo.values()].flat())].sort(compareCodepoints);
|
|
365
|
+
const topology = {
|
|
366
|
+
schemaVersion: 1,
|
|
367
|
+
workspaceId: options.workspaceId,
|
|
368
|
+
workspaceGlobs,
|
|
369
|
+
packages,
|
|
370
|
+
packageEdges,
|
|
371
|
+
services,
|
|
372
|
+
serviceEdges,
|
|
373
|
+
skipped: {
|
|
374
|
+
schemaVersion: 1,
|
|
375
|
+
generationId: options.generationId,
|
|
376
|
+
entries: skipped,
|
|
377
|
+
countsByReason: summarizeSkipReasons(skipped),
|
|
378
|
+
},
|
|
379
|
+
};
|
|
380
|
+
return { topology, projectConfigs };
|
|
381
|
+
}
|
|
382
|
+
/** Schluessel eines Konfigurationsfundes: Repository plus repo-relativer Pfad. */
|
|
383
|
+
export function configKey(repoId, path) {
|
|
384
|
+
return `${repoId}\u001f${normalizePath(path)}`;
|
|
385
|
+
}
|
|
386
|
+
/**
|
|
387
|
+
* Aliasregeln aller gelesenen Projektkonfigurationen, in stabiler Reihenfolge.
|
|
388
|
+
*
|
|
389
|
+
* Die Reihenfolge ist „spezifischstes Muster zuerst": ein Muster ohne `*`
|
|
390
|
+
* schlaegt eines mit `*`, und laengere Praefixe schlagen kuerzere. Genau so
|
|
391
|
+
* loest TypeScript `paths` auf; ohne diese Ordnung wuerde `@app/*` ein
|
|
392
|
+
* konkretes `@app/core` verdecken.
|
|
393
|
+
*/
|
|
394
|
+
export function aliasRulesFromConfigs(configs) {
|
|
395
|
+
const rules = [];
|
|
396
|
+
for (const { repoId, config } of configs.values()) {
|
|
397
|
+
for (const [pattern, targets] of Object.entries(config.paths)) {
|
|
398
|
+
rules.push({ pattern, targets: [...targets], repoId, source: config.configPath });
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
rules.sort((left, right) => {
|
|
402
|
+
const leftStar = left.pattern.includes("*") ? 1 : 0;
|
|
403
|
+
const rightStar = right.pattern.includes("*") ? 1 : 0;
|
|
404
|
+
if (leftStar !== rightStar)
|
|
405
|
+
return leftStar - rightStar;
|
|
406
|
+
const leftPrefix = left.pattern.split("*")[0]?.length ?? 0;
|
|
407
|
+
const rightPrefix = right.pattern.split("*")[0]?.length ?? 0;
|
|
408
|
+
if (leftPrefix !== rightPrefix)
|
|
409
|
+
return rightPrefix - leftPrefix;
|
|
410
|
+
return (compareCodepoints(left.pattern, right.pattern) ||
|
|
411
|
+
compareCodepoints(left.source, right.source) ||
|
|
412
|
+
compareCodepoints(left.repoId, right.repoId));
|
|
413
|
+
});
|
|
414
|
+
return rules;
|
|
415
|
+
}
|
|
416
|
+
function ledgerEntry(repositories, file, reason, detail, recoverable) {
|
|
417
|
+
const repository = repositories.get(file.repoId);
|
|
418
|
+
return buildSkipLedgerEntry({
|
|
419
|
+
stage: "file_graph",
|
|
420
|
+
subjectKind: "file",
|
|
421
|
+
path: file.path,
|
|
422
|
+
repoId: file.repoId,
|
|
423
|
+
...(repository === undefined ? {} : { refId: repository.refId }),
|
|
424
|
+
reason,
|
|
425
|
+
detail,
|
|
426
|
+
recoverable,
|
|
427
|
+
});
|
|
428
|
+
}
|
|
429
|
+
/** Identitaet eines Pakets: Repository plus Manifestpfad, nicht der Name. */
|
|
430
|
+
function packageKey(entry) {
|
|
431
|
+
return `${entry.repoId}\u001f${entry.manifestPath}`;
|
|
432
|
+
}
|
|
433
|
+
function messageOf(error) {
|
|
434
|
+
return error instanceof Error ? error.message : String(error);
|
|
435
|
+
}
|
|
436
|
+
//# sourceMappingURL=load.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"load.js","sourceRoot":"","sources":["../../src/topology/load.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/** Abhaengigkeitsbloecke eines Manifests, in Auswertungsreihenfolge. */
|
|
2
|
+
export declare const DEPENDENCY_FIELDS: readonly ["dependencies", "devDependencies", "peerDependencies", "optionalDependencies"];
|
|
3
|
+
export type DependencyField = (typeof DEPENDENCY_FIELDS)[number];
|
|
4
|
+
/** Ausgewertetes Manifest. */
|
|
5
|
+
export interface ManifestV1 {
|
|
6
|
+
name?: string;
|
|
7
|
+
version?: string;
|
|
8
|
+
main?: string;
|
|
9
|
+
module?: string;
|
|
10
|
+
types?: string;
|
|
11
|
+
exports?: unknown;
|
|
12
|
+
imports?: unknown;
|
|
13
|
+
/** Block → (Paketname → Versionsangabe). */
|
|
14
|
+
dependencies: Record<DependencyField, Record<string, string>>;
|
|
15
|
+
/** `workspaces`-Feld (npm/Yarn), falls vorhanden. */
|
|
16
|
+
workspaceGlobs: string[];
|
|
17
|
+
}
|
|
18
|
+
export type ManifestParseResult = {
|
|
19
|
+
ok: true;
|
|
20
|
+
manifest: ManifestV1;
|
|
21
|
+
} | {
|
|
22
|
+
ok: false;
|
|
23
|
+
error: string;
|
|
24
|
+
};
|
|
25
|
+
/** Liest ein Manifest. Wirft nie — ein kaputtes Manifest ist ein Befund, kein Absturz. */
|
|
26
|
+
export declare function parseManifest(text: string): ManifestParseResult;
|
|
27
|
+
/**
|
|
28
|
+
* True, wenn eine Versionsangabe auf ein Paket DESSELBEN Workspace zeigt.
|
|
29
|
+
*
|
|
30
|
+
* `workspace:*` ist das pnpm-/Yarn-Protokoll. `link:` und `file:` zeigen
|
|
31
|
+
* ebenfalls in den Workspace, sind aber keine Katalogeintraege — sie werden
|
|
32
|
+
* hier bewusst NICHT als Workspace-Abhaengigkeit gezaehlt, weil ihr Ziel ein
|
|
33
|
+
* Pfad und kein Paketname ist; der Pfadfall gehoert in den Resolver, nicht in
|
|
34
|
+
* die Topologie.
|
|
35
|
+
*/
|
|
36
|
+
export declare function isWorkspaceProtocol(range: string): boolean;
|
|
37
|
+
/** Alle deklarierten Abhaengigkeiten, dedupliziert und codepoint-sortiert. */
|
|
38
|
+
export declare function declaredDependencyNames(manifest: ManifestV1): string[];
|
|
39
|
+
/**
|
|
40
|
+
* Versionsangabe eines Pakets im ersten Block, der es nennt. Reihenfolge ist
|
|
41
|
+
* `DEPENDENCY_FIELDS`, damit dieselbe Antwort unabhaengig von der
|
|
42
|
+
* Schluesselreihenfolge im JSON herauskommt.
|
|
43
|
+
*/
|
|
44
|
+
export declare function declaredRangeOf(manifest: ManifestV1, packageName: string): {
|
|
45
|
+
field: DependencyField;
|
|
46
|
+
range: string;
|
|
47
|
+
} | null;
|
|
48
|
+
//# sourceMappingURL=manifest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../src/topology/manifest.ts"],"names":[],"mappings":"AAaA,wEAAwE;AACxE,eAAO,MAAM,iBAAiB,0FAKpB,CAAC;AAEX,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEjE,8BAA8B;AAC9B,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,4CAA4C;IAC5C,YAAY,EAAE,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC9D,qDAAqD;IACrD,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,MAAM,MAAM,mBAAmB,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,UAAU,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEpG,0FAA0F;AAC1F,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,mBAAmB,CA8B/D;AAoBD;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAE1D;AAED,8EAA8E;AAC9E,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,UAAU,GAAG,MAAM,EAAE,CAQtE;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,UAAU,EACpB,WAAW,EAAE,MAAM,GAClB;IAAE,KAAK,EAAE,eAAe,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAQlD"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Paketmanifest (`package.json`) → auswertbare Form.
|
|
3
|
+
*
|
|
4
|
+
* Nur die Felder, die fuer Aufloesung und Topologie zaehlen. Alles andere
|
|
5
|
+
* bleibt unangetastet; `exports`/`imports` werden ABSICHTLICH als `unknown`
|
|
6
|
+
* durchgereicht, weil ihre Grammatik (verschachtelte Bedingungen, Arrays,
|
|
7
|
+
* Subpath-Muster) im Resolver ausgewertet wird und eine Vorab-Normalisierung
|
|
8
|
+
* hier Information vernichten wuerde.
|
|
9
|
+
*/
|
|
10
|
+
import { compareCodepoints } from "@untangle-code/domain";
|
|
11
|
+
import { isJsonObject, parseJsonc, stringField, stringRecordField } from "./jsonc.js";
|
|
12
|
+
/** Abhaengigkeitsbloecke eines Manifests, in Auswertungsreihenfolge. */
|
|
13
|
+
export const DEPENDENCY_FIELDS = [
|
|
14
|
+
"dependencies",
|
|
15
|
+
"devDependencies",
|
|
16
|
+
"peerDependencies",
|
|
17
|
+
"optionalDependencies",
|
|
18
|
+
];
|
|
19
|
+
/** Liest ein Manifest. Wirft nie — ein kaputtes Manifest ist ein Befund, kein Absturz. */
|
|
20
|
+
export function parseManifest(text) {
|
|
21
|
+
const parsed = parseJsonc(text);
|
|
22
|
+
if (!parsed.ok) {
|
|
23
|
+
return { ok: false, error: parsed.error };
|
|
24
|
+
}
|
|
25
|
+
if (!isJsonObject(parsed.value)) {
|
|
26
|
+
return { ok: false, error: "manifest root is not a JSON object" };
|
|
27
|
+
}
|
|
28
|
+
const root = parsed.value;
|
|
29
|
+
const dependencies = {};
|
|
30
|
+
for (const field of DEPENDENCY_FIELDS) {
|
|
31
|
+
dependencies[field] = stringRecordField(root, field);
|
|
32
|
+
}
|
|
33
|
+
const manifest = {
|
|
34
|
+
dependencies,
|
|
35
|
+
workspaceGlobs: readWorkspaceGlobs(root),
|
|
36
|
+
};
|
|
37
|
+
const name = stringField(root, "name");
|
|
38
|
+
if (name !== undefined)
|
|
39
|
+
manifest.name = name;
|
|
40
|
+
const version = stringField(root, "version");
|
|
41
|
+
if (version !== undefined)
|
|
42
|
+
manifest.version = version;
|
|
43
|
+
const main = stringField(root, "main");
|
|
44
|
+
if (main !== undefined)
|
|
45
|
+
manifest.main = main;
|
|
46
|
+
const moduleField = stringField(root, "module");
|
|
47
|
+
if (moduleField !== undefined)
|
|
48
|
+
manifest.module = moduleField;
|
|
49
|
+
const types = stringField(root, "types");
|
|
50
|
+
if (types !== undefined)
|
|
51
|
+
manifest.types = types;
|
|
52
|
+
if (root["exports"] !== undefined)
|
|
53
|
+
manifest.exports = root["exports"];
|
|
54
|
+
if (root["imports"] !== undefined)
|
|
55
|
+
manifest.imports = root["imports"];
|
|
56
|
+
return { ok: true, manifest };
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* `workspaces` kennt zwei Schreibweisen: eine Liste von Globmustern und ein
|
|
60
|
+
* Objekt mit `packages`. Beide werden gelesen — die Objektform stammt aus
|
|
61
|
+
* Yarn und faellt sonst still unter den Tisch.
|
|
62
|
+
*/
|
|
63
|
+
function readWorkspaceGlobs(root) {
|
|
64
|
+
const value = root["workspaces"];
|
|
65
|
+
if (Array.isArray(value)) {
|
|
66
|
+
return value.filter((entry) => typeof entry === "string");
|
|
67
|
+
}
|
|
68
|
+
if (isJsonObject(value) && Array.isArray(value["packages"])) {
|
|
69
|
+
return value["packages"].filter((entry) => typeof entry === "string");
|
|
70
|
+
}
|
|
71
|
+
return [];
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* True, wenn eine Versionsangabe auf ein Paket DESSELBEN Workspace zeigt.
|
|
75
|
+
*
|
|
76
|
+
* `workspace:*` ist das pnpm-/Yarn-Protokoll. `link:` und `file:` zeigen
|
|
77
|
+
* ebenfalls in den Workspace, sind aber keine Katalogeintraege — sie werden
|
|
78
|
+
* hier bewusst NICHT als Workspace-Abhaengigkeit gezaehlt, weil ihr Ziel ein
|
|
79
|
+
* Pfad und kein Paketname ist; der Pfadfall gehoert in den Resolver, nicht in
|
|
80
|
+
* die Topologie.
|
|
81
|
+
*/
|
|
82
|
+
export function isWorkspaceProtocol(range) {
|
|
83
|
+
return range.startsWith("workspace:");
|
|
84
|
+
}
|
|
85
|
+
/** Alle deklarierten Abhaengigkeiten, dedupliziert und codepoint-sortiert. */
|
|
86
|
+
export function declaredDependencyNames(manifest) {
|
|
87
|
+
const names = new Set();
|
|
88
|
+
for (const field of DEPENDENCY_FIELDS) {
|
|
89
|
+
for (const name of Object.keys(manifest.dependencies[field])) {
|
|
90
|
+
names.add(name);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return [...names].sort(compareCodepoints);
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Versionsangabe eines Pakets im ersten Block, der es nennt. Reihenfolge ist
|
|
97
|
+
* `DEPENDENCY_FIELDS`, damit dieselbe Antwort unabhaengig von der
|
|
98
|
+
* Schluesselreihenfolge im JSON herauskommt.
|
|
99
|
+
*/
|
|
100
|
+
export function declaredRangeOf(manifest, packageName) {
|
|
101
|
+
for (const field of DEPENDENCY_FIELDS) {
|
|
102
|
+
const range = manifest.dependencies[field][packageName];
|
|
103
|
+
if (range !== undefined) {
|
|
104
|
+
return { field, range };
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return null;
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=manifest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../src/topology/manifest.ts"],"names":[],"mappings":"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"}
|