sadrazam 0.1.8 → 0.1.10
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/CHANGELOG.md +23 -0
- package/README.md +17 -1
- package/dist/aliasResolver.d.ts +28 -0
- package/dist/aliasResolver.d.ts.map +1 -0
- package/dist/aliasResolver.js +136 -0
- package/dist/aliasResolver.js.map +1 -0
- package/dist/autoFix.d.ts +1 -0
- package/dist/autoFix.d.ts.map +1 -1
- package/dist/autoFix.js +37 -4
- package/dist/autoFix.js.map +1 -1
- package/dist/importParser.d.ts.map +1 -1
- package/dist/importParser.js +12 -7
- package/dist/importParser.js.map +1 -1
- package/dist/index.js +31 -0
- package/dist/index.js.map +1 -1
- package/dist/init.d.ts +2 -0
- package/dist/init.d.ts.map +1 -0
- package/dist/init.js +219 -0
- package/dist/init.js.map +1 -0
- package/dist/oxcParser.d.ts +3 -0
- package/dist/oxcParser.d.ts.map +1 -0
- package/dist/oxcParser.js +188 -0
- package/dist/oxcParser.js.map +1 -0
- package/dist/reporters.d.ts +2 -0
- package/dist/reporters.d.ts.map +1 -1
- package/dist/reporters.js +115 -0
- package/dist/reporters.js.map +1 -1
- package/dist/scan.d.ts +5 -0
- package/dist/scan.d.ts.map +1 -1
- package/dist/scan.js +124 -66
- package/dist/scan.js.map +1 -1
- package/dist/scriptParser.d.ts.map +1 -1
- package/dist/scriptParser.js +28 -0
- package/dist/scriptParser.js.map +1 -1
- package/dist/sourceSanitizer.d.ts +3 -0
- package/dist/sourceSanitizer.d.ts.map +1 -0
- package/dist/sourceSanitizer.js +69 -0
- package/dist/sourceSanitizer.js.map +1 -0
- package/dist/symbolParser.d.ts +22 -0
- package/dist/symbolParser.d.ts.map +1 -1
- package/dist/symbolParser.js +152 -3
- package/dist/symbolParser.js.map +1 -1
- package/dist/workspaceFinder.d.ts +16 -0
- package/dist/workspaceFinder.d.ts.map +1 -1
- package/dist/workspaceFinder.js +67 -25
- package/dist/workspaceFinder.js.map +1 -1
- package/package.json +3 -1
package/dist/init.js
ADDED
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
import { access, mkdir, writeFile } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import * as readline from "node:readline";
|
|
4
|
+
import { findNearestPackageJson, readPackageJson } from "./packageReader.js";
|
|
5
|
+
export async function runInit(targetDir) {
|
|
6
|
+
const absoluteDir = path.resolve(targetDir);
|
|
7
|
+
const configPath = path.join(absoluteDir, "sadrazam.json");
|
|
8
|
+
const promptSession = await createPromptSession();
|
|
9
|
+
try {
|
|
10
|
+
// Check if config already exists
|
|
11
|
+
if (await fileExists(configPath)) {
|
|
12
|
+
const answer = await promptSession.ask("sadrazam.json already exists. Overwrite? (y/N) ");
|
|
13
|
+
if (answer.trim().toLowerCase() !== "y") {
|
|
14
|
+
console.log("Aborted.");
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
const context = await detectContext(absoluteDir);
|
|
19
|
+
const config = await promptConfig(context, promptSession.ask);
|
|
20
|
+
await mkdir(absoluteDir, { recursive: true });
|
|
21
|
+
await writeFile(configPath, `${JSON.stringify(config, null, 2)}\n`, "utf8");
|
|
22
|
+
console.log(`\nCreated sadrazam.json`);
|
|
23
|
+
if (Object.keys(config).length === 0) {
|
|
24
|
+
console.log("No options selected — using all defaults.");
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
console.log("\nConfiguration summary:");
|
|
28
|
+
for (const [key, value] of Object.entries(config)) {
|
|
29
|
+
console.log(` ${key}: ${JSON.stringify(value)}`);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
console.log("\nRun `sadrazam .` to start scanning.");
|
|
33
|
+
}
|
|
34
|
+
finally {
|
|
35
|
+
promptSession.close();
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
async function createPromptSession() {
|
|
39
|
+
if (!process.stdin.isTTY) {
|
|
40
|
+
const answers = splitInputLines(await readAllStdin());
|
|
41
|
+
let index = 0;
|
|
42
|
+
return {
|
|
43
|
+
ask: async (question) => {
|
|
44
|
+
process.stdout.write(question);
|
|
45
|
+
const answer = answers[index] ?? "";
|
|
46
|
+
index += 1;
|
|
47
|
+
return answer;
|
|
48
|
+
},
|
|
49
|
+
close: () => { },
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
const rl = readline.createInterface({
|
|
53
|
+
input: process.stdin,
|
|
54
|
+
output: process.stdout,
|
|
55
|
+
terminal: true,
|
|
56
|
+
});
|
|
57
|
+
return {
|
|
58
|
+
ask: makeReadlineAsker(rl),
|
|
59
|
+
close: () => rl.close(),
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
async function readAllStdin() {
|
|
63
|
+
let input = "";
|
|
64
|
+
process.stdin.setEncoding("utf8");
|
|
65
|
+
for await (const chunk of process.stdin) {
|
|
66
|
+
input += chunk;
|
|
67
|
+
}
|
|
68
|
+
return input;
|
|
69
|
+
}
|
|
70
|
+
function splitInputLines(input) {
|
|
71
|
+
return input.replace(/\r\n/g, "\n").replace(/\r/g, "\n").split("\n");
|
|
72
|
+
}
|
|
73
|
+
function makeReadlineAsker(rl) {
|
|
74
|
+
let closed = false;
|
|
75
|
+
rl.on("close", () => { closed = true; });
|
|
76
|
+
return (question) => new Promise((resolve) => {
|
|
77
|
+
if (closed) {
|
|
78
|
+
resolve("");
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
let settled = false;
|
|
82
|
+
const settle = (value) => {
|
|
83
|
+
if (!settled) {
|
|
84
|
+
settled = true;
|
|
85
|
+
resolve(value);
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
rl.question(question, settle);
|
|
89
|
+
rl.once("close", () => settle(""));
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
async function promptConfig(context, ask) {
|
|
93
|
+
const config = {};
|
|
94
|
+
console.log(`\nInitializing sadrazam for ${context.packageName}`);
|
|
95
|
+
console.log("Press Enter to accept defaults, or type a value.\n");
|
|
96
|
+
// Reporter
|
|
97
|
+
const reporter = await ask("Default reporter? (text/json/markdown/sarif) [text]: ");
|
|
98
|
+
const trimmedReporter = reporter.trim();
|
|
99
|
+
if (trimmedReporter && trimmedReporter !== "text") {
|
|
100
|
+
const valid = ["text", "json", "toon", "markdown", "sarif"];
|
|
101
|
+
if (valid.includes(trimmedReporter)) {
|
|
102
|
+
config.reporter = trimmedReporter;
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
console.log(` Unknown reporter "${trimmedReporter}", using text.`);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
// Cache
|
|
109
|
+
const cache = await ask("Enable cache by default? (y/N) [y]: ");
|
|
110
|
+
const cacheVal = cache.trim().toLowerCase() || "y";
|
|
111
|
+
if (cacheVal === "y") {
|
|
112
|
+
config.cache = true;
|
|
113
|
+
}
|
|
114
|
+
// Production mode
|
|
115
|
+
const production = await ask("Scan production files only? (y/N) [N]: ");
|
|
116
|
+
if (production.trim().toLowerCase() === "y") {
|
|
117
|
+
config.production = true;
|
|
118
|
+
// Strict mode (only relevant with production)
|
|
119
|
+
const strict = await ask("Enable strict mode (flag devDeps in production files)? (y/N) [N]: ");
|
|
120
|
+
if (strict.trim().toLowerCase() === "y") {
|
|
121
|
+
config.strict = true;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
// Exclude finding types
|
|
125
|
+
console.log("\nFinding types: missing, unused-dependencies, unused-devDependencies,");
|
|
126
|
+
console.log(" misplaced-devDependencies, unused-files, unused-exports");
|
|
127
|
+
const exclude = await ask("Exclude any finding types? (comma-separated, or Enter to skip): ");
|
|
128
|
+
const excludeList = exclude
|
|
129
|
+
.split(",")
|
|
130
|
+
.map((s) => s.trim())
|
|
131
|
+
.filter(Boolean);
|
|
132
|
+
if (excludeList.length > 0) {
|
|
133
|
+
config.exclude = excludeList;
|
|
134
|
+
}
|
|
135
|
+
// Monorepo workspace filter
|
|
136
|
+
if (context.isMonorepo) {
|
|
137
|
+
const workspace = await ask("Filter to specific workspaces? (comma-separated names, or Enter to scan all): ");
|
|
138
|
+
const workspaceList = workspace
|
|
139
|
+
.split(",")
|
|
140
|
+
.map((s) => s.trim())
|
|
141
|
+
.filter(Boolean);
|
|
142
|
+
if (workspaceList.length > 0) {
|
|
143
|
+
config.workspace = workspaceList;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
// Allowlists
|
|
147
|
+
const allowUnused = await ask("Allow specific unused dependencies? (comma-separated, or Enter to skip): ");
|
|
148
|
+
const allowUnusedList = allowUnused
|
|
149
|
+
.split(",")
|
|
150
|
+
.map((s) => s.trim())
|
|
151
|
+
.filter(Boolean);
|
|
152
|
+
if (allowUnusedList.length > 0) {
|
|
153
|
+
config.allowUnusedDependencies = allowUnusedList;
|
|
154
|
+
}
|
|
155
|
+
const ignorePackages = await ask("Ignore specific packages in all findings? (comma-separated, or Enter to skip): ");
|
|
156
|
+
const ignoreList = ignorePackages
|
|
157
|
+
.split(",")
|
|
158
|
+
.map((s) => s.trim())
|
|
159
|
+
.filter(Boolean);
|
|
160
|
+
if (ignoreList.length > 0) {
|
|
161
|
+
config.ignorePackages = ignoreList;
|
|
162
|
+
}
|
|
163
|
+
// AI
|
|
164
|
+
const ai = await ask("Configure AI summary? (y/N) [N]: ");
|
|
165
|
+
if (ai.trim().toLowerCase() === "y") {
|
|
166
|
+
const provider = await ask("AI provider? (openai/anthropic/gemini) [openai]: ");
|
|
167
|
+
const trimmedProvider = provider.trim() || "openai";
|
|
168
|
+
config.ai = { provider: trimmedProvider };
|
|
169
|
+
const model = await ask("AI model? (Enter for provider default): ");
|
|
170
|
+
if (model.trim()) {
|
|
171
|
+
config.ai.model = model.trim();
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
return config;
|
|
175
|
+
}
|
|
176
|
+
async function detectContext(packageDir) {
|
|
177
|
+
try {
|
|
178
|
+
const packagePath = await findNearestPackageJson(packageDir);
|
|
179
|
+
const packageJson = (await readPackageJson(packagePath));
|
|
180
|
+
const allDeps = {
|
|
181
|
+
...packageJson.dependencies,
|
|
182
|
+
...packageJson.devDependencies,
|
|
183
|
+
};
|
|
184
|
+
const isMonorepo = Array.isArray(packageJson.workspaces) ||
|
|
185
|
+
(typeof packageJson.workspaces === "object" &&
|
|
186
|
+
Array.isArray(packageJson.workspaces.packages)) ||
|
|
187
|
+
(await fileExists(path.join(packageDir, "pnpm-workspace.yaml")));
|
|
188
|
+
return {
|
|
189
|
+
isMonorepo,
|
|
190
|
+
hasTypeScript: "typescript" in allDeps,
|
|
191
|
+
hasVitest: "vitest" in allDeps,
|
|
192
|
+
hasJest: "jest" in allDeps,
|
|
193
|
+
hasEslint: "eslint" in allDeps,
|
|
194
|
+
hasPrettier: "prettier" in allDeps,
|
|
195
|
+
packageName: packageJson.name ?? path.basename(packageDir),
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
catch {
|
|
199
|
+
return {
|
|
200
|
+
isMonorepo: false,
|
|
201
|
+
hasTypeScript: false,
|
|
202
|
+
hasVitest: false,
|
|
203
|
+
hasJest: false,
|
|
204
|
+
hasEslint: false,
|
|
205
|
+
hasPrettier: false,
|
|
206
|
+
packageName: path.basename(packageDir),
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
async function fileExists(filePath) {
|
|
211
|
+
try {
|
|
212
|
+
await access(filePath);
|
|
213
|
+
return true;
|
|
214
|
+
}
|
|
215
|
+
catch {
|
|
216
|
+
return false;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
//# sourceMappingURL=init.js.map
|
package/dist/init.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oxcParser.d.ts","sourceRoot":"","sources":["../src/oxcParser.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAkB,MAAM,mBAAmB,CAAC;AAErE,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,MAAM,EACd,kBAAkB,GAAE,MAAM,EAAO,EACjC,QAAQ,SAAe,GACtB,WAAW,GAAG,IAAI,CAiFpB"}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
import { parseSync } from "oxc-parser";
|
|
2
|
+
export function parseFileSymbolsWithOxc(source, ignoredExportNames = [], filename = "source.tsx") {
|
|
3
|
+
let result;
|
|
4
|
+
try {
|
|
5
|
+
result = parseSync(filename, source, { sourceType: "unambiguous" });
|
|
6
|
+
}
|
|
7
|
+
catch {
|
|
8
|
+
return null;
|
|
9
|
+
}
|
|
10
|
+
if (result.errors.some((error) => error.severity === "Error")) {
|
|
11
|
+
return null;
|
|
12
|
+
}
|
|
13
|
+
const allSpecifiers = new Set();
|
|
14
|
+
const references = [];
|
|
15
|
+
const exportedNames = new Set();
|
|
16
|
+
for (const staticImport of result.module.staticImports) {
|
|
17
|
+
const specifier = staticImport.moduleRequest.value.trim();
|
|
18
|
+
if (!specifier) {
|
|
19
|
+
continue;
|
|
20
|
+
}
|
|
21
|
+
allSpecifiers.add(specifier);
|
|
22
|
+
if (staticImport.entries.length === 0) {
|
|
23
|
+
continue;
|
|
24
|
+
}
|
|
25
|
+
references.push({
|
|
26
|
+
specifier,
|
|
27
|
+
importedNames: parseOxcImportNames(staticImport.entries),
|
|
28
|
+
usesAllExports: staticImport.entries.some((entry) => entry.importName.kind === "NamespaceObject"),
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
for (const dynamicImport of result.module.dynamicImports) {
|
|
32
|
+
const specifier = readModuleRequest(source, dynamicImport.moduleRequest);
|
|
33
|
+
if (specifier) {
|
|
34
|
+
allSpecifiers.add(specifier);
|
|
35
|
+
references.push({ specifier, importedNames: [], usesAllExports: true });
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
for (const staticExport of result.module.staticExports) {
|
|
39
|
+
for (const entry of staticExport.entries) {
|
|
40
|
+
if (entry.moduleRequest) {
|
|
41
|
+
const specifier = entry.moduleRequest.value.trim();
|
|
42
|
+
if (!specifier) {
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
allSpecifiers.add(specifier);
|
|
46
|
+
references.push({
|
|
47
|
+
specifier,
|
|
48
|
+
importedNames: parseOxcExportImportNames(entry.importName),
|
|
49
|
+
usesAllExports: entry.importName.kind === "All"
|
|
50
|
+
|| entry.importName.kind === "AllButDefault",
|
|
51
|
+
});
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
const exportName = parseOxcExportName(entry.exportName);
|
|
55
|
+
if (exportName) {
|
|
56
|
+
exportedNames.add(exportName);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
collectCommonJsReferences(result.program, allSpecifiers, references);
|
|
61
|
+
return {
|
|
62
|
+
allSpecifiers: [...allSpecifiers].sort(),
|
|
63
|
+
localReferences: dedupeReferences(references),
|
|
64
|
+
exportedNames: [...exportedNames].sort(),
|
|
65
|
+
ignoredExportNames,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
function parseOxcImportNames(entries) {
|
|
69
|
+
const names = new Set();
|
|
70
|
+
for (const entry of entries) {
|
|
71
|
+
if (entry.importName.kind === "Default") {
|
|
72
|
+
names.add("default");
|
|
73
|
+
}
|
|
74
|
+
else if (entry.importName.kind === "Name" && entry.importName.name) {
|
|
75
|
+
names.add(entry.importName.name);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return [...names].sort();
|
|
79
|
+
}
|
|
80
|
+
function parseOxcExportImportNames(importName) {
|
|
81
|
+
return importName.kind === "Name" && importName.name ? [importName.name] : [];
|
|
82
|
+
}
|
|
83
|
+
function parseOxcExportName(exportName) {
|
|
84
|
+
if (exportName.kind === "Default") {
|
|
85
|
+
return "default";
|
|
86
|
+
}
|
|
87
|
+
return exportName.kind === "Name" ? exportName.name : null;
|
|
88
|
+
}
|
|
89
|
+
function collectCommonJsReferences(program, allSpecifiers, references) {
|
|
90
|
+
visitNode(program, (node) => {
|
|
91
|
+
const importEqualsSpecifier = getImportEqualsSpecifier(node);
|
|
92
|
+
if (importEqualsSpecifier) {
|
|
93
|
+
allSpecifiers.add(importEqualsSpecifier);
|
|
94
|
+
references.push({ specifier: importEqualsSpecifier, importedNames: [], usesAllExports: true });
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
if (node.type !== "CallExpression") {
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
const specifier = getRequireCallSpecifier(node);
|
|
101
|
+
if (specifier) {
|
|
102
|
+
allSpecifiers.add(specifier);
|
|
103
|
+
references.push({ specifier, importedNames: [], usesAllExports: true });
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
function getImportEqualsSpecifier(node) {
|
|
108
|
+
if (node.type !== "TSImportEqualsDeclaration") {
|
|
109
|
+
return null;
|
|
110
|
+
}
|
|
111
|
+
const moduleReference = node.moduleReference;
|
|
112
|
+
if (!isRecord(moduleReference) || moduleReference.type !== "TSExternalModuleReference") {
|
|
113
|
+
return null;
|
|
114
|
+
}
|
|
115
|
+
return getStringLiteralValue(moduleReference.expression);
|
|
116
|
+
}
|
|
117
|
+
function getRequireCallSpecifier(node) {
|
|
118
|
+
const args = Array.isArray(node.arguments) ? node.arguments : [];
|
|
119
|
+
const specifier = getStringLiteralValue(args[0]);
|
|
120
|
+
if (!specifier) {
|
|
121
|
+
return null;
|
|
122
|
+
}
|
|
123
|
+
const callee = node.callee;
|
|
124
|
+
if (isIdentifier(callee, "require")) {
|
|
125
|
+
return specifier;
|
|
126
|
+
}
|
|
127
|
+
if (!isRecord(callee) || callee.type !== "MemberExpression" || callee.computed !== false) {
|
|
128
|
+
return null;
|
|
129
|
+
}
|
|
130
|
+
return isIdentifier(callee.object, "require") && isIdentifier(callee.property, "resolve")
|
|
131
|
+
? specifier
|
|
132
|
+
: null;
|
|
133
|
+
}
|
|
134
|
+
function readModuleRequest(source, span) {
|
|
135
|
+
return unquoteStringLiteral(source.slice(span.start, span.end).trim());
|
|
136
|
+
}
|
|
137
|
+
function getStringLiteralValue(node) {
|
|
138
|
+
return isRecord(node) && node.type === "Literal" && typeof node.value === "string"
|
|
139
|
+
? node.value
|
|
140
|
+
: null;
|
|
141
|
+
}
|
|
142
|
+
function unquoteStringLiteral(value) {
|
|
143
|
+
if (value.length < 2) {
|
|
144
|
+
return null;
|
|
145
|
+
}
|
|
146
|
+
const quote = value[0];
|
|
147
|
+
const endQuote = value[value.length - 1];
|
|
148
|
+
if ((quote !== "\"" && quote !== "'" && quote !== "`") || quote !== endQuote) {
|
|
149
|
+
return null;
|
|
150
|
+
}
|
|
151
|
+
return value.slice(1, -1);
|
|
152
|
+
}
|
|
153
|
+
function visitNode(node, visitor) {
|
|
154
|
+
if (!isRecord(node)) {
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
visitor(node);
|
|
158
|
+
for (const [key, value] of Object.entries(node)) {
|
|
159
|
+
if (key === "type" || key === "start" || key === "end") {
|
|
160
|
+
continue;
|
|
161
|
+
}
|
|
162
|
+
if (Array.isArray(value)) {
|
|
163
|
+
for (const item of value) {
|
|
164
|
+
visitNode(item, visitor);
|
|
165
|
+
}
|
|
166
|
+
continue;
|
|
167
|
+
}
|
|
168
|
+
visitNode(value, visitor);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
function dedupeReferences(references) {
|
|
172
|
+
const seen = new Set();
|
|
173
|
+
return references.filter((reference) => {
|
|
174
|
+
const key = `${reference.specifier}:${reference.usesAllExports}:${reference.importedNames.join(",")}`;
|
|
175
|
+
if (seen.has(key)) {
|
|
176
|
+
return false;
|
|
177
|
+
}
|
|
178
|
+
seen.add(key);
|
|
179
|
+
return true;
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
function isIdentifier(node, name) {
|
|
183
|
+
return isRecord(node) && node.type === "Identifier" && node.name === name;
|
|
184
|
+
}
|
|
185
|
+
function isRecord(value) {
|
|
186
|
+
return typeof value === "object" && value !== null;
|
|
187
|
+
}
|
|
188
|
+
//# sourceMappingURL=oxcParser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oxcParser.js","sourceRoot":"","sources":["../src/oxcParser.ts"],"names":[],"mappings":"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"}
|
package/dist/reporters.d.ts
CHANGED
|
@@ -30,6 +30,7 @@ export interface RenderReportInput {
|
|
|
30
30
|
workspaces: ReportWorkspace[];
|
|
31
31
|
trace?: string;
|
|
32
32
|
traceExport?: string;
|
|
33
|
+
explain?: string;
|
|
33
34
|
aiSummary?: string;
|
|
34
35
|
warnings?: string[];
|
|
35
36
|
configurationHints?: string[];
|
|
@@ -63,6 +64,7 @@ export interface RenderReportInput {
|
|
|
63
64
|
packagePath: string;
|
|
64
65
|
removedDependencies: string[];
|
|
65
66
|
removedDevDependencies: string[];
|
|
67
|
+
addedDevDependencies: string[];
|
|
66
68
|
formattedFiles: string[];
|
|
67
69
|
}>;
|
|
68
70
|
}
|
package/dist/reporters.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reporters.d.ts","sourceRoot":"","sources":["../src/reporters.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACxD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAE5D,eAAO,MAAM,mBAAmB,wDAAyD,CAAC;AAE1F,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAC;AAChE,MAAM,MAAM,WAAW,GACnB,SAAS,GACT,qBAAqB,GACrB,wBAAwB,GACxB,2BAA2B,GAC3B,cAAc,GACd,gBAAgB,CAAC;AAErB,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,WAAW,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,eAAe,CAAC;IAC3B,MAAM,EAAE,UAAU,CAAC;IACnB,QAAQ,EAAE,aAAa,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,YAAY,CAAC;IACvB,KAAK,EAAE,OAAO,CAAC;IACf,WAAW,EAAE,OAAO,CAAC;IACrB,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,EAAE,OAAO,CAAC;IACf,GAAG,EAAE,OAAO,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,OAAO,CAAC;IACpB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,UAAU,EAAE,eAAe,EAAE,CAAC;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE;QACb,cAAc,EAAE,MAAM,EAAE,CAAC;QACzB,uBAAuB,EAAE,MAAM,EAAE,CAAC;QAClC,0BAA0B,EAAE,MAAM,EAAE,CAAC;QACrC,oBAAoB,EAAE,MAAM,EAAE,CAAC;QAC/B,6BAA6B,EAAE,MAAM,EAAE,CAAC;QACxC,aAAa,EAAE;YACb,eAAe,EAAE,MAAM,EAAE,CAAC;YAC1B,YAAY,EAAE,MAAM,EAAE,CAAC;YACvB,cAAc,EAAE,MAAM,EAAE,CAAC;SAC1B,CAAC;KACH,CAAC;IACF,kBAAkB,CAAC,EAAE;QACnB,oBAAoB,EAAE,MAAM,CAAC;QAC7B,eAAe,EAAE,MAAM,CAAC;QACxB,WAAW,EAAE,MAAM,CAAC;QACpB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,aAAa,CAAC,EAAE;QACd,IAAI,EAAE,UAAU,CAAC;KAClB,CAAC;IACF,EAAE,CAAC,EAAE;QACH,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,YAAY,CAAC,EAAE,KAAK,CAAC;QACnB,WAAW,EAAE,MAAM,CAAC;QACpB,mBAAmB,EAAE,MAAM,EAAE,CAAC;QAC9B,sBAAsB,EAAE,MAAM,EAAE,CAAC;QACjC,cAAc,EAAE,MAAM,EAAE,CAAC;KAC1B,CAAC,CAAC;CACJ;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"reporters.d.ts","sourceRoot":"","sources":["../src/reporters.ts"],"names":[],"mappings":"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"}
|
package/dist/reporters.js
CHANGED
|
@@ -37,6 +37,9 @@ export function renderReport(input) {
|
|
|
37
37
|
if (fix.removedDevDependencies.length > 0) {
|
|
38
38
|
lines.push(`Removed devDependencies: ${fix.removedDevDependencies.join(", ")}`);
|
|
39
39
|
}
|
|
40
|
+
if (fix.addedDevDependencies.length > 0) {
|
|
41
|
+
lines.push(`Added devDependencies: ${fix.addedDevDependencies.join(", ")} (version "*" — run npm install to resolve)`);
|
|
42
|
+
}
|
|
40
43
|
if (fix.formattedFiles.length > 0) {
|
|
41
44
|
lines.push(`Formatted files: ${fix.formattedFiles.join(", ")}`);
|
|
42
45
|
}
|
|
@@ -101,6 +104,9 @@ export function renderReport(input) {
|
|
|
101
104
|
if (input.memory) {
|
|
102
105
|
lines.push(`Heap used: ${formatMb(result.memory.heapUsedMb)}`);
|
|
103
106
|
}
|
|
107
|
+
if (input.debug) {
|
|
108
|
+
lines.push(`Parser: OXC ${result.parseStats.oxcFiles}, fallback ${result.parseStats.fallbackFiles}`);
|
|
109
|
+
}
|
|
104
110
|
if (findingCount === 0) {
|
|
105
111
|
lines.push(pc.green("No dependency issues found."));
|
|
106
112
|
}
|
|
@@ -141,6 +147,11 @@ export function renderReport(input) {
|
|
|
141
147
|
}
|
|
142
148
|
}
|
|
143
149
|
}
|
|
150
|
+
if (input.explain) {
|
|
151
|
+
lines.push("");
|
|
152
|
+
lines.push(pc.bold(`Explain: ${input.explain}`));
|
|
153
|
+
lines.push(...renderExplainLines(input.explain, result, workspace.relativeDir));
|
|
154
|
+
}
|
|
144
155
|
}
|
|
145
156
|
if (input.debug) {
|
|
146
157
|
lines.push("");
|
|
@@ -205,6 +216,10 @@ function buildStructuredReport(input) {
|
|
|
205
216
|
scriptCommandPackages: result.scriptCommandPackages,
|
|
206
217
|
scriptEntryFiles: result.scriptEntryFiles,
|
|
207
218
|
cached: result.cached,
|
|
219
|
+
parser: {
|
|
220
|
+
oxcFiles: result.parseStats.oxcFiles,
|
|
221
|
+
fallbackFiles: result.parseStats.fallbackFiles,
|
|
222
|
+
},
|
|
208
223
|
},
|
|
209
224
|
findings,
|
|
210
225
|
externalImports: result.externalImports,
|
|
@@ -224,6 +239,9 @@ function buildStructuredReport(input) {
|
|
|
224
239
|
sources: result.exportTraces[input.traceExport] ?? [],
|
|
225
240
|
}
|
|
226
241
|
: null,
|
|
242
|
+
explain: input.explain
|
|
243
|
+
? buildExplainPayload(input.explain, result, workspace.relativeDir)
|
|
244
|
+
: null,
|
|
227
245
|
})),
|
|
228
246
|
};
|
|
229
247
|
}
|
|
@@ -450,4 +468,101 @@ function renderSarifReport(input) {
|
|
|
450
468
|
],
|
|
451
469
|
};
|
|
452
470
|
}
|
|
471
|
+
function buildExplainPayload(findingType, result, relativeDir) {
|
|
472
|
+
const entryFiles = result.scriptEntryFiles;
|
|
473
|
+
if (findingType === "unused-files") {
|
|
474
|
+
return {
|
|
475
|
+
type: findingType,
|
|
476
|
+
entryFiles,
|
|
477
|
+
items: result.unusedFiles.map((file) => ({
|
|
478
|
+
item: file,
|
|
479
|
+
reason: "Not reachable from any entry point via local imports.",
|
|
480
|
+
})),
|
|
481
|
+
};
|
|
482
|
+
}
|
|
483
|
+
if (findingType === "unused-exports") {
|
|
484
|
+
return {
|
|
485
|
+
type: findingType,
|
|
486
|
+
entryFiles,
|
|
487
|
+
items: result.unusedExports.map((entry) => {
|
|
488
|
+
const [file, exportName] = entry.split(": ");
|
|
489
|
+
const traceKey = `${file}: ${exportName}`;
|
|
490
|
+
const importedBy = result.exportTraces[traceKey] ?? [];
|
|
491
|
+
return {
|
|
492
|
+
item: entry,
|
|
493
|
+
reason: importedBy.length === 0
|
|
494
|
+
? "Export is not imported by any reachable file."
|
|
495
|
+
: "Export exists in traces but was filtered.",
|
|
496
|
+
importedBy,
|
|
497
|
+
};
|
|
498
|
+
}),
|
|
499
|
+
};
|
|
500
|
+
}
|
|
501
|
+
if (findingType === "unused-dependencies" ||
|
|
502
|
+
findingType === "unused-devDependencies") {
|
|
503
|
+
const packages = findingType === "unused-dependencies"
|
|
504
|
+
? result.unusedDependencies
|
|
505
|
+
: result.unusedDevDependencies;
|
|
506
|
+
return {
|
|
507
|
+
type: findingType,
|
|
508
|
+
entryFiles,
|
|
509
|
+
items: packages.map((pkg) => ({
|
|
510
|
+
item: pkg,
|
|
511
|
+
reason: "Package is declared but not imported in any scanned file or script.",
|
|
512
|
+
importedBy: result.packageTraces[pkg] ?? [],
|
|
513
|
+
})),
|
|
514
|
+
};
|
|
515
|
+
}
|
|
516
|
+
if (findingType === "missing") {
|
|
517
|
+
return {
|
|
518
|
+
type: findingType,
|
|
519
|
+
entryFiles,
|
|
520
|
+
items: result.missingPackages.map((pkg) => ({
|
|
521
|
+
item: pkg,
|
|
522
|
+
reason: "Package is imported but not declared in package.json.",
|
|
523
|
+
importedBy: result.packageTraces[pkg] ?? [],
|
|
524
|
+
})),
|
|
525
|
+
};
|
|
526
|
+
}
|
|
527
|
+
if (findingType === "misplaced-devDependencies") {
|
|
528
|
+
return {
|
|
529
|
+
type: findingType,
|
|
530
|
+
entryFiles,
|
|
531
|
+
items: result.misplacedDevDependencies.map((pkg) => ({
|
|
532
|
+
item: pkg,
|
|
533
|
+
reason: "Package is a devDependency but imported in production files.",
|
|
534
|
+
importedBy: (result.packageTraces[pkg] ?? []).filter((f) => result.files.find((file) => file.relativePath === f)?.isProduction),
|
|
535
|
+
})),
|
|
536
|
+
};
|
|
537
|
+
}
|
|
538
|
+
return { type: findingType, entryFiles, items: [] };
|
|
539
|
+
}
|
|
540
|
+
function renderExplainLines(findingType, result, relativeDir) {
|
|
541
|
+
const payload = buildExplainPayload(findingType, result, relativeDir);
|
|
542
|
+
const lines = [];
|
|
543
|
+
if (payload.entryFiles.length > 0) {
|
|
544
|
+
lines.push(pc.dim(`Entry files: ${payload.entryFiles.join(", ")}`));
|
|
545
|
+
}
|
|
546
|
+
else {
|
|
547
|
+
lines.push(pc.dim("Entry files: none detected"));
|
|
548
|
+
}
|
|
549
|
+
if (payload.items.length === 0) {
|
|
550
|
+
lines.push(pc.green(`No ${findingType} findings to explain.`));
|
|
551
|
+
return lines;
|
|
552
|
+
}
|
|
553
|
+
for (const entry of payload.items) {
|
|
554
|
+
lines.push("");
|
|
555
|
+
lines.push(pc.yellow(` ${entry.item}`));
|
|
556
|
+
lines.push(pc.dim(` Reason: ${entry.reason}`));
|
|
557
|
+
if (entry.importedBy && entry.importedBy.length > 0) {
|
|
558
|
+
lines.push(pc.dim(` Imported by: ${entry.importedBy.join(", ")}`));
|
|
559
|
+
}
|
|
560
|
+
else if (findingType === "unused-dependencies" ||
|
|
561
|
+
findingType === "unused-devDependencies" ||
|
|
562
|
+
findingType === "missing") {
|
|
563
|
+
lines.push(pc.dim(" Imported by: (none found in scanned files)"));
|
|
564
|
+
}
|
|
565
|
+
}
|
|
566
|
+
return lines;
|
|
567
|
+
}
|
|
453
568
|
//# sourceMappingURL=reporters.js.map
|