projscan 1.9.0 → 1.11.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 +47 -21
- package/dist/cli/_shared.d.ts +2 -0
- package/dist/cli/_shared.js +33 -0
- package/dist/cli/_shared.js.map +1 -1
- package/dist/cli/commands/analyze.js +4 -1
- package/dist/cli/commands/analyze.js.map +1 -1
- package/dist/cli/commands/ci.js +19 -2
- package/dist/cli/commands/ci.js.map +1 -1
- package/dist/cli/commands/doctor.js +6 -1
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/commands/plugin.d.ts +6 -0
- package/dist/cli/commands/plugin.js +111 -0
- package/dist/cli/commands/plugin.js.map +1 -0
- package/dist/cli/index.js +2 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/core/applyFix.d.ts +9 -0
- package/dist/core/applyFix.js +71 -0
- package/dist/core/applyFix.js.map +1 -1
- package/dist/core/codeGraph.js +8 -1
- package/dist/core/codeGraph.js.map +1 -1
- package/dist/core/issueEngine.js +12 -0
- package/dist/core/issueEngine.js.map +1 -1
- package/dist/core/plugins.d.ts +146 -0
- package/dist/core/plugins.js +399 -0
- package/dist/core/plugins.js.map +1 -0
- package/dist/core/taint.js +27 -4
- package/dist/core/taint.js.map +1 -1
- package/dist/core/watcher.d.ts +8 -0
- package/dist/core/watcher.js +48 -18
- package/dist/core/watcher.js.map +1 -1
- package/dist/mcp/tools/costSummary.js +259 -49
- package/dist/mcp/tools/costSummary.js.map +1 -1
- package/dist/mcp/tools/plugin.d.ts +13 -0
- package/dist/mcp/tools/plugin.js +72 -0
- package/dist/mcp/tools/plugin.js.map +1 -0
- package/dist/mcp/tools.js +2 -0
- package/dist/mcp/tools.js.map +1 -1
- package/dist/tool-manifest.json +44 -5
- package/dist/utils/changedFiles.js +25 -0
- package/dist/utils/changedFiles.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,399 @@
|
|
|
1
|
+
import fs from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { pathToFileURL } from 'node:url';
|
|
4
|
+
/**
|
|
5
|
+
* Plugin API preview (1.10+).
|
|
6
|
+
*
|
|
7
|
+
* Gated behind PROJSCAN_PLUGINS_PREVIEW=1. The shape declared here is what
|
|
8
|
+
* 2.0 will commit to; until 2.0 ships, the schema, the discovery path,
|
|
9
|
+
* and the dispatch lifecycle may change between minors. Without the env
|
|
10
|
+
* flag, `loadPlugins()` returns [] and projscan ignores any manifests on
|
|
11
|
+
* disk — so a half-written plugin can't accidentally light up.
|
|
12
|
+
*
|
|
13
|
+
* Goal for 2.0: third parties write `.projscan-plugin.json` declaring an
|
|
14
|
+
* analyzer that produces Issue[], projscan dispatches to it during
|
|
15
|
+
* `doctor` / `ci` / `analyze`, and the issue stream merges with the
|
|
16
|
+
* built-ins. No LLM inside; no codemods; mechanical only — same scope
|
|
17
|
+
* discipline as the rest of projscan.
|
|
18
|
+
*/
|
|
19
|
+
export const PLUGIN_PREVIEW_FLAG = 'PROJSCAN_PLUGINS_PREVIEW';
|
|
20
|
+
export const PLUGIN_SCHEMA_VERSION = 1;
|
|
21
|
+
export const PLUGIN_DIR = '.projscan-plugins';
|
|
22
|
+
export const PLUGIN_MANIFEST_EXT = '.projscan-plugin.json';
|
|
23
|
+
export const PLUGIN_REPORTER_COMMANDS = ['doctor', 'analyze', 'ci'];
|
|
24
|
+
export function pluginsEnabled() {
|
|
25
|
+
const v = process.env[PLUGIN_PREVIEW_FLAG];
|
|
26
|
+
return v === '1' || v === 'true';
|
|
27
|
+
}
|
|
28
|
+
export async function readPluginManifestFile(manifestPath) {
|
|
29
|
+
let raw;
|
|
30
|
+
try {
|
|
31
|
+
raw = await fs.readFile(manifestPath, 'utf-8');
|
|
32
|
+
}
|
|
33
|
+
catch (err) {
|
|
34
|
+
const message = `unable to read manifest: ${err instanceof Error ? err.message : String(err)}`;
|
|
35
|
+
return {
|
|
36
|
+
ok: false,
|
|
37
|
+
reason: message,
|
|
38
|
+
diagnostic: {
|
|
39
|
+
code: 'read-error',
|
|
40
|
+
message,
|
|
41
|
+
hint: 'Check file permissions and try again.',
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
let parsed;
|
|
46
|
+
try {
|
|
47
|
+
parsed = JSON.parse(raw);
|
|
48
|
+
}
|
|
49
|
+
catch (err) {
|
|
50
|
+
const message = `invalid JSON: ${err instanceof Error ? err.message : String(err)}`;
|
|
51
|
+
return {
|
|
52
|
+
ok: false,
|
|
53
|
+
reason: message,
|
|
54
|
+
diagnostic: {
|
|
55
|
+
code: 'invalid-json',
|
|
56
|
+
message,
|
|
57
|
+
hint: 'Fix the manifest so it is valid JSON.',
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
const validation = validateManifest(parsed);
|
|
62
|
+
return validation.ok
|
|
63
|
+
? { ok: true, manifest: validation.manifest }
|
|
64
|
+
: { ok: false, reason: validation.reason, diagnostic: validation.diagnostic };
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Discover every plugin manifest under `<root>/.projscan-plugins/`. Manifests
|
|
68
|
+
* that fail to parse or validate are returned with `manifest: null` and an
|
|
69
|
+
* `error` so the CLI / MCP tool can surface them without throwing.
|
|
70
|
+
*/
|
|
71
|
+
export async function discoverPluginManifests(rootPath) {
|
|
72
|
+
const dir = path.join(rootPath, PLUGIN_DIR);
|
|
73
|
+
let entries;
|
|
74
|
+
try {
|
|
75
|
+
entries = await fs.readdir(dir);
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
return [];
|
|
79
|
+
}
|
|
80
|
+
const out = [];
|
|
81
|
+
for (const name of entries.sort()) {
|
|
82
|
+
if (!name.endsWith(PLUGIN_MANIFEST_EXT))
|
|
83
|
+
continue;
|
|
84
|
+
const manifestPath = path.join(dir, name);
|
|
85
|
+
const result = await readPluginManifestFile(manifestPath);
|
|
86
|
+
if (!result.ok) {
|
|
87
|
+
out.push({
|
|
88
|
+
manifestPath,
|
|
89
|
+
manifest: null,
|
|
90
|
+
error: result.reason,
|
|
91
|
+
diagnostic: result.diagnostic,
|
|
92
|
+
});
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
out.push({ manifestPath, manifest: result.manifest });
|
|
96
|
+
}
|
|
97
|
+
return out;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Discover, validate, and dynamically import every plugin under the
|
|
101
|
+
* project. Returns [] when the preview flag is off.
|
|
102
|
+
*
|
|
103
|
+
* Errors loading an individual plugin are isolated: that plugin is
|
|
104
|
+
* skipped (with a console.warn on stderr) but other plugins still load.
|
|
105
|
+
* We never let one bad plugin break the projscan pipeline.
|
|
106
|
+
*/
|
|
107
|
+
export async function loadPlugins(rootPath) {
|
|
108
|
+
if (!pluginsEnabled())
|
|
109
|
+
return [];
|
|
110
|
+
const discovered = await discoverPluginManifests(rootPath);
|
|
111
|
+
const loaded = [];
|
|
112
|
+
for (const entry of discovered) {
|
|
113
|
+
if (!entry.manifest)
|
|
114
|
+
continue;
|
|
115
|
+
if (entry.manifest.kind !== 'analyzer')
|
|
116
|
+
continue;
|
|
117
|
+
const modulePath = path.resolve(path.dirname(entry.manifestPath), entry.manifest.module);
|
|
118
|
+
try {
|
|
119
|
+
const mod = (await import(pathToFileURL(modulePath).href));
|
|
120
|
+
const exportsObj = (mod.default ?? mod);
|
|
121
|
+
if (typeof exportsObj.check !== 'function') {
|
|
122
|
+
process.stderr.write(`[projscan] plugin "${entry.manifest.name}" missing required export "check"; skipped.\n`);
|
|
123
|
+
continue;
|
|
124
|
+
}
|
|
125
|
+
loaded.push({
|
|
126
|
+
manifest: entry.manifest,
|
|
127
|
+
manifestPath: entry.manifestPath,
|
|
128
|
+
modulePath,
|
|
129
|
+
exports: { check: exportsObj.check },
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
catch (err) {
|
|
133
|
+
process.stderr.write(`[projscan] plugin "${entry.manifest.name}" failed to load: ${err instanceof Error ? err.message : String(err)}. skipped.\n`);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
return loaded;
|
|
137
|
+
}
|
|
138
|
+
export async function resolveReporterPlugin(rootPath, reporterName, command) {
|
|
139
|
+
if (!pluginsEnabled()) {
|
|
140
|
+
return pluginRuntimeFail({
|
|
141
|
+
code: 'plugins-disabled',
|
|
142
|
+
message: `reporter plugins require ${PLUGIN_PREVIEW_FLAG}=1`,
|
|
143
|
+
hint: `Set ${PLUGIN_PREVIEW_FLAG}=1 in the environment to enable plugin reporters.`,
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
const entries = await discoverPluginManifests(rootPath);
|
|
147
|
+
const reporters = entries.filter((entry) => entry.manifest?.kind === 'reporter');
|
|
148
|
+
const entry = reporters.find((candidate) => candidate.manifest.name === reporterName);
|
|
149
|
+
if (!entry) {
|
|
150
|
+
return pluginRuntimeFail({
|
|
151
|
+
code: 'reporter-not-found',
|
|
152
|
+
message: `reporter plugin "${reporterName}" was not found`,
|
|
153
|
+
hint: 'Run `projscan plugin list` to see discovered reporter plugins.',
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
if (!entry.manifest.commands.includes(command)) {
|
|
157
|
+
return pluginRuntimeFail({
|
|
158
|
+
code: 'reporter-unsupported-command',
|
|
159
|
+
message: `reporter plugin "${reporterName}" does not support command "${command}"`,
|
|
160
|
+
hint: `Add "${command}" to the reporter manifest's commands array or choose a different reporter.`,
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
return loadReporterPlugin(entry.manifest, entry.manifestPath);
|
|
164
|
+
}
|
|
165
|
+
export async function renderReporterPlugin(plugin, context) {
|
|
166
|
+
try {
|
|
167
|
+
const output = await plugin.exports.render(context);
|
|
168
|
+
if (typeof output !== 'string') {
|
|
169
|
+
return pluginRuntimeFail({
|
|
170
|
+
code: 'reporter-render-error',
|
|
171
|
+
message: `reporter plugin "${plugin.manifest.name}" returned ${typeof output}; expected string`,
|
|
172
|
+
hint: 'Reporter render(context) must return text for stdout.',
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
return { ok: true, output };
|
|
176
|
+
}
|
|
177
|
+
catch (err) {
|
|
178
|
+
return pluginRuntimeFail({
|
|
179
|
+
code: 'reporter-render-error',
|
|
180
|
+
message: `reporter plugin "${plugin.manifest.name}" failed during render: ${formatError(err)}`,
|
|
181
|
+
hint: 'Fix the reporter render(context) implementation and try again.',
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
async function loadReporterPlugin(manifest, manifestPath) {
|
|
186
|
+
const modulePath = path.resolve(path.dirname(manifestPath), manifest.module);
|
|
187
|
+
try {
|
|
188
|
+
const mod = (await import(pathToFileURL(modulePath).href));
|
|
189
|
+
const exportsObj = (mod.default ?? mod);
|
|
190
|
+
if (typeof exportsObj.render !== 'function') {
|
|
191
|
+
return pluginRuntimeFail({
|
|
192
|
+
code: 'invalid-reporter-export',
|
|
193
|
+
message: `reporter plugin "${manifest.name}" missing required export "render"`,
|
|
194
|
+
hint: 'Export `render(context)` as the default export or a named export.',
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
return {
|
|
198
|
+
ok: true,
|
|
199
|
+
plugin: {
|
|
200
|
+
manifest,
|
|
201
|
+
manifestPath,
|
|
202
|
+
modulePath,
|
|
203
|
+
exports: { render: exportsObj.render },
|
|
204
|
+
},
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
catch (err) {
|
|
208
|
+
return pluginRuntimeFail({
|
|
209
|
+
code: 'reporter-load-error',
|
|
210
|
+
message: `reporter plugin "${manifest.name}" failed to load: ${formatError(err)}`,
|
|
211
|
+
hint: 'Check the reporter module path and module syntax.',
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Run every loaded analyzer plugin against `files`. Issues that don't pass
|
|
217
|
+
* a tight shape check are dropped so a malformed plugin can't poison the
|
|
218
|
+
* issue stream. Each plugin's output is also re-stamped with `id` prefixed
|
|
219
|
+
* by the plugin name (so two plugins emitting the same local rule id can't
|
|
220
|
+
* collide).
|
|
221
|
+
*/
|
|
222
|
+
export async function runAnalyzerPlugins(plugins, rootPath, files) {
|
|
223
|
+
const out = [];
|
|
224
|
+
for (const p of plugins) {
|
|
225
|
+
let raw;
|
|
226
|
+
try {
|
|
227
|
+
raw = (await p.exports.check(rootPath, files)) ?? [];
|
|
228
|
+
}
|
|
229
|
+
catch (err) {
|
|
230
|
+
process.stderr.write(`[projscan] plugin "${p.manifest.name}" threw during check: ${err instanceof Error ? err.message : String(err)}. ignored for this run.\n`);
|
|
231
|
+
continue;
|
|
232
|
+
}
|
|
233
|
+
for (const issue of raw) {
|
|
234
|
+
if (!isWellShapedIssue(issue))
|
|
235
|
+
continue;
|
|
236
|
+
out.push({
|
|
237
|
+
...issue,
|
|
238
|
+
id: `plugin:${p.manifest.name}:${issue.id}`,
|
|
239
|
+
category: issue.category || p.manifest.category,
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
return out;
|
|
244
|
+
}
|
|
245
|
+
function failValidation(diagnostic) {
|
|
246
|
+
return { ok: false, reason: diagnostic.message, diagnostic };
|
|
247
|
+
}
|
|
248
|
+
function pluginRuntimeFail(diagnostic) {
|
|
249
|
+
return { ok: false, reason: diagnostic.message, diagnostic };
|
|
250
|
+
}
|
|
251
|
+
function formatError(err) {
|
|
252
|
+
return err instanceof Error ? err.message : String(err);
|
|
253
|
+
}
|
|
254
|
+
export function validateManifest(input) {
|
|
255
|
+
if (!input || typeof input !== 'object') {
|
|
256
|
+
return failValidation({
|
|
257
|
+
code: 'invalid-manifest',
|
|
258
|
+
message: 'manifest must be a JSON object',
|
|
259
|
+
hint: 'Use an object with schemaVersion, name, kind, module, and category fields.',
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
const obj = input;
|
|
263
|
+
if (obj.schemaVersion !== PLUGIN_SCHEMA_VERSION) {
|
|
264
|
+
return failValidation({
|
|
265
|
+
code: 'unsupported-schema-version',
|
|
266
|
+
field: 'schemaVersion',
|
|
267
|
+
message: `unsupported schemaVersion ${String(obj.schemaVersion)}; expected ${PLUGIN_SCHEMA_VERSION}`,
|
|
268
|
+
hint: `Set "schemaVersion": ${PLUGIN_SCHEMA_VERSION}.`,
|
|
269
|
+
});
|
|
270
|
+
}
|
|
271
|
+
if (typeof obj.name !== 'string' || !/^[a-z0-9][a-z0-9._/-]{0,64}$/i.test(obj.name)) {
|
|
272
|
+
return failValidation({
|
|
273
|
+
code: 'invalid-name',
|
|
274
|
+
field: 'name',
|
|
275
|
+
message: 'name is required and must be 1-65 chars of [a-z0-9._/-]',
|
|
276
|
+
hint: 'Use a stable 1-65 character plugin id such as "team/no-console" or "my-plugin".',
|
|
277
|
+
});
|
|
278
|
+
}
|
|
279
|
+
if (obj.kind !== 'analyzer' && obj.kind !== 'reporter') {
|
|
280
|
+
return failValidation({
|
|
281
|
+
code: 'unsupported-kind',
|
|
282
|
+
field: 'kind',
|
|
283
|
+
message: 'kind must be "analyzer" or "reporter"',
|
|
284
|
+
hint: 'Set "kind": "analyzer" for issue-producing plugins or "kind": "reporter" for CLI output plugins.',
|
|
285
|
+
});
|
|
286
|
+
}
|
|
287
|
+
if (typeof obj.module !== 'string' || obj.module.length === 0) {
|
|
288
|
+
return failValidation({
|
|
289
|
+
code: 'invalid-module',
|
|
290
|
+
field: 'module',
|
|
291
|
+
message: 'module is required and must be a relative path',
|
|
292
|
+
hint: 'Point to a local module inside the same plugin directory, for example "./check.mjs".',
|
|
293
|
+
});
|
|
294
|
+
}
|
|
295
|
+
// Path-traversal guard. Modules must resolve under the manifest's own dir.
|
|
296
|
+
if (path.isAbsolute(obj.module) || obj.module.split(/[/\\]/).some((seg) => seg === '..')) {
|
|
297
|
+
return failValidation({
|
|
298
|
+
code: 'invalid-module',
|
|
299
|
+
field: 'module',
|
|
300
|
+
message: 'module must be a relative path inside the plugin dir',
|
|
301
|
+
hint: 'Do not use absolute paths or any ".." path segment.',
|
|
302
|
+
});
|
|
303
|
+
}
|
|
304
|
+
if (obj.description !== undefined && typeof obj.description !== 'string') {
|
|
305
|
+
return failValidation({
|
|
306
|
+
code: 'invalid-description',
|
|
307
|
+
field: 'description',
|
|
308
|
+
message: 'description must be a string when provided',
|
|
309
|
+
});
|
|
310
|
+
}
|
|
311
|
+
if (obj.kind === 'analyzer') {
|
|
312
|
+
if (typeof obj.category !== 'string' || obj.category.length === 0) {
|
|
313
|
+
return failValidation({
|
|
314
|
+
code: 'invalid-category',
|
|
315
|
+
field: 'category',
|
|
316
|
+
message: 'category is required for analyzer plugins',
|
|
317
|
+
hint: 'Use the fallback Issue.category for this plugin, for example "custom" or "security".',
|
|
318
|
+
});
|
|
319
|
+
}
|
|
320
|
+
return {
|
|
321
|
+
ok: true,
|
|
322
|
+
manifest: {
|
|
323
|
+
schemaVersion: obj.schemaVersion,
|
|
324
|
+
name: obj.name,
|
|
325
|
+
kind: obj.kind,
|
|
326
|
+
module: obj.module,
|
|
327
|
+
category: obj.category,
|
|
328
|
+
...(typeof obj.description === 'string' ? { description: obj.description } : {}),
|
|
329
|
+
},
|
|
330
|
+
};
|
|
331
|
+
}
|
|
332
|
+
const commandValidation = validateReporterCommands(obj.commands);
|
|
333
|
+
if (!commandValidation.ok)
|
|
334
|
+
return commandValidation;
|
|
335
|
+
return {
|
|
336
|
+
ok: true,
|
|
337
|
+
manifest: {
|
|
338
|
+
schemaVersion: obj.schemaVersion,
|
|
339
|
+
name: obj.name,
|
|
340
|
+
kind: obj.kind,
|
|
341
|
+
module: obj.module,
|
|
342
|
+
commands: commandValidation.commands,
|
|
343
|
+
...(typeof obj.description === 'string' ? { description: obj.description } : {}),
|
|
344
|
+
},
|
|
345
|
+
};
|
|
346
|
+
}
|
|
347
|
+
function validateReporterCommands(input) {
|
|
348
|
+
if (!Array.isArray(input) || input.length === 0) {
|
|
349
|
+
return failValidation({
|
|
350
|
+
code: 'invalid-commands',
|
|
351
|
+
field: 'commands',
|
|
352
|
+
message: 'commands must be a non-empty array for reporter plugins',
|
|
353
|
+
hint: 'Use one or more supported commands: doctor, analyze, ci.',
|
|
354
|
+
});
|
|
355
|
+
}
|
|
356
|
+
const seen = new Set();
|
|
357
|
+
const invalid = [];
|
|
358
|
+
for (const value of input) {
|
|
359
|
+
if (typeof value !== 'string' || !isReporterCommand(value)) {
|
|
360
|
+
invalid.push(String(value));
|
|
361
|
+
continue;
|
|
362
|
+
}
|
|
363
|
+
seen.add(value);
|
|
364
|
+
}
|
|
365
|
+
if (invalid.length > 0) {
|
|
366
|
+
return failValidation({
|
|
367
|
+
code: 'invalid-commands',
|
|
368
|
+
field: 'commands',
|
|
369
|
+
message: `unsupported reporter command(s): ${invalid.join(', ')}`,
|
|
370
|
+
hint: 'Supported reporter commands are: doctor, analyze, ci.',
|
|
371
|
+
});
|
|
372
|
+
}
|
|
373
|
+
return { ok: true, commands: [...seen] };
|
|
374
|
+
}
|
|
375
|
+
function isReporterCommand(value) {
|
|
376
|
+
return PLUGIN_REPORTER_COMMANDS.includes(value);
|
|
377
|
+
}
|
|
378
|
+
function isWellShapedIssue(x) {
|
|
379
|
+
if (!x || typeof x !== 'object')
|
|
380
|
+
return false;
|
|
381
|
+
const obj = x;
|
|
382
|
+
if (typeof obj.id !== 'string' || obj.id.length === 0)
|
|
383
|
+
return false;
|
|
384
|
+
if (typeof obj.title !== 'string')
|
|
385
|
+
return false;
|
|
386
|
+
if (typeof obj.description !== 'string')
|
|
387
|
+
return false;
|
|
388
|
+
if (!isSeverity(obj.severity))
|
|
389
|
+
return false;
|
|
390
|
+
if (typeof obj.category !== 'string')
|
|
391
|
+
return false;
|
|
392
|
+
if (typeof obj.fixAvailable !== 'boolean')
|
|
393
|
+
return false;
|
|
394
|
+
return true;
|
|
395
|
+
}
|
|
396
|
+
function isSeverity(x) {
|
|
397
|
+
return x === 'error' || x === 'warning' || x === 'info';
|
|
398
|
+
}
|
|
399
|
+
//# sourceMappingURL=plugins.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugins.js","sourceRoot":"","sources":["../../src/core/plugins.ts"],"names":[],"mappings":"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"}
|
package/dist/core/taint.js
CHANGED
|
@@ -104,6 +104,14 @@ export function computeTaint(graph, config) {
|
|
|
104
104
|
// shell-exec sink. 12 catches those without exploding fan-out
|
|
105
105
|
// memory in the BFS frontier.
|
|
106
106
|
const MAX_DEPTH = 12;
|
|
107
|
+
// 1.10+ — per-step frontier cap. MAX_DEPTH bounds path length, but
|
|
108
|
+
// wide-fan-out graphs (Java/TS with prevalent get/set/toString bare-name
|
|
109
|
+
// collisions) can balloon the frontier exponentially: each step
|
|
110
|
+
// resolves every bare-name callee to every same-named function in the
|
|
111
|
+
// graph. Once a single step would push past this cap, we abort the
|
|
112
|
+
// remaining BFS for this source and surface it in `truncatedSources`,
|
|
113
|
+
// matching how MAX_DEPTH truncation is reported.
|
|
114
|
+
const MAX_FRONTIER_PER_STEP = 5000;
|
|
107
115
|
for (const sourceFn of fnByQual.values()) {
|
|
108
116
|
if (!sourceFn.hasSource)
|
|
109
117
|
continue;
|
|
@@ -126,10 +134,14 @@ export function computeTaint(graph, config) {
|
|
|
126
134
|
const visited = new Set([`${sourceFn.file}::${sourceFn.qualName}`]);
|
|
127
135
|
let frontier = [{ node: sourceFn, path: [sourceFn] }];
|
|
128
136
|
let depth = 0;
|
|
137
|
+
let frontierCapped = false;
|
|
129
138
|
while (frontier.length > 0 && depth < MAX_DEPTH) {
|
|
130
139
|
depth += 1;
|
|
131
140
|
const next = [];
|
|
141
|
+
let aborted = false;
|
|
132
142
|
for (const entry of frontier) {
|
|
143
|
+
if (aborted)
|
|
144
|
+
break;
|
|
133
145
|
for (const calleeName of entry.node.callees) {
|
|
134
146
|
const candidates = fnsByBareName.get(calleeName) ?? [];
|
|
135
147
|
for (const candidate of candidates) {
|
|
@@ -160,15 +172,26 @@ export function computeTaint(graph, config) {
|
|
|
160
172
|
continue;
|
|
161
173
|
}
|
|
162
174
|
next.push({ node: candidate, path: newPath });
|
|
175
|
+
if (next.length >= MAX_FRONTIER_PER_STEP) {
|
|
176
|
+
// 1.10+ — per-step frontier cap reached. Abort this source's
|
|
177
|
+
// BFS and surface it as truncated. Continuing would just
|
|
178
|
+
// multiply: each entry in `next` will spawn its own bare-name
|
|
179
|
+
// resolutions on the following step.
|
|
180
|
+
frontierCapped = true;
|
|
181
|
+
aborted = true;
|
|
182
|
+
break;
|
|
183
|
+
}
|
|
163
184
|
}
|
|
185
|
+
if (aborted)
|
|
186
|
+
break;
|
|
164
187
|
}
|
|
165
188
|
}
|
|
166
189
|
frontier = next;
|
|
167
190
|
}
|
|
168
|
-
// If the BFS exited because of MAX_DEPTH
|
|
169
|
-
// emptied), record the source so the caller
|
|
170
|
-
//
|
|
171
|
-
if (frontier.length > 0) {
|
|
191
|
+
// If the BFS exited because of MAX_DEPTH or the per-step frontier cap
|
|
192
|
+
// (not because the frontier emptied), record the source so the caller
|
|
193
|
+
// knows flows beyond that point weren't explored.
|
|
194
|
+
if (frontier.length > 0 || frontierCapped) {
|
|
172
195
|
truncatedSources.push(sourceFn.qualName);
|
|
173
196
|
}
|
|
174
197
|
}
|
package/dist/core/taint.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"taint.js","sourceRoot":"","sources":["../../src/core/taint.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"taint.js","sourceRoot":"","sources":["../../src/core/taint.ts"],"names":[],"mappings":"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"}
|
package/dist/core/watcher.d.ts
CHANGED
|
@@ -13,6 +13,14 @@ export interface WatchOptions {
|
|
|
13
13
|
}
|
|
14
14
|
export interface WatchHandle {
|
|
15
15
|
close: () => void;
|
|
16
|
+
/**
|
|
17
|
+
* 1.10+ — await this to wait for any in-flight debounce flush to settle
|
|
18
|
+
* after `close()`. `close()` itself is synchronous and stops new work,
|
|
19
|
+
* but a flush already past its `closed` check would otherwise resolve
|
|
20
|
+
* its onChange asynchronously after `close()` returned. Tests and
|
|
21
|
+
* orderly-shutdown callers should `await handle.closed` after `close()`.
|
|
22
|
+
*/
|
|
23
|
+
closed: Promise<void>;
|
|
16
24
|
/** Resolves once the initial scan + first onChange call have completed. */
|
|
17
25
|
ready: Promise<void>;
|
|
18
26
|
}
|
package/dist/core/watcher.js
CHANGED
|
@@ -35,12 +35,19 @@ export function startWatcher(rootPath, options) {
|
|
|
35
35
|
const pending = new Set();
|
|
36
36
|
let graph = null;
|
|
37
37
|
let closed = false;
|
|
38
|
-
|
|
38
|
+
// 1.10+ — track the in-flight flush as a Promise instead of a bare bool
|
|
39
|
+
// so close() can await it. Without this, a flush that was already past
|
|
40
|
+
// its top-of-function `closed` check would still call options.onChange
|
|
41
|
+
// *after* close() returned, leaving the downstream consumer seeing one
|
|
42
|
+
// final stale event.
|
|
43
|
+
let inFlightPromise = null;
|
|
39
44
|
const ready = (async () => {
|
|
40
45
|
const scan = await scanRepository(rootPath);
|
|
41
46
|
const cached = await loadCachedGraph(rootPath);
|
|
42
47
|
graph = await buildCodeGraph(rootPath, scan.files, cached);
|
|
43
48
|
await saveCachedGraph(rootPath, graph).catch(() => undefined);
|
|
49
|
+
if (closed)
|
|
50
|
+
return;
|
|
44
51
|
await options.onChange({ paths: [], graph });
|
|
45
52
|
})();
|
|
46
53
|
ready.then(() => {
|
|
@@ -67,7 +74,7 @@ export function startWatcher(rootPath, options) {
|
|
|
67
74
|
}
|
|
68
75
|
});
|
|
69
76
|
async function flush() {
|
|
70
|
-
if (closed ||
|
|
77
|
+
if (closed || inFlightPromise || !graph) {
|
|
71
78
|
// If a flush fires while one is already in flight, leave `pending`
|
|
72
79
|
// intact - the next debounce will pick up the accumulated set plus
|
|
73
80
|
// anything new.
|
|
@@ -77,23 +84,34 @@ export function startWatcher(rootPath, options) {
|
|
|
77
84
|
return;
|
|
78
85
|
const batch = [...pending];
|
|
79
86
|
pending.clear();
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
if (
|
|
93
|
-
|
|
94
|
-
|
|
87
|
+
const currentGraph = graph;
|
|
88
|
+
const promise = (async () => {
|
|
89
|
+
try {
|
|
90
|
+
// Tiny stat-retry: editors that delete-then-write can race the watcher.
|
|
91
|
+
await sleep(STAT_RETRY_MS);
|
|
92
|
+
await incrementallyUpdateGraph(currentGraph, rootPath, batch);
|
|
93
|
+
await saveCachedGraph(rootPath, currentGraph).catch(() => undefined);
|
|
94
|
+
// 1.10+ — guard against firing onChange after close(). close()
|
|
95
|
+
// sets `closed` synchronously; we may have raced past the top-of-
|
|
96
|
+
// function check while awaiting the graph update. The downstream
|
|
97
|
+
// consumer has shut down; an event delivered now is a use-after-
|
|
98
|
+
// free for them.
|
|
99
|
+
if (!closed) {
|
|
100
|
+
await options.onChange({ paths: batch, graph: currentGraph });
|
|
101
|
+
}
|
|
95
102
|
}
|
|
96
|
-
|
|
103
|
+
finally {
|
|
104
|
+
inFlightPromise = null;
|
|
105
|
+
// If new events arrived while we were processing, schedule another flush.
|
|
106
|
+
if (!closed && pending.size > 0) {
|
|
107
|
+
if (debounceTimer)
|
|
108
|
+
clearTimeout(debounceTimer);
|
|
109
|
+
debounceTimer = setTimeout(() => void flush(), DEBOUNCE_MS);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
})();
|
|
113
|
+
inFlightPromise = promise;
|
|
114
|
+
return promise;
|
|
97
115
|
}
|
|
98
116
|
return {
|
|
99
117
|
close: () => {
|
|
@@ -103,6 +121,18 @@ export function startWatcher(rootPath, options) {
|
|
|
103
121
|
if (watcher)
|
|
104
122
|
watcher.close();
|
|
105
123
|
},
|
|
124
|
+
get closed() {
|
|
125
|
+
// Resolve once any in-flight flush has finished. The flush itself
|
|
126
|
+
// checks `closed` before calling onChange so the downstream sees no
|
|
127
|
+
// post-close event; this just lets shutdown callers await full quiet.
|
|
128
|
+
return (async () => {
|
|
129
|
+
// Wait for ready first so we don't miss the initial onChange in
|
|
130
|
+
// tests that close() immediately after construction.
|
|
131
|
+
await ready.catch(() => undefined);
|
|
132
|
+
if (inFlightPromise)
|
|
133
|
+
await inFlightPromise.catch(() => undefined);
|
|
134
|
+
})();
|
|
135
|
+
},
|
|
106
136
|
ready,
|
|
107
137
|
};
|
|
108
138
|
}
|
package/dist/core/watcher.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"watcher.js","sourceRoot":"","sources":["../../src/core/watcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,IAAI,OAAO,EAAkB,MAAM,SAAS,CAAC;AAC3D,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,wBAAwB,EAAkB,MAAM,gBAAgB,CAAC;AAC1F,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEnE,MAAM,WAAW,GAAG,GAAG,CAAC;AACxB,MAAM,aAAa,GAAG,EAAE,CAAC;AAEzB,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC;IACxB,cAAc,EAAE,MAAM,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,EAAE,OAAO;IAC1E,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,OAAO;IACtE,aAAa,EAAE,MAAM,EAAE,eAAe,EAAE,aAAa,EAAE,aAAa;IACpE,OAAO;CACR,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"watcher.js","sourceRoot":"","sources":["../../src/core/watcher.ts"],"names":[],"mappings":"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"}
|