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.
Files changed (47) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/README.md +17 -1
  3. package/dist/aliasResolver.d.ts +28 -0
  4. package/dist/aliasResolver.d.ts.map +1 -0
  5. package/dist/aliasResolver.js +136 -0
  6. package/dist/aliasResolver.js.map +1 -0
  7. package/dist/autoFix.d.ts +1 -0
  8. package/dist/autoFix.d.ts.map +1 -1
  9. package/dist/autoFix.js +37 -4
  10. package/dist/autoFix.js.map +1 -1
  11. package/dist/importParser.d.ts.map +1 -1
  12. package/dist/importParser.js +12 -7
  13. package/dist/importParser.js.map +1 -1
  14. package/dist/index.js +31 -0
  15. package/dist/index.js.map +1 -1
  16. package/dist/init.d.ts +2 -0
  17. package/dist/init.d.ts.map +1 -0
  18. package/dist/init.js +219 -0
  19. package/dist/init.js.map +1 -0
  20. package/dist/oxcParser.d.ts +3 -0
  21. package/dist/oxcParser.d.ts.map +1 -0
  22. package/dist/oxcParser.js +188 -0
  23. package/dist/oxcParser.js.map +1 -0
  24. package/dist/reporters.d.ts +2 -0
  25. package/dist/reporters.d.ts.map +1 -1
  26. package/dist/reporters.js +115 -0
  27. package/dist/reporters.js.map +1 -1
  28. package/dist/scan.d.ts +5 -0
  29. package/dist/scan.d.ts.map +1 -1
  30. package/dist/scan.js +124 -66
  31. package/dist/scan.js.map +1 -1
  32. package/dist/scriptParser.d.ts.map +1 -1
  33. package/dist/scriptParser.js +28 -0
  34. package/dist/scriptParser.js.map +1 -1
  35. package/dist/sourceSanitizer.d.ts +3 -0
  36. package/dist/sourceSanitizer.d.ts.map +1 -0
  37. package/dist/sourceSanitizer.js +69 -0
  38. package/dist/sourceSanitizer.js.map +1 -0
  39. package/dist/symbolParser.d.ts +22 -0
  40. package/dist/symbolParser.d.ts.map +1 -1
  41. package/dist/symbolParser.js +152 -3
  42. package/dist/symbolParser.js.map +1 -1
  43. package/dist/workspaceFinder.d.ts +16 -0
  44. package/dist/workspaceFinder.d.ts.map +1 -1
  45. package/dist/workspaceFinder.js +67 -25
  46. package/dist/workspaceFinder.js.map +1 -1
  47. 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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { FileSymbols } from "./symbolParser.js";
2
+ export declare function parseFileSymbolsWithOxc(source: string, ignoredExportNames?: string[], filename?: string): FileSymbols | null;
3
+ //# sourceMappingURL=oxcParser.d.ts.map
@@ -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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"}
@@ -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
  }
@@ -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,CAiO7D"}
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,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,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,oBAAoB,EAAE,MAAM,EAAE,CAAC;QAC/B,cAAc,EAAE,MAAM,EAAE,CAAC;KAC1B,CAAC,CAAC;CACJ;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG,MAAM,CA6O7D"}
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