projscan 0.12.0 → 0.16.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 +20 -14
- package/dist/analyzers/crossPackageImportCheck.d.ts +13 -0
- package/dist/analyzers/crossPackageImportCheck.js +136 -0
- package/dist/analyzers/crossPackageImportCheck.js.map +1 -0
- package/dist/analyzers/cycleCheck.d.ts +12 -0
- package/dist/analyzers/cycleCheck.js +65 -0
- package/dist/analyzers/cycleCheck.js.map +1 -0
- package/dist/cli/_shared.js +2 -2
- package/dist/cli/_shared.js.map +1 -1
- package/dist/cli/commands/audit.js +8 -2
- package/dist/cli/commands/audit.js.map +1 -1
- package/dist/cli/commands/coupling.js +4 -0
- package/dist/cli/commands/coupling.js.map +1 -1
- package/dist/cli/commands/dependencies.js +4 -3
- package/dist/cli/commands/dependencies.js.map +1 -1
- package/dist/cli/commands/doctor.js +4 -0
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/commands/explainIssue.d.ts +1 -0
- package/dist/cli/commands/explainIssue.js +49 -0
- package/dist/cli/commands/explainIssue.js.map +1 -0
- package/dist/cli/commands/fixSuggest.d.ts +1 -0
- package/dist/cli/commands/fixSuggest.js +71 -0
- package/dist/cli/commands/fixSuggest.js.map +1 -0
- package/dist/cli/commands/hotspots.js +4 -0
- package/dist/cli/commands/hotspots.js.map +1 -1
- package/dist/cli/commands/impact.d.ts +1 -0
- package/dist/cli/commands/impact.js +59 -0
- package/dist/cli/commands/impact.js.map +1 -0
- package/dist/cli/commands/review.d.ts +1 -0
- package/dist/cli/commands/review.js +70 -0
- package/dist/cli/commands/review.js.map +1 -0
- package/dist/cli/commands/search.js +6 -2
- package/dist/cli/commands/search.js.map +1 -1
- package/dist/cli/commands/watch.d.ts +1 -0
- package/dist/cli/commands/watch.js +58 -0
- package/dist/cli/commands/watch.js.map +1 -0
- package/dist/cli/index.js +10 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/core/ast.d.ts +28 -0
- package/dist/core/ast.js +190 -0
- package/dist/core/ast.js.map +1 -1
- package/dist/core/auditRunner.d.ts +8 -0
- package/dist/core/auditRunner.js +50 -1
- package/dist/core/auditRunner.js.map +1 -1
- package/dist/core/codeGraph.d.ts +23 -1
- package/dist/core/codeGraph.js +198 -0
- package/dist/core/codeGraph.js.map +1 -1
- package/dist/core/dependencyAnalyzer.d.ts +15 -1
- package/dist/core/dependencyAnalyzer.js +115 -18
- package/dist/core/dependencyAnalyzer.js.map +1 -1
- package/dist/core/explainIssue.d.ts +9 -0
- package/dist/core/explainIssue.js +106 -0
- package/dist/core/explainIssue.js.map +1 -0
- package/dist/core/fileInspector.js +13 -0
- package/dist/core/fileInspector.js.map +1 -1
- package/dist/core/fixSuggest.d.ts +41 -0
- package/dist/core/fixSuggest.js +327 -0
- package/dist/core/fixSuggest.js.map +1 -0
- package/dist/core/impact.d.ts +27 -0
- package/dist/core/impact.js +169 -0
- package/dist/core/impact.js.map +1 -0
- package/dist/core/indexCache.js +5 -1
- package/dist/core/indexCache.js.map +1 -1
- package/dist/core/issueEngine.js +18 -0
- package/dist/core/issueEngine.js.map +1 -1
- package/dist/core/languages/goAdapter.js +5 -0
- package/dist/core/languages/goAdapter.js.map +1 -1
- package/dist/core/languages/goFunctions.d.ts +24 -0
- package/dist/core/languages/goFunctions.js +99 -0
- package/dist/core/languages/goFunctions.js.map +1 -0
- package/dist/core/languages/javaAdapter.js +5 -0
- package/dist/core/languages/javaAdapter.js.map +1 -1
- package/dist/core/languages/javaFunctions.d.ts +22 -0
- package/dist/core/languages/javaFunctions.js +87 -0
- package/dist/core/languages/javaFunctions.js.map +1 -0
- package/dist/core/languages/pythonAdapter.js +5 -0
- package/dist/core/languages/pythonAdapter.js.map +1 -1
- package/dist/core/languages/pythonFunctions.d.ts +23 -0
- package/dist/core/languages/pythonFunctions.js +87 -0
- package/dist/core/languages/pythonFunctions.js.map +1 -0
- package/dist/core/languages/rubyAdapter.js +5 -0
- package/dist/core/languages/rubyAdapter.js.map +1 -1
- package/dist/core/languages/rubyFunctions.d.ts +22 -0
- package/dist/core/languages/rubyFunctions.js +91 -0
- package/dist/core/languages/rubyFunctions.js.map +1 -0
- package/dist/core/review.d.ts +21 -0
- package/dist/core/review.js +457 -0
- package/dist/core/review.js.map +1 -0
- package/dist/core/searchIndex.d.ts +9 -0
- package/dist/core/searchIndex.js.map +1 -1
- package/dist/core/semanticSearch.d.ts +69 -2
- package/dist/core/semanticSearch.js +113 -55
- package/dist/core/semanticSearch.js.map +1 -1
- package/dist/core/watcher.d.ts +37 -0
- package/dist/core/watcher.js +126 -0
- package/dist/core/watcher.js.map +1 -0
- package/dist/index.d.ts +11 -2
- package/dist/index.js +7 -1
- package/dist/index.js.map +1 -1
- package/dist/mcp/tools/audit.js +7 -2
- package/dist/mcp/tools/audit.js.map +1 -1
- package/dist/mcp/tools/dependencies.js +11 -5
- package/dist/mcp/tools/dependencies.js.map +1 -1
- package/dist/mcp/tools/explainIssue.d.ts +2 -0
- package/dist/mcp/tools/explainIssue.js +30 -0
- package/dist/mcp/tools/explainIssue.js.map +1 -0
- package/dist/mcp/tools/file.js +1 -1
- package/dist/mcp/tools/file.js.map +1 -1
- package/dist/mcp/tools/fixSuggest.d.ts +2 -0
- package/dist/mcp/tools/fixSuggest.js +57 -0
- package/dist/mcp/tools/fixSuggest.js.map +1 -0
- package/dist/mcp/tools/hotspots.js +40 -1
- package/dist/mcp/tools/hotspots.js.map +1 -1
- package/dist/mcp/tools/impact.d.ts +2 -0
- package/dist/mcp/tools/impact.js +59 -0
- package/dist/mcp/tools/impact.js.map +1 -0
- package/dist/mcp/tools/review.d.ts +2 -0
- package/dist/mcp/tools/review.js +54 -0
- package/dist/mcp/tools/review.js.map +1 -0
- package/dist/mcp/tools/search.js +9 -2
- package/dist/mcp/tools/search.js.map +1 -1
- package/dist/mcp/tools.js +8 -0
- package/dist/mcp/tools.js.map +1 -1
- package/dist/reporters/consoleReporter.d.ts +10 -1
- package/dist/reporters/consoleReporter.js +218 -0
- package/dist/reporters/consoleReporter.js.map +1 -1
- package/dist/reporters/htmlReporter.d.ts +8 -0
- package/dist/reporters/htmlReporter.js +287 -0
- package/dist/reporters/htmlReporter.js.map +1 -0
- package/dist/reporters/jsonReporter.d.ts +10 -1
- package/dist/reporters/jsonReporter.js +12 -0
- package/dist/reporters/jsonReporter.js.map +1 -1
- package/dist/reporters/markdownReporter.d.ts +10 -1
- package/dist/reporters/markdownReporter.js +173 -0
- package/dist/reporters/markdownReporter.js.map +1 -1
- package/dist/tool-manifest.json +133 -8
- package/dist/types.d.ts +276 -1
- package/dist/utils/config.js +27 -0
- package/dist/utils/config.js.map +1 -1
- package/package.json +4 -2
package/dist/core/ast.js
CHANGED
|
@@ -8,6 +8,7 @@ const EMPTY = {
|
|
|
8
8
|
callSites: [],
|
|
9
9
|
lineCount: 0,
|
|
10
10
|
cyclomaticComplexity: 0,
|
|
11
|
+
functions: [],
|
|
11
12
|
};
|
|
12
13
|
const SOURCE_EXTENSIONS = new Set([
|
|
13
14
|
'.ts',
|
|
@@ -105,6 +106,7 @@ export function parseSource(filePath, content) {
|
|
|
105
106
|
if (isDecisionPoint(n))
|
|
106
107
|
decisionPoints++;
|
|
107
108
|
});
|
|
109
|
+
const functions = extractFunctionsFromBabel(ast.program);
|
|
108
110
|
return {
|
|
109
111
|
ok: true,
|
|
110
112
|
imports,
|
|
@@ -112,8 +114,196 @@ export function parseSource(filePath, content) {
|
|
|
112
114
|
callSites: [...new Set(callSites)],
|
|
113
115
|
lineCount: content ? content.split('\n').length : 0,
|
|
114
116
|
cyclomaticComplexity: decisionPoints + 1,
|
|
117
|
+
functions,
|
|
115
118
|
};
|
|
116
119
|
}
|
|
120
|
+
/**
|
|
121
|
+
* Walk a Babel program and emit one FunctionInfo per function-like node:
|
|
122
|
+
* FunctionDeclaration, FunctionExpression, ArrowFunctionExpression,
|
|
123
|
+
* ClassMethod, ObjectMethod. Each function's CC is computed over its own
|
|
124
|
+
* body only - decision points inside a nested function belong to that
|
|
125
|
+
* nested function, not its parent. This matches eslint's `complexity` rule
|
|
126
|
+
* and most static analyzers.
|
|
127
|
+
*/
|
|
128
|
+
function extractFunctionsFromBabel(program) {
|
|
129
|
+
const out = [];
|
|
130
|
+
collectFunctions(program, null, null, out);
|
|
131
|
+
return out;
|
|
132
|
+
}
|
|
133
|
+
const FUNCTION_TYPES = new Set([
|
|
134
|
+
'FunctionDeclaration',
|
|
135
|
+
'FunctionExpression',
|
|
136
|
+
'ArrowFunctionExpression',
|
|
137
|
+
'ClassMethod',
|
|
138
|
+
'ObjectMethod',
|
|
139
|
+
'ClassPrivateMethod',
|
|
140
|
+
]);
|
|
141
|
+
function isFunctionNode(n) {
|
|
142
|
+
return FUNCTION_TYPES.has(n.type);
|
|
143
|
+
}
|
|
144
|
+
function collectFunctions(node, parentClassName, bindingName, out) {
|
|
145
|
+
if (!node || typeof node !== 'object')
|
|
146
|
+
return;
|
|
147
|
+
if (isFunctionNode(node)) {
|
|
148
|
+
const name = nameForFunctionNode(node, parentClassName, bindingName);
|
|
149
|
+
const line = node.loc?.start.line ?? 0;
|
|
150
|
+
const endLine = node.loc?.end.line ?? line;
|
|
151
|
+
const cc = countCcInBody(node);
|
|
152
|
+
out.push({ name, line, endLine, cyclomaticComplexity: cc });
|
|
153
|
+
// Recurse into nested functions so they emit their own entries. The body
|
|
154
|
+
// walker (`countCcInBody`) skips nested functions for CC, but we still need
|
|
155
|
+
// to descend the whole tree to find all functions.
|
|
156
|
+
descendForNestedFunctions(node, parentClassName, out);
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
// Track context so nested functions get a useful name.
|
|
160
|
+
if (node.type === 'ClassDeclaration' || node.type === 'ClassExpression') {
|
|
161
|
+
const className = node.id?.name ?? null;
|
|
162
|
+
const body = node.body;
|
|
163
|
+
if (body)
|
|
164
|
+
collectFunctions(body, className, null, out);
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
if (node.type === 'VariableDeclarator') {
|
|
168
|
+
const id = node.id;
|
|
169
|
+
const init = node.init;
|
|
170
|
+
const name = id && id.type === 'Identifier' ? (id.name ?? null) : null;
|
|
171
|
+
if (init)
|
|
172
|
+
collectFunctions(init, parentClassName, name, out);
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
if (node.type === 'AssignmentExpression') {
|
|
176
|
+
const left = node.left;
|
|
177
|
+
const right = node.right;
|
|
178
|
+
const name = left && left.type === 'Identifier' ? (left.name ?? null) : null;
|
|
179
|
+
if (right)
|
|
180
|
+
collectFunctions(right, parentClassName, name, out);
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
if (node.type === 'ExportDefaultDeclaration') {
|
|
184
|
+
const decl = node.declaration;
|
|
185
|
+
if (decl)
|
|
186
|
+
collectFunctions(decl, parentClassName, 'default', out);
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
for (const key of Object.keys(node)) {
|
|
190
|
+
if (key === 'loc' || key === 'range' || key === 'leadingComments' || key === 'trailingComments')
|
|
191
|
+
continue;
|
|
192
|
+
const child = node[key];
|
|
193
|
+
if (!child)
|
|
194
|
+
continue;
|
|
195
|
+
if (Array.isArray(child)) {
|
|
196
|
+
for (const item of child) {
|
|
197
|
+
if (item && typeof item === 'object' && 'type' in item) {
|
|
198
|
+
collectFunctions(item, parentClassName, null, out);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
else if (typeof child === 'object' && 'type' in child) {
|
|
203
|
+
collectFunctions(child, parentClassName, null, out);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
function descendForNestedFunctions(fnNode, parentClassName, out) {
|
|
208
|
+
const body = fnNode.body;
|
|
209
|
+
if (!body)
|
|
210
|
+
return;
|
|
211
|
+
// Body of a function expression/declaration is a BlockStatement (or, for
|
|
212
|
+
// arrows, possibly an Expression). Either way, walk it.
|
|
213
|
+
walkChildren(body, (child) => collectFunctions(child, parentClassName, null, out));
|
|
214
|
+
}
|
|
215
|
+
function nameForFunctionNode(node, parentClassName, bindingName) {
|
|
216
|
+
// FunctionDeclaration: function foo() {}
|
|
217
|
+
if (node.type === 'FunctionDeclaration') {
|
|
218
|
+
const id = node.id;
|
|
219
|
+
return id?.name ?? bindingName ?? '<anonymous>';
|
|
220
|
+
}
|
|
221
|
+
// ClassMethod / ObjectMethod / ClassPrivateMethod
|
|
222
|
+
if (node.type === 'ClassMethod' || node.type === 'ObjectMethod' || node.type === 'ClassPrivateMethod') {
|
|
223
|
+
const key = node.key;
|
|
224
|
+
let methodName = '<anonymous>';
|
|
225
|
+
if (key) {
|
|
226
|
+
if (key.type === 'Identifier')
|
|
227
|
+
methodName = key.name ?? '<anonymous>';
|
|
228
|
+
else if (key.type === 'StringLiteral')
|
|
229
|
+
methodName = key.value ?? '<anonymous>';
|
|
230
|
+
else if (key.type === 'PrivateName') {
|
|
231
|
+
const inner = key.id;
|
|
232
|
+
methodName = inner?.name ? `#${inner.name}` : '<anonymous>';
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
return parentClassName ? `${parentClassName}.${methodName}` : methodName;
|
|
236
|
+
}
|
|
237
|
+
// FunctionExpression with an inner id: const x = function named() {}
|
|
238
|
+
if (node.type === 'FunctionExpression') {
|
|
239
|
+
const id = node.id;
|
|
240
|
+
if (id?.name)
|
|
241
|
+
return id.name;
|
|
242
|
+
}
|
|
243
|
+
// Arrow / unnamed function expression: use the binding name if we have it.
|
|
244
|
+
return bindingName ?? '<anonymous>';
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Count McCabe decision points in a function body, treating nested functions
|
|
248
|
+
* as opaque (their decision points belong to them, not the enclosing function).
|
|
249
|
+
*/
|
|
250
|
+
function countCcInBody(fnNode) {
|
|
251
|
+
const body = fnNode.body;
|
|
252
|
+
if (!body)
|
|
253
|
+
return 1;
|
|
254
|
+
let decisions = 0;
|
|
255
|
+
walkSkippingNestedFunctions(body, (n) => {
|
|
256
|
+
if (isDecisionPoint(n))
|
|
257
|
+
decisions++;
|
|
258
|
+
});
|
|
259
|
+
return decisions + 1;
|
|
260
|
+
}
|
|
261
|
+
function walkChildren(node, visit) {
|
|
262
|
+
if (!node || typeof node !== 'object')
|
|
263
|
+
return;
|
|
264
|
+
for (const key of Object.keys(node)) {
|
|
265
|
+
if (key === 'loc' || key === 'range' || key === 'leadingComments' || key === 'trailingComments')
|
|
266
|
+
continue;
|
|
267
|
+
const child = node[key];
|
|
268
|
+
if (!child)
|
|
269
|
+
continue;
|
|
270
|
+
if (Array.isArray(child)) {
|
|
271
|
+
for (const item of child) {
|
|
272
|
+
if (item && typeof item === 'object' && 'type' in item)
|
|
273
|
+
visit(item);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
else if (typeof child === 'object' && 'type' in child) {
|
|
277
|
+
visit(child);
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
function walkSkippingNestedFunctions(node, visit) {
|
|
282
|
+
if (!node || typeof node !== 'object')
|
|
283
|
+
return;
|
|
284
|
+
visit(node);
|
|
285
|
+
for (const key of Object.keys(node)) {
|
|
286
|
+
if (key === 'loc' || key === 'range' || key === 'leadingComments' || key === 'trailingComments')
|
|
287
|
+
continue;
|
|
288
|
+
const child = node[key];
|
|
289
|
+
if (!child)
|
|
290
|
+
continue;
|
|
291
|
+
if (Array.isArray(child)) {
|
|
292
|
+
for (const item of child) {
|
|
293
|
+
if (item && typeof item === 'object' && 'type' in item) {
|
|
294
|
+
if (isFunctionNode(item))
|
|
295
|
+
continue;
|
|
296
|
+
walkSkippingNestedFunctions(item, visit);
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
else if (typeof child === 'object' && 'type' in child) {
|
|
301
|
+
if (isFunctionNode(child))
|
|
302
|
+
continue;
|
|
303
|
+
walkSkippingNestedFunctions(child, visit);
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
}
|
|
117
307
|
/**
|
|
118
308
|
* McCabe decision points for JavaScript/TypeScript. Default switch cases and
|
|
119
309
|
* optional-chaining do NOT count - this matches eslint's `complexity` rule
|
package/dist/core/ast.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ast.js","sourceRoot":"","sources":["../../src/core/ast.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ast.js","sourceRoot":"","sources":["../../src/core/ast.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,14 @@ import type { AuditReport } from '../types.js';
|
|
|
2
2
|
export interface AuditOptions {
|
|
3
3
|
/** Seconds before giving up on npm audit. */
|
|
4
4
|
timeoutMs?: number;
|
|
5
|
+
/**
|
|
6
|
+
* Optional workspace package name (or relative path) to scope findings to.
|
|
7
|
+
* The audit command itself runs against the root lockfile (which is what
|
|
8
|
+
* npm/yarn/pnpm need for transitive resolution), but findings are then
|
|
9
|
+
* filtered to vulnerabilities whose name appears as a direct dependency or
|
|
10
|
+
* dev-dependency of the named workspace's manifest.
|
|
11
|
+
*/
|
|
12
|
+
packageFilter?: string;
|
|
5
13
|
}
|
|
6
14
|
/**
|
|
7
15
|
* Run `npm audit --json` and normalize the output.
|
package/dist/core/auditRunner.js
CHANGED
|
@@ -2,6 +2,7 @@ import { execFile } from 'node:child_process';
|
|
|
2
2
|
import { promisify } from 'node:util';
|
|
3
3
|
import fs from 'node:fs/promises';
|
|
4
4
|
import path from 'node:path';
|
|
5
|
+
import { detectWorkspaces } from './monorepo.js';
|
|
5
6
|
const execFileAsync = promisify(execFile);
|
|
6
7
|
const EMPTY_SUMMARY = {
|
|
7
8
|
critical: 0,
|
|
@@ -68,7 +69,55 @@ export async function runAudit(rootPath, options = {}) {
|
|
|
68
69
|
catch {
|
|
69
70
|
return unavailable('npm audit returned invalid JSON');
|
|
70
71
|
}
|
|
71
|
-
|
|
72
|
+
const report = normalize(payload);
|
|
73
|
+
if (options.packageFilter && report.available) {
|
|
74
|
+
return await scopeReportToWorkspace(rootPath, options.packageFilter, report);
|
|
75
|
+
}
|
|
76
|
+
return report;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Filter audit findings to the direct dependencies of a single workspace's
|
|
80
|
+
* package.json. Findings whose name doesn't appear in that manifest are
|
|
81
|
+
* dropped. If the workspace can't be located the original report is returned
|
|
82
|
+
* with a `reason` annotation rather than failing.
|
|
83
|
+
*/
|
|
84
|
+
async function scopeReportToWorkspace(rootPath, packageFilter, report) {
|
|
85
|
+
const ws = await detectWorkspaces(rootPath);
|
|
86
|
+
const target = ws.packages.find((p) => p.name === packageFilter || p.relativePath === packageFilter);
|
|
87
|
+
if (!target) {
|
|
88
|
+
return {
|
|
89
|
+
...report,
|
|
90
|
+
reason: `Workspace not found: ${packageFilter}`,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
const manifestPath = path.join(rootPath, target.relativePath, 'package.json');
|
|
94
|
+
let raw;
|
|
95
|
+
try {
|
|
96
|
+
raw = await fs.readFile(manifestPath, 'utf-8');
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
return { ...report, reason: `Cannot read ${target.relativePath}/package.json` };
|
|
100
|
+
}
|
|
101
|
+
let pkg;
|
|
102
|
+
try {
|
|
103
|
+
pkg = JSON.parse(raw);
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
return { ...report, reason: `Invalid JSON in ${target.relativePath}/package.json` };
|
|
107
|
+
}
|
|
108
|
+
const allowed = new Set([
|
|
109
|
+
...Object.keys(pkg.dependencies ?? {}),
|
|
110
|
+
...Object.keys(pkg.devDependencies ?? {}),
|
|
111
|
+
]);
|
|
112
|
+
const findings = report.findings.filter((f) => allowed.has(f.name));
|
|
113
|
+
const summary = { ...EMPTY_SUMMARY };
|
|
114
|
+
for (const f of findings)
|
|
115
|
+
summary[f.severity]++;
|
|
116
|
+
return {
|
|
117
|
+
available: true,
|
|
118
|
+
summary,
|
|
119
|
+
findings,
|
|
120
|
+
};
|
|
72
121
|
}
|
|
73
122
|
function normalize(payload) {
|
|
74
123
|
// Modern format (npm 7+): { vulnerabilities: { name: { severity, via, range, fixAvailable, ... } }, metadata: { vulnerabilities: { critical, high, ... } } }
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auditRunner.js","sourceRoot":"","sources":["../../src/core/auditRunner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"auditRunner.js","sourceRoot":"","sources":["../../src/core/auditRunner.ts"],"names":[],"mappings":"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"}
|
package/dist/core/codeGraph.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { FileEntry } from '../types.js';
|
|
2
|
-
import type { AstImport, AstExport } from './ast.js';
|
|
2
|
+
import type { AstImport, AstExport, FunctionInfo } from './ast.js';
|
|
3
3
|
export interface GraphFile {
|
|
4
4
|
relativePath: string;
|
|
5
5
|
imports: AstImport[];
|
|
@@ -8,6 +8,12 @@ export interface GraphFile {
|
|
|
8
8
|
lineCount: number;
|
|
9
9
|
/** File-level McCabe cyclomatic complexity from the adapter. 0 when unparsed. */
|
|
10
10
|
cyclomaticComplexity: number;
|
|
11
|
+
/**
|
|
12
|
+
* Per-function McCabe CC from the adapter (0.13.0+). Optional for
|
|
13
|
+
* backward compatibility with code paths that build GraphFile records
|
|
14
|
+
* without function metadata. Treat absence as "no per-function data".
|
|
15
|
+
*/
|
|
16
|
+
functions?: FunctionInfo[];
|
|
11
17
|
mtimeMs: number;
|
|
12
18
|
parseOk: boolean;
|
|
13
19
|
parseReason?: string;
|
|
@@ -28,6 +34,22 @@ export declare function buildCodeGraph(rootPath: string, files: FileEntry[], pre
|
|
|
28
34
|
* `getAdapterFor(filePath).toPackageName(specifier)`.
|
|
29
35
|
*/
|
|
30
36
|
export declare function toPackageName(specifier: string): string | null;
|
|
37
|
+
/**
|
|
38
|
+
* 0.16.0: targeted incremental update for watch mode. Given a graph and a
|
|
39
|
+
* list of repo-relative paths that may have changed (added, modified, or
|
|
40
|
+
* deleted), update the graph in place: re-stat each path, re-parse changed
|
|
41
|
+
* ones, drop deleted ones, and fix up the cross-file derived indexes
|
|
42
|
+
* (`localImporters`, `packageImporters`, `symbolDefs`, per-function
|
|
43
|
+
* `fanIn`).
|
|
44
|
+
*
|
|
45
|
+
* Returns the same `graph` reference. Cheap: O(changedPaths) for the parse
|
|
46
|
+
* pass; the fan-in recomputation is O(graph.files) but it's a single
|
|
47
|
+
* walk over already-parsed entries (no IO).
|
|
48
|
+
*
|
|
49
|
+
* `changedPaths` should be repo-relative (forward-slash). Files that don't
|
|
50
|
+
* exist are treated as deletions; files that do exist are re-parsed.
|
|
51
|
+
*/
|
|
52
|
+
export declare function incrementallyUpdateGraph(graph: CodeGraph, rootPath: string, changedPaths: string[]): Promise<CodeGraph>;
|
|
31
53
|
export declare function packagesUsed(graph: CodeGraph): Set<string>;
|
|
32
54
|
export declare function filesImportingPackage(graph: CodeGraph, pkg: string): string[];
|
|
33
55
|
export declare function filesImportingFile(graph: CodeGraph, relativePath: string): string[];
|
package/dist/core/codeGraph.js
CHANGED
|
@@ -53,6 +53,7 @@ export async function buildCodeGraph(rootPath, files, previousGraph) {
|
|
|
53
53
|
callSites: [],
|
|
54
54
|
lineCount: 0,
|
|
55
55
|
cyclomaticComplexity: 0,
|
|
56
|
+
functions: [],
|
|
56
57
|
};
|
|
57
58
|
}
|
|
58
59
|
graphFiles.set(file.relativePath, {
|
|
@@ -62,6 +63,7 @@ export async function buildCodeGraph(rootPath, files, previousGraph) {
|
|
|
62
63
|
callSites: result.callSites,
|
|
63
64
|
lineCount: result.lineCount,
|
|
64
65
|
cyclomaticComplexity: result.cyclomaticComplexity,
|
|
66
|
+
functions: result.functions ?? [],
|
|
65
67
|
mtimeMs,
|
|
66
68
|
parseOk: result.ok,
|
|
67
69
|
parseReason: result.reason,
|
|
@@ -100,6 +102,36 @@ export async function buildCodeGraph(rootPath, files, previousGraph) {
|
|
|
100
102
|
symbolDefs.get(exp.name).add(importingFile);
|
|
101
103
|
}
|
|
102
104
|
}
|
|
105
|
+
// 0.15.0: per-function fan-in. For each function name across the graph,
|
|
106
|
+
// count how many OTHER files include the name in their callSites. The
|
|
107
|
+
// result is attached to the function entry in-place. Approximate: shared
|
|
108
|
+
// names across files attribute to every definition.
|
|
109
|
+
const callerFilesByName = new Map();
|
|
110
|
+
for (const gf of graphFiles.values()) {
|
|
111
|
+
for (const name of gf.callSites ?? []) {
|
|
112
|
+
let set = callerFilesByName.get(name);
|
|
113
|
+
if (!set) {
|
|
114
|
+
set = new Set();
|
|
115
|
+
callerFilesByName.set(name, set);
|
|
116
|
+
}
|
|
117
|
+
set.add(gf.relativePath);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
for (const gf of graphFiles.values()) {
|
|
121
|
+
if (!gf.functions || gf.functions.length === 0)
|
|
122
|
+
continue;
|
|
123
|
+
for (const fn of gf.functions) {
|
|
124
|
+
const bare = bareName(fn.name);
|
|
125
|
+
const callers = callerFilesByName.get(bare);
|
|
126
|
+
if (!callers) {
|
|
127
|
+
fn.fanIn = 0;
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
130
|
+
// Subtract self if the function's own file appears in the caller set
|
|
131
|
+
// (self-call from within the same file).
|
|
132
|
+
fn.fanIn = callers.size - (callers.has(gf.relativePath) ? 1 : 0);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
103
135
|
return {
|
|
104
136
|
files: graphFiles,
|
|
105
137
|
packageImporters,
|
|
@@ -108,6 +140,19 @@ export async function buildCodeGraph(rootPath, files, previousGraph) {
|
|
|
108
140
|
scannedFiles: graphFiles.size,
|
|
109
141
|
};
|
|
110
142
|
}
|
|
143
|
+
/**
|
|
144
|
+
* Function names in the graph are sometimes qualified (`Class.method` for
|
|
145
|
+
* methods, `Class.<init>` for Java constructors). callSites only carries
|
|
146
|
+
* the bare name (the called identifier), so we strip the class/receiver
|
|
147
|
+
* prefix to do the lookup. Falls back to the original on names without a
|
|
148
|
+
* dot.
|
|
149
|
+
*/
|
|
150
|
+
function bareName(qualified) {
|
|
151
|
+
const dot = qualified.lastIndexOf('.');
|
|
152
|
+
if (dot < 0)
|
|
153
|
+
return qualified;
|
|
154
|
+
return qualified.slice(dot + 1);
|
|
155
|
+
}
|
|
111
156
|
/**
|
|
112
157
|
* Back-compat: convert a JS/TS import specifier to a bare package name.
|
|
113
158
|
* Delegates to the JavaScript adapter. For multi-language use cases, prefer
|
|
@@ -117,6 +162,159 @@ export function toPackageName(specifier) {
|
|
|
117
162
|
const jsAdapter = listAdapters().find((a) => a.id === 'javascript');
|
|
118
163
|
return jsAdapter ? jsAdapter.toPackageName(specifier) : null;
|
|
119
164
|
}
|
|
165
|
+
/**
|
|
166
|
+
* 0.16.0: targeted incremental update for watch mode. Given a graph and a
|
|
167
|
+
* list of repo-relative paths that may have changed (added, modified, or
|
|
168
|
+
* deleted), update the graph in place: re-stat each path, re-parse changed
|
|
169
|
+
* ones, drop deleted ones, and fix up the cross-file derived indexes
|
|
170
|
+
* (`localImporters`, `packageImporters`, `symbolDefs`, per-function
|
|
171
|
+
* `fanIn`).
|
|
172
|
+
*
|
|
173
|
+
* Returns the same `graph` reference. Cheap: O(changedPaths) for the parse
|
|
174
|
+
* pass; the fan-in recomputation is O(graph.files) but it's a single
|
|
175
|
+
* walk over already-parsed entries (no IO).
|
|
176
|
+
*
|
|
177
|
+
* `changedPaths` should be repo-relative (forward-slash). Files that don't
|
|
178
|
+
* exist are treated as deletions; files that do exist are re-parsed.
|
|
179
|
+
*/
|
|
180
|
+
export async function incrementallyUpdateGraph(graph, rootPath, changedPaths) {
|
|
181
|
+
if (changedPaths.length === 0)
|
|
182
|
+
return graph;
|
|
183
|
+
// Per-adapter context. We re-prepare since changedPaths may include
|
|
184
|
+
// manifest edits (pyproject.toml, go.mod) that would shift package roots.
|
|
185
|
+
// Run once for the whole batch; cheap relative to parsing.
|
|
186
|
+
const contextByAdapter = new Map();
|
|
187
|
+
// We need a FileEntry-shaped argument for preparePackageRoots; build one
|
|
188
|
+
// from the current graph plus the changed-path stat info as a stand-in.
|
|
189
|
+
const fakeFiles = [...graph.files.values()].map((gf) => ({
|
|
190
|
+
relativePath: gf.relativePath,
|
|
191
|
+
absolutePath: path.resolve(rootPath, gf.relativePath),
|
|
192
|
+
directory: path.dirname(gf.relativePath),
|
|
193
|
+
extension: path.extname(gf.relativePath),
|
|
194
|
+
sizeBytes: 0,
|
|
195
|
+
}));
|
|
196
|
+
for (const adapter of listAdapters()) {
|
|
197
|
+
contextByAdapter.set(adapter, await adapter.preparePackageRoots(rootPath, fakeFiles));
|
|
198
|
+
}
|
|
199
|
+
// Step 1: re-parse or delete each changed path.
|
|
200
|
+
await Promise.all(changedPaths.map(async (rel) => {
|
|
201
|
+
const adapter = getAdapterFor(rel);
|
|
202
|
+
if (!adapter) {
|
|
203
|
+
// Not a parseable file (e.g. README). If we previously had it in the
|
|
204
|
+
// graph drop the entry; otherwise nothing to do.
|
|
205
|
+
if (graph.files.has(rel))
|
|
206
|
+
graph.files.delete(rel);
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
const abs = path.resolve(rootPath, rel);
|
|
210
|
+
let mtimeMs;
|
|
211
|
+
try {
|
|
212
|
+
const stat = await fs.stat(abs);
|
|
213
|
+
mtimeMs = stat.mtimeMs;
|
|
214
|
+
}
|
|
215
|
+
catch {
|
|
216
|
+
// File doesn't exist anymore - treat as deletion.
|
|
217
|
+
graph.files.delete(rel);
|
|
218
|
+
// Strip its old contributions when we rebuild the indexes below.
|
|
219
|
+
return;
|
|
220
|
+
}
|
|
221
|
+
let content;
|
|
222
|
+
try {
|
|
223
|
+
content = await fs.readFile(abs, 'utf-8');
|
|
224
|
+
}
|
|
225
|
+
catch {
|
|
226
|
+
graph.files.delete(rel);
|
|
227
|
+
return;
|
|
228
|
+
}
|
|
229
|
+
let result;
|
|
230
|
+
try {
|
|
231
|
+
result = await adapter.parse(rel, content);
|
|
232
|
+
}
|
|
233
|
+
catch (err) {
|
|
234
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
235
|
+
result = {
|
|
236
|
+
ok: false,
|
|
237
|
+
reason: `adapter ${adapter.id} threw: ${msg.slice(0, 120)}`,
|
|
238
|
+
imports: [],
|
|
239
|
+
exports: [],
|
|
240
|
+
callSites: [],
|
|
241
|
+
lineCount: 0,
|
|
242
|
+
cyclomaticComplexity: 0,
|
|
243
|
+
functions: [],
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
graph.files.set(rel, {
|
|
247
|
+
relativePath: rel,
|
|
248
|
+
imports: result.imports,
|
|
249
|
+
exports: result.exports,
|
|
250
|
+
callSites: result.callSites,
|
|
251
|
+
lineCount: result.lineCount,
|
|
252
|
+
cyclomaticComplexity: result.cyclomaticComplexity,
|
|
253
|
+
functions: result.functions ?? [],
|
|
254
|
+
mtimeMs,
|
|
255
|
+
parseOk: result.ok,
|
|
256
|
+
parseReason: result.reason,
|
|
257
|
+
adapterId: adapter.id,
|
|
258
|
+
});
|
|
259
|
+
}));
|
|
260
|
+
// Step 2: rebuild the cross-file derived indexes from scratch. The graph
|
|
261
|
+
// is small relative to parse cost; rebuilding edges in O(N) keeps the
|
|
262
|
+
// logic simple and correct (no orphan-edge bugs from in-place patching).
|
|
263
|
+
graph.localImporters.clear();
|
|
264
|
+
graph.packageImporters.clear();
|
|
265
|
+
graph.symbolDefs.clear();
|
|
266
|
+
for (const [importingFile, entry] of graph.files) {
|
|
267
|
+
const adapter = getAdapterFor(importingFile);
|
|
268
|
+
if (!adapter)
|
|
269
|
+
continue;
|
|
270
|
+
const context = contextByAdapter.get(adapter) ?? {};
|
|
271
|
+
for (const imp of entry.imports) {
|
|
272
|
+
const resolved = adapter.resolveImport(importingFile, imp.source, graph.files, context);
|
|
273
|
+
if (resolved) {
|
|
274
|
+
if (!graph.localImporters.has(resolved))
|
|
275
|
+
graph.localImporters.set(resolved, new Set());
|
|
276
|
+
graph.localImporters.get(resolved).add(importingFile);
|
|
277
|
+
continue;
|
|
278
|
+
}
|
|
279
|
+
const pkg = adapter.toPackageName(imp.source);
|
|
280
|
+
if (pkg) {
|
|
281
|
+
if (!graph.packageImporters.has(pkg))
|
|
282
|
+
graph.packageImporters.set(pkg, new Set());
|
|
283
|
+
graph.packageImporters.get(pkg).add(importingFile);
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
for (const exp of entry.exports) {
|
|
287
|
+
if (!exp.name)
|
|
288
|
+
continue;
|
|
289
|
+
if (!graph.symbolDefs.has(exp.name))
|
|
290
|
+
graph.symbolDefs.set(exp.name, new Set());
|
|
291
|
+
graph.symbolDefs.get(exp.name).add(importingFile);
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
// Step 3: recompute per-function fan-in. Cheap: iterates files twice.
|
|
295
|
+
const callerFilesByName = new Map();
|
|
296
|
+
for (const gf of graph.files.values()) {
|
|
297
|
+
for (const name of gf.callSites ?? []) {
|
|
298
|
+
let set = callerFilesByName.get(name);
|
|
299
|
+
if (!set) {
|
|
300
|
+
set = new Set();
|
|
301
|
+
callerFilesByName.set(name, set);
|
|
302
|
+
}
|
|
303
|
+
set.add(gf.relativePath);
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
for (const gf of graph.files.values()) {
|
|
307
|
+
if (!gf.functions || gf.functions.length === 0)
|
|
308
|
+
continue;
|
|
309
|
+
for (const fn of gf.functions) {
|
|
310
|
+
const bare = bareName(fn.name);
|
|
311
|
+
const callers = callerFilesByName.get(bare);
|
|
312
|
+
fn.fanIn = !callers ? 0 : callers.size - (callers.has(gf.relativePath) ? 1 : 0);
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
graph.scannedFiles = graph.files.size;
|
|
316
|
+
return graph;
|
|
317
|
+
}
|
|
120
318
|
// ── Query API ──────────────────────────────────────────────
|
|
121
319
|
export function packagesUsed(graph) {
|
|
122
320
|
return new Set(graph.packageImporters.keys());
|