@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,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"}
|
package/dist/restore.js
ADDED
|
@@ -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"}
|