@flaid/devmap 0.4.1 → 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 (84) hide show
  1. package/dist/analyzers/analysis/fileScanner.d.ts.map +1 -1
  2. package/dist/analyzers/analysis/fileScanner.js +34 -7
  3. package/dist/analyzers/analysis/fileScanner.js.map +1 -1
  4. package/dist/analyzers/analysis/filterEngine.d.ts +2 -0
  5. package/dist/analyzers/analysis/filterEngine.d.ts.map +1 -1
  6. package/dist/analyzers/analysis/filterEngine.js +57 -29
  7. package/dist/analyzers/analysis/filterEngine.js.map +1 -1
  8. package/dist/analyzers/analysis/index.d.ts +1 -0
  9. package/dist/analyzers/analysis/index.d.ts.map +1 -1
  10. package/dist/analyzers/analysis/index.js +1 -0
  11. package/dist/analyzers/analysis/index.js.map +1 -1
  12. package/dist/analyzers/analysis/jsonText.d.ts +7 -0
  13. package/dist/analyzers/analysis/jsonText.d.ts.map +1 -0
  14. package/dist/analyzers/analysis/jsonText.js +9 -0
  15. package/dist/analyzers/analysis/jsonText.js.map +1 -0
  16. package/dist/analyzers/analysis/tsMorphAnalyzer.d.ts.map +1 -1
  17. package/dist/analyzers/analysis/tsMorphAnalyzer.js +142 -12
  18. package/dist/analyzers/analysis/tsMorphAnalyzer.js.map +1 -1
  19. package/dist/analyzers/detectors/capabilityDetector.js +7 -3
  20. package/dist/analyzers/detectors/capabilityDetector.js.map +1 -1
  21. package/dist/analyzers/detectors/databaseDetector.d.ts +4 -1
  22. package/dist/analyzers/detectors/databaseDetector.d.ts.map +1 -1
  23. package/dist/analyzers/detectors/databaseDetector.js +103 -14
  24. package/dist/analyzers/detectors/databaseDetector.js.map +1 -1
  25. package/dist/analyzers/detectors/frameworkDetector.d.ts +1 -1
  26. package/dist/analyzers/detectors/frameworkDetector.d.ts.map +1 -1
  27. package/dist/analyzers/detectors/frameworkDetector.js +4 -2
  28. package/dist/analyzers/detectors/frameworkDetector.js.map +1 -1
  29. package/dist/analyzers/detectors/routeDetector.js +96 -25
  30. package/dist/analyzers/detectors/routeDetector.js.map +1 -1
  31. package/dist/analyzers/detectors/serviceDetector.d.ts +1 -1
  32. package/dist/analyzers/detectors/serviceDetector.d.ts.map +1 -1
  33. package/dist/analyzers/detectors/serviceDetector.js +2 -1
  34. package/dist/analyzers/detectors/serviceDetector.js.map +1 -1
  35. package/dist/analyzers/features/featureCandidates.d.ts.map +1 -1
  36. package/dist/analyzers/features/featureCandidates.js +48 -0
  37. package/dist/analyzers/features/featureCandidates.js.map +1 -1
  38. package/dist/analyzers/graph/aliasResolver.d.ts +28 -5
  39. package/dist/analyzers/graph/aliasResolver.d.ts.map +1 -1
  40. package/dist/analyzers/graph/aliasResolver.js +264 -31
  41. package/dist/analyzers/graph/aliasResolver.js.map +1 -1
  42. package/dist/analyzers/graph/dependencyGraph.d.ts.map +1 -1
  43. package/dist/analyzers/graph/dependencyGraph.js +74 -78
  44. package/dist/analyzers/graph/dependencyGraph.js.map +1 -1
  45. package/dist/analyzers/graph/entryPoints.d.ts +8 -1
  46. package/dist/analyzers/graph/entryPoints.d.ts.map +1 -1
  47. package/dist/analyzers/graph/entryPoints.js +69 -4
  48. package/dist/analyzers/graph/entryPoints.js.map +1 -1
  49. package/dist/analyzers/graph/index.d.ts +4 -2
  50. package/dist/analyzers/graph/index.d.ts.map +1 -1
  51. package/dist/analyzers/graph/index.js +3 -2
  52. package/dist/analyzers/graph/index.js.map +1 -1
  53. package/dist/analyzers/graph/localPaths.d.ts +4 -0
  54. package/dist/analyzers/graph/localPaths.d.ts.map +1 -0
  55. package/dist/analyzers/graph/localPaths.js +50 -0
  56. package/dist/analyzers/graph/localPaths.js.map +1 -0
  57. package/dist/analyzers/graph/nuxtAutoImports.d.ts +33 -0
  58. package/dist/analyzers/graph/nuxtAutoImports.d.ts.map +1 -0
  59. package/dist/analyzers/graph/nuxtAutoImports.js +222 -0
  60. package/dist/analyzers/graph/nuxtAutoImports.js.map +1 -0
  61. package/dist/analyzers/graph/packageManifests.d.ts +49 -0
  62. package/dist/analyzers/graph/packageManifests.d.ts.map +1 -0
  63. package/dist/analyzers/graph/packageManifests.js +322 -0
  64. package/dist/analyzers/graph/packageManifests.js.map +1 -0
  65. package/dist/analyzers/graph/sourceScope.d.ts +2 -0
  66. package/dist/analyzers/graph/sourceScope.d.ts.map +1 -1
  67. package/dist/analyzers/graph/sourceScope.js +23 -14
  68. package/dist/analyzers/graph/sourceScope.js.map +1 -1
  69. package/dist/analyzers/pipeline/heuristicAnalyzer.d.ts.map +1 -1
  70. package/dist/analyzers/pipeline/heuristicAnalyzer.js +10 -3
  71. package/dist/analyzers/pipeline/heuristicAnalyzer.js.map +1 -1
  72. package/dist/analyzers/pipeline/languageReaders.d.ts +8 -0
  73. package/dist/analyzers/pipeline/languageReaders.d.ts.map +1 -0
  74. package/dist/analyzers/pipeline/languageReaders.js +296 -0
  75. package/dist/analyzers/pipeline/languageReaders.js.map +1 -0
  76. package/dist/analyzers/pipeline/projectMap.d.ts.map +1 -1
  77. package/dist/analyzers/pipeline/projectMap.js +22 -29
  78. package/dist/analyzers/pipeline/projectMap.js.map +1 -1
  79. package/dist/analyzers/pipeline/projectMetadata.d.ts.map +1 -1
  80. package/dist/analyzers/pipeline/projectMetadata.js +33 -5
  81. package/dist/analyzers/pipeline/projectMetadata.js.map +1 -1
  82. package/dist/commands/analyze.js +3 -0
  83. package/dist/commands/analyze.js.map +1 -1
  84. package/package.json +5 -5
