@flaid/devmap 0.5.0 → 0.6.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 (39) hide show
  1. package/dist/analyzers/analysis/tsMorphAnalyzer.d.ts.map +1 -1
  2. package/dist/analyzers/analysis/tsMorphAnalyzer.js +94 -1
  3. package/dist/analyzers/analysis/tsMorphAnalyzer.js.map +1 -1
  4. package/dist/analyzers/detectors/databaseDetector.d.ts +3 -0
  5. package/dist/analyzers/detectors/databaseDetector.d.ts.map +1 -1
  6. package/dist/analyzers/detectors/databaseDetector.js +101 -13
  7. package/dist/analyzers/detectors/databaseDetector.js.map +1 -1
  8. package/dist/analyzers/graph/aliasResolver.d.ts.map +1 -1
  9. package/dist/analyzers/graph/aliasResolver.js +58 -0
  10. package/dist/analyzers/graph/aliasResolver.js.map +1 -1
  11. package/dist/analyzers/graph/dependencyGraph.d.ts.map +1 -1
  12. package/dist/analyzers/graph/dependencyGraph.js +37 -53
  13. package/dist/analyzers/graph/dependencyGraph.js.map +1 -1
  14. package/dist/analyzers/graph/entryPoints.d.ts +8 -1
  15. package/dist/analyzers/graph/entryPoints.d.ts.map +1 -1
  16. package/dist/analyzers/graph/entryPoints.js +54 -3
  17. package/dist/analyzers/graph/entryPoints.js.map +1 -1
  18. package/dist/analyzers/graph/index.d.ts +2 -0
  19. package/dist/analyzers/graph/index.d.ts.map +1 -1
  20. package/dist/analyzers/graph/index.js +1 -0
  21. package/dist/analyzers/graph/index.js.map +1 -1
  22. package/dist/analyzers/graph/localPaths.d.ts +4 -0
  23. package/dist/analyzers/graph/localPaths.d.ts.map +1 -0
  24. package/dist/analyzers/graph/localPaths.js +50 -0
  25. package/dist/analyzers/graph/localPaths.js.map +1 -0
  26. package/dist/analyzers/graph/nuxtAutoImports.d.ts +33 -0
  27. package/dist/analyzers/graph/nuxtAutoImports.d.ts.map +1 -0
  28. package/dist/analyzers/graph/nuxtAutoImports.js +222 -0
  29. package/dist/analyzers/graph/nuxtAutoImports.js.map +1 -0
  30. package/dist/analyzers/graph/packageManifests.d.ts +49 -0
  31. package/dist/analyzers/graph/packageManifests.d.ts.map +1 -0
  32. package/dist/analyzers/graph/packageManifests.js +322 -0
  33. package/dist/analyzers/graph/packageManifests.js.map +1 -0
  34. package/dist/analyzers/pipeline/projectMap.d.ts.map +1 -1
  35. package/dist/analyzers/pipeline/projectMap.js +2 -2
  36. package/dist/analyzers/pipeline/projectMap.js.map +1 -1
  37. package/dist/commands/analyze.js +3 -0
  38. package/dist/commands/analyze.js.map +1 -1
  39. package/package.json +1 -1
