mapra 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 (123) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +144 -0
  3. package/dist/analyzer/blast-radius.d.ts +27 -0
  4. package/dist/analyzer/blast-radius.d.ts.map +1 -0
  5. package/dist/analyzer/blast-radius.js +58 -0
  6. package/dist/analyzer/blast-radius.js.map +1 -0
  7. package/dist/analyzer/churn.d.ts +26 -0
  8. package/dist/analyzer/churn.d.ts.map +1 -0
  9. package/dist/analyzer/churn.js +96 -0
  10. package/dist/analyzer/churn.js.map +1 -0
  11. package/dist/analyzer/co-change.d.ts +60 -0
  12. package/dist/analyzer/co-change.d.ts.map +1 -0
  13. package/dist/analyzer/co-change.js +153 -0
  14. package/dist/analyzer/co-change.js.map +1 -0
  15. package/dist/analyzer/conventions.d.ts +22 -0
  16. package/dist/analyzer/conventions.d.ts.map +1 -0
  17. package/dist/analyzer/conventions.js +81 -0
  18. package/dist/analyzer/conventions.js.map +1 -0
  19. package/dist/analyzer/git-hash.d.ts +11 -0
  20. package/dist/analyzer/git-hash.d.ts.map +1 -0
  21. package/dist/analyzer/git-hash.js +25 -0
  22. package/dist/analyzer/git-hash.js.map +1 -0
  23. package/dist/analyzer/graph-utils.d.ts +46 -0
  24. package/dist/analyzer/graph-utils.d.ts.map +1 -0
  25. package/dist/analyzer/graph-utils.js +145 -0
  26. package/dist/analyzer/graph-utils.js.map +1 -0
  27. package/dist/analyzer/index.d.ts +34 -0
  28. package/dist/analyzer/index.d.ts.map +1 -0
  29. package/dist/analyzer/index.js +63 -0
  30. package/dist/analyzer/index.js.map +1 -0
  31. package/dist/cli/hooks.d.ts +24 -0
  32. package/dist/cli/hooks.d.ts.map +1 -0
  33. package/dist/cli/hooks.js +126 -0
  34. package/dist/cli/hooks.js.map +1 -0
  35. package/dist/cli/index.d.ts +18 -0
  36. package/dist/cli/index.d.ts.map +1 -0
  37. package/dist/cli/index.js +818 -0
  38. package/dist/cli/index.js.map +1 -0
  39. package/dist/cli/plan-parser.d.ts +20 -0
  40. package/dist/cli/plan-parser.d.ts.map +1 -0
  41. package/dist/cli/plan-parser.js +104 -0
  42. package/dist/cli/plan-parser.js.map +1 -0
  43. package/dist/cli/shim.d.ts +3 -0
  44. package/dist/cli/shim.d.ts.map +1 -0
  45. package/dist/cli/shim.js +33 -0
  46. package/dist/cli/shim.js.map +1 -0
  47. package/dist/cli/templates.d.ts +28 -0
  48. package/dist/cli/templates.d.ts.map +1 -0
  49. package/dist/cli/templates.js +91 -0
  50. package/dist/cli/templates.js.map +1 -0
  51. package/dist/encoder/encode.d.ts +17 -0
  52. package/dist/encoder/encode.d.ts.map +1 -0
  53. package/dist/encoder/encode.js +270 -0
  54. package/dist/encoder/encode.js.map +1 -0
  55. package/dist/encoder/layer-infrastructure.d.ts +17 -0
  56. package/dist/encoder/layer-infrastructure.d.ts.map +1 -0
  57. package/dist/encoder/layer-infrastructure.js +232 -0
  58. package/dist/encoder/layer-infrastructure.js.map +1 -0
  59. package/dist/encoder/layer-labels.d.ts +18 -0
  60. package/dist/encoder/layer-labels.d.ts.map +1 -0
  61. package/dist/encoder/layer-labels.js +172 -0
  62. package/dist/encoder/layer-labels.js.map +1 -0
  63. package/dist/encoder/layer-terrain.d.ts +18 -0
  64. package/dist/encoder/layer-terrain.d.ts.map +1 -0
  65. package/dist/encoder/layer-terrain.js +135 -0
  66. package/dist/encoder/layer-terrain.js.map +1 -0
  67. package/dist/encoder/layout.d.ts +53 -0
  68. package/dist/encoder/layout.d.ts.map +1 -0
  69. package/dist/encoder/layout.js +178 -0
  70. package/dist/encoder/layout.js.map +1 -0
  71. package/dist/encoder/parse-strand-header.d.ts +29 -0
  72. package/dist/encoder/parse-strand-header.d.ts.map +1 -0
  73. package/dist/encoder/parse-strand-header.js +59 -0
  74. package/dist/encoder/parse-strand-header.js.map +1 -0
  75. package/dist/encoder/spatial-text-encode.d.ts +22 -0
  76. package/dist/encoder/spatial-text-encode.d.ts.map +1 -0
  77. package/dist/encoder/spatial-text-encode.js +199 -0
  78. package/dist/encoder/spatial-text-encode.js.map +1 -0
  79. package/dist/encoder/strand-format-encode-v1.d.ts +16 -0
  80. package/dist/encoder/strand-format-encode-v1.d.ts.map +1 -0
  81. package/dist/encoder/strand-format-encode-v1.js +296 -0
  82. package/dist/encoder/strand-format-encode-v1.js.map +1 -0
  83. package/dist/encoder/strand-format-encode.d.ts +21 -0
  84. package/dist/encoder/strand-format-encode.d.ts.map +1 -0
  85. package/dist/encoder/strand-format-encode.js +562 -0
  86. package/dist/encoder/strand-format-encode.js.map +1 -0
  87. package/dist/encoder/text-encode.d.ts +13 -0
  88. package/dist/encoder/text-encode.d.ts.map +1 -0
  89. package/dist/encoder/text-encode.js +123 -0
  90. package/dist/encoder/text-encode.js.map +1 -0
  91. package/dist/query/blast-radius.d.ts +14 -0
  92. package/dist/query/blast-radius.d.ts.map +1 -0
  93. package/dist/query/blast-radius.js +81 -0
  94. package/dist/query/blast-radius.js.map +1 -0
  95. package/dist/query/cache.d.ts +29 -0
  96. package/dist/query/cache.d.ts.map +1 -0
  97. package/dist/query/cache.js +138 -0
  98. package/dist/query/cache.js.map +1 -0
  99. package/dist/query/index.d.ts +2 -0
  100. package/dist/query/index.d.ts.map +1 -0
  101. package/dist/query/index.js +46 -0
  102. package/dist/query/index.js.map +1 -0
  103. package/dist/query/resolve.d.ts +7 -0
  104. package/dist/query/resolve.d.ts.map +1 -0
  105. package/dist/query/resolve.js +24 -0
  106. package/dist/query/resolve.js.map +1 -0
  107. package/dist/query/risk-profile.d.ts +30 -0
  108. package/dist/query/risk-profile.d.ts.map +1 -0
  109. package/dist/query/risk-profile.js +94 -0
  110. package/dist/query/risk-profile.js.map +1 -0
  111. package/dist/query/test-map.d.ts +13 -0
  112. package/dist/query/test-map.d.ts.map +1 -0
  113. package/dist/query/test-map.js +43 -0
  114. package/dist/query/test-map.js.map +1 -0
  115. package/dist/scanner/index.d.ts +51 -0
  116. package/dist/scanner/index.d.ts.map +1 -0
  117. package/dist/scanner/index.js +480 -0
  118. package/dist/scanner/index.js.map +1 -0
  119. package/dist/scanner/workspace.d.ts +11 -0
  120. package/dist/scanner/workspace.d.ts.map +1 -0
  121. package/dist/scanner/workspace.js +243 -0
  122. package/dist/scanner/workspace.js.map +1 -0
  123. package/package.json +52 -0
