@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.
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,202 @@
1
+ /**
2
+ * Kandidatenbildung: aus einem Pfad ohne Erweiterung die Liste der Dateien,
3
+ * die gemeint sein koennen — in fester Reihenfolge.
4
+ *
5
+ * DREI DINGE, DIE HIER PASSIEREN und ohne die jeder zweite Import dieses
6
+ * Repositories „unresolved" waere:
7
+ *
8
+ * 1. ERWEITERUNGSPROBE. `"./util"` kann `util.ts`, `util.tsx`, `util.js`,
9
+ * … oder `util/index.ts` meinen.
10
+ *
11
+ * 2. RUECKABBILDUNG DER ESM-ENDUNG. TypeScript unter `NodeNext` schreibt
12
+ * `import "./registry.js"` und meint `registry.ts`. Wer nur exakt
13
+ * vergleicht, findet in einem modernen TypeScript-Monorepo praktisch
14
+ * keinen einzigen relativen Import.
15
+ *
16
+ * 3. RUECKABBILDUNG DER BUILD-AUSGABE. Eine `exports`-Map zeigt auf
17
+ * `dist/index.js`. Im Quellindex gibt es nur `src/index.ts`. Mit
18
+ * `rootDir`/`outDir` aus der Projektkonfiguration wird daraus wieder eine
19
+ * Quelldatei — und der Workspace-Import zeigt auf echten Quelltext statt
20
+ * auf ein Artefakt, das gar nicht indiziert ist.
21
+ *
22
+ * Jede Probe, die NICHT getroffen hat, wird mitgefuehrt und landet als
23
+ * `rejectedCandidates` an der unaufgeloesten Kante (E4): wer die Aufloesung
24
+ * spaeter debuggt, sieht, wonach gesucht wurde.
25
+ */
26
+ import { basenameOf, extensionOf, joinRelative, normalizePath, relativeWithin } from "../paths.js";
27
+ /** Erweiterungen in Probierreihenfolge. Quelltext vor Build-Ausgabe. */
28
+ export const DEFAULT_EXTENSION_ORDER = [
29
+ ".ts",
30
+ ".tsx",
31
+ ".mts",
32
+ ".cts",
33
+ ".d.ts",
34
+ ".js",
35
+ ".jsx",
36
+ ".mjs",
37
+ ".cjs",
38
+ ".json",
39
+ ".py",
40
+ ".vue",
41
+ ];
42
+ /**
43
+ * Endung, wie sie im Spezifizierer steht → Endungen, die tatsaechlich gemeint
44
+ * sein koennen. Die geschriebene Endung steht bewusst mit in der Liste, denn
45
+ * es gibt Projekte, in denen `./bundle.js` wirklich `bundle.js` meint.
46
+ *
47
+ * WELCHE ZUERST PROBIERT WIRD, haengt an der Sprache der QUELLDATEI
48
+ * (`preferSourceExtension`): in einer TypeScript-Datei meint `./util.js`
49
+ * unter `NodeNext` die Datei `util.ts`, also gewinnt dort die Quellendung.
50
+ * In einer JavaScript-Datei ist `./util.js` woertlich gemeint, also gewinnt
51
+ * dort die geschriebene Endung. Liegen `util.ts` und `util.js` nebeneinander,
52
+ * ist das der einzige Fall, in dem die Reihenfolge ueberhaupt zaehlt — und
53
+ * dann ist sie so, wie der jeweilige Uebersetzer sie auch waehlt.
54
+ */
55
+ export const ESM_EXTENSION_REMAP = {
56
+ ".js": [".ts", ".tsx", ".d.ts", ".js"],
57
+ ".jsx": [".tsx", ".jsx"],
58
+ ".mjs": [".mts", ".d.mts", ".mjs"],
59
+ ".cjs": [".cts", ".d.cts", ".cjs"],
60
+ };
61
+ /** Erweiterungen, die als „nicht ausfuehrbarer Inhalt" gelten (spec.md §19/§20). */
62
+ export const ASSET_EXTENSIONS = new Set([
63
+ ".avif",
64
+ ".css",
65
+ ".gif",
66
+ ".graphql",
67
+ ".ico",
68
+ ".jpeg",
69
+ ".jpg",
70
+ ".less",
71
+ ".md",
72
+ ".mdx",
73
+ ".png",
74
+ ".sass",
75
+ ".scss",
76
+ ".svg",
77
+ ".txt",
78
+ ".webp",
79
+ ".woff",
80
+ ".woff2",
81
+ ]);
82
+ /**
83
+ * Bildet alle Kandidatenpfade zu einem Basispfad, ohne den Index zu befragen.
84
+ * Reihenfolge ist Teil des Vertrags: sie entscheidet, welche Datei gewinnt,
85
+ * wenn mehrere existieren.
86
+ */
87
+ export function candidatePaths(basePath, extensionOrder = DEFAULT_EXTENSION_ORDER, options = {}) {
88
+ const preferSourceExtension = options.preferSourceExtension ?? true;
89
+ const normalized = normalizePath(basePath);
90
+ const candidates = [];
91
+ const push = (candidate) => {
92
+ if (!candidates.includes(candidate)) {
93
+ candidates.push(candidate);
94
+ }
95
+ };
96
+ const written = extensionOf(normalized);
97
+ if (written !== "") {
98
+ const remap = ESM_EXTENSION_REMAP[written];
99
+ if (remap === undefined || !preferSourceExtension) {
100
+ push(normalized);
101
+ }
102
+ if (remap !== undefined) {
103
+ const stem = normalized.slice(0, normalized.length - written.length);
104
+ for (const extension of remap) {
105
+ push(`${stem}${extension}`);
106
+ }
107
+ push(normalized);
108
+ }
109
+ // Ein Punkt im Namen ist NICHT immer eine Erweiterung: `./vitest.config`
110
+ // meint `vitest.config.ts`. Deshalb wird nur dann noch eine Erweiterung
111
+ // angehaengt, wenn der geschriebene Suffix keine bekannte ist — sonst
112
+ // entstuenden Unsinnskandidaten wie `context.js.cts`, die die
113
+ // `rejectedCandidates` unlesbar machen.
114
+ if (!isKnownExtension(written, extensionOrder)) {
115
+ for (const extension of extensionOrder) {
116
+ push(`${normalized}${extension}`);
117
+ }
118
+ }
119
+ // Auch ein Pfad mit Punkt kann ein Verzeichnis sein.
120
+ for (const extension of extensionOrder) {
121
+ push(`${normalized}/index${extension}`);
122
+ }
123
+ return candidates;
124
+ }
125
+ push(normalized);
126
+ for (const extension of extensionOrder) {
127
+ push(`${normalized}${extension}`);
128
+ }
129
+ for (const extension of extensionOrder) {
130
+ push(`${normalized}/index${extension}`);
131
+ }
132
+ // Python: ein Paketverzeichnis wird ueber seine Initialisierungsdatei erreicht.
133
+ push(`${normalized}/__init__.py`);
134
+ return candidates;
135
+ }
136
+ /**
137
+ * Bildet einen Pfad in der Build-Ausgabe eines Pakets auf den entsprechenden
138
+ * Quellpfad ab. `null`, wenn der Pfad nicht in einer bekannten Build-Ausgabe
139
+ * liegt oder das Paket keine Abbildung deklariert.
140
+ */
141
+ export function reverseBuildOutput(packages, repoId, path) {
142
+ const normalized = normalizePath(path);
143
+ for (const entry of packages) {
144
+ if (entry.repoId !== repoId)
145
+ continue;
146
+ if (entry.outDir === undefined || entry.rootDir === undefined)
147
+ continue;
148
+ const withinOutput = relativeWithin(entry.outDir, normalized);
149
+ if (withinOutput === null || withinOutput === "")
150
+ continue;
151
+ const mapped = joinRelative(entry.rootDir, withinOutput);
152
+ if (mapped !== null) {
153
+ return mapped;
154
+ }
155
+ }
156
+ return null;
157
+ }
158
+ /**
159
+ * Sucht die erste existierende Datei zu einem Basispfad.
160
+ *
161
+ * Zuerst die direkten Kandidaten, danach — und nur, wenn keiner traf — die
162
+ * ueber `rootDir`/`outDir` zurueckgebildeten. Diese Reihenfolge ist wichtig:
163
+ * existiert die Build-Ausgabe wirklich im Index (weil jemand `dist/` mit
164
+ * indiziert hat), gewinnt sie, und wir erfinden keine Quelldatei.
165
+ */
166
+ export function probeCandidates(context, repoId, basePath) {
167
+ const tried = [];
168
+ // In einer JavaScript-Quelle ist die geschriebene Endung woertlich gemeint;
169
+ // in einer TypeScript-Quelle ist sie die Endung der BUILD-Ausgabe.
170
+ const probeOptions = { preferSourceExtension: context.fromLanguageId !== "javascript" };
171
+ const direct = candidatePaths(basePath, context.extensionOrder, probeOptions);
172
+ for (const candidate of direct) {
173
+ tried.push(candidate);
174
+ if (context.files.hasFile(repoId, candidate)) {
175
+ return { path: candidate, tried };
176
+ }
177
+ }
178
+ const mapped = reverseBuildOutput(context.packageCatalog.all(), repoId, basePath);
179
+ if (mapped === null) {
180
+ return { path: null, tried };
181
+ }
182
+ for (const candidate of candidatePaths(mapped, context.extensionOrder, probeOptions)) {
183
+ if (tried.includes(candidate))
184
+ continue;
185
+ tried.push(candidate);
186
+ if (context.files.hasFile(repoId, candidate)) {
187
+ return { path: candidate, tried };
188
+ }
189
+ }
190
+ return { path: null, tried };
191
+ }
192
+ function isKnownExtension(extension, extensionOrder) {
193
+ return (extensionOrder.includes(extension) ||
194
+ extension in ESM_EXTENSION_REMAP ||
195
+ ASSET_EXTENSIONS.has(extension));
196
+ }
197
+ /** True, wenn der Spezifizierer auf eine Nicht-Code-Ressource zeigt. */
198
+ export function isAssetSpecifier(specifier) {
199
+ const withoutQuery = specifier.split("?")[0] ?? specifier;
200
+ return ASSET_EXTENSIONS.has(extensionOf(basenameOf(withoutQuery)));
201
+ }
202
+ //# sourceMappingURL=candidates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"candidates.js","sourceRoot":"","sources":["../../src/resolve/candidates.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import type { WorkspacePackageV1 } from "../types.js";
2
+ /** Bedingungen in Auswertungsreihenfolge. */
3
+ export declare const DEFAULT_EXPORT_CONDITIONS: readonly ["node", "import", "require", "default", "types"];
4
+ /** Ergebnis der Subpfadauswertung. */
5
+ export type SubpathResolution = {
6
+ status: "target";
7
+ target: string;
8
+ via: "exports" | "imports" | "manifest-field" | "direct";
9
+ } | {
10
+ status: "blocked";
11
+ detail: string;
12
+ } | {
13
+ status: "no_match";
14
+ detail: string;
15
+ };
16
+ /**
17
+ * Loest einen Subpfad eines Pakets auf einen repo-relativen Basispfad auf.
18
+ *
19
+ * `subpath` ist `"."` fuer den Paketwurzel-Import oder `"./unter/pfad"`.
20
+ * Das Ergebnis ist ein Pfad OHNE Existenzpruefung — die uebernimmt
21
+ * `probeCandidates`.
22
+ */
23
+ export declare function resolvePackageSubpath(entry: WorkspacePackageV1, subpath: string, conditions?: readonly string[]): SubpathResolution;
24
+ /** Loest einen `#`-Subpath-Import gegen die `imports`-Karte eines Pakets auf. */
25
+ export declare function resolvePackageImports(entry: WorkspacePackageV1, specifier: string, conditions?: readonly string[]): SubpathResolution;
26
+ /** Zerlegt einen Paketspezifizierer in Paketname und Subpfad. */
27
+ export declare function splitPackageSpecifier(specifier: string): {
28
+ name: string;
29
+ subpath: string;
30
+ } | null;
31
+ //# sourceMappingURL=package-exports.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-exports.d.ts","sourceRoot":"","sources":["../../src/resolve/package-exports.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEtD,6CAA6C;AAC7C,eAAO,MAAM,yBAAyB,4DAA6D,CAAC;AAEpG,sCAAsC;AACtC,MAAM,MAAM,iBAAiB,GACzB;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,SAAS,GAAG,SAAS,GAAG,gBAAgB,GAAG,QAAQ,CAAA;CAAE,GAC9F;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACrC;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3C;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,kBAAkB,EACzB,OAAO,EAAE,MAAM,EACf,UAAU,GAAE,SAAS,MAAM,EAA8B,GACxD,iBAAiB,CAsDnB;AAED,iFAAiF;AACjF,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,kBAAkB,EACzB,SAAS,EAAE,MAAM,EACjB,UAAU,GAAE,SAAS,MAAM,EAA8B,GACxD,iBAAiB,CAmBnB;AA6HD,iEAAiE;AACjE,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAiBjG"}
@@ -0,0 +1,229 @@
1
+ /**
2
+ * Auswertung der `exports`- und `imports`-Karten eines Paketmanifests
3
+ * (spec.md §14.3 „Node Package Exports").
4
+ *
5
+ * Was hier abgedeckt ist: die String-Kurzform, die Bedingungsobjekte
6
+ * (`types`/`node`/`import`/`require`/`default`), die Subpfadkarte, die
7
+ * Musterform mit `*`, Arrays als Fallbackliste und `null` als bewusste
8
+ * Sperre eines Subpfads.
9
+ *
10
+ * BEDINGUNGSREIHENFOLGE: Laufzeitbedingungen kommen VOR `types`. Grund: ein
11
+ * `types`-Treffer zeigt auf eine Deklarationsdatei (`.d.ts`), und die ist im
12
+ * Quellindex eines Monorepos praktisch nie vorhanden — die Kante waere
13
+ * unaufgeloest, obwohl das Paket eindeutig bestimmt ist. Ueber die
14
+ * Laufzeitbedingung landet man auf der Build-Ausgabe, und die
15
+ * `rootDir`/`outDir`-Rueckabbildung fuehrt von dort zur Quelldatei.
16
+ *
17
+ * `null` als Ziel ist KEIN „nicht gefunden": es ist die ausdrueckliche
18
+ * Aussage des Paketautors, dass dieser Subpfad nicht importiert werden darf.
19
+ * Das wird als eigener Grund gemeldet und nicht mit einem Fehlschlag
20
+ * verwechselt (E4).
21
+ */
22
+ import { joinRelative, normalizePath } from "../paths.js";
23
+ /** Bedingungen in Auswertungsreihenfolge. */
24
+ export const DEFAULT_EXPORT_CONDITIONS = ["node", "import", "require", "default", "types"];
25
+ /**
26
+ * Loest einen Subpfad eines Pakets auf einen repo-relativen Basispfad auf.
27
+ *
28
+ * `subpath` ist `"."` fuer den Paketwurzel-Import oder `"./unter/pfad"`.
29
+ * Das Ergebnis ist ein Pfad OHNE Existenzpruefung — die uebernimmt
30
+ * `probeCandidates`.
31
+ */
32
+ export function resolvePackageSubpath(entry, subpath, conditions = DEFAULT_EXPORT_CONDITIONS) {
33
+ const normalizedSubpath = subpath === "" ? "." : subpath;
34
+ if (entry.exports !== undefined) {
35
+ const matched = matchExportsMap(entry.exports, normalizedSubpath, conditions);
36
+ if (matched.status === "target") {
37
+ const joined = joinRelative(entry.packageDir, matched.target);
38
+ if (joined === null) {
39
+ return {
40
+ status: "no_match",
41
+ detail: `exports target "${matched.target}" escapes the package directory "${entry.packageDir}"`,
42
+ };
43
+ }
44
+ return { status: "target", target: joined, via: "exports" };
45
+ }
46
+ if (matched.status === "blocked") {
47
+ return matched;
48
+ }
49
+ // Kein Subpfadtreffer in einer vorhandenen exports-Karte: das Paket
50
+ // kapselt seinen Inhalt, der Import ist ungueltig. Kein stiller Rueckfall
51
+ // auf den Verzeichnispfad — das waere geraten.
52
+ return {
53
+ status: "no_match",
54
+ detail: `package "${entry.name}" declares "exports" but no entry matches subpath "${normalizedSubpath}"`,
55
+ };
56
+ }
57
+ if (normalizedSubpath === ".") {
58
+ for (const field of ["module", "main", "types"]) {
59
+ const value = entry[field];
60
+ if (value === undefined)
61
+ continue;
62
+ const joined = joinRelative(entry.packageDir, value);
63
+ if (joined !== null) {
64
+ return { status: "target", target: joined, via: "manifest-field" };
65
+ }
66
+ }
67
+ const indexPath = joinRelative(entry.packageDir, "index");
68
+ if (indexPath === null) {
69
+ return {
70
+ status: "no_match",
71
+ detail: `package directory "${entry.packageDir}" is not usable`,
72
+ };
73
+ }
74
+ return { status: "target", target: indexPath, via: "direct" };
75
+ }
76
+ const joined = joinRelative(entry.packageDir, normalizedSubpath);
77
+ if (joined === null) {
78
+ return {
79
+ status: "no_match",
80
+ detail: `subpath "${normalizedSubpath}" escapes the package directory "${entry.packageDir}"`,
81
+ };
82
+ }
83
+ return { status: "target", target: joined, via: "direct" };
84
+ }
85
+ /** Loest einen `#`-Subpath-Import gegen die `imports`-Karte eines Pakets auf. */
86
+ export function resolvePackageImports(entry, specifier, conditions = DEFAULT_EXPORT_CONDITIONS) {
87
+ if (entry.imports === undefined) {
88
+ return {
89
+ status: "no_match",
90
+ detail: `package "${entry.name}" declares no "imports" map for "${specifier}"`,
91
+ };
92
+ }
93
+ const matched = matchExportsMap(entry.imports, specifier, conditions);
94
+ if (matched.status !== "target") {
95
+ return matched;
96
+ }
97
+ const joined = joinRelative(entry.packageDir, matched.target);
98
+ if (joined === null) {
99
+ return {
100
+ status: "no_match",
101
+ detail: `imports target "${matched.target}" escapes the package directory "${entry.packageDir}"`,
102
+ };
103
+ }
104
+ return { status: "target", target: joined, via: "imports" };
105
+ }
106
+ function matchExportsMap(map, key, conditions) {
107
+ // Kurzform: `"exports": "./dist/index.js"` gilt nur fuer ".".
108
+ if (typeof map === "string") {
109
+ return key === "."
110
+ ? { status: "target", target: map }
111
+ : { status: "no_match", detail: `string "exports" only covers subpath "."` };
112
+ }
113
+ if (map === null) {
114
+ return { status: "blocked", detail: `"exports" is null — the package blocks all subpaths` };
115
+ }
116
+ if (Array.isArray(map)) {
117
+ return selectFromList(map, key, conditions);
118
+ }
119
+ if (typeof map !== "object") {
120
+ return { status: "no_match", detail: `"exports" is neither string, array nor object` };
121
+ }
122
+ const record = map;
123
+ const keys = Object.keys(record);
124
+ const isSubpathMap = keys.some((entry) => entry === "." || entry.startsWith("./") || entry.startsWith("#"));
125
+ if (!isSubpathMap) {
126
+ // Reines Bedingungsobjekt: gilt fuer ".".
127
+ if (key !== ".") {
128
+ return { status: "no_match", detail: `condition-only "exports" only covers subpath "."` };
129
+ }
130
+ return selectCondition(record, conditions);
131
+ }
132
+ const exact = record[key];
133
+ if (exact !== undefined) {
134
+ return resolveConditionValue(exact, conditions, key);
135
+ }
136
+ // Musterform: "./features/*": "./dist/features/*.js"
137
+ let best = null;
138
+ for (const pattern of keys) {
139
+ const starIndex = pattern.indexOf("*");
140
+ if (starIndex === -1)
141
+ continue;
142
+ const prefix = pattern.slice(0, starIndex);
143
+ const suffix = pattern.slice(starIndex + 1);
144
+ if (!key.startsWith(prefix) || !key.endsWith(suffix))
145
+ continue;
146
+ if (key.length < prefix.length + suffix.length)
147
+ continue;
148
+ const captured = key.slice(prefix.length, key.length - suffix.length);
149
+ // Node waehlt bei mehreren Mustern das mit dem laengsten Praefix.
150
+ if (best === null || prefix.length > best.pattern.indexOf("*")) {
151
+ best = { pattern, value: record[pattern], captured };
152
+ }
153
+ }
154
+ if (best === null) {
155
+ return { status: "no_match", detail: `no "exports" entry matches "${key}"` };
156
+ }
157
+ const resolved = resolveConditionValue(best.value, conditions, key);
158
+ if (resolved.status !== "target") {
159
+ return resolved;
160
+ }
161
+ return { status: "target", target: resolved.target.split("*").join(best.captured) };
162
+ }
163
+ function resolveConditionValue(value, conditions, key) {
164
+ if (value === null) {
165
+ return {
166
+ status: "blocked",
167
+ detail: `"exports" entry for "${key}" is null — import is forbidden`,
168
+ };
169
+ }
170
+ if (typeof value === "string") {
171
+ return { status: "target", target: value };
172
+ }
173
+ if (Array.isArray(value)) {
174
+ return selectFromList(value, key, conditions);
175
+ }
176
+ if (typeof value === "object") {
177
+ return selectCondition(value, conditions);
178
+ }
179
+ return { status: "no_match", detail: `"exports" entry for "${key}" has an unusable type` };
180
+ }
181
+ function selectFromList(list, key, conditions) {
182
+ const details = [];
183
+ for (const candidate of list) {
184
+ const resolved = resolveConditionValue(candidate, conditions, key);
185
+ if (resolved.status === "target") {
186
+ return resolved;
187
+ }
188
+ details.push(resolved.detail);
189
+ }
190
+ return {
191
+ status: "no_match",
192
+ detail: `no usable entry in "exports" array for "${key}" (${details.join("; ")})`,
193
+ };
194
+ }
195
+ function selectCondition(record, conditions) {
196
+ for (const condition of conditions) {
197
+ if (!(condition in record))
198
+ continue;
199
+ const value = record[condition];
200
+ const resolved = resolveConditionValue(value, conditions, condition);
201
+ if (resolved.status === "target" || resolved.status === "blocked") {
202
+ return resolved;
203
+ }
204
+ }
205
+ return {
206
+ status: "no_match",
207
+ detail: `none of the conditions [${conditions.join(", ")}] is present in [${Object.keys(record).join(", ")}]`,
208
+ };
209
+ }
210
+ /** Zerlegt einen Paketspezifizierer in Paketname und Subpfad. */
211
+ export function splitPackageSpecifier(specifier) {
212
+ const normalized = normalizePath(specifier);
213
+ if (normalized === "") {
214
+ return null;
215
+ }
216
+ const segments = normalized.split("/");
217
+ if (normalized.startsWith("@")) {
218
+ if (segments.length < 2 || segments[1] === undefined || segments[1] === "") {
219
+ return null;
220
+ }
221
+ const name = `${segments[0]}/${segments[1]}`;
222
+ const rest = segments.slice(2).join("/");
223
+ return { name, subpath: rest === "" ? "." : `./${rest}` };
224
+ }
225
+ const name = segments[0];
226
+ const rest = segments.slice(1).join("/");
227
+ return { name, subpath: rest === "" ? "." : `./${rest}` };
228
+ }
229
+ //# sourceMappingURL=package-exports.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-exports.js","sourceRoot":"","sources":["../../src/resolve/package-exports.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { ImportResolverV1, ResolveContextV1, ResolveResultV1 } from "../types.js";
2
+ /** Die Standardpipeline in der Reihenfolge von architecture.md §16.2. */
3
+ export declare const DEFAULT_RESOLVER_PIPELINE: readonly ImportResolverV1[];
4
+ /** Ergebnis eines Pipelinelaufs samt der Spur der befragten Resolver. */
5
+ export interface PipelineOutcomeV1 {
6
+ result: ResolveResultV1;
7
+ /** Namen aller Resolver, die sich zustaendig erklaert haben, in Reihenfolge. */
8
+ attemptedResolvers: string[];
9
+ }
10
+ export declare function resolveImport(specifier: string, context: ResolveContextV1, pipeline?: readonly ImportResolverV1[]): PipelineOutcomeV1;
11
+ //# sourceMappingURL=pipeline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../src/resolve/pipeline.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAavF,yEAAyE;AACzE,eAAO,MAAM,yBAAyB,EAAE,SAAS,gBAAgB,EAShE,CAAC;AAEF,yEAAyE;AACzE,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,eAAe,CAAC;IACxB,gFAAgF;IAChF,kBAAkB,EAAE,MAAM,EAAE,CAAC;CAC9B;AAED,wBAAgB,aAAa,CAC3B,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,gBAAgB,EACzB,QAAQ,GAAE,SAAS,gBAAgB,EAA8B,GAChE,iBAAiB,CAkFnB"}
@@ -0,0 +1,109 @@
1
+ /**
2
+ * Die Resolver-Pipeline (architecture.md §16.2).
3
+ *
4
+ * Reihenfolge wie dort festgelegt: relativer Pfad → Sprachaliase →
5
+ * Projektaliase → Workspace-Paketkarte → installierte Paketmetadaten →
6
+ * Klassifikation als extern/unaufgeloest.
7
+ *
8
+ * DER WICHTIGE TEIL IST DAS SCHEITERN. Ein Resolver, der zustaendig war und
9
+ * NICHT getroffen hat, beendet die Suche nicht: der naechste zustaendige darf
10
+ * es versuchen. Erst wenn keiner mehr uebrig ist, entsteht eine unaufgeloeste
11
+ * Kante — und die traegt dann den Grund des ERSTEN zustaendigen Resolvers,
12
+ * ergaenzt um die Namen aller weiteren Versuche und die Vereinigung aller
13
+ * geprueften Kandidaten. Ein pauschales „konnte nicht aufgeloest werden" ohne
14
+ * diese Spur waere genau die stille Ausblendung, die E4 verbietet.
15
+ */
16
+ import { compareCodepoints } from "@untangle-code/domain";
17
+ import { configuredAliasResolver, installedPackageResolver, projectAliasResolver, pythonModuleResolver, relativePathResolver, runtimeBuiltinResolver, subpathImportResolver, workspacePackageResolver, } from "./resolvers.js";
18
+ /** Die Standardpipeline in der Reihenfolge von architecture.md §16.2. */
19
+ export const DEFAULT_RESOLVER_PIPELINE = [
20
+ relativePathResolver,
21
+ runtimeBuiltinResolver,
22
+ subpathImportResolver,
23
+ pythonModuleResolver,
24
+ projectAliasResolver,
25
+ configuredAliasResolver,
26
+ workspacePackageResolver,
27
+ installedPackageResolver,
28
+ ];
29
+ export function resolveImport(specifier, context, pipeline = DEFAULT_RESOLVER_PIPELINE) {
30
+ const attempted = [];
31
+ const failures = [];
32
+ for (const resolver of pipeline) {
33
+ let supports;
34
+ try {
35
+ supports = resolver.supports(specifier, context);
36
+ }
37
+ catch (error) {
38
+ // Ein werfender Resolver darf die Kette nicht abbrechen — der Fehler
39
+ // wird zum benannten Fehlschlag, nicht zum verschluckten Ausnahmefall.
40
+ attempted.push(resolver.name);
41
+ failures.push({
42
+ resolver: resolver.name,
43
+ result: {
44
+ status: "unresolved",
45
+ reason: "no_resolver_supports_specifier",
46
+ detail: `resolver "${resolver.name}" threw while deciding support: ${messageOf(error)}`,
47
+ },
48
+ });
49
+ continue;
50
+ }
51
+ if (!supports)
52
+ continue;
53
+ attempted.push(resolver.name);
54
+ let outcome;
55
+ try {
56
+ outcome = resolver.resolve(specifier, context);
57
+ }
58
+ catch (error) {
59
+ failures.push({
60
+ resolver: resolver.name,
61
+ result: {
62
+ status: "unresolved",
63
+ reason: "target_file_not_found",
64
+ detail: `resolver "${resolver.name}" threw: ${messageOf(error)}`,
65
+ },
66
+ });
67
+ continue;
68
+ }
69
+ if (outcome === null)
70
+ continue;
71
+ if (outcome.status !== "unresolved") {
72
+ return { result: outcome, attemptedResolvers: attempted };
73
+ }
74
+ failures.push({ resolver: resolver.name, result: outcome });
75
+ }
76
+ if (failures.length === 0) {
77
+ return {
78
+ result: {
79
+ status: "unresolved",
80
+ reason: "no_resolver_supports_specifier",
81
+ detail: `no resolver in [${pipeline.map((entry) => entry.name).join(", ")}] claims specifier "${specifier}" from "${context.fromPath}"`,
82
+ },
83
+ attemptedResolvers: attempted,
84
+ };
85
+ }
86
+ const first = failures[0];
87
+ const rejected = new Set();
88
+ for (const failure of failures) {
89
+ for (const candidate of failure.result.rejectedCandidates ?? []) {
90
+ rejected.add(candidate);
91
+ }
92
+ }
93
+ const trail = failures
94
+ .map((failure) => `${failure.resolver}: ${failure.result.detail}`)
95
+ .join(" | ");
96
+ return {
97
+ result: {
98
+ status: "unresolved",
99
+ reason: first.result.reason,
100
+ detail: trail,
101
+ ...(rejected.size > 0 ? { rejectedCandidates: [...rejected].sort(compareCodepoints) } : {}),
102
+ },
103
+ attemptedResolvers: attempted,
104
+ };
105
+ }
106
+ function messageOf(error) {
107
+ return error instanceof Error ? error.message : String(error);
108
+ }
109
+ //# sourceMappingURL=pipeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../../src/resolve/pipeline.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import type { ImportResolverV1 } from "../types.js";
2
+ /**
3
+ * Modulnamen, die die Laufzeit selbst mitbringt. Bewusst als Liste und nicht
4
+ * ueber `node:module`s `builtinModules`: die Liste haengt sonst von der
5
+ * Node-Version der ANALYSIERENDEN Maschine ab, und dieselbe Codebasis haette
6
+ * je nach Rechner eine andere Import-Resolution-Rate.
7
+ */
8
+ export declare const RUNTIME_BUILTIN_MODULES: Set<string>;
9
+ export declare const relativePathResolver: ImportResolverV1;
10
+ export declare const runtimeBuiltinResolver: ImportResolverV1;
11
+ export declare const subpathImportResolver: ImportResolverV1;
12
+ export declare const projectAliasResolver: ImportResolverV1;
13
+ export declare const configuredAliasResolver: ImportResolverV1;
14
+ /** `"@app/*"` gegen `"@app/util"` → `"util"`; ohne `*` exakter Vergleich. */
15
+ export declare function matchAlias(pattern: string, specifier: string): string | null;
16
+ export declare const workspacePackageResolver: ImportResolverV1;
17
+ export declare const installedPackageResolver: ImportResolverV1;
18
+ /**
19
+ * Python schreibt Importe punktiert (`from ..pkg.mod import x` → `"..pkg.mod"`).
20
+ * Fuehrende Punkte sind relative Schritte nach oben, der Rest ist ein Pfad.
21
+ * Ohne diesen Resolver waere in einem Python-Teilprojekt JEDER Import
22
+ * unaufgeloest — mit ihm ist wenigstens der relative Fall exakt.
23
+ */
24
+ export declare const pythonModuleResolver: ImportResolverV1;
25
+ //# sourceMappingURL=resolvers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolvers.d.ts","sourceRoot":"","sources":["../../src/resolve/resolvers.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,gBAAgB,EAAqC,MAAM,aAAa,CAAC;AAUvF;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB,aA2ClC,CAAC;AAoBH,eAAO,MAAM,oBAAoB,EAAE,gBA4BlC,CAAC;AAMF,eAAO,MAAM,sBAAsB,EAAE,gBAcpC,CAAC;AAEF,eAAO,MAAM,qBAAqB,EAAE,gBAgBnC,CAAC;AAkDF,eAAO,MAAM,oBAAoB,kBAIhC,CAAC;AAEF,eAAO,MAAM,uBAAuB,kBAInC,CAAC;AAEF,6EAA6E;AAC7E,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAc5E;AAMD,eAAO,MAAM,wBAAwB,EAAE,gBA+CtC,CAAC;AAMF,eAAO,MAAM,wBAAwB,EAAE,gBA6BtC,CAAC;AAsBF;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,EAAE,gBAuElC,CAAC"}