@@ -1,40 +1,77 @@
1
- import { resolveAlias } from "./aliasResolver.js";
2
- const IMPORT_RE = /(?:import\s+(?:[^'"]+\s+from\s+)?|export\s+[^'"]+\s+from\s+|require\()\s*['"]([^'"]+)['"]/g;
1
+ import { isDeclaredAlias, resolveAliasCandidates } from "./aliasResolver.js";
2
+ import { matchLocalPath, normalizePath } from "./localPaths.js";
3
+ import { addNuxtAutoImportEdges } from "./nuxtAutoImports.js";
4
+ import { indexPackages, readPackageManifests, resolveSubpathImport, resolveWorkspaceSpecifier } from "./packageManifests.js";
5
+ // Static imports, re-exports, require() and dynamic import() with a literal.
6
+ const IMPORT_RE = /(?:\bimport\s+(?:[^'"]+\s+from\s+)?|\bexport\s+[^'"]+\s+from\s+|\b(?:require|import)\s*\(\s*)['"]([^'"]+)['"]/g;
3
7
  export function buildDependencyGraph(files, analyses = {}, aliasMappings = []) {
4
8
  const graph = {};
5
9
  const localPaths = new Set(files.map((file) => file.path));
10
+ const packages = indexPackages(readPackageManifests(files));
6
11
  const diagnostics = {
7
12
  unresolvedAliases: [],
8
13
  parserFallbacks: [],
9
14
  };
10
15
  for (const file of files) {
11
- graph[file.path] = [];
16
+ // A file importing the same module twice (`import type` + value import,
17
+ // or a static and a dynamic import) is still one dependency edge.
18
+ const edges = new Set();
12
19
  const importSpecifiers = analyses[file.path]?.imports ?? findImportSpecifiers(file.content);
13
- for (const specifier of importSpecifiers) {
20
+ for (const rawSpecifier of importSpecifiers) {
21
+ // Bundler suffixes (`./icon.svg?react`, `./worker.ts?worker`) are not
22
+ // part of the file name.
23
+ const specifier = stripQuery(rawSpecifier);
14
24
  if (specifier.startsWith(".")) {
15
25
  const resolved = resolveImport(file.path, specifier, localPaths);
16
- if (resolved) {
17
- graph[file.path].push(resolved);
26
+ if (resolved && resolved !== file.path) {
27
+ edges.add(resolved);
18
28
  }
19
29
  continue;
20
30
  }
21
- // Try alias resolution for non-relative imports
22
- const aliasResolved = resolveAlias(specifier, aliasMappings);
23
- if (aliasResolved) {
24
- const resolved = resolveAliasPath(aliasResolved, localPaths);
31
+ // package.json "imports": `#internal/db` is local by definition. Other
32
+ // `#` specifiers (Nuxt's `#shared/...`) are aliases and fall through.
33
+ if (specifier.startsWith("#")) {
34
+ const resolved = resolveSubpathImport(specifier, file.path, packages, localPaths);
25
35
  if (resolved) {
26
- graph[file.path].push(resolved);
36
+ if (resolved !== file.path)
37
+ edges.add(resolved);
38
+ continue;
27
39
  }
28
- else {
40
+ }
41
+ // Try alias resolution for non-relative imports
42
+ const candidates = resolveAliasCandidates(specifier, aliasMappings, file.path);
43
+ const aliasResolved = candidates.length > 0 ? firstResolved(candidates, localPaths) : null;
44
+ if (aliasResolved) {
45
+ if (aliasResolved !== file.path)
46
+ edges.add(aliasResolved);
47
+ continue;
48
+ }
49
+ // A package that lives in this repo (workspace member): import by name.
50
+ const workspaceResolved = resolveWorkspaceSpecifier(specifier, packages, localPaths);
51
+ if (workspaceResolved) {
52
+ if (workspaceResolved !== file.path)
53
+ edges.add(workspaceResolved);
54
+ continue;
55
+ }
56
+ if (candidates.length > 0) {
57
+ if (isDeclaredAlias(specifier, aliasMappings, file.path)) {
29
58
  diagnostics.unresolvedAliases.push({ file: file.path, specifier });
30
59
  }
31
60
  }
61
+ else if (file.path.endsWith(".py")) {
62
+ const resolved = resolvePythonModule(specifier, localPaths);
63
+ if (resolved && resolved !== file.path)
64
+ edges.add(resolved);
65
+ }
32
66
  // Non-relative, non-alias imports are silently skipped (npm packages etc.)
33
67
  }
68
+ graph[file.path] = [...edges];
34
69
  if (!analyses[file.path]) {
35
70
  diagnostics.parserFallbacks.push(file.path);
36
71
  }
37
72
  }
73
+ // Frameworks that connect files without import statements.
74
+ addNuxtAutoImportEdges(graph, files, analyses);
38
75
  return { graph, diagnostics };
39
76
  }
40
77
  export function countReferences(graph) {
@@ -46,6 +83,10 @@ export function countReferences(graph) {
46
83
  }
47
84
  return counts;
48
85
  }
86
+ function stripQuery(specifier) {
87
+ const query = specifier.indexOf("?");
88
+ return query === -1 ? specifier : specifier.slice(0, query);
89
+ }
49
90
  function findImportSpecifiers(content) {
50
91
  const matches = [];
51
92
  IMPORT_RE.lastIndex = 0;
@@ -60,76 +101,31 @@ function resolveImport(fromPath, specifier, localPaths) {
60
101
  const baseParts = fromPath.split("/");
61
102
  baseParts.pop();
62
103
  const normalized = normalizePath([...baseParts, specifier].join("/"));
63
- const candidates = [
64
- normalized,
65
- `${normalized}.ts`,
66
- `${normalized}.tsx`,
67
- `${normalized}.js`,
68
- `${normalized}.jsx`,
69
- `${normalized}.mjs`,
70
- `${normalized}.cjs`,
71
- `${normalized}.vue`,
72
- `${normalized}.svelte`,
73
- `${normalized}.astro`,
74
- `${normalized}/index.ts`,
75
- `${normalized}/index.tsx`,
76
- `${normalized}/index.js`,
77
- `${normalized}/index.jsx`,
78
- `${normalized}/index.vue`,
79
- `${normalized}/index.svelte`,
80
- `${normalized}/index.astro`
81
- ];
82
- if (normalized.endsWith(".js")) {
83
- const withoutExtension = normalized.slice(0, -3);
84
- candidates.push(`${withoutExtension}.ts`, `${withoutExtension}.tsx`);
85
- }
86
- if (normalized.endsWith(".mjs")) {
87
- candidates.push(`${normalized.slice(0, -4)}.mts`);
88
- }
89
- if (normalized.endsWith(".cjs")) {
90
- candidates.push(`${normalized.slice(0, -4)}.cts`);
91
- }
92
- return candidates.find((candidate) => localPaths.has(candidate)) ?? null;
104
+ return normalized === null ? null : matchLocalPath(normalized, localPaths);
93
105
  }
94
- function resolveAliasPath(rootRelativePath, localPaths) {
95
- const normalized = normalizePath(rootRelativePath);
96
- const candidates = [
97
- normalized,
98
- `${normalized}.ts`,
99
- `${normalized}.tsx`,
100
- `${normalized}.js`,
101
- `${normalized}.jsx`,
102
- `${normalized}.mjs`,
103
- `${normalized}.cjs`,
104
- `${normalized}.vue`,
105
- `${normalized}.svelte`,
106
- `${normalized}.astro`,
107
- `${normalized}/index.ts`,
108
- `${normalized}/index.tsx`,
109
- `${normalized}/index.js`,
110
- `${normalized}/index.jsx`,
111
- `${normalized}/index.vue`,
112
- `${normalized}/index.svelte`,
113
- `${normalized}/index.astro`
114
- ];
115
- if (normalized.endsWith(".js")) {
116
- const withoutExtension = normalized.slice(0, -3);
117
- candidates.push(`${withoutExtension}.ts`, `${withoutExtension}.tsx`);
106
+ // `from app.models import User` -> app/models.py or app/models/__init__.py,
107
+ // looked up from the project root and from a conventional src/ layout.
108
+ function resolvePythonModule(specifier, localPaths) {
109
+ if (!/^[A-Za-z_][\w.]*$/.test(specifier))
110
+ return null;
111
+ const modulePath = specifier.replace(/\./g, "/");
112
+ for (const base of ["", "src/"]) {
113
+ for (const candidate of [`${base}${modulePath}.py`, `${base}${modulePath}/__init__.py`]) {
114
+ if (localPaths.has(candidate))
115
+ return candidate;
116
+ }
118
117
  }
119
- return candidates.find((candidate) => localPaths.has(candidate)) ?? null;
118
+ return null;
120
119
  }
121
- function normalizePath(path) {
122
- const parts = [];
123
- for (const part of path.split("/")) {
124
- if (part === "." || part === "") {
125
- continue;
126
- }
127
- if (part === "..") {
128
- parts.pop();
120
+ function firstResolved(rootRelativePaths, localPaths) {
121
+ for (const rootRelativePath of rootRelativePaths) {
122
+ const normalized = normalizePath(rootRelativePath);
123
+ if (normalized === null)
129
124
  continue;
130
- }
131
- parts.push(part);
125
+ const resolved = matchLocalPath(normalized, localPaths);
126
+ if (resolved)
127
+ return resolved;
132
128
  }
133
- return parts.join("/");
129
+ return null;
134
130
  }
135
131
  //# sourceMappingURL=dependencyGraph.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"dependencyGraph.js","sourceRoot":"","sources":["../../../src/analyzers/graph/dependencyGraph.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dependencyGraph.js","sourceRoot":"","sources":["../../../src/analyzers/graph/dependencyGraph.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,10 @@
1
1
  import type { FileGraph } from "./dependencyGraph.js";
2
- export declare function detectEntryPoints(graph: FileGraph): string[];
2
+ import type { ManifestEntry } from "./packageManifests.js";
3
+ /**
4
+ * `manifestEntries` come from package.json (`bin`, `main`/`exports`, scripts).
5
+ * A `main` file that another source file imports is just shared plumbing, so
6
+ * it only counts while nothing imports it; `bin` and script entries are
7
+ * started from outside and always count.
8
+ */
9
+ export declare function detectEntryPoints(graph: FileGraph, manifestEntries?: ManifestEntry[]): string[];
3
10
  //# sourceMappingURL=entryPoints.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"entryPoints.d.ts","sourceRoot":"","sources":["../../../src/analyzers/graph/entryPoints.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AA2BtD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,EAAE,CAS5D"}
1
+ {"version":3,"file":"entryPoints.d.ts","sourceRoot":"","sources":["../../../src/analyzers/graph/entryPoints.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AA4D3D;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,SAAS,EAAE,eAAe,GAAE,aAAa,EAAO,GAAG,MAAM,EAAE,CAsCnG"}
@@ -6,11 +6,35 @@ const ENTRY_PATTERNS = [
6
6
  /(^|\/)(server|app|index|main)\.[cm]?[jt]sx?$/,
7
7
  /(^|\/)route\.[jt]s$/
8
8
  ];
9
+ // Files a framework loads by convention. They only count while no source file
10
+ // imports them: a Vue SPA's `pages/Home.vue` pulled in by its router is a
11
+ // component, while a Nuxt page that nothing references is where a route starts.
12
+ const FRAMEWORK_LOADED_PATTERNS = [
13
+ /(^|\/)app\.vue$/,
14
+ /(^|\/)\+(?:page|layout)\.svelte$/,
15
+ /(^|\/)\+server\.[jt]s$/,
16
+ /(^|\/)hooks\.(?:server|client)\.[jt]s$/,
17
+ /(^|\/)app\/root\.[jt]sx?$/,
18
+ /(^|\/)entry\.(?:client|server)\.[jt]sx?$/,
19
+ /(^|\/)pages\/.+\.(?:vue|astro)$/,
20
+ /(^|\/)pages\/(?:_app|_document)\.[jt]sx?$/,
21
+ /(^|\/)server\/(?:api|routes|middleware)\/.+\.[cm]?[jt]s$/
22
+ ];
9
23
  const ENTRY_PATTERN_SCORES = [
10
24
  { pattern: /(^|\/)layout\.[jt]sx?$/, score: 0 },
25
+ { pattern: /(^|\/)app\/root\.[jt]sx?$/, score: 0 },
26
+ { pattern: /(^|\/)\+layout\.svelte$/, score: 0 },
27
+ { pattern: /(^|\/)app\.vue$/, score: 0 },
28
+ { pattern: /(^|\/)pages\/(?:_app|_document)\.[jt]sx?$/, score: 0 },
29
+ { pattern: /(^|\/)pages\/.+\.(?:vue|astro)$/, score: 1 },
11
30
  { pattern: /(^|\/)page\.[jt]sx?$/, score: 1 },
31
+ { pattern: /(^|\/)\+page\.svelte$/, score: 1 },
12
32
  { pattern: /(^|\/)route\.[jt]s$/, score: 2 },
33
+ { pattern: /(^|\/)\+server\.[jt]s$/, score: 2 },
34
+ { pattern: /(^|\/)server\/(?:api|routes|middleware)\/.+\.[cm]?[jt]s$/, score: 2 },
13
35
  { pattern: /(^|\/)middleware\.[jt]s$/, score: 3 },
36
+ { pattern: /(^|\/)hooks\.(?:server|client)\.[jt]s$/, score: 3 },
37
+ { pattern: /(^|\/)entry\.(?:client|server)\.[jt]sx?$/, score: 3 },
14
38
  { pattern: /(^|\/)(app|server)\.[cm]?[jt]sx?$/, score: 4 },
15
39
  { pattern: /(^|\/)(index|main)\.[cm]?[jt]sx?$/, score: 5 },
16
40
  ];
@@ -21,13 +45,54 @@ function entryPointScore(path) {
21
45
  }
22
46
  return 10;
23
47
  }
24
- export function detectEntryPoints(graph) {
25
- const imported = new Set(Object.values(graph).flat());
48
+ // Declared entries rank above guesses: a CLI's `bin` is the way in, a package's
49
+ // `main` is its public face, and a script runs the file on purpose.
50
+ const MANIFEST_SCORES = {
51
+ bin: -2,
52
+ main: -1,
53
+ script: 6.5
54
+ };
55
+ /**
56
+ * `manifestEntries` come from package.json (`bin`, `main`/`exports`, scripts).
57
+ * A `main` file that another source file imports is just shared plumbing, so
58
+ * it only counts while nothing imports it; `bin` and script entries are
59
+ * started from outside and always count.
60
+ */
61
+ export function detectEntryPoints(graph, manifestEntries = []) {
62
+ // Only production code counts as a consumer: a barrel that nothing but its
63
+ // own tests imports (or a root index.ts that tests import) is still an
64
+ // entry, while a barrel re-exported through the app is just plumbing.
65
+ const imported = new Set(Object.entries(graph)
66
+ .filter(([path]) => isArchitectureSource(path))
67
+ .flatMap(([, imports]) => imports));
68
+ const declared = new Map();
69
+ for (const entry of manifestEntries) {
70
+ if (!(entry.path in graph) || !isSourceFile(entry.path) || !isArchitectureSource(entry.path))
71
+ continue;
72
+ if (entry.kind === "main" && imported.has(entry.path))
73
+ continue;
74
+ const score = MANIFEST_SCORES[entry.kind];
75
+ declared.set(entry.path, Math.min(score, declared.get(entry.path) ?? score));
76
+ }
77
+ const scoreOf = (path) => declared.get(path) ?? entryPointScore(path);
26
78
  return Object.keys(graph)
27
79
  .filter((path) => isSourceFile(path))
28
80
  .filter((path) => isArchitectureSource(path))
29
- .filter((path) => ENTRY_PATTERNS.some((pattern) => pattern.test(path)) || (!imported.has(path) && (graph[path]?.length ?? 0) > 0))
30
- .sort((a, b) => entryPointScore(a) - entryPointScore(b) || a.localeCompare(b))
81
+ .filter((path) => {
82
+ if (declared.has(path))
83
+ return true;
84
+ const unimportedWithImports = !imported.has(path) && (graph[path]?.length ?? 0) > 0;
85
+ // index.* is also the conventional barrel file; it is an entry only when
86
+ // nothing else imports it. A top-level index (index.ts, src/index.ts) is
87
+ // the package entry even when it has no imports of its own.
88
+ if (/(^|\/)index\.[cm]?[jt]sx?$/.test(path)) {
89
+ return !imported.has(path) && ((graph[path]?.length ?? 0) > 0 || path.split("/").length <= 2);
90
+ }
91
+ return ENTRY_PATTERNS.some((pattern) => pattern.test(path))
92
+ || (!imported.has(path) && FRAMEWORK_LOADED_PATTERNS.some((pattern) => pattern.test(path)))
93
+ || unimportedWithImports;
94
+ })
95
+ .sort((a, b) => scoreOf(a) - scoreOf(b) || a.localeCompare(b))
31
96
  .slice(0, 20);
32
97
  }
33
98
  function isSourceFile(path) {
@@ -1 +1 @@
1
- {"version":3,"file":"entryPoints.js","sourceRoot":"","sources":["../../../src/analyzers/graph/entryPoints.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAExD,MAAM,cAAc,GAAG;IACrB,sBAAsB;IACtB,wBAAwB;IACxB,0BAA0B;IAC1B,8CAA8C;IAC9C,qBAAqB;CACtB,CAAC;AAEF,MAAM,oBAAoB,GAA8C;IACtE,EAAE,OAAO,EAAE,wBAAwB,EAAE,KAAK,EAAE,CAAC,EAAE;IAC/C,EAAE,OAAO,EAAE,sBAAsB,EAAE,KAAK,EAAE,CAAC,EAAE;IAC7C,EAAE,OAAO,EAAE,qBAAqB,EAAE,KAAK,EAAE,CAAC,EAAE;IAC5C,EAAE,OAAO,EAAE,0BAA0B,EAAE,KAAK,EAAE,CAAC,EAAE;IACjD,EAAE,OAAO,EAAE,mCAAmC,EAAE,KAAK,EAAE,CAAC,EAAE;IAC1D,EAAE,OAAO,EAAE,mCAAmC,EAAE,KAAK,EAAE,CAAC,EAAE;CAC3D,CAAC;AAEF,SAAS,eAAe,CAAC,IAAY;IACnC,KAAK,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,oBAAoB,EAAE,CAAC;QACtD,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,OAAO,KAAK,CAAC;IACvC,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAgB;IAChD,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAEtD,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;SACtB,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;SACpC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC;SAC5C,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;SACjI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;SAC7E,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAClB,CAAC;AAED,SAAS,YAAY,CAAC,IAAY;IAChC,OAAO,2CAA2C,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAChE,CAAC"}
1
+ {"version":3,"file":"entryPoints.js","sourceRoot":"","sources":["../../../src/analyzers/graph/entryPoints.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,11 @@
1
1
  export { buildDependencyGraph, countReferences, } from "./dependencyGraph.js";
2
2
  export type { FileGraph, DependencyGraphDiagnostics, } from "./dependencyGraph.js";
3
- export { loadAliasMappings, resolveAlias, } from "./aliasResolver.js";
3
+ export { loadAliasMappings, resolveAlias, resolveAliasCandidates, isDeclaredAlias, } from "./aliasResolver.js";
4
4
  export type { AliasMapping, } from "./aliasResolver.js";
5
5
  export { detectEntryPoints, } from "./entryPoints.js";
6
- export { isArchitectureSource, } from "./sourceScope.js";
6
+ export { indexPackages, manifestEntryPoints, readPackageManifests, resolveSubpathImport, resolveWorkspaceSpecifier, } from "./packageManifests.js";
7
+ export type { ManifestEntry, PackageIndex, PackageManifest, } from "./packageManifests.js";
8
+ export { isArchitectureSource, isTestPath, } from "./sourceScope.js";
7
9
  export { buildReverseGraph, buildBoundedTree, collectNodesWithinDepth, DEFAULT_MAX_CHILDREN, } from "./dependencyMap.js";
8
10
  export type { MapTreeNode, } from "./dependencyMap.js";
9
11
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/analyzers/graph/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,eAAe,GAChB,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EACV,SAAS,EACT,0BAA0B,GAC3B,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,iBAAiB,EACjB,YAAY,GACb,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EACV,YAAY,GACb,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,iBAAiB,GAClB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,oBAAoB,GACrB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,uBAAuB,EACvB,oBAAoB,GACrB,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EACV,WAAW,GACZ,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/analyzers/graph/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,eAAe,GAChB,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EACV,SAAS,EACT,0BAA0B,GAC3B,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,iBAAiB,EACjB,YAAY,EACZ,sBAAsB,EACtB,eAAe,GAChB,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EACV,YAAY,GACb,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,iBAAiB,GAClB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,aAAa,EACb,mBAAmB,EACnB,oBAAoB,EACpB,oBAAoB,EACpB,yBAAyB,GAC1B,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EACV,aAAa,EACb,YAAY,EACZ,eAAe,GAChB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,oBAAoB,EACpB,UAAU,GACX,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,uBAAuB,EACvB,oBAAoB,GACrB,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EACV,WAAW,GACZ,MAAM,oBAAoB,CAAC"}
@@ -1,6 +1,7 @@
1
1
  export { buildDependencyGraph, countReferences, } from "./dependencyGraph.js";
2
- export { loadAliasMappings, resolveAlias, } from "./aliasResolver.js";
2
+ export { loadAliasMappings, resolveAlias, resolveAliasCandidates, isDeclaredAlias, } from "./aliasResolver.js";
3
3
  export { detectEntryPoints, } from "./entryPoints.js";
4
- export { isArchitectureSource, } from "./sourceScope.js";
4
+ export { indexPackages, manifestEntryPoints, readPackageManifests, resolveSubpathImport, resolveWorkspaceSpecifier, } from "./packageManifests.js";
5
+ export { isArchitectureSource, isTestPath, } from "./sourceScope.js";
5
6
  export { buildReverseGraph, buildBoundedTree, collectNodesWithinDepth, DEFAULT_MAX_CHILDREN, } from "./dependencyMap.js";
6
7
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/analyzers/graph/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,eAAe,GAChB,MAAM,sBAAsB,CAAC;AAM9B,OAAO,EACL,iBAAiB,EACjB,YAAY,GACb,MAAM,oBAAoB,CAAC;AAK5B,OAAO,EACL,iBAAiB,GAClB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,oBAAoB,GACrB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,uBAAuB,EACvB,oBAAoB,GACrB,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/analyzers/graph/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,eAAe,GAChB,MAAM,sBAAsB,CAAC;AAM9B,OAAO,EACL,iBAAiB,EACjB,YAAY,EACZ,sBAAsB,EACtB,eAAe,GAChB,MAAM,oBAAoB,CAAC;AAK5B,OAAO,EACL,iBAAiB,GAClB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,aAAa,EACb,mBAAmB,EACnB,oBAAoB,EACpB,oBAAoB,EACpB,yBAAyB,GAC1B,MAAM,uBAAuB,CAAC;AAO/B,OAAO,EACL,oBAAoB,EACpB,UAAU,GACX,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,uBAAuB,EACvB,oBAAoB,GACrB,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare function matchLocalPath(normalized: string, localPaths: Set<string>): string | null;
2
+ /** Collapse `.` and `..`; null when the path climbs above the project root. */
3
+ export declare function normalizePath(path: string): string | null;
4
+ //# sourceMappingURL=localPaths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"localPaths.d.ts","sourceRoot":"","sources":["../../../src/analyzers/graph/localPaths.ts"],"names":[],"mappings":"AAoBA,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,MAAM,GAAG,IAAI,CAgBzF;AAED,+EAA+E;AAC/E,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAkBzD"}
@@ -0,0 +1,50 @@
1
+ // Shared path matching for graph resolution: turn an import target (no
2
+ // extension, directory, or emitted `.js`) into a scanned source file.
3
+ const SOURCE_EXTENSIONS = [
4
+ ".ts", ".tsx", ".js", ".jsx", ".mjs", ".cjs", ".mts", ".cts", ".vue", ".svelte", ".astro",
5
+ ".py", ".rb", ".php"
6
+ ];
7
+ const INDEX_EXTENSIONS = [
8
+ ".ts", ".tsx", ".js", ".jsx", ".mjs", ".cjs", ".mts", ".cts", ".vue", ".svelte", ".astro",
9
+ ".py", ".rb", ".php"
10
+ ];
11
+ // TypeScript ESM writes the emitted extension in the specifier.
12
+ const EMITTED_EXTENSION_SOURCES = [
13
+ [".js", [".ts", ".tsx"]],
14
+ [".jsx", [".tsx"]],
15
+ [".mjs", [".mts"]],
16
+ [".cjs", [".cts"]]
17
+ ];
18
+ export function matchLocalPath(normalized, localPaths) {
19
+ const candidates = [
20
+ normalized,
21
+ ...SOURCE_EXTENSIONS.map((extension) => `${normalized}${extension}`),
22
+ ...INDEX_EXTENSIONS.map((extension) => `${normalized}/index${extension}`),
23
+ `${normalized}/__init__.py`
24
+ ];
25
+ for (const [emitted, sources] of EMITTED_EXTENSION_SOURCES) {
26
+ if (normalized.endsWith(emitted)) {
27
+ const withoutExtension = normalized.slice(0, -emitted.length);
28
+ candidates.push(...sources.map((source) => `${withoutExtension}${source}`));
29
+ }
30
+ }
31
+ return candidates.find((candidate) => localPaths.has(candidate)) ?? null;
32
+ }
33
+ /** Collapse `.` and `..`; null when the path climbs above the project root. */
34
+ export function normalizePath(path) {
35
+ const parts = [];
36
+ for (const part of path.split("/")) {
37
+ if (part === "." || part === "") {
38
+ continue;
39
+ }
40
+ if (part === "..") {
41
+ if (parts.length === 0)
42
+ return null;
43
+ parts.pop();
44
+ continue;
45
+ }
46
+ parts.push(part);
47
+ }
48
+ return parts.join("/");
49
+ }
50
+ //# sourceMappingURL=localPaths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"localPaths.js","sourceRoot":"","sources":["../../../src/analyzers/graph/localPaths.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,sEAAsE;AAEtE,MAAM,iBAAiB,GAAG;IACxB,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ;IACzF,KAAK,EAAE,KAAK,EAAE,MAAM;CACrB,CAAC;AACF,MAAM,gBAAgB,GAAG;IACvB,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ;IACzF,KAAK,EAAE,KAAK,EAAE,MAAM;CACrB,CAAC;AAEF,gEAAgE;AAChE,MAAM,yBAAyB,GAA8B;IAC3D,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACxB,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC;IAClB,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC;IAClB,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC;CACnB,CAAC;AAEF,MAAM,UAAU,cAAc,CAAC,UAAkB,EAAE,UAAuB;IACxE,MAAM,UAAU,GAAG;QACjB,UAAU;QACV,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,GAAG,UAAU,GAAG,SAAS,EAAE,CAAC;QACpE,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,GAAG,UAAU,SAAS,SAAS,EAAE,CAAC;QACzE,GAAG,UAAU,cAAc;KAC5B,CAAC;IAEF,KAAK,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,yBAAyB,EAAE,CAAC;QAC3D,IAAI,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YACjC,MAAM,gBAAgB,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAC9D,UAAU,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,gBAAgB,GAAG,MAAM,EAAE,CAAC,CAAC,CAAC;QAC9E,CAAC;IACH,CAAC;IAED,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,IAAI,CAAC;AAC3E,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QACnC,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,EAAE,EAAE,CAAC;YAChC,SAAS;QACX,CAAC;QAED,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAClB,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,IAAI,CAAC;YACpC,KAAK,CAAC,GAAG,EAAE,CAAC;YACZ,SAAS;QACX,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACzB,CAAC"}
@@ -0,0 +1,33 @@
1
+ import type { FileAnalysis, ScannedFile } from "../analysis/index.js";
2
+ import type { FileGraph } from "./dependencyGraph.js";
3
+ /**
4
+ * Nuxt wires files together without import statements: components, composables
5
+ * and utils are picked up from their folders, and `~/` points at `app/` (Nuxt
6
+ * 4) or the project root (Nuxt 3), not at `src/`. Without modelling that, a
7
+ * Nuxt project looks like a pile of files that never reference each other.
8
+ */
9
+ export interface NuxtApp {
10
+ /** Project-root-relative directory holding nuxt.config (`""` for the root). */
11
+ dir: string;
12
+ /** Source directory, relative to `dir` (`""` or `"app"`, or a custom srcDir). */
13
+ srcDir: string;
14
+ /** `@pinia/nuxt` is installed: `stores/` is auto-imported too. */
15
+ pinia: boolean;
16
+ }
17
+ /**
18
+ * The source directory a Nuxt project uses. An explicit `srcDir` in the config
19
+ * wins; otherwise `app/` when the Nuxt 4 layout is present, else the root.
20
+ * `hasPath` answers whether a path (or, with a trailing slash, a folder)
21
+ * exists under the config's directory.
22
+ */
23
+ export declare function pickNuxtSrcDir(configText: string, hasPath: (relative: string) => boolean): string;
24
+ export declare function detectNuxtApps(files: ScannedFile[]): NuxtApp[];
25
+ /**
26
+ * Add the edges Nuxt creates implicitly: a file that renders `<AccountAvatar>`
27
+ * or calls `useUser()` depends on the component / composable file that
28
+ * provides it. Mutates `graph`; existing explicit imports are untouched.
29
+ */
30
+ export declare function addNuxtAutoImportEdges(graph: FileGraph, files: ScannedFile[], analyses: Record<string, FileAnalysis>): void;
31
+ /** Nuxt's component name: folder path + file name, overlap dropped. */
32
+ export declare function componentName(relativeToComponents: string): string | null;
33
+ //# sourceMappingURL=nuxtAutoImports.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nuxtAutoImports.d.ts","sourceRoot":"","sources":["../../../src/analyzers/graph/nuxtAutoImports.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACtE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAGtD;;;;;GAKG;AAEH,MAAM,WAAW,OAAO;IACtB,+EAA+E;IAC/E,GAAG,EAAE,MAAM,CAAC;IACZ,iFAAiF;IACjF,MAAM,EAAE,MAAM,CAAC;IACf,kEAAkE;IAClE,KAAK,EAAE,OAAO,CAAC;CAChB;AAaD;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,GAAG,MAAM,CAOjG;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,OAAO,EAAE,CAoB9D;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,SAAS,EAChB,KAAK,EAAE,WAAW,EAAE,EACpB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,GACrC,IAAI,CAoGN;AAID,uEAAuE;AACvE,wBAAgB,aAAa,CAAC,oBAAoB,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAuBzE"}