@@ -0,0 +1,480 @@
1
+ /**
2
+ * Strand Scanner — reads a codebase and builds a structural graph
3
+ *
4
+ * Extracts: modules, files, imports, exports, routes, components,
5
+ * framework conventions, and complexity metrics.
6
+ */
7
+ import * as fs from "fs";
8
+ import * as path from "path";
9
+ import { detectWorkspaceAliases, resolveWorkspaceImport } from "./workspace.js";
10
+ const IGNORE_DIRS = new Set([
11
+ "node_modules",
12
+ ".next",
13
+ ".git",
14
+ "dist",
15
+ ".claude",
16
+ ".worktrees",
17
+ ".vercel",
18
+ "coverage",
19
+ "__pycache__",
20
+ ]);
21
+ const IGNORE_FILES = new Set([
22
+ "package-lock.json",
23
+ "yarn.lock",
24
+ "pnpm-lock.yaml",
25
+ ".DS_Store",
26
+ "thumbs.db",
27
+ ]);
28
+ export function scanCodebase(rootDir) {
29
+ const nodes = [];
30
+ const edges = [];
31
+ // Detect framework
32
+ const framework = detectFramework(rootDir);
33
+ const projectName = path.basename(rootDir);
34
+ // Walk the file tree
35
+ walkDir(rootDir, rootDir, nodes, framework);
36
+ // Resolve imports into edges
37
+ resolveEdges(nodes, edges, rootDir);
38
+ // Detect module boundaries
39
+ const modules = detectModules(nodes, rootDir, edges);
40
+ // Calculate complexity
41
+ calculateComplexity(nodes);
42
+ return {
43
+ projectName,
44
+ projectType: framework.type,
45
+ framework: framework.name,
46
+ totalFiles: nodes.filter((n) => n.type !== "module").length,
47
+ totalLines: nodes.reduce((sum, n) => sum + n.lines, 0),
48
+ nodes,
49
+ edges,
50
+ modules,
51
+ };
52
+ }
53
+ function detectFramework(rootDir) {
54
+ const packageJsonPath = path.join(rootDir, "package.json");
55
+ if (!fs.existsSync(packageJsonPath)) {
56
+ return { name: "unknown", type: "unknown", srcDir: "" };
57
+ }
58
+ const pkg = JSON.parse(fs.readFileSync(packageJsonPath, "utf-8"));
59
+ const deps = {
60
+ ...pkg.dependencies,
61
+ ...pkg.devDependencies,
62
+ };
63
+ if (deps["next"]) {
64
+ const srcDir = fs.existsSync(path.join(rootDir, "src")) ? "src" : "";
65
+ return { name: "nextjs", type: "Next.js", srcDir };
66
+ }
67
+ if (deps["@nestjs/core"])
68
+ return { name: "nestjs", type: "NestJS", srcDir: "src" };
69
+ if (deps["express"])
70
+ return { name: "express", type: "Express", srcDir: "" };
71
+ if (deps["react"])
72
+ return { name: "react", type: "React", srcDir: "src" };
73
+ if (deps["vue"])
74
+ return { name: "vue", type: "Vue", srcDir: "src" };
75
+ if (deps["svelte"])
76
+ return { name: "svelte", type: "SvelteKit", srcDir: "src" };
77
+ return { name: "typescript", type: "TypeScript", srcDir: "src" };
78
+ }
79
+ /**
80
+ * Detect the business domain for a file.
81
+ * Priority: TanStack Router route > Next.js route path > barrel file > directory fallback.
82
+ */
83
+ function detectDomain(relativePath, content, frameworkMeta) {
84
+ // 1. TanStack Router: createFileRoute('/secrets/detail') → "secrets"
85
+ const tanstackMatch = content.match(/createFileRoute\s*\(\s*['"`]([^'"`]+)['"`]\s*\)/);
86
+ if (tanstackMatch && tanstackMatch[1]) {
87
+ const firstSegment = tanstackMatch[1].split("/").filter(Boolean)[0];
88
+ if (firstSegment && firstSegment !== "_authenticated")
89
+ return firstSegment;
90
+ }
91
+ // 2. Next.js route path from framework metadata
92
+ if (frameworkMeta?.type === "nextjs-page" || frameworkMeta?.type === "nextjs-api") {
93
+ const routePath = frameworkMeta.metadata?.["routePath"];
94
+ if (routePath) {
95
+ const firstSegment = routePath.split("/").filter(Boolean)[0];
96
+ if (firstSegment)
97
+ return firstSegment.replace(/\[.*\]/, "").replace(/-/g, "_") || undefined;
98
+ }
99
+ }
100
+ // 3. Barrel file: index.ts/tsx where >50% of content is re-exports → parent dir name
101
+ const isBarrel = relativePath.endsWith("/index.ts") ||
102
+ relativePath.endsWith("/index.tsx") ||
103
+ relativePath.endsWith("/index.js") ||
104
+ relativePath.endsWith("/index.jsx");
105
+ if (isBarrel) {
106
+ const reExportCount = (content.match(/export\s+\{[^}]+\}\s+from\s+['"]/g) || []).length;
107
+ const totalExports = (content.match(/^export\s/gm) || []).length;
108
+ if (reExportCount > 2 && totalExports > 0 && reExportCount / totalExports > 0.5) {
109
+ const parts = relativePath.split("/");
110
+ // parent directory name (e.g. src/components/secrets/index.ts → "secrets")
111
+ return parts[parts.length - 2];
112
+ }
113
+ }
114
+ // 4. Fallback: go one level deeper inside known framework buckets
115
+ const parts = relativePath.split("/");
116
+ const FRAMEWORK_BUCKETS = new Set([
117
+ "components", "hooks", "pages", "views", "layouts", "features", "modules",
118
+ ]);
119
+ if (parts.length >= 4 && FRAMEWORK_BUCKETS.has(parts[1] ?? "")) {
120
+ return parts[2] ?? parts[1] ?? "root"; // e.g. "pki-syncs", "secret-manager", "api"
121
+ }
122
+ if (parts.length > 2)
123
+ return parts[1];
124
+ if (parts.length === 2)
125
+ return parts[0];
126
+ return undefined;
127
+ }
128
+ function walkDir(dir, rootDir, nodes, framework) {
129
+ const entries = fs.readdirSync(dir, { withFileTypes: true });
130
+ for (const entry of entries) {
131
+ if (IGNORE_DIRS.has(entry.name))
132
+ continue;
133
+ if (IGNORE_FILES.has(entry.name))
134
+ continue;
135
+ const fullPath = path.join(dir, entry.name);
136
+ const relativePath = path.relative(rootDir, fullPath).replace(/\\/g, "/");
137
+ if (entry.isDirectory()) {
138
+ walkDir(fullPath, rootDir, nodes, framework);
139
+ }
140
+ else if (isSourceFile(entry.name)) {
141
+ const content = fs.readFileSync(fullPath, "utf-8");
142
+ const lines = content.split("\n").length;
143
+ const imports = extractImports(content);
144
+ const exports = extractExports(content);
145
+ const type = classifyFile(relativePath, content, framework);
146
+ // Add framework metadata first (domain detection uses it)
147
+ const fwMeta = extractFrameworkMetadata(relativePath, content, framework);
148
+ const node = {
149
+ id: relativePath,
150
+ path: relativePath,
151
+ type,
152
+ name: entry.name,
153
+ lines,
154
+ imports,
155
+ exports,
156
+ complexity: 0,
157
+ };
158
+ const domain = detectDomain(relativePath, content, fwMeta);
159
+ if (domain !== undefined)
160
+ node.domain = domain;
161
+ if (fwMeta) {
162
+ node.framework = fwMeta;
163
+ }
164
+ nodes.push(node);
165
+ }
166
+ }
167
+ }
168
+ function isSourceFile(name) {
169
+ return /\.(ts|tsx|js|jsx|mjs|cjs|prisma)$/.test(name);
170
+ }
171
+ const ENTRY_POINT_PATTERNS = [
172
+ // Next.js App Router — fire unconditionally (filenames are globally unambiguous)
173
+ { match: /\/api\/.*route\.(ts|js)$/, type: "api-route" },
174
+ { match: /\/page\.(tsx|jsx|ts|js)$/, type: "route" },
175
+ { match: /\/layout\.(tsx|jsx|ts|js)$/, type: "layout" },
176
+ { match: /\/(loading|error|not-found|template|default|global-error)\.(tsx|jsx|ts|js)$/, type: "route" },
177
+ { match: /middleware\.(ts|js)$/, type: "middleware" },
178
+ // NestJS — filenames are distinctive enough to fire unconditionally.
179
+ { match: /\.controller\.(ts|js)$/, type: "route" },
180
+ { match: /\.module\.(ts|js)$/, type: "config" },
181
+ { match: /\.guard\.(ts|js)$/, type: "middleware" },
182
+ { match: /\.interceptor\.(ts|js)$/, type: "middleware" },
183
+ { match: /\.pipe\.(ts|js)$/, type: "middleware" },
184
+ { match: /\.filter\.(ts|js)$/, type: "middleware" },
185
+ ];
186
+ function classifyFile(relativePath, content, framework) {
187
+ const normalized = relativePath.replace(/\\/g, "/");
188
+ // Test files
189
+ if (/\.(test|spec|e2e-spec|e2e)\.(ts|tsx|js|jsx)$/.test(normalized) ||
190
+ normalized.includes("__tests__/") ||
191
+ /(?:^|\/)(?:playwright|cypress|test|tests|e2e)\//.test(normalized)) {
192
+ return "test";
193
+ }
194
+ // Config files
195
+ if (/\.(config|rc)\.(ts|js|mjs|cjs)$/.test(normalized) ||
196
+ normalized === "tsconfig.json") {
197
+ return "config";
198
+ }
199
+ // Prisma schema
200
+ if (normalized.endsWith(".prisma"))
201
+ return "schema";
202
+ // Framework entry points — fire unconditionally unless gated by `frameworks` field
203
+ for (const pattern of ENTRY_POINT_PATTERNS) {
204
+ if (pattern.frameworks && !pattern.frameworks.includes(framework.name))
205
+ continue;
206
+ if (pattern.match.test(normalized))
207
+ return pattern.type;
208
+ }
209
+ // React components (files with JSX exports)
210
+ if (/\.(tsx|jsx)$/.test(normalized) && !normalized.includes("__tests__")) {
211
+ if (content.includes("export default function") ||
212
+ content.includes("export function") ||
213
+ content.includes("export const")) {
214
+ return "component";
215
+ }
216
+ }
217
+ return "utility";
218
+ }
219
+ function extractImports(content) {
220
+ const imports = [];
221
+ const importRegex = /(?:import\s+[\s\S]*?from\s+['"]([^'"]+)['"]|require\s*\(\s*['"]([^'"]+)['"]\s*\))/g;
222
+ let match;
223
+ while ((match = importRegex.exec(content)) !== null) {
224
+ const importPath = match[1] || match[2];
225
+ if (importPath && !importPath.startsWith("node_modules")) {
226
+ imports.push(importPath);
227
+ }
228
+ }
229
+ return imports;
230
+ }
231
+ function extractExports(content) {
232
+ const exports = [];
233
+ const exportRegex = /export\s+(?:default\s+)?(?:function|const|class|type|interface|enum)\s+(\w+)/g;
234
+ let match;
235
+ while ((match = exportRegex.exec(content)) !== null) {
236
+ if (match[1])
237
+ exports.push(match[1]);
238
+ }
239
+ return exports;
240
+ }
241
+ function extractFrameworkMetadata(relativePath, content, framework) {
242
+ if (framework.name === "nextjs") {
243
+ // API routes — extract HTTP methods
244
+ if (/\/api\/.*route\.(ts|js)$/.test(relativePath)) {
245
+ const methods = [];
246
+ if (/export\s+(?:async\s+)?function\s+GET/.test(content))
247
+ methods.push("GET");
248
+ if (/export\s+(?:async\s+)?function\s+POST/.test(content))
249
+ methods.push("POST");
250
+ if (/export\s+(?:async\s+)?function\s+PUT/.test(content))
251
+ methods.push("PUT");
252
+ if (/export\s+(?:async\s+)?function\s+PATCH/.test(content))
253
+ methods.push("PATCH");
254
+ if (/export\s+(?:async\s+)?function\s+DELETE/.test(content))
255
+ methods.push("DELETE");
256
+ // Extract route path from file path
257
+ const routePath = relativePath
258
+ .replace(/^src\/app/, "")
259
+ .replace(/\/route\.(ts|js)$/, "")
260
+ .replace(/\\/g, "/");
261
+ return {
262
+ type: "nextjs-api",
263
+ metadata: { methods, routePath },
264
+ };
265
+ }
266
+ // Pages — extract route
267
+ if (/\/page\.(tsx|jsx|ts|js)$/.test(relativePath)) {
268
+ const routePath = relativePath
269
+ .replace(/^src\/app/, "")
270
+ .replace(/\/page\.(tsx|jsx|ts|js)$/, "")
271
+ .replace(/\\/g, "/");
272
+ const isClientComponent = content.includes("'use client'") || content.includes('"use client"');
273
+ return {
274
+ type: "nextjs-page",
275
+ metadata: {
276
+ routePath: routePath || "/",
277
+ isClientComponent,
278
+ },
279
+ };
280
+ }
281
+ // Layouts
282
+ if (/\/layout\.(tsx|jsx|ts|js)$/.test(relativePath)) {
283
+ return {
284
+ type: "nextjs-layout",
285
+ metadata: {
286
+ isRootLayout: relativePath.includes("app/layout"),
287
+ },
288
+ };
289
+ }
290
+ // Client components
291
+ if (content.includes("'use client'") || content.includes('"use client"')) {
292
+ return {
293
+ type: "react-client-component",
294
+ metadata: {},
295
+ };
296
+ }
297
+ }
298
+ // Prisma schema
299
+ if (relativePath.endsWith(".prisma")) {
300
+ const models = [];
301
+ const modelRegex = /model\s+(\w+)\s*\{/g;
302
+ let match;
303
+ while ((match = modelRegex.exec(content)) !== null) {
304
+ if (match[1])
305
+ models.push(match[1]);
306
+ }
307
+ return {
308
+ type: "prisma-schema",
309
+ metadata: { models },
310
+ };
311
+ }
312
+ return null;
313
+ }
314
+ function resolveEdges(nodes, edges, rootDir) {
315
+ const nodeMap = new Map(nodes.map((n) => [n.id, n]));
316
+ const pathAliases = detectPathAliases(rootDir);
317
+ const workspaceCtx = detectWorkspaceAliases(rootDir);
318
+ const hasNode = (id) => !!findNodeByImport(id, nodeMap);
319
+ for (const node of nodes) {
320
+ for (const importPath of node.imports) {
321
+ let resolvedId = resolveImportPath(importPath, node.path, pathAliases);
322
+ // Fallback to workspace resolution
323
+ if (!resolvedId && workspaceCtx.packages.size > 0) {
324
+ resolvedId = resolveWorkspaceImport(importPath, workspaceCtx, hasNode);
325
+ }
326
+ if (resolvedId) {
327
+ // Find the actual node (try with various extensions)
328
+ const target = findNodeByImport(resolvedId, nodeMap);
329
+ if (target) {
330
+ const edgeType = node.type === "test" ? "tests" : "imports";
331
+ edges.push({
332
+ from: node.id,
333
+ to: target.id,
334
+ type: edgeType,
335
+ weight: 1, // normalized below
336
+ });
337
+ }
338
+ }
339
+ }
340
+ }
341
+ // Normalize weights: files imported by many callers have lower coupling per edge.
342
+ // weight = 1 / log(1 + importerCount) so a file with 100 importers has weight ~0.22.
343
+ const importerCounts = new Map();
344
+ for (const e of edges) {
345
+ importerCounts.set(e.to, (importerCounts.get(e.to) || 0) + 1);
346
+ }
347
+ for (const e of edges) {
348
+ const count = importerCounts.get(e.to) || 1;
349
+ e.weight = Math.round((1 / Math.log(1 + count)) * 100) / 100;
350
+ }
351
+ }
352
+ export function detectPathAliases(rootDir) {
353
+ const aliases = new Map();
354
+ const tsconfigPath = path.join(rootDir, "tsconfig.json");
355
+ if (fs.existsSync(tsconfigPath)) {
356
+ try {
357
+ // Strip single-line comments only — block comment stripping is unsafe
358
+ // because it matches /* inside glob patterns like "**/*.ts"
359
+ const content = fs
360
+ .readFileSync(tsconfigPath, "utf-8")
361
+ .replace(/^\s*\/\/.*$/gm, "");
362
+ const tsconfig = JSON.parse(content);
363
+ const paths = tsconfig.compilerOptions?.paths || {};
364
+ for (const [alias, targets] of Object.entries(paths)) {
365
+ const cleanAlias = alias.replace("/*", "");
366
+ const target = targets[0]
367
+ ?.replace("/*", "")
368
+ .replace(/^\.\//, "") || "";
369
+ aliases.set(cleanAlias, target);
370
+ }
371
+ }
372
+ catch {
373
+ // tsconfig parsing failed — skip aliases
374
+ }
375
+ }
376
+ return aliases;
377
+ }
378
+ export function resolveImportPath(importPath, fromPath, aliases) {
379
+ // Skip node_modules imports
380
+ if (!importPath.startsWith(".") &&
381
+ !importPath.startsWith("@/") &&
382
+ !importPath.startsWith("~/")) {
383
+ // Check if it matches a path alias
384
+ for (const [alias, target] of aliases) {
385
+ if (importPath.startsWith(alias)) {
386
+ return importPath.replace(alias, target);
387
+ }
388
+ }
389
+ return null; // external package
390
+ }
391
+ // Resolve relative imports
392
+ if (importPath.startsWith(".")) {
393
+ const fromDir = path.dirname(fromPath);
394
+ return path.posix.join(fromDir, importPath);
395
+ }
396
+ // Resolve alias imports
397
+ for (const [alias, target] of aliases) {
398
+ if (importPath.startsWith(alias)) {
399
+ return importPath.replace(alias, target);
400
+ }
401
+ }
402
+ return importPath;
403
+ }
404
+ export function findNodeByImport(resolvedPath, nodeMap) {
405
+ // Try exact match first
406
+ if (nodeMap.has(resolvedPath))
407
+ return nodeMap.get(resolvedPath);
408
+ // Try with extensions
409
+ const extensions = [
410
+ ".ts",
411
+ ".tsx",
412
+ ".js",
413
+ ".jsx",
414
+ "/index.ts",
415
+ "/index.tsx",
416
+ "/index.js",
417
+ ];
418
+ for (const ext of extensions) {
419
+ const withExt = resolvedPath + ext;
420
+ if (nodeMap.has(withExt))
421
+ return nodeMap.get(withExt);
422
+ }
423
+ return null;
424
+ }
425
+ function detectModules(nodes, rootDir, edges) {
426
+ const modules = [];
427
+ // Group files by top-level directories
428
+ const dirGroups = new Map();
429
+ for (const node of nodes) {
430
+ const parts = node.path.split("/");
431
+ // Use first 2 levels for grouping (e.g., "src/lib", "src/components", "src/app")
432
+ const moduleKey = parts.length > 2 ? parts.slice(0, 2).join("/") : (parts[0] ?? "");
433
+ if (!dirGroups.has(moduleKey)) {
434
+ dirGroups.set(moduleKey, []);
435
+ }
436
+ dirGroups.get(moduleKey).push(node);
437
+ }
438
+ for (const [dirPath, groupNodes] of dirGroups) {
439
+ // Entry points: nodes in this module that are imported by files OUTSIDE this module
440
+ const groupNodeIds = new Set(groupNodes.map((n) => n.id));
441
+ const entryPoints = groupNodes
442
+ .filter((n) => edges.some((e) => e.to === n.id && !groupNodeIds.has(e.from)))
443
+ .map((n) => n.id);
444
+ modules.push({
445
+ id: dirPath,
446
+ name: path.basename(dirPath),
447
+ path: dirPath,
448
+ nodeCount: groupNodes.length,
449
+ totalLines: groupNodes.reduce((sum, n) => sum + n.lines, 0),
450
+ entryPoints,
451
+ });
452
+ }
453
+ return modules;
454
+ }
455
+ function percentile(sorted, p) {
456
+ if (sorted.length === 0)
457
+ return 0;
458
+ if (sorted.length === 1)
459
+ return sorted[0];
460
+ const idx = (p / 100) * (sorted.length - 1);
461
+ const lo = Math.floor(idx);
462
+ const hi = Math.ceil(idx);
463
+ if (lo === hi)
464
+ return sorted[lo];
465
+ return sorted[lo] + (sorted[hi] - sorted[lo]) * (idx - lo);
466
+ }
467
+ function calculateComplexity(nodes) {
468
+ if (nodes.length === 0)
469
+ return;
470
+ const sortedLines = nodes.map(n => n.lines).sort((a, b) => a - b);
471
+ const sortedImports = nodes.map(n => n.imports.length).sort((a, b) => a - b);
472
+ const p95Lines = percentile(sortedLines, 95);
473
+ const p95Imports = percentile(sortedImports, 95);
474
+ for (const node of nodes) {
475
+ const lineScore = p95Lines > 0 ? Math.min(node.lines / p95Lines, 1.0) : 0;
476
+ const importScore = p95Imports > 0 ? Math.min(node.imports.length / p95Imports, 1.0) : 0;
477
+ node.complexity = Math.round((lineScore * 0.6 + importScore * 0.4) * 100) / 100;
478
+ }
479
+ }
480
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/scanner/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export interface WorkspacePackage {
2
+ dir: string;
3
+ entryPoint?: string;
4
+ }
5
+ export interface WorkspaceContext {
6
+ packages: Map<string, WorkspacePackage>;
7
+ rootOffset: string;
8
+ }
9
+ export declare function detectWorkspaceAliases(scanRoot: string): WorkspaceContext;
10
+ export declare function resolveWorkspaceImport(importPath: string, ctx: WorkspaceContext, hasNode: (id: string) => boolean): string | null;
11
+ //# sourceMappingURL=workspace.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace.d.ts","sourceRoot":"","sources":["../../src/scanner/workspace.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IACxC,UAAU,EAAE,MAAM,CAAC;CACpB;AAMD,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,gBAAgB,CAyDzE;AAsID,wBAAgB,sBAAsB,CACpC,UAAU,EAAE,MAAM,EAClB,GAAG,EAAE,gBAAgB,EACrB,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,GAC/B,MAAM,GAAG,IAAI,CAgDf"}