@untangle-code/file-graph 0.0.0-stage → 0.1.1

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 (130) hide show
  1. package/LICENSE +661 -0
  2. package/NOTICE +90 -0
  3. package/README.md +284 -2
  4. package/THIRD_PARTY_LICENSES.md +29 -0
  5. package/dist/assignment.d.ts +15 -0
  6. package/dist/assignment.d.ts.map +1 -0
  7. package/dist/assignment.js +75 -0
  8. package/dist/assignment.js.map +1 -0
  9. package/dist/boundaries/endpoints.d.ts +11 -0
  10. package/dist/boundaries/endpoints.d.ts.map +1 -0
  11. package/dist/boundaries/endpoints.js +195 -0
  12. package/dist/boundaries/endpoints.js.map +1 -0
  13. package/dist/boundaries/index.d.ts +9 -0
  14. package/dist/boundaries/index.d.ts.map +1 -0
  15. package/dist/boundaries/index.js +93 -0
  16. package/dist/boundaries/index.js.map +1 -0
  17. package/dist/boundaries/requests.d.ts +12 -0
  18. package/dist/boundaries/requests.d.ts.map +1 -0
  19. package/dist/boundaries/requests.js +311 -0
  20. package/dist/boundaries/requests.js.map +1 -0
  21. package/dist/edges.d.ts +49 -0
  22. package/dist/edges.d.ts.map +1 -0
  23. package/dist/edges.js +223 -0
  24. package/dist/edges.js.map +1 -0
  25. package/dist/file-index.d.ts +37 -0
  26. package/dist/file-index.d.ts.map +1 -0
  27. package/dist/file-index.js +103 -0
  28. package/dist/file-index.js.map +1 -0
  29. package/dist/graph.d.ts +160 -0
  30. package/dist/graph.d.ts.map +1 -0
  31. package/dist/graph.js +448 -0
  32. package/dist/graph.js.map +1 -0
  33. package/dist/index.d.ts +35 -0
  34. package/dist/index.d.ts.map +1 -0
  35. package/dist/index.js +48 -0
  36. package/dist/index.js.map +1 -0
  37. package/dist/metrics.d.ts +67 -0
  38. package/dist/metrics.d.ts.map +1 -0
  39. package/dist/metrics.js +272 -0
  40. package/dist/metrics.js.map +1 -0
  41. package/dist/package-catalog.d.ts +43 -0
  42. package/dist/package-catalog.d.ts.map +1 -0
  43. package/dist/package-catalog.js +136 -0
  44. package/dist/package-catalog.js.map +1 -0
  45. package/dist/paths.d.ts +56 -0
  46. package/dist/paths.d.ts.map +1 -0
  47. package/dist/paths.js +129 -0
  48. package/dist/paths.js.map +1 -0
  49. package/dist/persistence.d.ts +83 -0
  50. package/dist/persistence.d.ts.map +1 -0
  51. package/dist/persistence.js +538 -0
  52. package/dist/persistence.js.map +1 -0
  53. package/dist/resolve/candidates.d.ts +52 -0
  54. package/dist/resolve/candidates.d.ts.map +1 -0
  55. package/dist/resolve/candidates.js +202 -0
  56. package/dist/resolve/candidates.js.map +1 -0
  57. package/dist/resolve/package-exports.d.ts +31 -0
  58. package/dist/resolve/package-exports.d.ts.map +1 -0
  59. package/dist/resolve/package-exports.js +229 -0
  60. package/dist/resolve/package-exports.js.map +1 -0
  61. package/dist/resolve/pipeline.d.ts +11 -0
  62. package/dist/resolve/pipeline.d.ts.map +1 -0
  63. package/dist/resolve/pipeline.js +109 -0
  64. package/dist/resolve/pipeline.js.map +1 -0
  65. package/dist/resolve/resolvers.d.ts +25 -0
  66. package/dist/resolve/resolvers.d.ts.map +1 -0
  67. package/dist/resolve/resolvers.js +367 -0
  68. package/dist/resolve/resolvers.js.map +1 -0
  69. package/dist/restore.d.ts +75 -0
  70. package/dist/restore.d.ts.map +1 -0
  71. package/dist/restore.js +136 -0
  72. package/dist/restore.js.map +1 -0
  73. package/dist/topology/compose.d.ts +27 -0
  74. package/dist/topology/compose.d.ts.map +1 -0
  75. package/dist/topology/compose.js +208 -0
  76. package/dist/topology/compose.js.map +1 -0
  77. package/dist/topology/jsonc.d.ts +38 -0
  78. package/dist/topology/jsonc.d.ts.map +1 -0
  79. package/dist/topology/jsonc.js +137 -0
  80. package/dist/topology/jsonc.js.map +1 -0
  81. package/dist/topology/load.d.ts +61 -0
  82. package/dist/topology/load.d.ts.map +1 -0
  83. package/dist/topology/load.js +436 -0
  84. package/dist/topology/load.js.map +1 -0
  85. package/dist/topology/manifest.d.ts +48 -0
  86. package/dist/topology/manifest.d.ts.map +1 -0
  87. package/dist/topology/manifest.js +109 -0
  88. package/dist/topology/manifest.js.map +1 -0
  89. package/dist/topology/project-config.d.ts +39 -0
  90. package/dist/topology/project-config.d.ts.map +1 -0
  91. package/dist/topology/project-config.js +150 -0
  92. package/dist/topology/project-config.js.map +1 -0
  93. package/dist/topology/workspace-definition.d.ts +26 -0
  94. package/dist/topology/workspace-definition.d.ts.map +1 -0
  95. package/dist/topology/workspace-definition.js +104 -0
  96. package/dist/topology/workspace-definition.js.map +1 -0
  97. package/dist/traverse.d.ts +49 -0
  98. package/dist/traverse.d.ts.map +1 -0
  99. package/dist/traverse.js +167 -0
  100. package/dist/traverse.js.map +1 -0
  101. package/dist/types.d.ts +332 -0
  102. package/dist/types.d.ts.map +1 -0
  103. package/dist/types.js +2 -0
  104. package/dist/types.js.map +1 -0
  105. package/package.json +63 -3
  106. package/src/assignment.ts +83 -0
  107. package/src/boundaries/endpoints.ts +273 -0
  108. package/src/boundaries/index.ts +118 -0
  109. package/src/boundaries/requests.ts +411 -0
  110. package/src/edges.ts +334 -0
  111. package/src/file-index.ts +127 -0
  112. package/src/graph.ts +591 -0
  113. package/src/index.ts +58 -0
  114. package/src/metrics.ts +350 -0
  115. package/src/package-catalog.ts +145 -0
  116. package/src/paths.ts +138 -0
  117. package/src/persistence.ts +746 -0
  118. package/src/resolve/candidates.ts +230 -0
  119. package/src/resolve/package-exports.ts +268 -0
  120. package/src/resolve/pipeline.ts +140 -0
  121. package/src/resolve/resolvers.ts +468 -0
  122. package/src/restore.ts +201 -0
  123. package/src/topology/compose.ts +268 -0
  124. package/src/topology/jsonc.ts +147 -0
  125. package/src/topology/load.ts +644 -0
  126. package/src/topology/manifest.ts +132 -0
  127. package/src/topology/project-config.ts +183 -0
  128. package/src/topology/workspace-definition.ts +115 -0
  129. package/src/traverse.ts +232 -0
  130. package/src/types.ts +372 -0