@@ -0,0 +1,222 @@
1
+ import { isArchitectureSource } from "./sourceScope.js";
2
+ const NUXT_CONFIG = /(^|\/)nuxt\.config\.[cm]?[jt]s$/;
3
+ const SCRIPT_EXTENSIONS = new Set([".ts", ".js", ".mjs", ".mts", ".cjs", ".cts"]);
4
+ const CONSUMER_EXTENSIONS = new Set([".vue", ".ts", ".tsx", ".js", ".jsx", ".mjs", ".mts"]);
5
+ const COMPONENT_EXTENSIONS = new Set([".vue", ".tsx", ".jsx"]);
6
+ // Nuxt 4 moved the app into `app/`; any of these under it means that layout.
7
+ const APP_DIR_MARKERS = [
8
+ "app/app.vue", "app/pages/", "app/components/", "app/layouts/",
9
+ "app/composables/", "app/plugins/", "app/middleware/", "app/utils/"
10
+ ];
11
+ /**
12
+ * The source directory a Nuxt project uses. An explicit `srcDir` in the config
13
+ * wins; otherwise `app/` when the Nuxt 4 layout is present, else the root.
14
+ * `hasPath` answers whether a path (or, with a trailing slash, a folder)
15
+ * exists under the config's directory.
16
+ */
17
+ export function pickNuxtSrcDir(configText, hasPath) {
18
+ const explicit = /\bsrcDir\s*:\s*['"`]([^'"`]+)['"`]/.exec(configText)?.[1];
19
+ if (explicit) {
20
+ const cleaned = explicit.replace(/^\.\//, "").replace(/\/+$/, "");
21
+ return cleaned === "." ? "" : cleaned;
22
+ }
23
+ return APP_DIR_MARKERS.some(hasPath) ? "app" : "";
24
+ }
25
+ export function detectNuxtApps(files) {
26
+ const apps = [];
27
+ for (const config of files.filter((file) => NUXT_CONFIG.test(file.path))) {
28
+ const dir = config.path.includes("/") ? config.path.slice(0, config.path.lastIndexOf("/")) : "";
29
+ const prefix = dir === "" ? "" : `${dir}/`;
30
+ const hasPath = (relative) => files.some((file) => file.path.startsWith(`${prefix}${relative}`));
31
+ apps.push({
32
+ dir,
33
+ srcDir: pickNuxtSrcDir(config.content, hasPath),
34
+ pinia: files.some((file) => (file.path === `${prefix}package.json` || file.path === "package.json")
35
+ && file.content.includes("@pinia/nuxt"))
36
+ });
37
+ }
38
+ return apps.sort((a, b) => a.dir.localeCompare(b.dir));
39
+ }
40
+ /**
41
+ * Add the edges Nuxt creates implicitly: a file that renders `<AccountAvatar>`
42
+ * or calls `useUser()` depends on the component / composable file that
43
+ * provides it. Mutates `graph`; existing explicit imports are untouched.
44
+ */
45
+ export function addNuxtAutoImportEdges(graph, files, analyses) {
46
+ const apps = detectNuxtApps(files);
47
+ if (apps.length === 0)
48
+ return;
49
+ const production = files.filter((file) => isArchitectureSource(file.path));
50
+ for (const app of apps) {
51
+ const inApp = (path) => app.dir === "" || path.startsWith(`${app.dir}/`);
52
+ const appFiles = production.filter((file) => inApp(file.path));
53
+ const rel = (path) => (app.dir === "" ? path : path.slice(app.dir.length + 1));
54
+ const srcPrefix = app.srcDir === "" ? "" : `${app.srcDir}/`;
55
+ const isServer = (path) => rel(path).startsWith("server/");
56
+ // Providers visible to app code vs. to the Nitro server.
57
+ const appValues = new Map();
58
+ const serverValues = new Map();
59
+ const components = new Map();
60
+ // PascalCase names, for components referenced as identifiers in a script
61
+ // (`{ component: NavButtonBookmark }`) instead of as a template tag.
62
+ const componentIdentifiers = new Map();
63
+ const registerValues = (target, file) => {
64
+ const analysis = analyses[file.path];
65
+ const names = new Set(analysis?.exports ?? []);
66
+ if (names.delete("default"))
67
+ names.add(camelCase(baseName(file.path)));
68
+ for (const name of names) {
69
+ if (name.length >= 3 && !target.has(name))
70
+ target.set(name, file.path);
71
+ }
72
+ };
73
+ for (const file of appFiles) {
74
+ const path = rel(file.path);
75
+ // components/**: every .vue file, named from its folder path.
76
+ if (path.startsWith(`${srcPrefix}components/`) && COMPONENT_EXTENSIONS.has(file.extension)) {
77
+ const name = componentName(path.slice(`${srcPrefix}components/`.length));
78
+ const key = name ? componentKey(name) : "";
79
+ if (key && !components.has(key))
80
+ components.set(key, file.path);
81
+ if (name && name.length >= 4 && !componentIdentifiers.has(name))
82
+ componentIdentifiers.set(name, file.path);
83
+ continue;
84
+ }
85
+ if (!SCRIPT_EXTENSIONS.has(file.extension))
86
+ continue;
87
+ const dirs = [
88
+ `${srcPrefix}composables/`,
89
+ `${srcPrefix}utils/`,
90
+ ...(app.pinia ? [`${srcPrefix}stores/`] : []),
91
+ "shared/utils/",
92
+ "shared/types/"
93
+ ];
94
+ const dirHit = dirs.find((dir) => path.startsWith(dir));
95
+ if (dirHit && isTopLevelOrIndex(path.slice(dirHit.length))) {
96
+ registerValues(appValues, file);
97
+ // shared/ is visible on both sides of the app.
98
+ if (dirHit.startsWith("shared/"))
99
+ registerValues(serverValues, file);
100
+ continue;
101
+ }
102
+ if (path.startsWith("server/utils/") && isTopLevelOrIndex(path.slice("server/utils/".length))) {
103
+ registerValues(serverValues, file);
104
+ }
105
+ }
106
+ if (appValues.size === 0 && serverValues.size === 0 && components.size === 0)
107
+ continue;
108
+ for (const consumer of appFiles) {
109
+ if (!CONSUMER_EXTENSIONS.has(consumer.extension) || !(consumer.path in graph))
110
+ continue;
111
+ const server = isServer(consumer.path);
112
+ const values = server ? serverValues : appValues;
113
+ const edges = new Set(graph[consumer.path]);
114
+ const before = edges.size;
115
+ const tokens = new Set(consumer.content.match(/[A-Za-z_$][\w$]*/g) ?? []);
116
+ if (values.size > 0) {
117
+ for (const [name, provider] of values) {
118
+ if (provider === consumer.path || edges.has(provider) || !tokens.has(name))
119
+ continue;
120
+ if (isReferenced(name, consumer.content))
121
+ edges.add(provider);
122
+ }
123
+ }
124
+ if (!server && consumer.extension === ".vue" && components.size > 0) {
125
+ for (const tag of renderedComponents(consumer.content)) {
126
+ const provider = components.get(tag) ?? components.get(tag.replace(/^lazy/, ""));
127
+ if (provider && provider !== consumer.path)
128
+ edges.add(provider);
129
+ }
130
+ }
131
+ if (!server && COMPONENT_EXTENSIONS.has(consumer.extension) && componentIdentifiers.size > 0) {
132
+ for (const token of tokens) {
133
+ const provider = componentIdentifiers.get(token);
134
+ if (provider && provider !== consumer.path)
135
+ edges.add(provider);
136
+ }
137
+ }
138
+ if (edges.size !== before)
139
+ graph[consumer.path] = [...edges];
140
+ }
141
+ }
142
+ }
143
+ // ------------------------------------------------------------------ naming
144
+ /** Nuxt's component name: folder path + file name, overlap dropped. */
145
+ export function componentName(relativeToComponents) {
146
+ const segments = relativeToComponents.split("/");
147
+ const file = segments.pop();
148
+ if (!file)
149
+ return null;
150
+ let fileName = file.replace(/\.[^.]+$/, "").replace(/\.(?:client|server|global)$/i, "");
151
+ // components/foo/index.vue is <Foo>.
152
+ if (fileName.toLowerCase() === "index") {
153
+ const directory = segments[segments.length - 1];
154
+ if (!directory)
155
+ return null;
156
+ fileName = directory;
157
+ }
158
+ const prefixParts = segments.flatMap(splitByCase);
159
+ const fileParts = splitByCase(fileName);
160
+ if (fileParts.length === 0)
161
+ return null;
162
+ const nameParts = [];
163
+ while (prefixParts.length > 0 && prefixParts[0].toLowerCase() !== fileParts[0].toLowerCase()) {
164
+ nameParts.push(prefixParts.shift());
165
+ }
166
+ return [...nameParts, ...fileParts].map(upperFirst).join("");
167
+ }
168
+ function componentKey(name) {
169
+ return name.toLowerCase().replace(/[-_]/g, "");
170
+ }
171
+ /** Component tags used by a .vue file, normalized to match `componentKey`. */
172
+ function renderedComponents(content) {
173
+ const tags = new Set();
174
+ for (const match of content.matchAll(/<([A-Za-z][\w-]*)(?=[\s/>])/g)) {
175
+ tags.add(componentKey(match[1]));
176
+ }
177
+ for (const match of content.matchAll(/\bresolveComponent\(\s*['"`]([\w-]+)['"`]/g)) {
178
+ tags.add(componentKey(match[1]));
179
+ }
180
+ return tags;
181
+ }
182
+ function splitByCase(value) {
183
+ return value
184
+ .replace(/([a-z\d])([A-Z])/g, "$1 $2")
185
+ .replace(/([A-Z]+)([A-Z][a-z])/g, "$1 $2")
186
+ .split(/[\s\-_./]+/)
187
+ .filter(Boolean);
188
+ }
189
+ function upperFirst(value) {
190
+ return value.charAt(0).toUpperCase() + value.slice(1);
191
+ }
192
+ function camelCase(value) {
193
+ const [first = "", ...rest] = splitByCase(value);
194
+ return first.charAt(0).toLowerCase() + first.slice(1) + rest.map(upperFirst).join("");
195
+ }
196
+ function baseName(path) {
197
+ const file = path.slice(path.lastIndexOf("/") + 1).replace(/\.[^.]+$/, "");
198
+ // utils/foo/index.ts is named after its folder.
199
+ if (file === "index") {
200
+ const parts = path.split("/");
201
+ return parts[parts.length - 2] ?? file;
202
+ }
203
+ return file;
204
+ }
205
+ /** Nuxt scans top-level files of an auto-import folder plus `folder/index.ts`. */
206
+ function isTopLevelOrIndex(relative) {
207
+ return !relative.includes("/") || /^[^/]+\/index\.[cm]?[jt]s$/.test(relative);
208
+ }
209
+ /**
210
+ * `useX`, `PascalCase` and `CONSTANTS` are referenced as bare identifiers;
211
+ * a plain camelCase helper must be called (`formatDate(...)`, not
212
+ * `date.format(...)` or a local variable that happens to share the name).
213
+ */
214
+ function isReferenced(name, content) {
215
+ if (/^use[A-Z]/.test(name) || /^[A-Z]/.test(name))
216
+ return true;
217
+ return new RegExp(`(?<![.\\w$])${escapeRegExp(name)}\\s*\\(`).test(content);
218
+ }
219
+ function escapeRegExp(value) {
220
+ return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
221
+ }
222
+ //# sourceMappingURL=nuxtAutoImports.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nuxtAutoImports.js","sourceRoot":"","sources":["../../../src/analyzers/graph/nuxtAutoImports.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAkBxD,MAAM,WAAW,GAAG,iCAAiC,CAAC;AACtD,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AAClF,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AAC5F,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AAE/D,6EAA6E;AAC7E,MAAM,eAAe,GAAG;IACtB,aAAa,EAAE,YAAY,EAAE,iBAAiB,EAAE,cAAc;IAC9D,kBAAkB,EAAE,cAAc,EAAE,iBAAiB,EAAE,YAAY;CACpE,CAAC;AAEF;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,UAAkB,EAAE,OAAsC;IACvF,MAAM,QAAQ,GAAG,oCAAoC,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC5E,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAClE,OAAO,OAAO,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;IACxC,CAAC;IACD,OAAO,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAoB;IACjD,MAAM,IAAI,GAAc,EAAE,CAAC;IAE3B,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;QACzE,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAChG,MAAM,MAAM,GAAG,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC;QAC3C,MAAM,OAAO,GAAG,CAAC,QAAgB,EAAE,EAAE,CACnC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,MAAM,GAAG,QAAQ,EAAE,CAAC,CAAC,CAAC;QAErE,IAAI,CAAC,IAAI,CAAC;YACR,GAAG;YACH,MAAM,EAAE,cAAc,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC;YAC/C,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CACzB,CAAC,IAAI,CAAC,IAAI,KAAK,GAAG,MAAM,cAAc,IAAI,IAAI,CAAC,IAAI,KAAK,cAAc,CAAC;mBACpE,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CACxC;SACF,CAAC,CAAC;IACL,CAAC;IAED,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACzD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CACpC,KAAgB,EAChB,KAAoB,EACpB,QAAsC;IAEtC,MAAM,IAAI,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IACnC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAE9B,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAE3E,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,KAAK,EAAE,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC;QACjF,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC/D,MAAM,GAAG,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;QACvF,MAAM,SAAS,GAAG,GAAG,CAAC,MAAM,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC;QAE5D,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QACnE,yDAAyD;QACzD,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;QAC5C,MAAM,YAAY,GAAG,IAAI,GAAG,EAAkB,CAAC;QAC/C,MAAM,UAAU,GAAG,IAAI,GAAG,EAAkB,CAAC;QAC7C,yEAAyE;QACzE,qEAAqE;QACrE,MAAM,oBAAoB,GAAG,IAAI,GAAG,EAAkB,CAAC;QAEvD,MAAM,cAAc,GAAG,CAAC,MAA2B,EAAE,IAAiB,EAAE,EAAE;YACxE,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACrC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAS,QAAQ,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC;YACvD,IAAI,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC;gBAAE,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACvE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;oBAAE,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YACzE,CAAC;QACH,CAAC,CAAC;QAEF,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;YAC5B,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAE5B,8DAA8D;YAC9D,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,SAAS,aAAa,CAAC,IAAI,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC3F,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,SAAS,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;gBACzE,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC3C,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC;oBAAE,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;gBAChE,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC;oBAAE,oBAAoB,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC3G,SAAS;YACX,CAAC;YAED,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC;gBAAE,SAAS;YAErD,MAAM,IAAI,GAAG;gBACX,GAAG,SAAS,cAAc;gBAC1B,GAAG,SAAS,QAAQ;gBACpB,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC7C,eAAe;gBACf,eAAe;aAChB,CAAC;YACF,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;YACxD,IAAI,MAAM,IAAI,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;gBAC3D,cAAc,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;gBAChC,+CAA+C;gBAC/C,IAAI,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC;oBAAE,cAAc,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;gBACrE,SAAS;YACX,CAAC;YAED,IAAI,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,IAAI,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;gBAC9F,cAAc,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;YACrC,CAAC;QACH,CAAC;QAED,IAAI,SAAS,CAAC,IAAI,KAAK,CAAC,IAAI,YAAY,CAAC,IAAI,KAAK,CAAC,IAAI,UAAU,CAAC,IAAI,KAAK,CAAC;YAAE,SAAS;QAEvF,KAAK,MAAM,QAAQ,IAAI,QAAQ,EAAE,CAAC;YAChC,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,IAAI,IAAI,KAAK,CAAC;gBAAE,SAAS;YAExF,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YACvC,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC;YACjD,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;YAC5C,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC;YAE1B,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,mBAAmB,CAAC,IAAI,EAAE,CAAC,CAAC;YAE1E,IAAI,MAAM,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;gBACpB,KAAK,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,MAAM,EAAE,CAAC;oBACtC,IAAI,QAAQ,KAAK,QAAQ,CAAC,IAAI,IAAI,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;wBAAE,SAAS;oBACrF,IAAI,YAAY,CAAC,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC;wBAAE,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBAChE,CAAC;YACH,CAAC;YAED,IAAI,CAAC,MAAM,IAAI,QAAQ,CAAC,SAAS,KAAK,MAAM,IAAI,UAAU,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;gBACpE,KAAK,MAAM,GAAG,IAAI,kBAAkB,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;oBACvD,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;oBACjF,IAAI,QAAQ,IAAI,QAAQ,KAAK,QAAQ,CAAC,IAAI;wBAAE,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBAClE,CAAC;YACH,CAAC;YAED,IAAI,CAAC,MAAM,IAAI,oBAAoB,CAAC,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,oBAAoB,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;gBAC7F,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;oBAC3B,MAAM,QAAQ,GAAG,oBAAoB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;oBACjD,IAAI,QAAQ,IAAI,QAAQ,KAAK,QAAQ,CAAC,IAAI;wBAAE,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBAClE,CAAC;YACH,CAAC;YAED,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM;gBAAE,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;AACH,CAAC;AAED,4EAA4E;AAE5E,uEAAuE;AACvE,MAAM,UAAU,aAAa,CAAC,oBAA4B;IACxD,MAAM,QAAQ,GAAG,oBAAoB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACjD,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC;IAC5B,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IAEvB,IAAI,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,8BAA8B,EAAE,EAAE,CAAC,CAAC;IACxF,qCAAqC;IACrC,IAAI,QAAQ,CAAC,WAAW,EAAE,KAAK,OAAO,EAAE,CAAC;QACvC,MAAM,SAAS,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAChD,IAAI,CAAC,SAAS;YAAE,OAAO,IAAI,CAAC;QAC5B,QAAQ,GAAG,SAAS,CAAC;IACvB,CAAC;IAED,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAClD,MAAM,SAAS,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;IACxC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAExC,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,OAAO,WAAW,CAAC,MAAM,GAAG,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;QAC7F,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,EAAY,CAAC,CAAC;IAChD,CAAC;IAED,OAAO,CAAC,GAAG,SAAS,EAAE,GAAG,SAAS,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC/D,CAAC;AAED,SAAS,YAAY,CAAC,IAAY;IAChC,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;AACjD,CAAC;AAED,8EAA8E;AAC9E,SAAS,kBAAkB,CAAC,OAAe;IACzC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAE/B,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,QAAQ,CAAC,8BAA8B,CAAC,EAAE,CAAC;QACrE,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACnC,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,QAAQ,CAAC,4CAA4C,CAAC,EAAE,CAAC;QACnF,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACnC,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,WAAW,CAAC,KAAa;IAChC,OAAO,KAAK;SACT,OAAO,CAAC,mBAAmB,EAAE,OAAO,CAAC;SACrC,OAAO,CAAC,uBAAuB,EAAE,OAAO,CAAC;SACzC,KAAK,CAAC,YAAY,CAAC;SACnB,MAAM,CAAC,OAAO,CAAC,CAAC;AACrB,CAAC;AAED,SAAS,UAAU,CAAC,KAAa;IAC/B,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACxD,CAAC;AAED,SAAS,SAAS,CAAC,KAAa;IAC9B,MAAM,CAAC,KAAK,GAAG,EAAE,EAAE,GAAG,IAAI,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IACjD,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACxF,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY;IAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAC3E,gDAAgD;IAChD,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QACrB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC9B,OAAO,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC;IACzC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,kFAAkF;AAClF,SAAS,iBAAiB,CAAC,QAAgB;IACzC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,4BAA4B,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAChF,CAAC;AAED;;;;GAIG;AACH,SAAS,YAAY,CAAC,IAAY,EAAE,OAAe;IACjD,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAC/D,OAAO,IAAI,MAAM,CAAC,eAAe,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAC9E,CAAC;AAED,SAAS,YAAY,CAAC,KAAa;IACjC,OAAO,KAAK,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;AACtD,CAAC"}
@@ -0,0 +1,49 @@
1
+ import { type ScannedFile } from "../analysis/index.js";
2
+ /**
3
+ * package.json knowledge the dependency graph needs: which workspace package a
4
+ * bare specifier names (`@acme/ui`), where `#internal/*` subpath imports point,
5
+ * and which files the manifest itself declares as entries (`bin`, `main`,
6
+ * `exports`, scripts).
7
+ */
8
+ export interface PackageManifest {
9
+ /** Project-root-relative directory; `""` for the root package. */
10
+ dir: string;
11
+ name?: string;
12
+ /** `"private": true`: an app or internal package, never a published API. */
13
+ private: boolean;
14
+ main?: string;
15
+ module?: string;
16
+ types?: string;
17
+ source?: string;
18
+ bin: string[];
19
+ exports?: unknown;
20
+ imports?: Record<string, unknown>;
21
+ scripts: Record<string, string>;
22
+ }
23
+ export interface PackageIndex {
24
+ manifests: PackageManifest[];
25
+ byName: Map<string, PackageManifest>;
26
+ }
27
+ export interface ManifestEntry {
28
+ path: string;
29
+ kind: "bin" | "main" | "script";
30
+ }
31
+ export declare function readPackageManifests(files: ScannedFile[]): PackageManifest[];
32
+ export declare function indexPackages(manifests: PackageManifest[]): PackageIndex;
33
+ /**
34
+ * Resolve `@scope/pkg` or `@scope/pkg/sub/path` to a scanned file when the
35
+ * package is part of this project (a workspace member). Registry packages are
36
+ * not in the scan, so they never match and stay skipped.
37
+ */
38
+ export declare function resolveWorkspaceSpecifier(specifier: string, index: PackageIndex, localPaths: Set<string>): string | null;
39
+ /** `#internal/db` -> the file declared by the nearest package.json `imports`. */
40
+ export declare function resolveSubpathImport(specifier: string, fromFile: string, index: PackageIndex, localPaths: Set<string>): string | null;
41
+ /** Files a manifest declares as runnable or importable entries. */
42
+ export declare function manifestEntryPoints(manifests: PackageManifest[], localPaths: Set<string>): ManifestEntry[];
43
+ /**
44
+ * Resolve a path written in a manifest (relative to the package directory) to
45
+ * a scanned file. Built output (`dist/index.mjs`, `dist/types/index.d.ts`) is
46
+ * mapped back to the source it came from, since only sources are scanned.
47
+ */
48
+ export declare function resolveManifestTarget(target: string, packageDir: string, localPaths: Set<string>): string | null;
49
+ //# sourceMappingURL=packageManifests.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"packageManifests.d.ts","sourceRoot":"","sources":["../../../src/analyzers/graph/packageManifests.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAIvE;;;;;GAKG;AACH,MAAM,WAAW,eAAe;IAC9B,kEAAkE;IAClE,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,4EAA4E;IAC5E,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,EAAE,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,eAAe,EAAE,CAAC;IAC7B,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;CACtC;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,KAAK,GAAG,MAAM,GAAG,QAAQ,CAAC;CACjC;AAgBD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,eAAe,EAAE,CAiC5E;AAED,wBAAgB,aAAa,CAAC,SAAS,EAAE,eAAe,EAAE,GAAG,YAAY,CAOxE;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CACvC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,YAAY,EACnB,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,GACtB,MAAM,GAAG,IAAI,CAmBf;AAED,iFAAiF;AACjF,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,YAAY,EACnB,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,GACtB,MAAM,GAAG,IAAI,CAcf;AAED,mEAAmE;AACnE,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,eAAe,EAAE,EAAE,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,aAAa,EAAE,CA8B1G;AAiDD;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,GACtB,MAAM,GAAG,IAAI,CAYf"}
@@ -0,0 +1,322 @@
1
+ import { parseJsonText } from "../analysis/index.js";
2
+ import { matchLocalPath, normalizePath } from "./localPaths.js";
3
+ import { isArchitectureSource } from "./sourceScope.js";
4
+ // Output folders and the format folders nested in them (`dist/esm/index.js`).
5
+ const BUILD_DIRS = new Set([
6
+ "dist", "build", "lib", "out", "output", "esm", "cjs", "es", "umd", "compiled", "dist-esm", "dist-cjs"
7
+ ]);
8
+ const FORMAT_DIRS = new Set(["esm", "cjs", "es", "umd", "types", "typings", "dts", "node", "browser"]);
9
+ // Where a built package keeps the sources its output came from.
10
+ const SOURCE_DIRS = ["src", "source", ""];
11
+ // Earlier conditions are closer to the source a reader wants to land on.
12
+ const CONDITION_ORDER = [
13
+ "source", "development", "import", "module", "default", "require", "node", "browser", "types"
14
+ ];
15
+ export function readPackageManifests(files) {
16
+ const manifests = [];
17
+ for (const file of files) {
18
+ if (file.path !== "package.json" && !file.path.endsWith("/package.json"))
19
+ continue;
20
+ if (!isArchitectureSource(file.path))
21
+ continue;
22
+ let parsed;
23
+ try {
24
+ const value = parseJsonText(file.content);
25
+ if (!value || typeof value !== "object" || Array.isArray(value))
26
+ continue;
27
+ parsed = value;
28
+ }
29
+ catch {
30
+ continue;
31
+ }
32
+ const dir = file.path === "package.json" ? "" : file.path.slice(0, -"/package.json".length);
33
+ manifests.push({
34
+ dir,
35
+ name: typeof parsed.name === "string" && parsed.name.length > 0 ? parsed.name : undefined,
36
+ private: parsed.private === true,
37
+ main: stringField(parsed.main),
38
+ module: stringField(parsed.module),
39
+ types: stringField(parsed.types) ?? stringField(parsed.typings),
40
+ source: stringField(parsed.source),
41
+ bin: binTargets(parsed.bin),
42
+ exports: parsed.exports,
43
+ imports: isRecord(parsed.imports) ? parsed.imports : undefined,
44
+ scripts: stringRecord(parsed.scripts)
45
+ });
46
+ }
47
+ return manifests.sort((a, b) => a.dir.localeCompare(b.dir));
48
+ }
49
+ export function indexPackages(manifests) {
50
+ const byName = new Map();
51
+ for (const manifest of manifests) {
52
+ // Sorted by directory, so the shallowest package wins a duplicate name.
53
+ if (manifest.name && !byName.has(manifest.name))
54
+ byName.set(manifest.name, manifest);
55
+ }
56
+ return { manifests, byName };
57
+ }
58
+ /**
59
+ * Resolve `@scope/pkg` or `@scope/pkg/sub/path` to a scanned file when the
60
+ * package is part of this project (a workspace member). Registry packages are
61
+ * not in the scan, so they never match and stay skipped.
62
+ */
63
+ export function resolveWorkspaceSpecifier(specifier, index, localPaths) {
64
+ const split = splitPackageSpecifier(specifier);
65
+ if (!split)
66
+ return null;
67
+ const manifest = index.byName.get(split.name);
68
+ if (!manifest)
69
+ return null;
70
+ if (split.subpath === ".")
71
+ return resolvePackageRoot(manifest, localPaths);
72
+ const exported = resolveExportsField(manifest, split.subpath, localPaths);
73
+ if (exported)
74
+ return exported;
75
+ // Not (or not only) described by `exports`: fall back to the file layout.
76
+ const relativePath = split.subpath.slice(2);
77
+ for (const base of ["", "src/"]) {
78
+ const found = matchLocalPath(joinPath(manifest.dir, `${base}${relativePath}`), localPaths);
79
+ if (found)
80
+ return found;
81
+ }
82
+ return null;
83
+ }
84
+ /** `#internal/db` -> the file declared by the nearest package.json `imports`. */
85
+ export function resolveSubpathImport(specifier, fromFile, index, localPaths) {
86
+ if (!specifier.startsWith("#"))
87
+ return null;
88
+ const manifest = nearestManifest(fromFile, index.manifests, (candidate) => candidate.imports !== undefined);
89
+ if (!manifest?.imports)
90
+ return null;
91
+ const match = matchSubpathMap(manifest.imports, specifier);
92
+ if (!match)
93
+ return null;
94
+ for (const target of leafTargets(match.value, match.wildcard)) {
95
+ const resolved = resolveManifestTarget(target, manifest.dir, localPaths);
96
+ if (resolved)
97
+ return resolved;
98
+ }
99
+ return null;
100
+ }
101
+ /** Files a manifest declares as runnable or importable entries. */
102
+ export function manifestEntryPoints(manifests, localPaths) {
103
+ const entries = [];
104
+ const seen = new Set();
105
+ const add = (path, kind) => {
106
+ if (!path || seen.has(path) || isConfigFile(path))
107
+ return;
108
+ seen.add(path);
109
+ entries.push({ path, kind });
110
+ };
111
+ for (const manifest of manifests) {
112
+ for (const bin of manifest.bin) {
113
+ add(resolveManifestTarget(bin, manifest.dir, localPaths), "bin");
114
+ }
115
+ // An internal workspace package's root file is shared plumbing for its
116
+ // siblings, not a place execution begins. The project root and published
117
+ // packages do expose theirs.
118
+ if (!manifest.private || manifest.dir === "") {
119
+ add(resolvePackageRoot(manifest, localPaths, false), "main");
120
+ }
121
+ for (const command of Object.values(manifest.scripts)) {
122
+ for (const token of scriptFileTokens(command)) {
123
+ add(resolveManifestTarget(token, manifest.dir, localPaths), "script");
124
+ }
125
+ }
126
+ }
127
+ return entries;
128
+ }
129
+ // ------------------------------------------------------------------ internals
130
+ /**
131
+ * The file `import "<package name>"` lands on. `guess` also tries the usual
132
+ * `src/index` layouts when the manifest declares nothing; entry detection
133
+ * leaves that off so only what the package states counts as its entry.
134
+ */
135
+ function resolvePackageRoot(manifest, localPaths, guess = true) {
136
+ const exported = resolveExportsField(manifest, ".", localPaths);
137
+ if (exported)
138
+ return exported;
139
+ for (const field of [manifest.source, manifest.module, manifest.main, manifest.types]) {
140
+ if (!field)
141
+ continue;
142
+ const resolved = resolveManifestTarget(field, manifest.dir, localPaths);
143
+ if (resolved)
144
+ return resolved;
145
+ }
146
+ if (!guess)
147
+ return null;
148
+ for (const fallback of ["src/index", "index", "src/main", "main"]) {
149
+ const found = matchLocalPath(joinPath(manifest.dir, fallback), localPaths);
150
+ if (found)
151
+ return found;
152
+ }
153
+ return null;
154
+ }
155
+ function resolveExportsField(manifest, subpath, localPaths) {
156
+ if (manifest.exports === undefined || manifest.exports === null)
157
+ return null;
158
+ const match = matchSubpathMap(normalizeExports(manifest.exports), subpath);
159
+ if (!match)
160
+ return null;
161
+ for (const target of leafTargets(match.value, match.wildcard)) {
162
+ const resolved = resolveManifestTarget(target, manifest.dir, localPaths);
163
+ if (resolved)
164
+ return resolved;
165
+ }
166
+ return null;
167
+ }
168
+ /**
169
+ * Resolve a path written in a manifest (relative to the package directory) to
170
+ * a scanned file. Built output (`dist/index.mjs`, `dist/types/index.d.ts`) is
171
+ * mapped back to the source it came from, since only sources are scanned.
172
+ */
173
+ export function resolveManifestTarget(target, packageDir, localPaths) {
174
+ // `imports`/`exports` may name another package (`"#dep": "lodash"`).
175
+ if (/^[a-z][a-z0-9+.-]*:/i.test(target))
176
+ return null;
177
+ const joined = normalizePath(joinPath(packageDir, target));
178
+ if (joined === null)
179
+ return null;
180
+ if (packageDir !== "" && joined !== packageDir && !joined.startsWith(`${packageDir}/`))
181
+ return null;
182
+ const direct = matchLocalPath(joined, localPaths);
183
+ if (direct)
184
+ return direct;
185
+ return resolveBuildOutput(joined, packageDir, localPaths);
186
+ }
187
+ function resolveBuildOutput(joined, packageDir, localPaths) {
188
+ const relativePath = packageDir === "" ? joined : joined.slice(packageDir.length + 1);
189
+ const segments = relativePath.split("/");
190
+ const buildIndex = segments.findIndex((segment) => BUILD_DIRS.has(segment));
191
+ const prefix = buildIndex === -1 ? [] : segments.slice(0, buildIndex);
192
+ const rest = buildIndex === -1 ? [...segments] : segments.slice(buildIndex + 1);
193
+ while (rest.length > 1 && FORMAT_DIRS.has(rest[0]))
194
+ rest.shift();
195
+ if (rest.length === 0)
196
+ return null;
197
+ const base = rest.join("/").replace(/\.d\.[cm]?ts$|\.[cm]?jsx?$/, "");
198
+ if (base === "")
199
+ return null;
200
+ for (const sourceDir of SOURCE_DIRS) {
201
+ const candidate = [packageDir, ...prefix, sourceDir, base].filter((part) => part !== "").join("/");
202
+ const found = matchLocalPath(candidate, localPaths);
203
+ if (found)
204
+ return found;
205
+ }
206
+ return null;
207
+ }
208
+ function normalizeExports(value) {
209
+ if (isRecord(value)) {
210
+ const keys = Object.keys(value);
211
+ // `{ "import": ..., "default": ... }` is a condition map for ".".
212
+ if (keys.length > 0 && keys.every((key) => key.startsWith(".")))
213
+ return value;
214
+ }
215
+ return { ".": value };
216
+ }
217
+ /** Exact key first, then the longest `prefix*suffix` pattern. */
218
+ function matchSubpathMap(map, subpath) {
219
+ if (Object.prototype.hasOwnProperty.call(map, subpath))
220
+ return { value: map[subpath] };
221
+ let best = null;
222
+ for (const [key, value] of Object.entries(map)) {
223
+ const star = key.indexOf("*");
224
+ if (star === -1)
225
+ continue;
226
+ const prefix = key.slice(0, star);
227
+ const suffix = key.slice(star + 1);
228
+ if (subpath.length < key.length - 1)
229
+ continue;
230
+ if (!subpath.startsWith(prefix) || !subpath.endsWith(suffix))
231
+ continue;
232
+ const wildcard = subpath.slice(prefix.length, subpath.length - suffix.length);
233
+ if (!best || prefix.length > best.length)
234
+ best = { value, wildcard, length: prefix.length };
235
+ }
236
+ return best ? { value: best.value, wildcard: best.wildcard } : null;
237
+ }
238
+ /** Every string target of a conditional export, best condition first. */
239
+ function leafTargets(value, wildcard) {
240
+ const targets = [];
241
+ const visit = (node) => {
242
+ if (typeof node === "string") {
243
+ targets.push(wildcard === undefined ? node : node.replace(/\*/g, wildcard));
244
+ }
245
+ else if (Array.isArray(node)) {
246
+ node.forEach(visit);
247
+ }
248
+ else if (isRecord(node)) {
249
+ const rank = (condition) => {
250
+ const position = CONDITION_ORDER.indexOf(condition);
251
+ return position === -1 ? CONDITION_ORDER.length : position;
252
+ };
253
+ // Array.prototype.sort is stable: unknown conditions keep declared order.
254
+ for (const condition of Object.keys(node).sort((a, b) => rank(a) - rank(b))) {
255
+ visit(node[condition]);
256
+ }
257
+ }
258
+ };
259
+ visit(value);
260
+ return targets;
261
+ }
262
+ function splitPackageSpecifier(specifier) {
263
+ if (specifier.startsWith(".") || specifier.startsWith("/") || specifier.startsWith("#"))
264
+ return null;
265
+ const parts = specifier.split("/");
266
+ const nameLength = specifier.startsWith("@") ? 2 : 1;
267
+ if (parts.length < nameLength || parts.slice(0, nameLength).some((part) => part === ""))
268
+ return null;
269
+ const name = parts.slice(0, nameLength).join("/");
270
+ const rest = parts.slice(nameLength).join("/");
271
+ return { name, subpath: rest === "" ? "." : `./${rest}` };
272
+ }
273
+ function nearestManifest(file, manifests, accept) {
274
+ let best;
275
+ for (const manifest of manifests) {
276
+ if (!accept(manifest))
277
+ continue;
278
+ const contains = manifest.dir === "" || file.startsWith(`${manifest.dir}/`);
279
+ if (contains && (!best || manifest.dir.length > best.dir.length))
280
+ best = manifest;
281
+ }
282
+ return best;
283
+ }
284
+ // File-looking tokens in a script: `tsx src/server.ts`, `node dist/index.js`,
285
+ // `tsup src/index.ts --format esm`. Globs and flags never match.
286
+ function scriptFileTokens(command) {
287
+ const tokens = [];
288
+ const pattern = /(?:^|[\s"'=:])((?:\.{1,2}\/)?[\w@.\-/]+\.(?:[cm]?[jt]sx?))(?=$|[\s"';&|])/g;
289
+ let match = pattern.exec(command);
290
+ while (match) {
291
+ const token = match[1];
292
+ if (!token.includes("node_modules/") && !token.startsWith("/"))
293
+ tokens.push(token);
294
+ match = pattern.exec(command);
295
+ }
296
+ return tokens;
297
+ }
298
+ function isConfigFile(path) {
299
+ return /(^|\/)[\w.-]*\.(?:config|setup)\.[cm]?[jt]s$/.test(path) || /(^|\/)\.[\w.-]+rc\.[cm]?[jt]s$/.test(path);
300
+ }
301
+ function joinPath(directory, path) {
302
+ return directory === "" ? path : `${directory}/${path}`;
303
+ }
304
+ function binTargets(value) {
305
+ if (typeof value === "string")
306
+ return [value];
307
+ if (isRecord(value))
308
+ return Object.values(value).filter((item) => typeof item === "string");
309
+ return [];
310
+ }
311
+ function stringField(value) {
312
+ return typeof value === "string" && value.length > 0 ? value : undefined;
313
+ }
314
+ function stringRecord(value) {
315
+ if (!isRecord(value))
316
+ return {};
317
+ return Object.fromEntries(Object.entries(value).filter((entry) => typeof entry[1] === "string"));
318
+ }
319
+ function isRecord(value) {
320
+ return typeof value === "object" && value !== null && !Array.isArray(value);
321
+ }
322
+ //# sourceMappingURL=packageManifests.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"packageManifests.js","sourceRoot":"","sources":["../../../src/analyzers/graph/packageManifests.ts"],"names":[],"mappings":"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"}