projscan 4.9.1 → 4.9.2
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 +25 -29
- package/dist/analyzers/deadCodeCheck.js +93 -0
- package/dist/analyzers/deadCodeCheck.js.map +1 -1
- package/dist/analyzers/unusedDependencyCheck.js +10 -10
- package/dist/analyzers/unusedDependencyCheck.js.map +1 -1
- package/dist/cli/commands/feedback.js +47 -1
- package/dist/cli/commands/feedback.js.map +1 -1
- package/dist/core/evidenceComment.d.ts +2 -1
- package/dist/core/evidenceComment.js +45 -7
- package/dist/core/evidenceComment.js.map +1 -1
- package/dist/core/feedback.d.ts +2 -1
- package/dist/core/feedback.js +186 -0
- package/dist/core/feedback.js.map +1 -1
- package/dist/core/importGraph.d.ts +2 -0
- package/dist/core/importGraph.js +14 -5
- package/dist/core/importGraph.js.map +1 -1
- package/dist/core/languages/LanguageAdapter.d.ts +2 -0
- package/dist/core/languages/javascriptAdapter.js +7 -28
- package/dist/core/languages/javascriptAdapter.js.map +1 -1
- package/dist/core/languages/javascriptProjectConfig.d.ts +20 -0
- package/dist/core/languages/javascriptProjectConfig.js +479 -0
- package/dist/core/languages/javascriptProjectConfig.js.map +1 -0
- package/dist/core/preflightCautionBudget.d.ts +2 -0
- package/dist/core/preflightCautionBudget.js +85 -0
- package/dist/core/preflightCautionBudget.js.map +1 -0
- package/dist/core/preflightInputs.d.ts +30 -2
- package/dist/core/preflightInputs.js +39 -12
- package/dist/core/preflightInputs.js.map +1 -1
- package/dist/core/preflightReport.js +3 -0
- package/dist/core/preflightReport.js.map +1 -1
- package/dist/core/releaseEvidence.d.ts +2 -2
- package/dist/core/releaseEvidence.js +3 -2
- package/dist/core/releaseEvidence.js.map +1 -1
- package/dist/core/understand.js +20 -22
- package/dist/core/understand.js.map +1 -1
- package/dist/core/workplan.js +1 -1
- package/dist/core/workplan.js.map +1 -1
- package/dist/mcp/tools/workspaceGraph.js +12 -9
- package/dist/mcp/tools/workspaceGraph.js.map +1 -1
- package/dist/projscan-sbom.cdx.json +6 -6
- package/dist/publicAgent.d.ts +1 -1
- package/dist/publicAgent.js +1 -1
- package/dist/publicAgent.js.map +1 -1
- package/dist/tool-manifest.json +2 -2
- package/dist/types/dogfood.d.ts +17 -0
- package/dist/types/evidencePack.d.ts +8 -0
- package/dist/types/preflight.d.ts +18 -0
- package/dist/utils/formatSupport.d.ts +1 -0
- package/dist/utils/formatSupport.js +1 -0
- package/dist/utils/formatSupport.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,479 @@
|
|
|
1
|
+
import { statSync } from 'node:fs';
|
|
2
|
+
import fs from 'node:fs/promises';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { createRequire } from 'node:module';
|
|
5
|
+
export const JS_RESOLUTION_EXTS = ['.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs', '.mts', '.cts'];
|
|
6
|
+
export async function loadJavaScriptProjectConfigs(rootPath, files) {
|
|
7
|
+
const configPaths = await findConfigPathsForFiles(rootPath, files);
|
|
8
|
+
const configs = [];
|
|
9
|
+
const rootConfig = await loadRootResolutionConfig(rootPath);
|
|
10
|
+
if (rootConfig)
|
|
11
|
+
configs.push(rootConfig);
|
|
12
|
+
for (const configPath of configPaths) {
|
|
13
|
+
const config = await loadJavaScriptProjectConfig(rootPath, configPath);
|
|
14
|
+
if (config)
|
|
15
|
+
configs.push(config);
|
|
16
|
+
}
|
|
17
|
+
return configs.sort((a, b) => b.configDir.length - a.configDir.length);
|
|
18
|
+
}
|
|
19
|
+
export function resolveJavaScriptImportFromConfigs(rootPath, importingFile, source, graphFiles, configs) {
|
|
20
|
+
if (source.startsWith('.') || source.startsWith('/')) {
|
|
21
|
+
const importingDir = path.posix.dirname(importingFile);
|
|
22
|
+
return resolveLocalBase(path.posix.normalize(path.posix.join(importingDir, source)), graphFiles);
|
|
23
|
+
}
|
|
24
|
+
for (const config of findConfigsForFile(importingFile, configs)) {
|
|
25
|
+
for (const candidateAbs of candidateAbsoluteImports(config, source)) {
|
|
26
|
+
const relativeCandidate = absoluteToRepoPath(rootPath, candidateAbs);
|
|
27
|
+
if (!relativeCandidate)
|
|
28
|
+
continue;
|
|
29
|
+
const resolved = resolveLocalBase(relativeCandidate, graphFiles);
|
|
30
|
+
if (resolved)
|
|
31
|
+
return resolved;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
export async function resolveJavaScriptImportAbsolute(rootPath, importingFile, source, configs) {
|
|
37
|
+
const sourceBase = source.startsWith('.') || source.startsWith('/')
|
|
38
|
+
? path.resolve(rootPath, path.dirname(importingFile), source)
|
|
39
|
+
: firstConfigCandidate(rootPath, importingFile, source, configs);
|
|
40
|
+
if (!sourceBase)
|
|
41
|
+
return null;
|
|
42
|
+
return await resolveAbsoluteBase(sourceBase);
|
|
43
|
+
}
|
|
44
|
+
export function resolveLocalBase(base, graphFiles) {
|
|
45
|
+
if (graphFiles.has(base))
|
|
46
|
+
return base;
|
|
47
|
+
for (const ext of JS_RESOLUTION_EXTS) {
|
|
48
|
+
if (graphFiles.has(base + ext))
|
|
49
|
+
return base + ext;
|
|
50
|
+
}
|
|
51
|
+
for (const ext of JS_RESOLUTION_EXTS) {
|
|
52
|
+
const barrel = `${base}/index${ext}`;
|
|
53
|
+
if (graphFiles.has(barrel))
|
|
54
|
+
return barrel;
|
|
55
|
+
}
|
|
56
|
+
if (base.endsWith('.js')) {
|
|
57
|
+
const trimmed = base.slice(0, -3);
|
|
58
|
+
if (graphFiles.has(`${trimmed}.ts`))
|
|
59
|
+
return `${trimmed}.ts`;
|
|
60
|
+
if (graphFiles.has(`${trimmed}.tsx`))
|
|
61
|
+
return `${trimmed}.tsx`;
|
|
62
|
+
}
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
function firstConfigCandidate(rootPath, importingFile, source, configs) {
|
|
66
|
+
for (const config of findConfigsForFile(importingFile, configs)) {
|
|
67
|
+
const candidate = candidateAbsoluteImports(config, source)[0];
|
|
68
|
+
if (candidate)
|
|
69
|
+
return candidate;
|
|
70
|
+
}
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
function candidateAbsoluteImports(config, source) {
|
|
74
|
+
const candidates = [];
|
|
75
|
+
for (const alias of config.aliases) {
|
|
76
|
+
const wildcard = matchAliasPattern(alias.pattern, source);
|
|
77
|
+
if (wildcard === null)
|
|
78
|
+
continue;
|
|
79
|
+
for (const target of alias.targets) {
|
|
80
|
+
const expanded = target.includes('*') ? target.split('*').join(wildcard) : target;
|
|
81
|
+
candidates.push(path.resolve(alias.targetBaseAbs, expanded));
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
if (candidates.length === 0 && config.baseUrlAbs) {
|
|
85
|
+
candidates.push(path.resolve(config.baseUrlAbs, source));
|
|
86
|
+
}
|
|
87
|
+
return candidates;
|
|
88
|
+
}
|
|
89
|
+
function findConfigsForFile(relativePath, configs) {
|
|
90
|
+
return configs.filter((config) => {
|
|
91
|
+
if (!config.configDir)
|
|
92
|
+
return true;
|
|
93
|
+
return relativePath === config.configDir || relativePath.startsWith(`${config.configDir}/`);
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
async function resolveAbsoluteBase(base) {
|
|
97
|
+
if (await fileExists(base))
|
|
98
|
+
return path.resolve(base);
|
|
99
|
+
for (const ext of JS_RESOLUTION_EXTS) {
|
|
100
|
+
const candidate = base + ext;
|
|
101
|
+
if (await fileExists(candidate))
|
|
102
|
+
return path.resolve(candidate);
|
|
103
|
+
}
|
|
104
|
+
for (const ext of JS_RESOLUTION_EXTS) {
|
|
105
|
+
const candidate = path.join(base, `index${ext}`);
|
|
106
|
+
if (await fileExists(candidate))
|
|
107
|
+
return path.resolve(candidate);
|
|
108
|
+
}
|
|
109
|
+
if (base.endsWith('.js')) {
|
|
110
|
+
const trimmed = base.slice(0, -3);
|
|
111
|
+
for (const ext of ['.ts', '.tsx']) {
|
|
112
|
+
const candidate = `${trimmed}${ext}`;
|
|
113
|
+
if (await fileExists(candidate))
|
|
114
|
+
return path.resolve(candidate);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return null;
|
|
118
|
+
}
|
|
119
|
+
async function findConfigPathsForFiles(rootPath, files) {
|
|
120
|
+
const found = new Set();
|
|
121
|
+
for (const file of files) {
|
|
122
|
+
let dir = normalizeRepoPath(path.posix.dirname(file.relativePath));
|
|
123
|
+
while (true) {
|
|
124
|
+
for (const name of ['tsconfig.json', 'jsconfig.json']) {
|
|
125
|
+
const candidate = path.join(rootPath, dir, name);
|
|
126
|
+
if (await fileExists(candidate))
|
|
127
|
+
found.add(path.resolve(candidate));
|
|
128
|
+
}
|
|
129
|
+
if (!dir)
|
|
130
|
+
break;
|
|
131
|
+
dir = normalizeRepoPath(path.posix.dirname(dir));
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
return [...found].sort();
|
|
135
|
+
}
|
|
136
|
+
async function loadJavaScriptProjectConfig(rootPath, configPath) {
|
|
137
|
+
const chain = await loadConfigChain(configPath, new Set());
|
|
138
|
+
if (chain.length === 0)
|
|
139
|
+
return null;
|
|
140
|
+
let baseUrlAbs;
|
|
141
|
+
let pathsLayer;
|
|
142
|
+
for (const layer of chain) {
|
|
143
|
+
const options = layer.compilerOptions;
|
|
144
|
+
if (!options)
|
|
145
|
+
continue;
|
|
146
|
+
if (typeof options.baseUrl === 'string')
|
|
147
|
+
baseUrlAbs = path.resolve(layer.configDirAbs, options.baseUrl);
|
|
148
|
+
if (options.paths && typeof options.paths === 'object')
|
|
149
|
+
pathsLayer = layer;
|
|
150
|
+
}
|
|
151
|
+
const configDirAbs = path.dirname(configPath);
|
|
152
|
+
const aliases = pathsLayer ? aliasesFromLayer(pathsLayer, baseUrlAbs) : [];
|
|
153
|
+
if (!baseUrlAbs && aliases.length === 0)
|
|
154
|
+
return null;
|
|
155
|
+
return {
|
|
156
|
+
configPath: normalizeAbsoluteToRepoPath(rootPath, configPath),
|
|
157
|
+
configDir: normalizeAbsoluteToRepoPath(rootPath, configDirAbs),
|
|
158
|
+
configDirAbs,
|
|
159
|
+
aliases,
|
|
160
|
+
...(baseUrlAbs ? { baseUrlAbs } : {}),
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
async function loadRootResolutionConfig(rootPath) {
|
|
164
|
+
const aliases = [
|
|
165
|
+
...(await loadViteAliases(rootPath)),
|
|
166
|
+
...(await loadWorkspacePackageAliases(rootPath)),
|
|
167
|
+
];
|
|
168
|
+
if (aliases.length === 0)
|
|
169
|
+
return null;
|
|
170
|
+
return {
|
|
171
|
+
configPath: 'package.json',
|
|
172
|
+
configDir: '',
|
|
173
|
+
configDirAbs: path.resolve(rootPath),
|
|
174
|
+
aliases: dedupeAliases(aliases),
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
function aliasesFromLayer(layer, baseUrlAbs) {
|
|
178
|
+
const paths = layer.compilerOptions?.paths;
|
|
179
|
+
if (!paths || typeof paths !== 'object')
|
|
180
|
+
return [];
|
|
181
|
+
const targetBaseAbs = baseUrlAbs ?? layer.configDirAbs;
|
|
182
|
+
const aliases = [];
|
|
183
|
+
for (const [pattern, rawTargets] of Object.entries(paths)) {
|
|
184
|
+
if (!Array.isArray(rawTargets))
|
|
185
|
+
continue;
|
|
186
|
+
const targets = rawTargets.filter((target) => typeof target === 'string');
|
|
187
|
+
if (targets.length > 0)
|
|
188
|
+
aliases.push({ pattern, targets, targetBaseAbs });
|
|
189
|
+
}
|
|
190
|
+
return aliases;
|
|
191
|
+
}
|
|
192
|
+
async function loadViteAliases(rootPath) {
|
|
193
|
+
const aliases = [];
|
|
194
|
+
for (const name of [
|
|
195
|
+
'vite.config.ts',
|
|
196
|
+
'vite.config.js',
|
|
197
|
+
'vite.config.mts',
|
|
198
|
+
'vite.config.mjs',
|
|
199
|
+
'vite.config.cts',
|
|
200
|
+
'vite.config.cjs',
|
|
201
|
+
'vitest.config.ts',
|
|
202
|
+
'vitest.config.js',
|
|
203
|
+
'vitest.config.mts',
|
|
204
|
+
'vitest.config.mjs',
|
|
205
|
+
'vitest.config.cts',
|
|
206
|
+
'vitest.config.cjs',
|
|
207
|
+
]) {
|
|
208
|
+
const filePath = path.join(rootPath, name);
|
|
209
|
+
let raw;
|
|
210
|
+
try {
|
|
211
|
+
raw = await fs.readFile(filePath, 'utf-8');
|
|
212
|
+
}
|
|
213
|
+
catch {
|
|
214
|
+
continue;
|
|
215
|
+
}
|
|
216
|
+
aliases.push(...parseViteAliasObjects(raw, rootPath));
|
|
217
|
+
}
|
|
218
|
+
return aliases;
|
|
219
|
+
}
|
|
220
|
+
function parseViteAliasObjects(raw, rootPath) {
|
|
221
|
+
const aliases = [];
|
|
222
|
+
for (const body of findObjectBodies(raw, 'alias')) {
|
|
223
|
+
const simpleEntry = /['"]([^'"]+)['"]\s*:\s*['"]([^'"]+)['"]/g;
|
|
224
|
+
for (const match of body.matchAll(simpleEntry)) {
|
|
225
|
+
aliases.push(...aliasPairToPatterns(match[1], match[2], rootPath));
|
|
226
|
+
}
|
|
227
|
+
const pathResolveEntry = /['"]([^'"]+)['"]\s*:\s*path\.resolve\([^,]+,\s*['"]([^'"]+)['"]\s*\)/g;
|
|
228
|
+
for (const match of body.matchAll(pathResolveEntry)) {
|
|
229
|
+
aliases.push(...aliasPairToPatterns(match[1], match[2], rootPath));
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
return aliases;
|
|
233
|
+
}
|
|
234
|
+
async function loadWorkspacePackageAliases(rootPath) {
|
|
235
|
+
const rootPkg = await readJsonObject(path.join(rootPath, 'package.json'));
|
|
236
|
+
if (!rootPkg)
|
|
237
|
+
return [];
|
|
238
|
+
const workspaces = workspacePatterns(rootPkg.workspaces);
|
|
239
|
+
const aliases = [];
|
|
240
|
+
for (const packageDir of await workspacePackageDirs(rootPath, workspaces)) {
|
|
241
|
+
const pkg = await readJsonObject(path.join(packageDir, 'package.json'));
|
|
242
|
+
if (!pkg)
|
|
243
|
+
continue;
|
|
244
|
+
const name = typeof pkg?.name === 'string' ? pkg.name : undefined;
|
|
245
|
+
if (!name)
|
|
246
|
+
continue;
|
|
247
|
+
aliases.push(...packageExportAliases(name, packageDir, pkg));
|
|
248
|
+
}
|
|
249
|
+
return aliases;
|
|
250
|
+
}
|
|
251
|
+
function packageExportAliases(packageName, packageDirAbs, pkg) {
|
|
252
|
+
const aliases = [];
|
|
253
|
+
for (const field of ['source', 'module', 'main', 'types', 'typings']) {
|
|
254
|
+
const value = pkg[field];
|
|
255
|
+
if (typeof value === 'string') {
|
|
256
|
+
aliases.push({ pattern: packageName, targets: [value], targetBaseAbs: packageDirAbs });
|
|
257
|
+
break;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
const exportsField = pkg.exports;
|
|
261
|
+
if (typeof exportsField === 'string') {
|
|
262
|
+
aliases.push({ pattern: packageName, targets: [exportsField], targetBaseAbs: packageDirAbs });
|
|
263
|
+
}
|
|
264
|
+
else if (exportsField && typeof exportsField === 'object') {
|
|
265
|
+
for (const [rawKey, rawValue] of Object.entries(exportsField)) {
|
|
266
|
+
const target = firstExportTarget(rawValue);
|
|
267
|
+
if (!target)
|
|
268
|
+
continue;
|
|
269
|
+
const key = rawKey === '.' ? '' : rawKey.replace(/^\.\//, '/');
|
|
270
|
+
aliases.push({
|
|
271
|
+
pattern: packageName + key,
|
|
272
|
+
targets: [target],
|
|
273
|
+
targetBaseAbs: packageDirAbs,
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
return aliases;
|
|
278
|
+
}
|
|
279
|
+
function firstExportTarget(value) {
|
|
280
|
+
if (typeof value === 'string')
|
|
281
|
+
return value;
|
|
282
|
+
if (Array.isArray(value)) {
|
|
283
|
+
for (const item of value) {
|
|
284
|
+
const target = firstExportTarget(item);
|
|
285
|
+
if (target)
|
|
286
|
+
return target;
|
|
287
|
+
}
|
|
288
|
+
return null;
|
|
289
|
+
}
|
|
290
|
+
if (!value || typeof value !== 'object')
|
|
291
|
+
return null;
|
|
292
|
+
const record = value;
|
|
293
|
+
for (const key of ['source', 'import', 'module', 'default', 'require', 'types']) {
|
|
294
|
+
const target = firstExportTarget(record[key]);
|
|
295
|
+
if (target)
|
|
296
|
+
return target;
|
|
297
|
+
}
|
|
298
|
+
for (const item of Object.values(record)) {
|
|
299
|
+
const target = firstExportTarget(item);
|
|
300
|
+
if (target)
|
|
301
|
+
return target;
|
|
302
|
+
}
|
|
303
|
+
return null;
|
|
304
|
+
}
|
|
305
|
+
function workspacePatterns(value) {
|
|
306
|
+
if (Array.isArray(value))
|
|
307
|
+
return value.filter((item) => typeof item === 'string');
|
|
308
|
+
if (value && typeof value === 'object') {
|
|
309
|
+
const packages = value.packages;
|
|
310
|
+
if (Array.isArray(packages)) {
|
|
311
|
+
return packages.filter((item) => typeof item === 'string');
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
return [];
|
|
315
|
+
}
|
|
316
|
+
async function workspacePackageDirs(rootPath, patterns) {
|
|
317
|
+
const dirs = new Set();
|
|
318
|
+
for (const pattern of patterns) {
|
|
319
|
+
if (pattern.endsWith('/*')) {
|
|
320
|
+
const parent = path.resolve(rootPath, pattern.slice(0, -2));
|
|
321
|
+
let entries;
|
|
322
|
+
try {
|
|
323
|
+
entries = await fs.readdir(parent);
|
|
324
|
+
}
|
|
325
|
+
catch {
|
|
326
|
+
continue;
|
|
327
|
+
}
|
|
328
|
+
for (const entry of entries)
|
|
329
|
+
dirs.add(path.join(parent, entry));
|
|
330
|
+
continue;
|
|
331
|
+
}
|
|
332
|
+
if (!pattern.includes('*'))
|
|
333
|
+
dirs.add(path.resolve(rootPath, pattern));
|
|
334
|
+
}
|
|
335
|
+
return [...dirs].sort();
|
|
336
|
+
}
|
|
337
|
+
function aliasPairToPatterns(find, replacement, rootPath) {
|
|
338
|
+
const targetBaseAbs = path.isAbsolute(replacement)
|
|
339
|
+
? replacement
|
|
340
|
+
: path.resolve(rootPath, replacement);
|
|
341
|
+
return [
|
|
342
|
+
{ pattern: find, targets: ['.'], targetBaseAbs },
|
|
343
|
+
{ pattern: `${find}/*`, targets: ['*'], targetBaseAbs },
|
|
344
|
+
];
|
|
345
|
+
}
|
|
346
|
+
function findObjectBodies(raw, propertyName) {
|
|
347
|
+
const bodies = [];
|
|
348
|
+
const pattern = new RegExp(`${propertyName}\\s*:\\s*\\{`, 'g');
|
|
349
|
+
for (const match of raw.matchAll(pattern)) {
|
|
350
|
+
const open = (match.index ?? 0) + match[0].lastIndexOf('{');
|
|
351
|
+
const close = findMatchingBrace(raw, open);
|
|
352
|
+
if (close > open)
|
|
353
|
+
bodies.push(raw.slice(open + 1, close));
|
|
354
|
+
}
|
|
355
|
+
return bodies;
|
|
356
|
+
}
|
|
357
|
+
function findMatchingBrace(raw, openIndex) {
|
|
358
|
+
let depth = 0;
|
|
359
|
+
for (let i = openIndex; i < raw.length; i++) {
|
|
360
|
+
const char = raw[i];
|
|
361
|
+
if (char === '{')
|
|
362
|
+
depth++;
|
|
363
|
+
if (char === '}') {
|
|
364
|
+
depth--;
|
|
365
|
+
if (depth === 0)
|
|
366
|
+
return i;
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
return -1;
|
|
370
|
+
}
|
|
371
|
+
async function readJsonObject(filePath) {
|
|
372
|
+
try {
|
|
373
|
+
const raw = await fs.readFile(filePath, 'utf-8');
|
|
374
|
+
const parsed = JSON.parse(stripJsonCommentsAndTrailingCommas(raw));
|
|
375
|
+
return parsed && typeof parsed === 'object' ? parsed : null;
|
|
376
|
+
}
|
|
377
|
+
catch {
|
|
378
|
+
return null;
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
function dedupeAliases(aliases) {
|
|
382
|
+
const seen = new Set();
|
|
383
|
+
const result = [];
|
|
384
|
+
for (const alias of aliases) {
|
|
385
|
+
const key = `${alias.pattern}\0${alias.targetBaseAbs}\0${alias.targets.join('\0')}`;
|
|
386
|
+
if (seen.has(key))
|
|
387
|
+
continue;
|
|
388
|
+
seen.add(key);
|
|
389
|
+
result.push(alias);
|
|
390
|
+
}
|
|
391
|
+
return result;
|
|
392
|
+
}
|
|
393
|
+
async function loadConfigChain(configPath, seen) {
|
|
394
|
+
const resolvedPath = path.resolve(configPath);
|
|
395
|
+
if (seen.has(resolvedPath))
|
|
396
|
+
return [];
|
|
397
|
+
seen.add(resolvedPath);
|
|
398
|
+
let parsed;
|
|
399
|
+
try {
|
|
400
|
+
const raw = await fs.readFile(resolvedPath, 'utf-8');
|
|
401
|
+
parsed = JSON.parse(stripJsonCommentsAndTrailingCommas(raw));
|
|
402
|
+
}
|
|
403
|
+
catch {
|
|
404
|
+
return [];
|
|
405
|
+
}
|
|
406
|
+
const layers = [];
|
|
407
|
+
if (typeof parsed.extends === 'string') {
|
|
408
|
+
const parent = resolveExtendsPath(parsed.extends, path.dirname(resolvedPath));
|
|
409
|
+
if (parent)
|
|
410
|
+
layers.push(...(await loadConfigChain(parent, seen)));
|
|
411
|
+
}
|
|
412
|
+
layers.push({
|
|
413
|
+
configPath: resolvedPath,
|
|
414
|
+
configDirAbs: path.dirname(resolvedPath),
|
|
415
|
+
compilerOptions: parsed.compilerOptions,
|
|
416
|
+
});
|
|
417
|
+
return layers;
|
|
418
|
+
}
|
|
419
|
+
function resolveExtendsPath(value, fromDir) {
|
|
420
|
+
const candidates = [];
|
|
421
|
+
if (value.startsWith('.') || value.startsWith('/') || value.startsWith('..')) {
|
|
422
|
+
const base = path.resolve(fromDir, value);
|
|
423
|
+
candidates.push(base, ensureJsonExtension(base), path.join(base, 'tsconfig.json'));
|
|
424
|
+
}
|
|
425
|
+
else {
|
|
426
|
+
try {
|
|
427
|
+
const require = createRequire(path.join(fromDir, 'tsconfig.json'));
|
|
428
|
+
candidates.push(require.resolve(value));
|
|
429
|
+
}
|
|
430
|
+
catch {
|
|
431
|
+
return null;
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
return (candidates.find((candidate, index) => candidates.indexOf(candidate) === index && existsSyncish(candidate)) ?? null);
|
|
435
|
+
}
|
|
436
|
+
function matchAliasPattern(pattern, source) {
|
|
437
|
+
const star = pattern.indexOf('*');
|
|
438
|
+
if (star === -1)
|
|
439
|
+
return pattern === source ? '' : null;
|
|
440
|
+
const prefix = pattern.slice(0, star);
|
|
441
|
+
const suffix = pattern.slice(star + 1);
|
|
442
|
+
if (!source.startsWith(prefix) || !source.endsWith(suffix))
|
|
443
|
+
return null;
|
|
444
|
+
return source.slice(prefix.length, source.length - suffix.length);
|
|
445
|
+
}
|
|
446
|
+
function absoluteToRepoPath(rootPath, absolutePath) {
|
|
447
|
+
const relative = normalizeRepoPath(path.relative(rootPath, absolutePath));
|
|
448
|
+
if (!relative || relative.startsWith('..'))
|
|
449
|
+
return null;
|
|
450
|
+
return relative;
|
|
451
|
+
}
|
|
452
|
+
function normalizeAbsoluteToRepoPath(rootPath, absolutePath) {
|
|
453
|
+
return normalizeRepoPath(path.relative(rootPath, absolutePath));
|
|
454
|
+
}
|
|
455
|
+
function normalizeRepoPath(value) {
|
|
456
|
+
const normalized = path.posix.normalize(value.replace(/\\/g, '/'));
|
|
457
|
+
return normalized === '.' ? '' : normalized.replace(/^\.\//, '');
|
|
458
|
+
}
|
|
459
|
+
function ensureJsonExtension(value) {
|
|
460
|
+
return path.extname(value) ? value : `${value}.json`;
|
|
461
|
+
}
|
|
462
|
+
async function fileExists(filePath) {
|
|
463
|
+
return fs.stat(filePath).then((stat) => stat.isFile(), () => false);
|
|
464
|
+
}
|
|
465
|
+
function existsSyncish(filePath) {
|
|
466
|
+
try {
|
|
467
|
+
return statSync(filePath).isFile();
|
|
468
|
+
}
|
|
469
|
+
catch {
|
|
470
|
+
return false;
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
function stripJsonCommentsAndTrailingCommas(value) {
|
|
474
|
+
return value
|
|
475
|
+
.replace(/\/\*[\s\S]*?\*\//g, '')
|
|
476
|
+
.replace(/(^|[^:])\/\/.*$/gm, '$1')
|
|
477
|
+
.replace(/,\s*([}\]])/g, '$1');
|
|
478
|
+
}
|
|
479
|
+
//# sourceMappingURL=javascriptProjectConfig.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"javascriptProjectConfig.js","sourceRoot":"","sources":["../../../src/core/languages/javascriptProjectConfig.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
const MANUAL_SIGNOFF_SOURCES = new Set([
|
|
2
|
+
'release',
|
|
3
|
+
'changed-files',
|
|
4
|
+
'hotspots',
|
|
5
|
+
'session',
|
|
6
|
+
'coordination',
|
|
7
|
+
]);
|
|
8
|
+
export function buildCautionBudget(reasons) {
|
|
9
|
+
const items = reasons.filter((reason) => reason.severity === 'warning').map(toBudgetItem);
|
|
10
|
+
if (items.length === 0)
|
|
11
|
+
return undefined;
|
|
12
|
+
const primary = [...items].sort(compareBudgetPriority)[0];
|
|
13
|
+
return {
|
|
14
|
+
primary,
|
|
15
|
+
reviewOnly: items.filter((item) => item !== primary),
|
|
16
|
+
fixNow: items.filter((item) => item.action === 'fix_now'),
|
|
17
|
+
manualSignoff: items.filter((item) => item.action === 'manual_signoff'),
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
function toBudgetItem(reason) {
|
|
21
|
+
const action = actionForReason(reason);
|
|
22
|
+
return {
|
|
23
|
+
severity: reason.severity,
|
|
24
|
+
source: reason.source,
|
|
25
|
+
message: reason.message,
|
|
26
|
+
action,
|
|
27
|
+
...(reason.file ? { file: reason.file } : {}),
|
|
28
|
+
...(reason.issueId ? { issueId: reason.issueId } : {}),
|
|
29
|
+
...(reason.tool ? { tool: reason.tool } : {}),
|
|
30
|
+
command: commandForReason(reason, action),
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
function actionForReason(reason) {
|
|
34
|
+
if (MANUAL_SIGNOFF_SOURCES.has(reason.source))
|
|
35
|
+
return 'manual_signoff';
|
|
36
|
+
if (reason.source === 'review' && isScaleOnlyReview(reason.message))
|
|
37
|
+
return 'manual_signoff';
|
|
38
|
+
return 'fix_now';
|
|
39
|
+
}
|
|
40
|
+
function compareBudgetPriority(a, b) {
|
|
41
|
+
const actionDelta = actionRank(a.action) - actionRank(b.action);
|
|
42
|
+
if (actionDelta !== 0)
|
|
43
|
+
return actionDelta;
|
|
44
|
+
return sourceRank(a.source) - sourceRank(b.source);
|
|
45
|
+
}
|
|
46
|
+
function actionRank(action) {
|
|
47
|
+
return action === 'fix_now' ? 0 : 1;
|
|
48
|
+
}
|
|
49
|
+
function sourceRank(source) {
|
|
50
|
+
switch (source) {
|
|
51
|
+
case 'doctor':
|
|
52
|
+
case 'taint':
|
|
53
|
+
case 'plugin':
|
|
54
|
+
case 'supply-chain':
|
|
55
|
+
return 0;
|
|
56
|
+
case 'review':
|
|
57
|
+
return 1;
|
|
58
|
+
case 'release':
|
|
59
|
+
return 2;
|
|
60
|
+
default:
|
|
61
|
+
return 3;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
function commandForReason(reason, action) {
|
|
65
|
+
if (reason.tool === 'projscan_review')
|
|
66
|
+
return 'projscan review --format json';
|
|
67
|
+
if (reason.tool === 'projscan_doctor')
|
|
68
|
+
return 'projscan doctor --format json';
|
|
69
|
+
if (reason.tool === 'projscan_dataflow')
|
|
70
|
+
return 'projscan dataflow --format json';
|
|
71
|
+
if (reason.tool === 'projscan_plugin')
|
|
72
|
+
return 'projscan plugin list --format json';
|
|
73
|
+
if (reason.source === 'supply-chain')
|
|
74
|
+
return 'projscan audit --format json';
|
|
75
|
+
if (action === 'manual_signoff')
|
|
76
|
+
return 'projscan preflight --mode before_commit --format json';
|
|
77
|
+
return 'projscan doctor --format json';
|
|
78
|
+
}
|
|
79
|
+
function isScaleOnlyReview(message) {
|
|
80
|
+
return (message.includes('scale/complexity') &&
|
|
81
|
+
!message.includes('new import cycle') &&
|
|
82
|
+
!message.includes('taint') &&
|
|
83
|
+
!message.includes('dataflow'));
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=preflightCautionBudget.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preflightCautionBudget.js","sourceRoot":"","sources":["../../src/core/preflightCautionBudget.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +1,39 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { scanRepository } from './repositoryScanner.js';
|
|
2
|
+
import { collectIssues } from './issueEngine.js';
|
|
3
|
+
import { safeReviewEvidence } from './preflightReviewEvidence.js';
|
|
4
|
+
import { safeChangedFiles } from './preflightChangedFiles.js';
|
|
5
|
+
import { safeCoordination, safeHotspots, safeSession } from './preflightLocalEvidence.js';
|
|
6
|
+
import { loadConfig, applyConfigToIssues } from '../utils/config.js';
|
|
7
|
+
import { calculateScore } from '../utils/scoreCalculator.js';
|
|
8
|
+
import type { PreflightMode } from '../types.js';
|
|
2
9
|
export interface LoadPreflightInputsOptions {
|
|
3
10
|
baseRef?: string;
|
|
4
11
|
headRef?: string;
|
|
5
12
|
enablePlugins?: boolean;
|
|
6
13
|
}
|
|
14
|
+
export interface PreflightInputDependencies {
|
|
15
|
+
loadConfig: typeof loadConfig;
|
|
16
|
+
scanRepository: typeof scanRepository;
|
|
17
|
+
collectIssues: typeof collectIssues;
|
|
18
|
+
applyConfigToIssues: typeof applyConfigToIssues;
|
|
19
|
+
calculateScore: typeof calculateScore;
|
|
20
|
+
safeChangedFiles: typeof safeChangedFiles;
|
|
21
|
+
safeSession: typeof safeSession;
|
|
22
|
+
safeHotspots: typeof safeHotspots;
|
|
23
|
+
safeReviewEvidence: typeof safeReviewEvidence;
|
|
24
|
+
safeCoordination: typeof safeCoordination;
|
|
25
|
+
}
|
|
7
26
|
export declare function loadPreflightInputs(rootPath: string, mode: PreflightMode, options?: LoadPreflightInputsOptions): Promise<{
|
|
8
|
-
issues: Issue[];
|
|
27
|
+
issues: import("../types.js").Issue[];
|
|
28
|
+
health: import("../types.js").HealthScore;
|
|
29
|
+
changedFiles: import("./preflightChangedFiles.js").PreflightChangedFiles;
|
|
30
|
+
session: import("./preflightLocalEvidence.js").PreflightSessionEvidence;
|
|
31
|
+
hotspots: import("../types.js").HotspotReport | null;
|
|
32
|
+
review: import("./preflightReviewEvidence.js").PreflightReviewEvidence;
|
|
33
|
+
coordination: import("./coordination.js").CoordinationSummary | null;
|
|
34
|
+
}>;
|
|
35
|
+
export declare function loadPreflightInputsWithDeps(rootPath: string, mode: PreflightMode, options?: LoadPreflightInputsOptions, deps?: PreflightInputDependencies): Promise<{
|
|
36
|
+
issues: import("../types.js").Issue[];
|
|
9
37
|
health: import("../types.js").HealthScore;
|
|
10
38
|
changedFiles: import("./preflightChangedFiles.js").PreflightChangedFiles;
|
|
11
39
|
session: import("./preflightLocalEvidence.js").PreflightSessionEvidence;
|