projscan 0.9.1 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -2
- package/dist/analyzers/deadCodeCheck.d.ts +10 -12
- package/dist/analyzers/deadCodeCheck.js +41 -69
- package/dist/analyzers/deadCodeCheck.js.map +1 -1
- package/dist/analyzers/pythonDependencyRiskCheck.d.ts +2 -0
- package/dist/analyzers/pythonDependencyRiskCheck.js +114 -0
- package/dist/analyzers/pythonDependencyRiskCheck.js.map +1 -0
- package/dist/analyzers/pythonLinterCheck.d.ts +2 -0
- package/dist/analyzers/pythonLinterCheck.js +119 -0
- package/dist/analyzers/pythonLinterCheck.js.map +1 -0
- package/dist/analyzers/pythonTestCheck.d.ts +2 -0
- package/dist/analyzers/pythonTestCheck.js +97 -0
- package/dist/analyzers/pythonTestCheck.js.map +1 -0
- package/dist/analyzers/pythonUnusedDependencyCheck.d.ts +2 -0
- package/dist/analyzers/pythonUnusedDependencyCheck.js +76 -0
- package/dist/analyzers/pythonUnusedDependencyCheck.js.map +1 -0
- package/dist/core/codeGraph.d.ts +6 -7
- package/dist/core/codeGraph.js +48 -72
- package/dist/core/codeGraph.js.map +1 -1
- package/dist/core/fileInspector.d.ts +3 -0
- package/dist/core/fileInspector.js +47 -2
- package/dist/core/fileInspector.js.map +1 -1
- package/dist/core/indexCache.js +5 -1
- package/dist/core/indexCache.js.map +1 -1
- package/dist/core/issueEngine.js +10 -0
- package/dist/core/issueEngine.js.map +1 -1
- package/dist/core/languages/LanguageAdapter.d.ts +36 -0
- package/dist/core/languages/LanguageAdapter.js +2 -0
- package/dist/core/languages/LanguageAdapter.js.map +1 -0
- package/dist/core/languages/javascriptAdapter.d.ts +2 -0
- package/dist/core/languages/javascriptAdapter.js +68 -0
- package/dist/core/languages/javascriptAdapter.js.map +1 -0
- package/dist/core/languages/pythonAdapter.d.ts +6 -0
- package/dist/core/languages/pythonAdapter.js +142 -0
- package/dist/core/languages/pythonAdapter.js.map +1 -0
- package/dist/core/languages/pythonExports.d.ts +28 -0
- package/dist/core/languages/pythonExports.js +169 -0
- package/dist/core/languages/pythonExports.js.map +1 -0
- package/dist/core/languages/pythonImports.d.ts +22 -0
- package/dist/core/languages/pythonImports.js +104 -0
- package/dist/core/languages/pythonImports.js.map +1 -0
- package/dist/core/languages/pythonManifests.d.ts +34 -0
- package/dist/core/languages/pythonManifests.js +344 -0
- package/dist/core/languages/pythonManifests.js.map +1 -0
- package/dist/core/languages/registry.d.ts +5 -0
- package/dist/core/languages/registry.js +30 -0
- package/dist/core/languages/registry.js.map +1 -0
- package/dist/core/languages/treeSitterLoader.d.ts +14 -0
- package/dist/core/languages/treeSitterLoader.js +75 -0
- package/dist/core/languages/treeSitterLoader.js.map +1 -0
- package/dist/core/searchIndex.js +8 -0
- package/dist/core/searchIndex.js.map +1 -1
- package/dist/core/upgradePreview.d.ts +12 -0
- package/dist/core/upgradePreview.js +54 -2
- package/dist/core/upgradePreview.js.map +1 -1
- package/dist/grammars/tree-sitter-python.wasm +0 -0
- package/dist/grammars/web-tree-sitter.wasm +0 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/mcp/tools.js +48 -0
- package/dist/mcp/tools.js.map +1 -1
- package/dist/types.d.ts +2 -0
- package/dist/utils/fileWalker.js +14 -0
- package/dist/utils/fileWalker.js.map +1 -1
- package/package.json +10 -5
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { detectPythonProject } from '../core/languages/pythonManifests.js';
|
|
2
|
+
import { buildCodeGraph } from '../core/codeGraph.js';
|
|
3
|
+
// Packages whose presence in manifests is implicit (build-time, test-time,
|
|
4
|
+
// or tooling) and which typically won't appear in `import` statements.
|
|
5
|
+
const IMPLICIT_USE = new Set([
|
|
6
|
+
'pytest',
|
|
7
|
+
'pytest-cov',
|
|
8
|
+
'pytest-mock',
|
|
9
|
+
'pytest-asyncio',
|
|
10
|
+
'pytest-xdist',
|
|
11
|
+
'ruff',
|
|
12
|
+
'black',
|
|
13
|
+
'mypy',
|
|
14
|
+
'coverage',
|
|
15
|
+
'wheel',
|
|
16
|
+
'build',
|
|
17
|
+
'setuptools',
|
|
18
|
+
'setuptools-scm',
|
|
19
|
+
'pip',
|
|
20
|
+
'pip-tools',
|
|
21
|
+
'twine',
|
|
22
|
+
'flake8',
|
|
23
|
+
'pylint',
|
|
24
|
+
'pyflakes',
|
|
25
|
+
'isort',
|
|
26
|
+
'bandit',
|
|
27
|
+
'tox',
|
|
28
|
+
'pre-commit',
|
|
29
|
+
'hatch',
|
|
30
|
+
'hatchling',
|
|
31
|
+
'poetry-core',
|
|
32
|
+
'maturin',
|
|
33
|
+
]);
|
|
34
|
+
/**
|
|
35
|
+
* Normalize a package name for comparison. PyPI names are case-insensitive
|
|
36
|
+
* and `_` / `-` / `.` are interchangeable per PEP 503.
|
|
37
|
+
*/
|
|
38
|
+
function normalize(name) {
|
|
39
|
+
return name.toLowerCase().replace(/[_.]/g, '-');
|
|
40
|
+
}
|
|
41
|
+
export async function check(rootPath, files) {
|
|
42
|
+
const info = await detectPythonProject(rootPath, files);
|
|
43
|
+
if (!info || info.declared.length === 0)
|
|
44
|
+
return [];
|
|
45
|
+
const pythonFiles = files.filter((f) => f.extension === '.py' || f.extension === '.pyw');
|
|
46
|
+
if (pythonFiles.length === 0)
|
|
47
|
+
return [];
|
|
48
|
+
const graph = await buildCodeGraph(rootPath, pythonFiles);
|
|
49
|
+
const usedPackages = new Set();
|
|
50
|
+
for (const pkg of graph.packageImporters.keys()) {
|
|
51
|
+
usedPackages.add(normalize(pkg));
|
|
52
|
+
}
|
|
53
|
+
const issues = [];
|
|
54
|
+
const seen = new Set();
|
|
55
|
+
for (const dep of info.declared) {
|
|
56
|
+
const norm = normalize(dep.name);
|
|
57
|
+
if (seen.has(norm))
|
|
58
|
+
continue;
|
|
59
|
+
if (IMPLICIT_USE.has(norm))
|
|
60
|
+
continue;
|
|
61
|
+
if (usedPackages.has(norm))
|
|
62
|
+
continue;
|
|
63
|
+
seen.add(norm);
|
|
64
|
+
issues.push({
|
|
65
|
+
id: `unused-python-dependency-${dep.name}`,
|
|
66
|
+
title: `Unused Python dependency: ${dep.name}`,
|
|
67
|
+
description: `\`${dep.name}\` is declared in ${dep.source} but no source file imports it. Either remove it or add it to the implicit-use allowlist.`,
|
|
68
|
+
severity: dep.scope === 'dev' ? 'info' : 'warning',
|
|
69
|
+
category: 'dependencies',
|
|
70
|
+
fixAvailable: false,
|
|
71
|
+
locations: [{ file: dep.source, line: dep.line }],
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
return issues;
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=pythonUnusedDependencyCheck.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pythonUnusedDependencyCheck.js","sourceRoot":"","sources":["../../src/analyzers/pythonUnusedDependencyCheck.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAC3E,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,2EAA2E;AAC3E,uEAAuE;AACvE,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC;IAC3B,QAAQ;IACR,YAAY;IACZ,aAAa;IACb,gBAAgB;IAChB,cAAc;IACd,MAAM;IACN,OAAO;IACP,MAAM;IACN,UAAU;IACV,OAAO;IACP,OAAO;IACP,YAAY;IACZ,gBAAgB;IAChB,KAAK;IACL,WAAW;IACX,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,UAAU;IACV,OAAO;IACP,QAAQ;IACR,KAAK;IACL,YAAY;IACZ,OAAO;IACP,WAAW;IACX,aAAa;IACb,SAAS;CACV,CAAC,CAAC;AAEH;;;GAGG;AACH,SAAS,SAAS,CAAC,IAAY;IAC7B,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,QAAgB,EAAE,KAAkB;IAC9D,MAAM,IAAI,GAAG,MAAM,mBAAmB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IACxD,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAEnD,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,KAAK,IAAI,CAAC,CAAC,SAAS,KAAK,MAAM,CAAC,CAAC;IACzF,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAExC,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IAC1D,MAAM,YAAY,GAAG,IAAI,GAAG,EAAU,CAAC;IACvC,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,gBAAgB,CAAC,IAAI,EAAE,EAAE,CAAC;QAChD,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;IACnC,CAAC;IAED,MAAM,MAAM,GAAY,EAAE,CAAC;IAC3B,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAE/B,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAChC,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACjC,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,SAAS;QAC7B,IAAI,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,SAAS;QACrC,IAAI,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,SAAS;QAErC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACf,MAAM,CAAC,IAAI,CAAC;YACV,EAAE,EAAE,4BAA4B,GAAG,CAAC,IAAI,EAAE;YAC1C,KAAK,EAAE,6BAA6B,GAAG,CAAC,IAAI,EAAE;YAC9C,WAAW,EAAE,KAAK,GAAG,CAAC,IAAI,qBAAqB,GAAG,CAAC,MAAM,2FAA2F;YACpJ,QAAQ,EAAE,GAAG,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;YAClD,QAAQ,EAAE,cAAc;YACxB,YAAY,EAAE,KAAK;YACnB,SAAS,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC;SAClD,CAAC,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
package/dist/core/codeGraph.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { FileEntry } from '../types.js';
|
|
2
|
-
import {
|
|
2
|
+
import type { AstImport, AstExport } from './ast.js';
|
|
3
3
|
export interface GraphFile {
|
|
4
4
|
relativePath: string;
|
|
5
5
|
imports: AstImport[];
|
|
@@ -9,22 +9,21 @@ export interface GraphFile {
|
|
|
9
9
|
mtimeMs: number;
|
|
10
10
|
parseOk: boolean;
|
|
11
11
|
parseReason?: string;
|
|
12
|
+
/** Adapter id that parsed this file. */
|
|
13
|
+
adapterId?: string;
|
|
12
14
|
}
|
|
13
15
|
export interface CodeGraph {
|
|
14
|
-
/** per-file parse results, keyed by relativePath */
|
|
15
16
|
files: Map<string, GraphFile>;
|
|
16
|
-
/** package name → relativePaths that import it */
|
|
17
17
|
packageImporters: Map<string, Set<string>>;
|
|
18
|
-
/** relativePath → relativePaths that import it (local resolution) */
|
|
19
18
|
localImporters: Map<string, Set<string>>;
|
|
20
|
-
/** symbol name → relativePaths that export it */
|
|
21
19
|
symbolDefs: Map<string, Set<string>>;
|
|
22
|
-
/** scanned file count */
|
|
23
20
|
scannedFiles: number;
|
|
24
21
|
}
|
|
25
22
|
export declare function buildCodeGraph(rootPath: string, files: FileEntry[], previousGraph?: CodeGraph): Promise<CodeGraph>;
|
|
26
23
|
/**
|
|
27
|
-
*
|
|
24
|
+
* Back-compat: convert a JS/TS import specifier to a bare package name.
|
|
25
|
+
* Delegates to the JavaScript adapter. For multi-language use cases, prefer
|
|
26
|
+
* `getAdapterFor(filePath).toPackageName(specifier)`.
|
|
28
27
|
*/
|
|
29
28
|
export declare function toPackageName(specifier: string): string | null;
|
|
30
29
|
export declare function packagesUsed(graph: CodeGraph): Set<string>;
|
package/dist/core/codeGraph.js
CHANGED
|
@@ -1,23 +1,21 @@
|
|
|
1
1
|
import fs from 'node:fs/promises';
|
|
2
2
|
import path from 'node:path';
|
|
3
|
-
import {
|
|
4
|
-
const NODE_BUILTINS = new Set([
|
|
5
|
-
'assert', 'async_hooks', 'buffer', 'child_process', 'cluster', 'console', 'constants', 'crypto',
|
|
6
|
-
'dgram', 'dns', 'domain', 'events', 'fs', 'fs/promises', 'http', 'http2', 'https', 'inspector',
|
|
7
|
-
'module', 'net', 'os', 'path', 'perf_hooks', 'process', 'punycode', 'querystring', 'readline',
|
|
8
|
-
'repl', 'stream', 'string_decoder', 'sys', 'timers', 'tls', 'trace_events', 'tty', 'url', 'util',
|
|
9
|
-
'v8', 'vm', 'wasi', 'worker_threads', 'zlib',
|
|
10
|
-
]);
|
|
11
|
-
const RESOLUTION_EXTS = ['.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs', '.mts', '.cts'];
|
|
3
|
+
import { getAdapterFor, listAdapters } from './languages/registry.js';
|
|
12
4
|
const MAX_FILE_SIZE = 1024 * 1024;
|
|
13
5
|
export async function buildCodeGraph(rootPath, files, previousGraph) {
|
|
14
|
-
|
|
6
|
+
// Per-adapter setup (e.g. Python package-root detection).
|
|
7
|
+
const contextByAdapter = new Map();
|
|
8
|
+
for (const adapter of listAdapters()) {
|
|
9
|
+
contextByAdapter.set(adapter, await adapter.preparePackageRoots(rootPath, files));
|
|
10
|
+
}
|
|
11
|
+
const parseable = files
|
|
12
|
+
.map((f) => ({ file: f, adapter: getAdapterFor(f.relativePath) }))
|
|
13
|
+
.filter((x) => !!x.adapter && x.file.sizeBytes <= (x.adapter.maxFileSize ?? MAX_FILE_SIZE));
|
|
15
14
|
const graphFiles = new Map();
|
|
16
15
|
const packageImporters = new Map();
|
|
17
16
|
const localImporters = new Map();
|
|
18
17
|
const symbolDefs = new Map();
|
|
19
|
-
|
|
20
|
-
await Promise.all(parseable.map(async (file) => {
|
|
18
|
+
await Promise.all(parseable.map(async ({ file, adapter }) => {
|
|
21
19
|
const absolutePath = path.isAbsolute(file.absolutePath)
|
|
22
20
|
? file.absolutePath
|
|
23
21
|
: path.resolve(rootPath, file.relativePath);
|
|
@@ -30,7 +28,7 @@ export async function buildCodeGraph(rootPath, files, previousGraph) {
|
|
|
30
28
|
return;
|
|
31
29
|
}
|
|
32
30
|
const cached = previousGraph?.files.get(file.relativePath);
|
|
33
|
-
if (cached && cached.mtimeMs === mtimeMs) {
|
|
31
|
+
if (cached && cached.mtimeMs === mtimeMs && cached.adapterId === adapter.id) {
|
|
34
32
|
graphFiles.set(file.relativePath, cached);
|
|
35
33
|
return;
|
|
36
34
|
}
|
|
@@ -41,7 +39,21 @@ export async function buildCodeGraph(rootPath, files, previousGraph) {
|
|
|
41
39
|
catch {
|
|
42
40
|
return;
|
|
43
41
|
}
|
|
44
|
-
|
|
42
|
+
let result;
|
|
43
|
+
try {
|
|
44
|
+
result = await adapter.parse(file.relativePath, content);
|
|
45
|
+
}
|
|
46
|
+
catch (err) {
|
|
47
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
48
|
+
result = {
|
|
49
|
+
ok: false,
|
|
50
|
+
reason: `adapter ${adapter.id} threw: ${msg.slice(0, 120)}`,
|
|
51
|
+
imports: [],
|
|
52
|
+
exports: [],
|
|
53
|
+
callSites: [],
|
|
54
|
+
lineCount: 0,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
45
57
|
graphFiles.set(file.relativePath, {
|
|
46
58
|
relativePath: file.relativePath,
|
|
47
59
|
imports: result.imports,
|
|
@@ -51,26 +63,32 @@ export async function buildCodeGraph(rootPath, files, previousGraph) {
|
|
|
51
63
|
mtimeMs,
|
|
52
64
|
parseOk: result.ok,
|
|
53
65
|
parseReason: result.reason,
|
|
66
|
+
adapterId: adapter.id,
|
|
54
67
|
});
|
|
55
68
|
}));
|
|
56
|
-
// Build derived indexes after all parsing is done
|
|
57
69
|
for (const [importingFile, entry] of graphFiles) {
|
|
58
|
-
const
|
|
70
|
+
const adapter = getAdapterFor(importingFile);
|
|
71
|
+
if (!adapter)
|
|
72
|
+
continue;
|
|
73
|
+
const context = contextByAdapter.get(adapter) ?? {};
|
|
59
74
|
for (const imp of entry.imports) {
|
|
60
|
-
|
|
75
|
+
// Try local resolution first. For JS/TS this is a no-op on bare specifiers
|
|
76
|
+
// (resolveImport short-circuits on non-relative paths). For Python it
|
|
77
|
+
// matters: `pkg.core` could be either a local module or third-party.
|
|
78
|
+
// Local takes precedence when it resolves; otherwise fall back to pkg.
|
|
79
|
+
const resolved = adapter.resolveImport(importingFile, imp.source, graphFiles, context);
|
|
80
|
+
if (resolved) {
|
|
81
|
+
if (!localImporters.has(resolved))
|
|
82
|
+
localImporters.set(resolved, new Set());
|
|
83
|
+
localImporters.get(resolved).add(importingFile);
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
const pkg = adapter.toPackageName(imp.source);
|
|
61
87
|
if (pkg) {
|
|
62
88
|
if (!packageImporters.has(pkg))
|
|
63
89
|
packageImporters.set(pkg, new Set());
|
|
64
90
|
packageImporters.get(pkg).add(importingFile);
|
|
65
91
|
}
|
|
66
|
-
else if (imp.source.startsWith('.') || imp.source.startsWith('/')) {
|
|
67
|
-
const resolved = resolveRelative(importingDir, imp.source, graphFiles);
|
|
68
|
-
if (resolved) {
|
|
69
|
-
if (!localImporters.has(resolved))
|
|
70
|
-
localImporters.set(resolved, new Set());
|
|
71
|
-
localImporters.get(resolved).add(importingFile);
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
92
|
}
|
|
75
93
|
for (const exp of entry.exports) {
|
|
76
94
|
if (!exp.name)
|
|
@@ -89,55 +107,13 @@ export async function buildCodeGraph(rootPath, files, previousGraph) {
|
|
|
89
107
|
};
|
|
90
108
|
}
|
|
91
109
|
/**
|
|
92
|
-
*
|
|
110
|
+
* Back-compat: convert a JS/TS import specifier to a bare package name.
|
|
111
|
+
* Delegates to the JavaScript adapter. For multi-language use cases, prefer
|
|
112
|
+
* `getAdapterFor(filePath).toPackageName(specifier)`.
|
|
93
113
|
*/
|
|
94
114
|
export function toPackageName(specifier) {
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
if (specifier.startsWith('.') || specifier.startsWith('/'))
|
|
98
|
-
return null;
|
|
99
|
-
if (specifier.startsWith('node:'))
|
|
100
|
-
return null;
|
|
101
|
-
if (NODE_BUILTINS.has(specifier))
|
|
102
|
-
return null;
|
|
103
|
-
if (specifier.startsWith('@')) {
|
|
104
|
-
const segments = specifier.split('/');
|
|
105
|
-
if (segments.length < 2)
|
|
106
|
-
return null;
|
|
107
|
-
return `${segments[0]}/${segments[1]}`;
|
|
108
|
-
}
|
|
109
|
-
return specifier.split('/')[0];
|
|
110
|
-
}
|
|
111
|
-
/**
|
|
112
|
-
* Resolve a relative import to a file in the graph, or null if no match.
|
|
113
|
-
* Supports:
|
|
114
|
-
* - direct hit (./foo.ts → foo.ts)
|
|
115
|
-
* - extension inference (./foo → foo.ts)
|
|
116
|
-
* - barrel index (./foo → foo/index.ts)
|
|
117
|
-
* - .js that resolves to .ts under NodeNext
|
|
118
|
-
*/
|
|
119
|
-
function resolveRelative(importingDir, specifier, graphFiles) {
|
|
120
|
-
const base = path.posix.normalize(path.posix.join(importingDir, specifier));
|
|
121
|
-
if (graphFiles.has(base))
|
|
122
|
-
return base;
|
|
123
|
-
for (const ext of RESOLUTION_EXTS) {
|
|
124
|
-
if (graphFiles.has(base + ext))
|
|
125
|
-
return base + ext;
|
|
126
|
-
}
|
|
127
|
-
for (const ext of RESOLUTION_EXTS) {
|
|
128
|
-
const barrel = `${base}/index${ext}`;
|
|
129
|
-
if (graphFiles.has(barrel))
|
|
130
|
-
return barrel;
|
|
131
|
-
}
|
|
132
|
-
// .js → .ts fallback (NodeNext)
|
|
133
|
-
if (base.endsWith('.js')) {
|
|
134
|
-
const trimmed = base.slice(0, -3);
|
|
135
|
-
if (graphFiles.has(`${trimmed}.ts`))
|
|
136
|
-
return `${trimmed}.ts`;
|
|
137
|
-
if (graphFiles.has(`${trimmed}.tsx`))
|
|
138
|
-
return `${trimmed}.tsx`;
|
|
139
|
-
}
|
|
140
|
-
return null;
|
|
115
|
+
const jsAdapter = listAdapters().find((a) => a.id === 'javascript');
|
|
116
|
+
return jsAdapter ? jsAdapter.toPackageName(specifier) : null;
|
|
141
117
|
}
|
|
142
118
|
// ── Query API ──────────────────────────────────────────────
|
|
143
119
|
export function packagesUsed(graph) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codeGraph.js","sourceRoot":"","sources":["../../src/core/codeGraph.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"codeGraph.js","sourceRoot":"","sources":["../../src/core/codeGraph.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
import type { ExportInfo, FileEntry, FileInspection, HotspotReport, ImportInfo, Issue } from '../types.js';
|
|
2
|
+
import type { CodeGraph } from './codeGraph.js';
|
|
2
3
|
export interface InspectOptions {
|
|
3
4
|
scan?: {
|
|
4
5
|
files: FileEntry[];
|
|
5
6
|
};
|
|
6
7
|
issues?: Issue[];
|
|
7
8
|
hotspots?: HotspotReport;
|
|
9
|
+
/** If provided, prefer graph-derived imports/exports over regex parsing. */
|
|
10
|
+
graph?: CodeGraph;
|
|
8
11
|
}
|
|
9
12
|
export declare function inspectFile(rootPath: string, relOrAbsFile: string, options?: InspectOptions): Promise<FileInspection>;
|
|
10
13
|
export declare function extractImports(content: string): ImportInfo[];
|
|
@@ -3,6 +3,7 @@ import path from 'node:path';
|
|
|
3
3
|
import { scanRepository } from './repositoryScanner.js';
|
|
4
4
|
import { collectIssues } from './issueEngine.js';
|
|
5
5
|
import { analyzeHotspots } from './hotspotAnalyzer.js';
|
|
6
|
+
import { getAdapterFor } from './languages/registry.js';
|
|
6
7
|
export async function inspectFile(rootPath, relOrAbsFile, options = {}) {
|
|
7
8
|
const resolvedRoot = path.resolve(rootPath);
|
|
8
9
|
const absolutePath = path.isAbsolute(relOrAbsFile)
|
|
@@ -27,8 +28,36 @@ export async function inspectFile(rootPath, relOrAbsFile, options = {}) {
|
|
|
27
28
|
}
|
|
28
29
|
const relativePath = path.relative(resolvedRoot, absolutePath).split(path.sep).join('/');
|
|
29
30
|
const lines = content.split('\n');
|
|
30
|
-
const
|
|
31
|
-
const
|
|
31
|
+
const adapter = getAdapterFor(relativePath);
|
|
32
|
+
const language = adapter?.id;
|
|
33
|
+
// Prefer graph-derived imports/exports when available. The regex extractors
|
|
34
|
+
// in this file only understand JS/TS syntax and would emit garbage on
|
|
35
|
+
// Python. For JS/TS we still fall back to regex when no graph is provided
|
|
36
|
+
// (preserves existing behavior).
|
|
37
|
+
let imports;
|
|
38
|
+
let exports;
|
|
39
|
+
const graphFile = options.graph?.files.get(relativePath);
|
|
40
|
+
if (graphFile) {
|
|
41
|
+
imports = graphFile.imports.map((i) => ({
|
|
42
|
+
source: i.source,
|
|
43
|
+
specifiers: i.specifiers,
|
|
44
|
+
isRelative: i.source.startsWith('.') || i.source.startsWith('/'),
|
|
45
|
+
}));
|
|
46
|
+
exports = graphFile.exports.map((e) => ({
|
|
47
|
+
name: e.name,
|
|
48
|
+
type: mapExportType(e.kind),
|
|
49
|
+
}));
|
|
50
|
+
}
|
|
51
|
+
else if (language === 'javascript') {
|
|
52
|
+
imports = extractImports(content);
|
|
53
|
+
exports = extractExports(content);
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
// Non-JS file with no graph: we don't have a safe extractor. Return empty
|
|
57
|
+
// rather than running the JS regex against (e.g.) Python and emitting garbage.
|
|
58
|
+
imports = [];
|
|
59
|
+
exports = [];
|
|
60
|
+
}
|
|
32
61
|
const purpose = inferPurpose(absolutePath, exports);
|
|
33
62
|
const potentialIssues = detectFileIssues(content, lines.length);
|
|
34
63
|
const files = options.scan?.files ?? (await scanRepository(resolvedRoot)).files;
|
|
@@ -47,8 +76,24 @@ export async function inspectFile(rootPath, relOrAbsFile, options = {}) {
|
|
|
47
76
|
potentialIssues,
|
|
48
77
|
hotspot,
|
|
49
78
|
issues: relatedIssues,
|
|
79
|
+
language,
|
|
50
80
|
};
|
|
51
81
|
}
|
|
82
|
+
function mapExportType(kind) {
|
|
83
|
+
switch (kind) {
|
|
84
|
+
case 'function':
|
|
85
|
+
case 'class':
|
|
86
|
+
case 'variable':
|
|
87
|
+
case 'type':
|
|
88
|
+
case 'interface':
|
|
89
|
+
case 'default':
|
|
90
|
+
return kind;
|
|
91
|
+
case 'enum':
|
|
92
|
+
return 'type';
|
|
93
|
+
default:
|
|
94
|
+
return 'unknown';
|
|
95
|
+
}
|
|
96
|
+
}
|
|
52
97
|
function makeEmpty(relativePath, reason) {
|
|
53
98
|
return {
|
|
54
99
|
relativePath,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fileInspector.js","sourceRoot":"","sources":["../../src/core/fileInspector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAU7B,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"fileInspector.js","sourceRoot":"","sources":["../../src/core/fileInspector.ts"],"names":[],"mappings":"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"}
|
package/dist/core/indexCache.js
CHANGED
|
@@ -2,7 +2,9 @@ import fs from 'node:fs/promises';
|
|
|
2
2
|
import path from 'node:path';
|
|
3
3
|
const CACHE_DIR = '.projscan-cache';
|
|
4
4
|
const CACHE_FILE = 'graph.json';
|
|
5
|
-
|
|
5
|
+
// v2: added `adapterId` to entries for multi-language routing. v1 caches are
|
|
6
|
+
// discarded on load so a file that switched adapters can't reuse a stale parse.
|
|
7
|
+
const CACHE_VERSION = 2;
|
|
6
8
|
/**
|
|
7
9
|
* Load a previously cached code graph, if present and valid. Returns undefined
|
|
8
10
|
* when there's no cache or the cache is incompatible - caller should rebuild.
|
|
@@ -36,6 +38,7 @@ export async function loadCachedGraph(rootPath) {
|
|
|
36
38
|
mtimeMs: entry.mtimeMs,
|
|
37
39
|
parseOk: entry.parseOk,
|
|
38
40
|
parseReason: entry.parseReason,
|
|
41
|
+
adapterId: entry.adapterId,
|
|
39
42
|
});
|
|
40
43
|
}
|
|
41
44
|
// Derived indexes are rebuilt on load - cheap compared to re-parsing.
|
|
@@ -72,6 +75,7 @@ export async function saveCachedGraph(rootPath, graph) {
|
|
|
72
75
|
mtimeMs: entry.mtimeMs,
|
|
73
76
|
parseOk: entry.parseOk,
|
|
74
77
|
parseReason: entry.parseReason,
|
|
78
|
+
adapterId: entry.adapterId,
|
|
75
79
|
})),
|
|
76
80
|
createdAt: new Date().toISOString(),
|
|
77
81
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"indexCache.js","sourceRoot":"","sources":["../../src/core/indexCache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,MAAM,SAAS,GAAG,iBAAiB,CAAC;AACpC,MAAM,UAAU,GAAG,YAAY,CAAC;AAChC,MAAM,aAAa,GAAG,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"indexCache.js","sourceRoot":"","sources":["../../src/core/indexCache.ts"],"names":[],"mappings":"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"}
|
package/dist/core/issueEngine.js
CHANGED
|
@@ -6,6 +6,10 @@ import { check as dependencyRiskCheck } from '../analyzers/dependencyRiskCheck.j
|
|
|
6
6
|
import { check as securityCheck } from '../analyzers/securityCheck.js';
|
|
7
7
|
import { check as unusedDependencyCheck } from '../analyzers/unusedDependencyCheck.js';
|
|
8
8
|
import { check as deadCodeCheck } from '../analyzers/deadCodeCheck.js';
|
|
9
|
+
import { check as pythonTestCheck } from '../analyzers/pythonTestCheck.js';
|
|
10
|
+
import { check as pythonLinterCheck } from '../analyzers/pythonLinterCheck.js';
|
|
11
|
+
import { check as pythonDependencyRiskCheck } from '../analyzers/pythonDependencyRiskCheck.js';
|
|
12
|
+
import { check as pythonUnusedDependencyCheck } from '../analyzers/pythonUnusedDependencyCheck.js';
|
|
9
13
|
const checkers = [
|
|
10
14
|
eslintCheck,
|
|
11
15
|
prettierCheck,
|
|
@@ -15,6 +19,12 @@ const checkers = [
|
|
|
15
19
|
securityCheck,
|
|
16
20
|
unusedDependencyCheck,
|
|
17
21
|
deadCodeCheck,
|
|
22
|
+
// Python analyzers - each early-exits on zero .py files so JS/TS repos
|
|
23
|
+
// see zero new issues.
|
|
24
|
+
pythonTestCheck,
|
|
25
|
+
pythonLinterCheck,
|
|
26
|
+
pythonDependencyRiskCheck,
|
|
27
|
+
pythonUnusedDependencyCheck,
|
|
18
28
|
];
|
|
19
29
|
export async function collectIssues(rootPath, files) {
|
|
20
30
|
const results = await Promise.all(checkers.map((check) => check(rootPath, files)));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"issueEngine.js","sourceRoot":"","sources":["../../src/core/issueEngine.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,IAAI,WAAW,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,KAAK,IAAI,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,KAAK,IAAI,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAC/E,OAAO,EAAE,KAAK,IAAI,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AACnF,OAAO,EAAE,KAAK,IAAI,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,EAAE,KAAK,IAAI,qBAAqB,EAAE,MAAM,uCAAuC,CAAC;AACvF,OAAO,EAAE,KAAK,IAAI,aAAa,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"issueEngine.js","sourceRoot":"","sources":["../../src/core/issueEngine.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,IAAI,WAAW,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,KAAK,IAAI,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,KAAK,IAAI,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAC/E,OAAO,EAAE,KAAK,IAAI,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AACnF,OAAO,EAAE,KAAK,IAAI,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,EAAE,KAAK,IAAI,qBAAqB,EAAE,MAAM,uCAAuC,CAAC;AACvF,OAAO,EAAE,KAAK,IAAI,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,EAAE,KAAK,IAAI,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAC3E,OAAO,EAAE,KAAK,IAAI,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAC/E,OAAO,EAAE,KAAK,IAAI,yBAAyB,EAAE,MAAM,2CAA2C,CAAC;AAC/F,OAAO,EAAE,KAAK,IAAI,2BAA2B,EAAE,MAAM,6CAA6C,CAAC;AAInG,MAAM,QAAQ,GAAc;IAC1B,WAAW;IACX,aAAa;IACb,SAAS;IACT,iBAAiB;IACjB,mBAAmB;IACnB,aAAa;IACb,qBAAqB;IACrB,aAAa;IACb,uEAAuE;IACvE,uBAAuB;IACvB,eAAe;IACf,iBAAiB;IACjB,yBAAyB;IACzB,2BAA2B;CAC5B,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,QAAgB,EAAE,KAAkB;IACtE,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IACnF,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAE9B,2CAA2C;IAC3C,MAAM,aAAa,GAA2B,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;IAChF,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAE3F,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { FileEntry } from '../../types.js';
|
|
2
|
+
import type { AstResult } from '../ast.js';
|
|
3
|
+
export type LanguageId = 'javascript' | 'python';
|
|
4
|
+
export interface LanguageResolveContext {
|
|
5
|
+
/** Language-specific root dirs used during import resolution. */
|
|
6
|
+
packageRoots?: string[];
|
|
7
|
+
meta?: Record<string, unknown>;
|
|
8
|
+
}
|
|
9
|
+
export interface GraphFileLike {
|
|
10
|
+
relativePath: string;
|
|
11
|
+
}
|
|
12
|
+
export interface LanguageAdapter {
|
|
13
|
+
id: LanguageId;
|
|
14
|
+
/** File extensions this adapter claims (lowercase, with dot). */
|
|
15
|
+
extensions: ReadonlySet<string>;
|
|
16
|
+
/** Max file size to parse. Defaults to 1 MB at the call site. */
|
|
17
|
+
maxFileSize?: number;
|
|
18
|
+
/** Barrel filenames (sans extension) to skip in dead-code analysis. */
|
|
19
|
+
barrelBasenames?: ReadonlySet<string>;
|
|
20
|
+
/** Source extensions used for dead-code analysis (a subset or equal of `extensions`). */
|
|
21
|
+
sourceExtensions?: ReadonlySet<string>;
|
|
22
|
+
/** Parse a file. Must never throw; returns ok:false on failure. */
|
|
23
|
+
parse(filePath: string, content: string): AstResult | Promise<AstResult>;
|
|
24
|
+
/**
|
|
25
|
+
* Resolve a single import source against the graph's known files.
|
|
26
|
+
* Called during graph-building AFTER all files are parsed.
|
|
27
|
+
*/
|
|
28
|
+
resolveImport(importingFile: string, source: string, graphFiles: Map<string, GraphFileLike>, context: LanguageResolveContext): string | null;
|
|
29
|
+
/**
|
|
30
|
+
* Return the bare external package name for this specifier, or null for
|
|
31
|
+
* "local/relative, let resolveImport handle it."
|
|
32
|
+
*/
|
|
33
|
+
toPackageName(source: string): string | null;
|
|
34
|
+
/** One-time per-scan setup. Called before any parse. */
|
|
35
|
+
preparePackageRoots(rootPath: string, files: FileEntry[]): Promise<LanguageResolveContext> | LanguageResolveContext;
|
|
36
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LanguageAdapter.js","sourceRoot":"","sources":["../../../src/core/languages/LanguageAdapter.ts"],"names":[],"mappings":""}
|