@@ -0,0 +1,367 @@
1
+ /**
2
+ * Die einzelnen Schritte der Resolver-Pipeline (architecture.md §16.2).
3
+ *
4
+ * Jeder Resolver ist rein: gleiche Eingabe, gleiche Ausgabe, kein
5
+ * Dateisystem, keine Uhr. Er liefert entweder ein Ergebnis (Treffer,
6
+ * externes Ziel oder benannter Fehlschlag) oder `null` — und `null` heisst
7
+ * genau „nicht meine Zustaendigkeit", nie „nicht gefunden". Diese
8
+ * Unterscheidung ist der Grund, warum ein nicht aufloesbarer Import am Ende
9
+ * einen SPRECHENDEN Grund traegt statt eines pauschalen „unresolved" (E4).
10
+ */
11
+ import { compareCodepoints } from "@untangle-code/domain";
12
+ import { dirnameOf, isRelativeSpecifier, joinRelative, normalizePath } from "../paths.js";
13
+ import { probeCandidates } from "./candidates.js";
14
+ import { resolvePackageImports, resolvePackageSubpath, splitPackageSpecifier, } from "./package-exports.js";
15
+ /**
16
+ * Modulnamen, die die Laufzeit selbst mitbringt. Bewusst als Liste und nicht
17
+ * ueber `node:module`s `builtinModules`: die Liste haengt sonst von der
18
+ * Node-Version der ANALYSIERENDEN Maschine ab, und dieselbe Codebasis haette
19
+ * je nach Rechner eine andere Import-Resolution-Rate.
20
+ */
21
+ export const RUNTIME_BUILTIN_MODULES = new Set([
22
+ "assert",
23
+ "async_hooks",
24
+ "buffer",
25
+ "child_process",
26
+ "cluster",
27
+ "console",
28
+ "constants",
29
+ "crypto",
30
+ "dgram",
31
+ "diagnostics_channel",
32
+ "dns",
33
+ "domain",
34
+ "events",
35
+ "fs",
36
+ "http",
37
+ "http2",
38
+ "https",
39
+ "inspector",
40
+ "module",
41
+ "net",
42
+ "os",
43
+ "path",
44
+ "perf_hooks",
45
+ "process",
46
+ "punycode",
47
+ "querystring",
48
+ "readline",
49
+ "repl",
50
+ "stream",
51
+ "string_decoder",
52
+ "sys",
53
+ "timers",
54
+ "tls",
55
+ "trace_events",
56
+ "tty",
57
+ "url",
58
+ "util",
59
+ "v8",
60
+ "vm",
61
+ "wasi",
62
+ "worker_threads",
63
+ "zlib",
64
+ ]);
65
+ /** Baut ein `unresolved`-Ergebnis mit Pflichtdetail und geprueften Kandidaten. */
66
+ function unresolved(reason, detail, tried = []) {
67
+ return {
68
+ status: "unresolved",
69
+ reason,
70
+ detail,
71
+ ...(tried.length > 0 ? { rejectedCandidates: [...tried].sort(compareCodepoints) } : {}),
72
+ };
73
+ }
74
+ // ---------------------------------------------------------------------------
75
+ // 1. Relative Pfade
76
+ // ---------------------------------------------------------------------------
77
+ export const relativePathResolver = {
78
+ name: "relative-path",
79
+ supports(specifier) {
80
+ return isRelativeSpecifier(specifier);
81
+ },
82
+ resolve(specifier, context) {
83
+ const base = joinRelative(dirnameOf(context.fromPath), specifier);
84
+ if (base === null) {
85
+ return unresolved("target_file_not_found", `relative specifier "${specifier}" from "${context.fromPath}" points above the repository root`);
86
+ }
87
+ const probe = probeCandidates(context, context.fromRepoId, base);
88
+ if (probe.path === null) {
89
+ return unresolved("target_file_not_found", `no file matched relative specifier "${specifier}" from "${context.fromPath}"`, probe.tried);
90
+ }
91
+ return {
92
+ status: "resolved",
93
+ mechanism: "relative-path",
94
+ targetRepoId: context.fromRepoId,
95
+ targetPath: probe.path,
96
+ };
97
+ },
98
+ };
99
+ // ---------------------------------------------------------------------------
100
+ // 2. Sprachaliase: Laufzeitmodule und `#`-Subpath-Imports
101
+ // ---------------------------------------------------------------------------
102
+ export const runtimeBuiltinResolver = {
103
+ name: "runtime-builtin",
104
+ supports(specifier) {
105
+ return (specifier.startsWith("node:") || RUNTIME_BUILTIN_MODULES.has(specifier.split("/")[0] ?? ""));
106
+ },
107
+ resolve(specifier) {
108
+ return {
109
+ status: "external",
110
+ mechanism: "language-alias",
111
+ packageName: specifier.startsWith("node:") ? specifier : `node:${specifier}`,
112
+ };
113
+ },
114
+ };
115
+ export const subpathImportResolver = {
116
+ name: "subpath-import",
117
+ supports(specifier) {
118
+ return specifier.startsWith("#");
119
+ },
120
+ resolve(specifier, context) {
121
+ const owner = context.fromPackage;
122
+ if (owner === undefined) {
123
+ return unresolved("package_not_in_workspace_catalog", `subpath import "${specifier}" requires an owning package, but "${context.fromPath}" is not assigned to one`);
124
+ }
125
+ const matched = resolvePackageImports(owner, specifier);
126
+ return targetOrFailure(matched, context, owner.repoId, specifier, "language-alias", owner.name);
127
+ },
128
+ };
129
+ // ---------------------------------------------------------------------------
130
+ // 3./4. Projekt-Aliase und konfigurierte Aliase
131
+ // ---------------------------------------------------------------------------
132
+ function aliasResolver(name, mechanism, pick) {
133
+ return {
134
+ name,
135
+ supports(specifier, context) {
136
+ return pick(context).some((rule) => rule.repoId === context.fromRepoId && matchAlias(rule.pattern, specifier) !== null);
137
+ },
138
+ resolve(specifier, context) {
139
+ const tried = [];
140
+ for (const rule of pick(context)) {
141
+ if (rule.repoId !== context.fromRepoId)
142
+ continue;
143
+ const captured = matchAlias(rule.pattern, specifier);
144
+ if (captured === null)
145
+ continue;
146
+ for (const target of rule.targets) {
147
+ const base = target.includes("*") ? target.split("*").join(captured) : target;
148
+ const probe = probeCandidates(context, context.fromRepoId, base);
149
+ tried.push(...probe.tried);
150
+ if (probe.path !== null) {
151
+ return {
152
+ status: "resolved",
153
+ mechanism,
154
+ targetRepoId: context.fromRepoId,
155
+ targetPath: probe.path,
156
+ };
157
+ }
158
+ }
159
+ }
160
+ return unresolved("alias_configured_but_target_missing", `an alias rule matched "${specifier}" but none of its targets exists`, tried);
161
+ },
162
+ };
163
+ }
164
+ export const projectAliasResolver = aliasResolver("project-alias", "project-alias", (context) => context.projectAliases);
165
+ export const configuredAliasResolver = aliasResolver("configured-alias", "configured-alias", (context) => context.configuredAliases);
166
+ /** `"@app/*"` gegen `"@app/util"` → `"util"`; ohne `*` exakter Vergleich. */
167
+ export function matchAlias(pattern, specifier) {
168
+ const starIndex = pattern.indexOf("*");
169
+ if (starIndex === -1) {
170
+ return pattern === specifier ? "" : null;
171
+ }
172
+ const prefix = pattern.slice(0, starIndex);
173
+ const suffix = pattern.slice(starIndex + 1);
174
+ if (!specifier.startsWith(prefix) || !specifier.endsWith(suffix)) {
175
+ return null;
176
+ }
177
+ if (specifier.length < prefix.length + suffix.length) {
178
+ return null;
179
+ }
180
+ return specifier.slice(prefix.length, specifier.length - suffix.length);
181
+ }
182
+ // ---------------------------------------------------------------------------
183
+ // 5. Workspace-Paketkatalog (architecture.md §16.3)
184
+ // ---------------------------------------------------------------------------
185
+ export const workspacePackageResolver = {
186
+ name: "workspace-package",
187
+ supports(specifier, context) {
188
+ const split = splitPackageSpecifier(specifier);
189
+ return split !== null && context.packageCatalog.has(split.name);
190
+ },
191
+ resolve(specifier, context) {
192
+ const split = splitPackageSpecifier(specifier);
193
+ if (split === null) {
194
+ return unresolved("no_resolver_supports_specifier", `"${specifier}" is not a usable package specifier`);
195
+ }
196
+ // Aus der Sicht des IMPORTIERENDEN Repositories nachschlagen: derselbe
197
+ // Paketname kann in mehreren Repositories eines Workspace liegen, und
198
+ // gemeint ist dann zuerst das eigene.
199
+ const lookup = context.packageCatalog.lookup(context.fromRepoId, split.name);
200
+ if (lookup.status === "absent") {
201
+ return unresolved("package_not_in_workspace_catalog", `package "${split.name}" is not part of the workspace catalog`);
202
+ }
203
+ if (lookup.status === "ambiguous") {
204
+ // NICHT raten. Weder zwei fremde Repositories mit demselben Paketnamen
205
+ // noch zwei gleichnamige Manifeste im EIGENEN Repository sind ohne
206
+ // weitere Angabe entscheidbar; eine willkuerlich gewaehlte Kante saehe
207
+ // wie ein Erfolg aus und zeigte auf das falsche Paket.
208
+ return unresolved("ambiguous_candidates", `package "${split.name}" is declared by ${String(lookup.candidates.length)} manifests [${lookup.candidates
209
+ .map((entry) => `${entry.repoId}:${entry.manifestPath}`)
210
+ .join(", ")}] and none of them is the single candidate for "${context.fromPath}" in repository "${context.fromRepoId}"; the reference cannot be attributed`, lookup.candidates.map((entry) => entry.manifestPath).sort(compareCodepoints));
211
+ }
212
+ const target = lookup.entry;
213
+ const matched = resolvePackageSubpath(target, split.subpath);
214
+ const mechanism = matched.status === "target" && matched.via === "exports"
215
+ ? "package-exports"
216
+ : "workspace-package";
217
+ return targetOrFailure(matched, context, target.repoId, specifier, mechanism, target.name);
218
+ },
219
+ };
220
+ // ---------------------------------------------------------------------------
221
+ // 6. Installierte Pakete (ausserhalb des Workspace)
222
+ // ---------------------------------------------------------------------------
223
+ export const installedPackageResolver = {
224
+ name: "installed-package",
225
+ supports(specifier, context) {
226
+ const split = splitPackageSpecifier(specifier);
227
+ if (split === null)
228
+ return false;
229
+ return declaredRange(context, split.name) !== null;
230
+ },
231
+ resolve(specifier, context) {
232
+ const split = splitPackageSpecifier(specifier);
233
+ if (split === null) {
234
+ return unresolved("no_resolver_supports_specifier", `"${specifier}" is not a usable package specifier`);
235
+ }
236
+ const range = declaredRange(context, split.name);
237
+ if (range === null) {
238
+ return unresolved("package_not_installed", `package "${split.name}" is declared by no manifest reachable from "${context.fromPath}"`);
239
+ }
240
+ return {
241
+ status: "external",
242
+ mechanism: "installed-package",
243
+ packageName: split.name,
244
+ declaredVersion: range,
245
+ };
246
+ },
247
+ };
248
+ function declaredRange(context, packageName) {
249
+ const owner = context.fromPackage;
250
+ if (owner !== undefined) {
251
+ const declared = owner.externalDependencies[packageName];
252
+ if (declared !== undefined)
253
+ return declared;
254
+ }
255
+ // Fallback auf die Wurzel des Repositories: in einem Monorepo stehen
256
+ // Werkzeuge und geteilte Bibliotheken oft nur dort.
257
+ for (const entry of context.packageCatalog.all()) {
258
+ if (entry.repoId !== context.fromRepoId || entry.packageDir !== "")
259
+ continue;
260
+ const declared = entry.externalDependencies[packageName];
261
+ if (declared !== undefined)
262
+ return declared;
263
+ }
264
+ return null;
265
+ }
266
+ // ---------------------------------------------------------------------------
267
+ // 7. Python-Module
268
+ // ---------------------------------------------------------------------------
269
+ /**
270
+ * Python schreibt Importe punktiert (`from ..pkg.mod import x` → `"..pkg.mod"`).
271
+ * Fuehrende Punkte sind relative Schritte nach oben, der Rest ist ein Pfad.
272
+ * Ohne diesen Resolver waere in einem Python-Teilprojekt JEDER Import
273
+ * unaufgeloest — mit ihm ist wenigstens der relative Fall exakt.
274
+ */
275
+ export const pythonModuleResolver = {
276
+ name: "python-module",
277
+ supports(specifier, context) {
278
+ if (context.fromLanguageId !== "python")
279
+ return false;
280
+ return specifier !== "" && !specifier.includes("/");
281
+ },
282
+ resolve(specifier, context) {
283
+ const leadingDots = /^\.+/.exec(specifier)?.[0].length ?? 0;
284
+ const rest = specifier.slice(leadingDots);
285
+ const segments = rest === "" ? [] : rest.split(".");
286
+ if (leadingDots > 0) {
287
+ // Ein Punkt = das eigene Paketverzeichnis, jeder weitere eine Ebene hoeher.
288
+ let directory = dirnameOf(context.fromPath);
289
+ for (let step = 1; step < leadingDots; step += 1) {
290
+ directory = directory === null ? null : joinRelative(directory, "..");
291
+ }
292
+ if (directory === null) {
293
+ return unresolved("target_file_not_found", `relative python import "${specifier}" from "${context.fromPath}" points above the repository root`);
294
+ }
295
+ const base = segments.length === 0 ? directory : joinRelative(directory, segments.join("/"));
296
+ if (base === null) {
297
+ return unresolved("target_file_not_found", `relative python import "${specifier}" from "${context.fromPath}" points above the repository root`);
298
+ }
299
+ const probe = probeCandidates(context, context.fromRepoId, base);
300
+ if (probe.path === null) {
301
+ return unresolved("target_file_not_found", `no module file matched relative python import "${specifier}" from "${context.fromPath}"`, probe.tried);
302
+ }
303
+ return {
304
+ status: "resolved",
305
+ mechanism: "relative-path",
306
+ targetRepoId: context.fromRepoId,
307
+ targetPath: probe.path,
308
+ };
309
+ }
310
+ // Absoluter, punktierter Modulpfad: gegen die Repositorywurzel und gegen
311
+ // jedes Paketverzeichnis des Repositories probieren.
312
+ const relativePath = segments.join("/");
313
+ const roots = ["", ...packageDirsOf(context)];
314
+ const tried = [];
315
+ for (const root of roots) {
316
+ const base = root === "" ? relativePath : joinRelative(root, relativePath);
317
+ if (base === null)
318
+ continue;
319
+ const probe = probeCandidates(context, context.fromRepoId, base);
320
+ tried.push(...probe.tried);
321
+ if (probe.path !== null) {
322
+ return {
323
+ status: "resolved",
324
+ mechanism: "language-alias",
325
+ targetRepoId: context.fromRepoId,
326
+ targetPath: probe.path,
327
+ };
328
+ }
329
+ }
330
+ return unresolved("package_not_installed", `python module "${specifier}" was not found on any module root of repository "${context.fromRepoId}"; it is most likely an installed distribution`, tried);
331
+ },
332
+ };
333
+ function packageDirsOf(context) {
334
+ const dirs = new Set();
335
+ for (const entry of context.packageCatalog.all()) {
336
+ if (entry.repoId !== context.fromRepoId)
337
+ continue;
338
+ if (entry.packageDir !== "")
339
+ dirs.add(entry.packageDir);
340
+ if (entry.rootDir !== undefined)
341
+ dirs.add(entry.rootDir);
342
+ }
343
+ return [...dirs].sort(compareCodepoints);
344
+ }
345
+ // ---------------------------------------------------------------------------
346
+ // gemeinsame Nachbereitung
347
+ // ---------------------------------------------------------------------------
348
+ function targetOrFailure(matched, context, targetRepoId, specifier, mechanism, viaPackageName) {
349
+ if (matched.status === "blocked") {
350
+ return unresolved("excluded_by_configuration", `${matched.detail} (specifier "${specifier}")`);
351
+ }
352
+ if (matched.status === "no_match") {
353
+ return unresolved("target_file_not_found", `${matched.detail} (specifier "${specifier}")`);
354
+ }
355
+ const probe = probeCandidates(context, targetRepoId, normalizePath(matched.target));
356
+ if (probe.path === null) {
357
+ return unresolved("target_file_not_found", `package "${viaPackageName}" maps "${specifier}" to "${matched.target}", but no such file is indexed`, probe.tried);
358
+ }
359
+ return {
360
+ status: "resolved",
361
+ mechanism,
362
+ targetRepoId,
363
+ targetPath: probe.path,
364
+ viaPackageName,
365
+ };
366
+ }
367
+ //# sourceMappingURL=resolvers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolvers.js","sourceRoot":"","sources":["../../src/resolve/resolvers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Der LESEPFAD des Dateigraphen: aus einem Abbild (`FileGraphSnapshotV1`)
3
+ * wieder einen abfragbaren Graphen machen.
4
+ *
5
+ * WARUM ES DAS BRAUCHT: `untangle index` baut den Graphen und legt ihn ueber
6
+ * `writeGraphSnapshot` ab. Bis hierher gab es nur `FileDependencyGraph.build`
7
+ * — und der braucht die ROHIMPORTE jeder Datei, die im Abbild gar nicht
8
+ * stehen (das Abbild traegt fertige Kanten, keine Spezifizierer mit
9
+ * Quellpositionen). Ein Leser haette den Graphen also neu bauen muessen, was
10
+ * ohne die Quelldateien nicht geht, oder sich eine eigene Traversierung
11
+ * schreiben muessen — die zweite Wahrheit ueber Zyklen und Budgets, die
12
+ * `traverse.ts` gerade verhindert.
13
+ *
14
+ * WAS EIN ZURUECKGELADENER GRAPH KANN UND WAS NICHT — und warum das hier
15
+ * ausdruecklich steht statt in einer Fussnote:
16
+ *
17
+ * KANN: Knoten, Kanten, Metriken, Topologie, Skip-Ledger, Traversierung in
18
+ * beide Richtungen mit Budget, Zyklenmeldung und Abschneidegrund.
19
+ * KANN NICHT: `applyChanges`. Fortschreiben heisst Kanten NEU AUFLOESEN,
20
+ * und dafuer braucht es die Rohimporte samt Quellpositionen. Sie
21
+ * fehlen im Abbild. Der zurueckgeladene Graph bietet die Methode
22
+ * deshalb gar nicht erst an, statt sie mit halber Eingabe falsch
23
+ * auszufuehren (E4).
24
+ */
25
+ import type { FileEdgeV1, FileGraphMetricsV1, FileNodeV1, SkipLedgerV1, TraversalDirection, TraversalLimitsV1 } from "@untangle-code/domain";
26
+ import type { MonotonicClock } from "./traverse.js";
27
+ import type { FileGraphSnapshotV1, FileTraversalResultV1, WorkspaceTopologyV1 } from "./types.js";
28
+ /**
29
+ * Ein aus einem Abbild zurueckgeladener Dateigraph — lesend.
30
+ *
31
+ * Die Abfragemethoden heissen wie die von {@link FileDependencyGraph} und
32
+ * antworten dasselbe; das ist Absicht, damit ein Aufrufer nicht zwei
33
+ * Vokabulare lernen muss.
34
+ */
35
+ export declare class RestoredFileGraph {
36
+ readonly snapshot: FileGraphSnapshotV1;
37
+ private readonly nodesById;
38
+ private readonly edgesById;
39
+ private readonly edgeIdsByFrom;
40
+ private readonly adjacency;
41
+ private readonly nodeIdsByPath;
42
+ constructor(snapshot: FileGraphSnapshotV1);
43
+ get workspaceId(): string;
44
+ get graphGeneration(): string;
45
+ get topology(): WorkspaceTopologyV1;
46
+ nodes(): FileNodeV1[];
47
+ edges(): FileEdgeV1[];
48
+ node(fileId: string): FileNodeV1 | null;
49
+ edge(edgeId: string): FileEdgeV1 | null;
50
+ /** Kanten, deren Quelle `fileId` ist, in kanonischer Ordnung. */
51
+ edgesFrom(fileId: string): FileEdgeV1[];
52
+ /**
53
+ * Alle Dateien dieses Pfades — eine LISTE, weil derselbe repo-relative Pfad
54
+ * in mehreren Repositories eines Workspace existieren darf. Wer hier einen
55
+ * einzelnen Knoten zurueckgaebe, muesste heimlich einen auswaehlen.
56
+ */
57
+ nodesAtPath(filePath: string): FileNodeV1[];
58
+ metrics(): FileGraphMetricsV1;
59
+ skipLedger(): SkipLedgerV1;
60
+ /** Woran haenge ich (vorwaerts, ueber `dependencies`). */
61
+ dependenciesOf(fileId: string, limits?: Partial<TraversalLimitsV1>, now?: MonotonicClock): FileTraversalResultV1;
62
+ /** Wer haengt an mir (rueckwaerts, ueber `dependents`) — die Wirkungsfrage. */
63
+ dependentsOf(fileId: string, limits?: Partial<TraversalLimitsV1>, now?: MonotonicClock): FileTraversalResultV1;
64
+ traverse(rootFileIds: readonly string[], options: {
65
+ direction: TraversalDirection;
66
+ limits?: Partial<TraversalLimitsV1>;
67
+ now?: MonotonicClock;
68
+ }): FileTraversalResultV1;
69
+ /** Direkte Nachbarn in Traversierungsrichtung, codepoint-sortiert. */
70
+ neighborsOf(fileId: string, direction: TraversalDirection): readonly string[];
71
+ private edgeIdBetween;
72
+ }
73
+ /** Kurzform des Zurueckladens. */
74
+ export declare function restoreFileGraph(snapshot: FileGraphSnapshotV1): RestoredFileGraph;
75
+ //# sourceMappingURL=restore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"restore.d.ts","sourceRoot":"","sources":["../src/restore.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,OAAO,KAAK,EACV,UAAU,EACV,kBAAkB,EAClB,UAAU,EACV,YAAY,EACZ,kBAAkB,EAClB,iBAAiB,EAClB,MAAM,uBAAuB,CAAC;AAO/B,OAAO,KAAK,EAA2B,cAAc,EAAE,MAAM,eAAe,CAAC;AAE7E,OAAO,KAAK,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAElG;;;;;;GAMG;AACH,qBAAa,iBAAiB;IAOhB,QAAQ,CAAC,QAAQ,EAAE,mBAAmB;IANlD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA0B;IACpD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA0B;IACpD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAwB;IACtD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAc;IACxC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAwB;gBAEjC,QAAQ,EAAE,mBAAmB;IAuBlD,IAAI,WAAW,IAAI,MAAM,CAExB;IAED,IAAI,eAAe,IAAI,MAAM,CAE5B;IAED,IAAI,QAAQ,IAAI,mBAAmB,CAElC;IAED,KAAK,IAAI,UAAU,EAAE;IAMrB,KAAK,IAAI,UAAU,EAAE;IAIrB,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IAIvC,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IAIvC,iEAAiE;IACjE,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,EAAE;IAOvC;;;;OAIG;IACH,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,EAAE;IAO3C,OAAO,IAAI,kBAAkB;IAI7B,UAAU,IAAI,YAAY;IAI1B,0DAA0D;IAC1D,cAAc,CACZ,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,EACnC,GAAG,CAAC,EAAE,cAAc,GACnB,qBAAqB;IAQxB,+EAA+E;IAC/E,YAAY,CACV,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,EACnC,GAAG,CAAC,EAAE,cAAc,GACnB,qBAAqB;IAQxB,QAAQ,CACN,WAAW,EAAE,SAAS,MAAM,EAAE,EAC9B,OAAO,EAAE;QACP,SAAS,EAAE,kBAAkB,CAAC;QAC9B,MAAM,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;QACpC,GAAG,CAAC,EAAE,cAAc,CAAC;KACtB,GACA,qBAAqB;IAQxB,sEAAsE;IACtE,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,kBAAkB,GAAG,SAAS,MAAM,EAAE;IAK7E,OAAO,CAAC,aAAa;CAWtB;AAED,kCAAkC;AAClC,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,mBAAmB,GAAG,iBAAiB,CAEjF"}
@@ -0,0 +1,136 @@
1
+ import { compareCodepoints } from "@untangle-code/domain";
2
+ import { compareEdges } from "./edges.js";
3
+ import { buildAdjacency } from "./metrics.js";
4
+ import { normalizePath } from "./paths.js";
5
+ import { traverseFileGraph } from "./traverse.js";
6
+ /**
7
+ * Ein aus einem Abbild zurueckgeladener Dateigraph — lesend.
8
+ *
9
+ * Die Abfragemethoden heissen wie die von {@link FileDependencyGraph} und
10
+ * antworten dasselbe; das ist Absicht, damit ein Aufrufer nicht zwei
11
+ * Vokabulare lernen muss.
12
+ */
13
+ export class RestoredFileGraph {
14
+ snapshot;
15
+ nodesById;
16
+ edgesById;
17
+ edgeIdsByFrom;
18
+ adjacency;
19
+ nodeIdsByPath;
20
+ constructor(snapshot) {
21
+ this.snapshot = snapshot;
22
+ this.nodesById = new Map(snapshot.nodes.map((node) => [node.fileId, node]));
23
+ this.edgesById = new Map(snapshot.edges.map((edge) => [edge.edgeId, edge]));
24
+ this.edgeIdsByFrom = new Map();
25
+ for (const edge of [...snapshot.edges].sort(compareEdges)) {
26
+ const list = this.edgeIdsByFrom.get(edge.fromFileId);
27
+ if (list === undefined)
28
+ this.edgeIdsByFrom.set(edge.fromFileId, [edge.edgeId]);
29
+ else
30
+ list.push(edge.edgeId);
31
+ }
32
+ const nodeIds = [...this.nodesById.keys()].sort(compareCodepoints);
33
+ // Aus den KANTEN gebaut, nicht aus `node.dependencies` — dieselbe Quelle,
34
+ // aus der der gebaute Graph seine Nachbarschaft nimmt. Zwei Wege zu
35
+ // derselben Aussage waeren zwei Gelegenheiten, verschieden zu antworten.
36
+ this.adjacency = buildAdjacency(nodeIds, snapshot.edges);
37
+ this.nodeIdsByPath = new Map();
38
+ for (const node of snapshot.nodes) {
39
+ const key = normalizePath(node.filePath);
40
+ const list = this.nodeIdsByPath.get(key);
41
+ if (list === undefined)
42
+ this.nodeIdsByPath.set(key, [node.fileId]);
43
+ else
44
+ list.push(node.fileId);
45
+ }
46
+ }
47
+ get workspaceId() {
48
+ return this.snapshot.workspaceId;
49
+ }
50
+ get graphGeneration() {
51
+ return this.snapshot.graphGeneration;
52
+ }
53
+ get topology() {
54
+ return this.snapshot.topology;
55
+ }
56
+ nodes() {
57
+ return [...this.nodesById.values()].sort((left, right) => compareCodepoints(left.fileId, right.fileId));
58
+ }
59
+ edges() {
60
+ return [...this.edgesById.values()].sort(compareEdges);
61
+ }
62
+ node(fileId) {
63
+ return this.nodesById.get(fileId) ?? null;
64
+ }
65
+ edge(edgeId) {
66
+ return this.edgesById.get(edgeId) ?? null;
67
+ }
68
+ /** Kanten, deren Quelle `fileId` ist, in kanonischer Ordnung. */
69
+ edgesFrom(fileId) {
70
+ return (this.edgeIdsByFrom.get(fileId) ?? [])
71
+ .map((edgeId) => this.edgesById.get(edgeId))
72
+ .filter((edge) => edge !== undefined)
73
+ .sort(compareEdges);
74
+ }
75
+ /**
76
+ * Alle Dateien dieses Pfades — eine LISTE, weil derselbe repo-relative Pfad
77
+ * in mehreren Repositories eines Workspace existieren darf. Wer hier einen
78
+ * einzelnen Knoten zurueckgaebe, muesste heimlich einen auswaehlen.
79
+ */
80
+ nodesAtPath(filePath) {
81
+ return (this.nodeIdsByPath.get(normalizePath(filePath)) ?? [])
82
+ .map((fileId) => this.nodesById.get(fileId))
83
+ .filter((node) => node !== undefined)
84
+ .sort((left, right) => compareCodepoints(left.fileId, right.fileId));
85
+ }
86
+ metrics() {
87
+ return this.snapshot.metrics;
88
+ }
89
+ skipLedger() {
90
+ return this.snapshot.skipped;
91
+ }
92
+ /** Woran haenge ich (vorwaerts, ueber `dependencies`). */
93
+ dependenciesOf(fileId, limits, now) {
94
+ return this.traverse([fileId], {
95
+ direction: "forward",
96
+ ...(limits === undefined ? {} : { limits }),
97
+ ...(now === undefined ? {} : { now }),
98
+ });
99
+ }
100
+ /** Wer haengt an mir (rueckwaerts, ueber `dependents`) — die Wirkungsfrage. */
101
+ dependentsOf(fileId, limits, now) {
102
+ return this.traverse([fileId], {
103
+ direction: "reverse",
104
+ ...(limits === undefined ? {} : { limits }),
105
+ ...(now === undefined ? {} : { now }),
106
+ });
107
+ }
108
+ traverse(rootFileIds, options) {
109
+ const neighborhood = {
110
+ adjacency: this.adjacency,
111
+ edgeIdBetween: (from, to, direction) => this.edgeIdBetween(from, to, direction),
112
+ };
113
+ return traverseFileGraph(neighborhood, rootFileIds, options);
114
+ }
115
+ /** Direkte Nachbarn in Traversierungsrichtung, codepoint-sortiert. */
116
+ neighborsOf(fileId, direction) {
117
+ const map = direction === "forward" ? this.adjacency.forward : this.adjacency.reverse;
118
+ return map.get(fileId) ?? [];
119
+ }
120
+ edgeIdBetween(from, to, direction) {
121
+ const source = direction === "forward" ? from : to;
122
+ const target = direction === "forward" ? to : from;
123
+ for (const edgeId of this.edgeIdsByFrom.get(source) ?? []) {
124
+ const edge = this.edgesById.get(edgeId);
125
+ if (edge?.resolution.status === "resolved" && edge.resolution.targetFileId === target) {
126
+ return edgeId;
127
+ }
128
+ }
129
+ return null;
130
+ }
131
+ }
132
+ /** Kurzform des Zurueckladens. */
133
+ export function restoreFileGraph(snapshot) {
134
+ return new RestoredFileGraph(snapshot);
135
+ }
136
+ //# sourceMappingURL=restore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"restore.js","sourceRoot":"","sources":["../src/restore.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import type { ContainerServiceEdgeV1, ContainerServiceV1 } from "../types.js";
2
+ /** Name des impliziten Netzwerks, dem Dienste ohne eigene Angabe beitreten. */
3
+ export declare const IMPLICIT_DEFAULT_NETWORK = "default";
4
+ /** Dateinamen, die als Kompositionsdatei gelten (Compose-Spezifikation). */
5
+ export declare const COMPOSE_FILE_NAMES: readonly ["compose.yaml", "compose.yml", "docker-compose.yaml", "docker-compose.yml"];
6
+ export interface ComposeParseResultV1 {
7
+ services: ContainerServiceV1[];
8
+ edges: ContainerServiceEdgeV1[];
9
+ /** Was nicht gelesen werden konnte, mit Grund (E4). */
10
+ warnings: string[];
11
+ }
12
+ export type ComposeReadResult = {
13
+ ok: true;
14
+ result: ComposeParseResultV1;
15
+ } | {
16
+ ok: false;
17
+ error: string;
18
+ };
19
+ /**
20
+ * Liest eine Kompositionsdatei.
21
+ *
22
+ * `composeFilePath` ist repo-relativ; relative Build-Kontexte werden gegen
23
+ * SEIN Verzeichnis aufgeloest, nicht gegen die Repositorywurzel — genau so
24
+ * verhaelt sich Compose auch.
25
+ */
26
+ export declare function parseComposeFile(repoId: string, composeFilePath: string, text: string): ComposeReadResult;
27
+ //# sourceMappingURL=compose.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compose.d.ts","sourceRoot":"","sources":["../../src/topology/compose.ts"],"names":[],"mappings":"AA2BA,OAAO,KAAK,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAE9E,+EAA+E;AAC/E,eAAO,MAAM,wBAAwB,YAAY,CAAC;AAElD,4EAA4E;AAC5E,eAAO,MAAM,kBAAkB,uFAKrB,CAAC;AAEX,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,kBAAkB,EAAE,CAAC;IAC/B,KAAK,EAAE,sBAAsB,EAAE,CAAC;IAChC,uDAAuD;IACvD,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,MAAM,iBAAiB,GAC3B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,oBAAoB,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAE5E;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,MAAM,EACd,eAAe,EAAE,MAAM,EACvB,IAAI,EAAE,MAAM,GACX,iBAAiB,CAqGnB"}