sadrazam 0.1.0-alpha.6
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 +62 -0
- package/LICENSE +21 -0
- package/README.md +343 -0
- package/dist/aiClient.d.ts +4 -0
- package/dist/aiClient.d.ts.map +1 -0
- package/dist/aiClient.js +152 -0
- package/dist/aiClient.js.map +1 -0
- package/dist/aiConfig.d.ts +19 -0
- package/dist/aiConfig.d.ts.map +1 -0
- package/dist/aiConfig.js +28 -0
- package/dist/aiConfig.js.map +1 -0
- package/dist/config.d.ts +26 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +32 -0
- package/dist/config.js.map +1 -0
- package/dist/fileFinder.d.ts +2 -0
- package/dist/fileFinder.d.ts.map +1 -0
- package/dist/fileFinder.js +14 -0
- package/dist/fileFinder.js.map +1 -0
- package/dist/findings.d.ts +13 -0
- package/dist/findings.d.ts.map +1 -0
- package/dist/findings.js +52 -0
- package/dist/findings.js.map +1 -0
- package/dist/importParser.d.ts +6 -0
- package/dist/importParser.d.ts.map +1 -0
- package/dist/importParser.js +36 -0
- package/dist/importParser.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +185 -0
- package/dist/index.js.map +1 -0
- package/dist/packageReader.d.ts +14 -0
- package/dist/packageReader.d.ts.map +1 -0
- package/dist/packageReader.js +51 -0
- package/dist/packageReader.js.map +1 -0
- package/dist/reporters.d.ts +42 -0
- package/dist/reporters.d.ts.map +1 -0
- package/dist/reporters.js +138 -0
- package/dist/reporters.js.map +1 -0
- package/dist/scan.d.ts +25 -0
- package/dist/scan.d.ts.map +1 -0
- package/dist/scan.js +152 -0
- package/dist/scan.js.map +1 -0
- package/dist/scriptParser.d.ts +7 -0
- package/dist/scriptParser.d.ts.map +1 -0
- package/dist/scriptParser.js +117 -0
- package/dist/scriptParser.js.map +1 -0
- package/dist/sourceMapper.d.ts +2 -0
- package/dist/sourceMapper.d.ts.map +1 -0
- package/dist/sourceMapper.js +57 -0
- package/dist/sourceMapper.js.map +1 -0
- package/dist/workspaceFinder.d.ts +11 -0
- package/dist/workspaceFinder.d.ts.map +1 -0
- package/dist/workspaceFinder.js +62 -0
- package/dist/workspaceFinder.js.map +1 -0
- package/package.json +53 -0
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import pc from "picocolors";
|
|
2
|
+
export const SUPPORTED_REPORTERS = ["text", "json"];
|
|
3
|
+
export function renderReport(input) {
|
|
4
|
+
if (input.reporter === "json") {
|
|
5
|
+
return JSON.stringify({
|
|
6
|
+
targetDir: input.targetDir,
|
|
7
|
+
mode: {
|
|
8
|
+
debug: input.debug,
|
|
9
|
+
production: input.production,
|
|
10
|
+
strict: input.strict,
|
|
11
|
+
include: input.include,
|
|
12
|
+
exclude: input.exclude,
|
|
13
|
+
},
|
|
14
|
+
ai: input.ai ?? null,
|
|
15
|
+
aiSummary: input.aiSummary ?? null,
|
|
16
|
+
warnings: input.warnings ?? [],
|
|
17
|
+
configSource: input.configSource ?? null,
|
|
18
|
+
rulesSummary: input.rulesSummary ?? null,
|
|
19
|
+
workspaces: input.workspaces.map(({ workspace, result, findings }) => ({
|
|
20
|
+
workspace,
|
|
21
|
+
summary: {
|
|
22
|
+
filesScanned: result.files.length,
|
|
23
|
+
externalPackagesUsed: result.externalImports.length,
|
|
24
|
+
findings: findings.reduce((sum, finding) => sum + finding.items.length, 0),
|
|
25
|
+
scriptCommandPackages: result.scriptCommandPackages,
|
|
26
|
+
scriptEntryFiles: result.scriptEntryFiles,
|
|
27
|
+
},
|
|
28
|
+
findings,
|
|
29
|
+
externalImports: result.externalImports,
|
|
30
|
+
traces: input.trace
|
|
31
|
+
? {
|
|
32
|
+
package: input.trace,
|
|
33
|
+
sources: result.packageTraces[input.trace] ?? [],
|
|
34
|
+
}
|
|
35
|
+
: null,
|
|
36
|
+
})),
|
|
37
|
+
}, null, 2);
|
|
38
|
+
}
|
|
39
|
+
const lines = [];
|
|
40
|
+
lines.push(pc.bold(pc.cyan("Sarraf Report")));
|
|
41
|
+
lines.push(`Target: ${input.targetDir}`);
|
|
42
|
+
lines.push(`Workspaces: ${input.workspaces.length}`);
|
|
43
|
+
lines.push(`Mode: ${describeMode(input)}`);
|
|
44
|
+
if (input.warnings && input.warnings.length > 0) {
|
|
45
|
+
lines.push("");
|
|
46
|
+
lines.push(pc.yellow("Warnings"));
|
|
47
|
+
for (const warning of input.warnings) {
|
|
48
|
+
lines.push(`- ${warning}`);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
if (input.ai) {
|
|
52
|
+
lines.push("");
|
|
53
|
+
lines.push(pc.magenta("AI mode"));
|
|
54
|
+
lines.push(`Provider: ${input.ai.provider}`);
|
|
55
|
+
lines.push(`Model: ${input.ai.model ?? "default"}`);
|
|
56
|
+
lines.push("Status: configured");
|
|
57
|
+
lines.push(`Summary: ${input.aiSummary ? "generated" : "not available"}`);
|
|
58
|
+
}
|
|
59
|
+
if (input.aiSummary) {
|
|
60
|
+
lines.push("");
|
|
61
|
+
lines.push(pc.magenta("AI summary"));
|
|
62
|
+
lines.push(input.aiSummary);
|
|
63
|
+
}
|
|
64
|
+
for (const { workspace, result, findings } of input.workspaces) {
|
|
65
|
+
const findingCount = findings.reduce((sum, finding) => sum + finding.items.length, 0);
|
|
66
|
+
lines.push("");
|
|
67
|
+
lines.push(pc.bold(`${workspace.name} (${workspace.relativeDir})`));
|
|
68
|
+
lines.push(`Package: ${result.packagePath}`);
|
|
69
|
+
lines.push(`Files scanned: ${result.files.length}`);
|
|
70
|
+
lines.push(`External packages used: ${result.externalImports.length}`);
|
|
71
|
+
lines.push(`Findings: ${findingCount}`);
|
|
72
|
+
if (result.scriptCommandPackages.length > 0) {
|
|
73
|
+
lines.push(`Script packages: ${result.scriptCommandPackages.join(", ")}`);
|
|
74
|
+
}
|
|
75
|
+
if (findingCount === 0) {
|
|
76
|
+
lines.push(pc.green("No dependency issues found."));
|
|
77
|
+
}
|
|
78
|
+
for (const finding of findings) {
|
|
79
|
+
lines.push("");
|
|
80
|
+
lines.push(colorizeFindingTitle(finding.type, finding.title));
|
|
81
|
+
for (const item of finding.items) {
|
|
82
|
+
lines.push(`- ${item}`);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
if (result.externalImports.length > 0) {
|
|
86
|
+
lines.push("");
|
|
87
|
+
lines.push(pc.dim(`External imports: ${result.externalImports.join(", ")}`));
|
|
88
|
+
}
|
|
89
|
+
if (input.trace) {
|
|
90
|
+
lines.push("");
|
|
91
|
+
lines.push(pc.bold(`Trace: ${input.trace}`));
|
|
92
|
+
const traceEntries = result.packageTraces[input.trace] ?? [];
|
|
93
|
+
if (traceEntries.length === 0) {
|
|
94
|
+
lines.push(pc.dim("No trace entries found."));
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
for (const entry of traceEntries) {
|
|
98
|
+
lines.push(`- ${entry}`);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
if (input.debug) {
|
|
104
|
+
lines.push("");
|
|
105
|
+
lines.push(pc.dim("Debug"));
|
|
106
|
+
lines.push(pc.dim(`Config source: ${input.configSource ?? "defaults"}`));
|
|
107
|
+
lines.push(pc.dim(`Reporter: ${input.reporter}`));
|
|
108
|
+
lines.push(pc.dim(`Include: ${input.include.join(", ") || "-"}`));
|
|
109
|
+
lines.push(pc.dim(`Exclude: ${input.exclude.join(", ") || "-"}`));
|
|
110
|
+
lines.push(pc.dim(`Trace: ${input.trace ?? "-"}`));
|
|
111
|
+
if (input.rulesSummary) {
|
|
112
|
+
lines.push(pc.dim(`Ignore packages: ${input.rulesSummary.ignorePackages.join(", ") || "-"}`));
|
|
113
|
+
lines.push(pc.dim(`Allow unused dependencies: ${input.rulesSummary.allowUnusedDependencies.join(", ") || "-"}`));
|
|
114
|
+
lines.push(pc.dim(`Allow unused devDependencies: ${input.rulesSummary.allowUnusedDevDependencies.join(", ") || "-"}`));
|
|
115
|
+
lines.push(pc.dim(`Allow missing packages: ${input.rulesSummary.allowMissingPackages.join(", ") || "-"}`));
|
|
116
|
+
lines.push(pc.dim(`Allow misplaced devDependencies: ${input.rulesSummary.allowMisplacedDevDependencies.join(", ") || "-"}`));
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return lines.join("\n");
|
|
120
|
+
}
|
|
121
|
+
function describeMode(input) {
|
|
122
|
+
const enabled = [
|
|
123
|
+
input.production ? "production" : null,
|
|
124
|
+
input.strict ? "strict" : null,
|
|
125
|
+
input.debug ? "debug" : null,
|
|
126
|
+
].filter(Boolean);
|
|
127
|
+
return enabled.join(", ") || "default";
|
|
128
|
+
}
|
|
129
|
+
function colorizeFindingTitle(type, title) {
|
|
130
|
+
if (type === "missing") {
|
|
131
|
+
return pc.red(title);
|
|
132
|
+
}
|
|
133
|
+
if (type === "misplaced-devDependencies") {
|
|
134
|
+
return pc.red(title);
|
|
135
|
+
}
|
|
136
|
+
return pc.yellow(title);
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=reporters.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reporters.js","sourceRoot":"","sources":["../src/reporters.ts"],"names":[],"mappings":"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"}
|
package/dist/scan.d.ts
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export interface FileScanResult {
|
|
2
|
+
filePath: string;
|
|
3
|
+
relativePath: string;
|
|
4
|
+
imports: string[];
|
|
5
|
+
isProduction: boolean;
|
|
6
|
+
}
|
|
7
|
+
export interface ScanResult {
|
|
8
|
+
rootDir: string;
|
|
9
|
+
packagePath: string;
|
|
10
|
+
files: FileScanResult[];
|
|
11
|
+
externalImports: string[];
|
|
12
|
+
scriptCommandPackages: string[];
|
|
13
|
+
scriptEntryFiles: string[];
|
|
14
|
+
packageTraces: Record<string, string[]>;
|
|
15
|
+
missingPackages: string[];
|
|
16
|
+
unusedDependencies: string[];
|
|
17
|
+
unusedDevDependencies: string[];
|
|
18
|
+
misplacedDevDependencies: string[];
|
|
19
|
+
}
|
|
20
|
+
export interface ScanOptions {
|
|
21
|
+
production?: boolean;
|
|
22
|
+
strict?: boolean;
|
|
23
|
+
}
|
|
24
|
+
export declare function scanProject(rootDir: string, options?: ScanOptions): Promise<ScanResult>;
|
|
25
|
+
//# sourceMappingURL=scan.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../src/scan.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,YAAY,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,qBAAqB,EAAE,MAAM,EAAE,CAAC;IAChC,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACxC,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,qBAAqB,EAAE,MAAM,EAAE,CAAC;IAChC,wBAAwB,EAAE,MAAM,EAAE,CAAC;CACpC;AAED,MAAM,WAAW,WAAW;IAC1B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,UAAU,CAAC,CAiEjG"}
|
package/dist/scan.js
ADDED
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { builtinModules } from "node:module";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { findSourceFiles } from "./fileFinder.js";
|
|
5
|
+
import { parseImports } from "./importParser.js";
|
|
6
|
+
import { readPackageMetadata } from "./packageReader.js";
|
|
7
|
+
import { parsePackageScripts } from "./scriptParser.js";
|
|
8
|
+
import { mapToSourcePath } from "./sourceMapper.js";
|
|
9
|
+
export async function scanProject(rootDir, options = {}) {
|
|
10
|
+
const absoluteRoot = path.resolve(rootDir);
|
|
11
|
+
const [files, packageMetadata] = await Promise.all([
|
|
12
|
+
findSourceFiles(absoluteRoot),
|
|
13
|
+
readPackageMetadata(absoluteRoot),
|
|
14
|
+
]);
|
|
15
|
+
const scriptAnalysis = await parsePackageScripts(packageMetadata.packageDir, packageMetadata.scripts);
|
|
16
|
+
const allFiles = mergeFiles(files, scriptAnalysis.fileEntries);
|
|
17
|
+
const selectedFiles = options.production || options.strict
|
|
18
|
+
? allFiles.filter((filePath) => isProductionFilePath(absoluteRoot, filePath))
|
|
19
|
+
: allFiles;
|
|
20
|
+
const mappedFiles = await Promise.all(selectedFiles.map((filePath) => mapToSourcePath(absoluteRoot, filePath)));
|
|
21
|
+
const dedupedFiles = mergeFiles([], mappedFiles);
|
|
22
|
+
const fileResults = await Promise.all(dedupedFiles.map(async (filePath) => {
|
|
23
|
+
const source = await readFile(filePath, "utf8");
|
|
24
|
+
const imports = parseImports(source).map((entry) => entry.specifier);
|
|
25
|
+
const relativePath = path.relative(absoluteRoot, filePath) || path.basename(filePath);
|
|
26
|
+
return {
|
|
27
|
+
filePath,
|
|
28
|
+
relativePath,
|
|
29
|
+
imports,
|
|
30
|
+
isProduction: isProductionFilePath(absoluteRoot, filePath),
|
|
31
|
+
};
|
|
32
|
+
}));
|
|
33
|
+
const externalImports = collectExternalImports(fileResults, scriptAnalysis.commandPackages);
|
|
34
|
+
const packageTraces = collectPackageTraces(fileResults, scriptAnalysis.commandUsage);
|
|
35
|
+
const missingPackages = externalImports.filter((name) => !isBuiltinPackage(name) && !packageMetadata.allDependencies.has(name));
|
|
36
|
+
const unusedDependencies = getUnusedDeclaredPackages(packageMetadata.dependencies, externalImports);
|
|
37
|
+
const unusedDevDependencies = getUnusedDeclaredPackages(packageMetadata.devDependencies, externalImports);
|
|
38
|
+
const misplacedDevDependencies = options.strict
|
|
39
|
+
? getMisplacedDevDependencies(fileResults, packageMetadata.devDependencies)
|
|
40
|
+
: [];
|
|
41
|
+
return {
|
|
42
|
+
rootDir: absoluteRoot,
|
|
43
|
+
packagePath: packageMetadata.packagePath,
|
|
44
|
+
files: fileResults,
|
|
45
|
+
externalImports,
|
|
46
|
+
scriptCommandPackages: scriptAnalysis.commandPackages,
|
|
47
|
+
scriptEntryFiles: await mapScriptEntryFiles(absoluteRoot, scriptAnalysis.fileEntries),
|
|
48
|
+
packageTraces,
|
|
49
|
+
missingPackages,
|
|
50
|
+
unusedDependencies,
|
|
51
|
+
unusedDevDependencies,
|
|
52
|
+
misplacedDevDependencies,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
function collectExternalImports(files, scriptPackages) {
|
|
56
|
+
const packages = new Set();
|
|
57
|
+
for (const file of files) {
|
|
58
|
+
for (const specifier of file.imports) {
|
|
59
|
+
if (isExternalSpecifier(specifier)) {
|
|
60
|
+
packages.add(getPackageName(specifier));
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
for (const packageName of scriptPackages) {
|
|
65
|
+
packages.add(packageName);
|
|
66
|
+
}
|
|
67
|
+
return [...packages].sort();
|
|
68
|
+
}
|
|
69
|
+
function collectPackageTraces(files, scriptUsage) {
|
|
70
|
+
const traces = new Map();
|
|
71
|
+
for (const file of files) {
|
|
72
|
+
for (const specifier of file.imports) {
|
|
73
|
+
if (!isExternalSpecifier(specifier)) {
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
const packageName = getPackageName(specifier);
|
|
77
|
+
const entries = traces.get(packageName) ?? new Set();
|
|
78
|
+
entries.add(file.relativePath);
|
|
79
|
+
traces.set(packageName, entries);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
for (const [packageName, entries] of Object.entries(scriptUsage)) {
|
|
83
|
+
const currentEntries = traces.get(packageName) ?? new Set();
|
|
84
|
+
for (const entry of entries) {
|
|
85
|
+
currentEntries.add(entry);
|
|
86
|
+
}
|
|
87
|
+
traces.set(packageName, currentEntries);
|
|
88
|
+
}
|
|
89
|
+
return Object.fromEntries([...traces.entries()]
|
|
90
|
+
.map(([packageName, entries]) => [packageName, [...entries].sort()])
|
|
91
|
+
.sort(([left], [right]) => left.localeCompare(right)));
|
|
92
|
+
}
|
|
93
|
+
function isExternalSpecifier(specifier) {
|
|
94
|
+
return !specifier.startsWith(".") && !path.isAbsolute(specifier);
|
|
95
|
+
}
|
|
96
|
+
function getPackageName(specifier) {
|
|
97
|
+
if (specifier.startsWith("@")) {
|
|
98
|
+
const [scope, name] = specifier.split("/");
|
|
99
|
+
return scope && name ? `${scope}/${name}` : specifier;
|
|
100
|
+
}
|
|
101
|
+
const [name] = specifier.split("/");
|
|
102
|
+
return name ?? specifier;
|
|
103
|
+
}
|
|
104
|
+
function isBuiltinPackage(packageName) {
|
|
105
|
+
return builtinModules.includes(packageName) || builtinModules.includes(packageName.replace(/^node:/, ""));
|
|
106
|
+
}
|
|
107
|
+
function mergeFiles(files, extraFiles) {
|
|
108
|
+
return [...new Set([...files, ...extraFiles])].sort();
|
|
109
|
+
}
|
|
110
|
+
async function mapScriptEntryFiles(rootDir, fileEntries) {
|
|
111
|
+
const mappedEntries = await Promise.all(fileEntries.map(async (filePath) => {
|
|
112
|
+
const mappedPath = await mapToSourcePath(rootDir, filePath);
|
|
113
|
+
return path.relative(rootDir, mappedPath) || path.basename(mappedPath);
|
|
114
|
+
}));
|
|
115
|
+
return [...new Set(mappedEntries)].sort();
|
|
116
|
+
}
|
|
117
|
+
function getUnusedDeclaredPackages(declaredPackages, usedPackages) {
|
|
118
|
+
const usedSet = new Set(usedPackages);
|
|
119
|
+
return [...declaredPackages]
|
|
120
|
+
.filter((packageName) => !usedSet.has(packageName))
|
|
121
|
+
.sort();
|
|
122
|
+
}
|
|
123
|
+
function getMisplacedDevDependencies(files, devDependencies) {
|
|
124
|
+
const misplaced = new Set();
|
|
125
|
+
for (const file of files) {
|
|
126
|
+
if (!file.isProduction) {
|
|
127
|
+
continue;
|
|
128
|
+
}
|
|
129
|
+
for (const specifier of file.imports) {
|
|
130
|
+
if (!isExternalSpecifier(specifier)) {
|
|
131
|
+
continue;
|
|
132
|
+
}
|
|
133
|
+
const packageName = getPackageName(specifier);
|
|
134
|
+
if (devDependencies.has(packageName)) {
|
|
135
|
+
misplaced.add(packageName);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
return [...misplaced].sort();
|
|
140
|
+
}
|
|
141
|
+
function isProductionFilePath(rootDir, filePath) {
|
|
142
|
+
const relativePath = path.relative(rootDir, filePath);
|
|
143
|
+
const normalizedPath = relativePath.split(path.sep).join("/");
|
|
144
|
+
return !(normalizedPath.includes("/__tests__/") ||
|
|
145
|
+
normalizedPath.includes("/__mocks__/") ||
|
|
146
|
+
normalizedPath.includes("/fixtures/") ||
|
|
147
|
+
normalizedPath.includes("/test-utils/") ||
|
|
148
|
+
/\.test\.[^.]+$/i.test(normalizedPath) ||
|
|
149
|
+
/\.spec\.[^.]+$/i.test(normalizedPath) ||
|
|
150
|
+
/\.stories\.[^.]+$/i.test(normalizedPath));
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=scan.js.map
|
package/dist/scan.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scan.js","sourceRoot":"","sources":["../src/scan.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export interface ParsedScripts {
|
|
2
|
+
commandPackages: string[];
|
|
3
|
+
fileEntries: string[];
|
|
4
|
+
commandUsage: Record<string, string[]>;
|
|
5
|
+
}
|
|
6
|
+
export declare function parsePackageScripts(packageDir: string, scripts: Record<string, string>): Promise<ParsedScripts>;
|
|
7
|
+
//# sourceMappingURL=scriptParser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scriptParser.d.ts","sourceRoot":"","sources":["../src/scriptParser.ts"],"names":[],"mappings":"AAoBA,MAAM,WAAW,aAAa;IAC5B,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;CACxC;AAED,wBAAsB,mBAAmB,CACvC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC9B,OAAO,CAAC,aAAa,CAAC,CAyCxB"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { access } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
const COMMAND_SPLIT_RE = /\s*(?:&&|\|\||;)\s*/;
|
|
4
|
+
const TOKEN_RE = /"[^"]*"|'[^']*'|`[^`]*`|[^\s]+/g;
|
|
5
|
+
const BUILTIN_SCRIPT_COMMANDS = new Set([
|
|
6
|
+
"node",
|
|
7
|
+
"npm",
|
|
8
|
+
"pnpm",
|
|
9
|
+
"yarn",
|
|
10
|
+
"bun",
|
|
11
|
+
"npx",
|
|
12
|
+
"pnpx",
|
|
13
|
+
"sh",
|
|
14
|
+
"bash",
|
|
15
|
+
]);
|
|
16
|
+
const COMMAND_PACKAGE_ALIASES = {
|
|
17
|
+
tsc: "typescript",
|
|
18
|
+
};
|
|
19
|
+
export async function parsePackageScripts(packageDir, scripts) {
|
|
20
|
+
const commandPackages = new Set();
|
|
21
|
+
const fileEntries = new Set();
|
|
22
|
+
const commandUsage = new Map();
|
|
23
|
+
for (const [scriptName, script] of Object.entries(scripts)) {
|
|
24
|
+
const segments = script.split(COMMAND_SPLIT_RE);
|
|
25
|
+
for (const segment of segments) {
|
|
26
|
+
const tokens = tokenize(segment);
|
|
27
|
+
if (tokens.length === 0) {
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
30
|
+
const commandPackage = resolveCommandPackage(tokens);
|
|
31
|
+
if (commandPackage) {
|
|
32
|
+
commandPackages.add(commandPackage);
|
|
33
|
+
addUsage(commandUsage, commandPackage, `script:${scriptName}`);
|
|
34
|
+
}
|
|
35
|
+
for (const token of tokens) {
|
|
36
|
+
const cleaned = stripQuotes(token);
|
|
37
|
+
if (looksLikeFileReference(cleaned)) {
|
|
38
|
+
const absolutePath = path.resolve(packageDir, cleaned);
|
|
39
|
+
if (await fileExists(absolutePath)) {
|
|
40
|
+
fileEntries.add(absolutePath);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return {
|
|
47
|
+
commandPackages: [...commandPackages].sort(),
|
|
48
|
+
fileEntries: [...fileEntries].sort(),
|
|
49
|
+
commandUsage: mapUsage(commandUsage),
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
function tokenize(command) {
|
|
53
|
+
return command.match(TOKEN_RE)?.map((token) => token.trim()).filter(Boolean) ?? [];
|
|
54
|
+
}
|
|
55
|
+
function resolveCommandPackage(tokens) {
|
|
56
|
+
const [first, second] = tokens;
|
|
57
|
+
if (!first) {
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
const command = stripQuotes(first);
|
|
61
|
+
if (command === "npx" || command === "pnpx") {
|
|
62
|
+
return second ? normalizeCommandName(stripQuotes(second)) : null;
|
|
63
|
+
}
|
|
64
|
+
if (BUILTIN_SCRIPT_COMMANDS.has(command)) {
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
return normalizeCommandName(command);
|
|
68
|
+
}
|
|
69
|
+
function normalizeCommandName(command) {
|
|
70
|
+
const aliasedPackage = COMMAND_PACKAGE_ALIASES[command];
|
|
71
|
+
if (aliasedPackage) {
|
|
72
|
+
return aliasedPackage;
|
|
73
|
+
}
|
|
74
|
+
if (command.startsWith("@")) {
|
|
75
|
+
const [scope, name] = command.split("/");
|
|
76
|
+
return scope && name ? `${scope}/${name}` : command;
|
|
77
|
+
}
|
|
78
|
+
return command;
|
|
79
|
+
}
|
|
80
|
+
function looksLikeFileReference(token) {
|
|
81
|
+
if (token.startsWith("-")) {
|
|
82
|
+
return false;
|
|
83
|
+
}
|
|
84
|
+
return (token.startsWith("./") ||
|
|
85
|
+
token.startsWith("../") ||
|
|
86
|
+
token.endsWith(".js") ||
|
|
87
|
+
token.endsWith(".cjs") ||
|
|
88
|
+
token.endsWith(".mjs") ||
|
|
89
|
+
token.endsWith(".ts") ||
|
|
90
|
+
token.endsWith(".cts") ||
|
|
91
|
+
token.endsWith(".mts") ||
|
|
92
|
+
token.endsWith(".jsx") ||
|
|
93
|
+
token.endsWith(".tsx"));
|
|
94
|
+
}
|
|
95
|
+
function stripQuotes(value) {
|
|
96
|
+
return value.replace(/^['"`]|['"`]$/g, "");
|
|
97
|
+
}
|
|
98
|
+
async function fileExists(filePath) {
|
|
99
|
+
try {
|
|
100
|
+
await access(filePath);
|
|
101
|
+
return true;
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
return false;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
function addUsage(usageMap, packageName, source) {
|
|
108
|
+
const entries = usageMap.get(packageName) ?? new Set();
|
|
109
|
+
entries.add(source);
|
|
110
|
+
usageMap.set(packageName, entries);
|
|
111
|
+
}
|
|
112
|
+
function mapUsage(usageMap) {
|
|
113
|
+
return Object.fromEntries([...usageMap.entries()]
|
|
114
|
+
.map(([packageName, entries]) => [packageName, [...entries].sort()])
|
|
115
|
+
.sort(([left], [right]) => left.localeCompare(right)));
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=scriptParser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scriptParser.js","sourceRoot":"","sources":["../src/scriptParser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sourceMapper.d.ts","sourceRoot":"","sources":["../src/sourceMapper.ts"],"names":[],"mappings":"AAUA,wBAAsB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAcxF"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { access, readFile } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
const SOURCE_EXTENSIONS = [".ts", ".tsx", ".mts", ".cts", ".js", ".jsx", ".mjs", ".cjs"];
|
|
4
|
+
export async function mapToSourcePath(rootDir, filePath) {
|
|
5
|
+
const sourceMapMatch = await mapUsingSourceMap(filePath);
|
|
6
|
+
if (sourceMapMatch) {
|
|
7
|
+
return sourceMapMatch;
|
|
8
|
+
}
|
|
9
|
+
const distHeuristicMatch = await mapDistPathToSource(rootDir, filePath);
|
|
10
|
+
if (distHeuristicMatch) {
|
|
11
|
+
return distHeuristicMatch;
|
|
12
|
+
}
|
|
13
|
+
return filePath;
|
|
14
|
+
}
|
|
15
|
+
async function mapUsingSourceMap(filePath) {
|
|
16
|
+
const sourceMapPath = `${filePath}.map`;
|
|
17
|
+
try {
|
|
18
|
+
const sourceMap = JSON.parse(await readFile(sourceMapPath, "utf8"));
|
|
19
|
+
const sourceRoot = sourceMap.sourceRoot ?? "";
|
|
20
|
+
for (const source of sourceMap.sources ?? []) {
|
|
21
|
+
const resolvedSource = path.resolve(path.dirname(sourceMapPath), sourceRoot, source);
|
|
22
|
+
if (await fileExists(resolvedSource)) {
|
|
23
|
+
return resolvedSource;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
async function mapDistPathToSource(rootDir, filePath) {
|
|
33
|
+
const relativePath = path.relative(rootDir, filePath);
|
|
34
|
+
const normalizedPath = relativePath.split(path.sep).join("/");
|
|
35
|
+
if (!normalizedPath.startsWith("dist/")) {
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
const withoutDistPrefix = normalizedPath.replace(/^dist\//, "");
|
|
39
|
+
const parsedPath = path.parse(withoutDistPrefix);
|
|
40
|
+
for (const extension of SOURCE_EXTENSIONS) {
|
|
41
|
+
const candidate = path.join(rootDir, "src", parsedPath.dir, `${parsedPath.name}${extension}`);
|
|
42
|
+
if (await fileExists(candidate)) {
|
|
43
|
+
return candidate;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
async function fileExists(filePath) {
|
|
49
|
+
try {
|
|
50
|
+
await access(filePath);
|
|
51
|
+
return true;
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=sourceMapper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sourceMapper.js","sourceRoot":"","sources":["../src/sourceMapper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,IAAI,MAAM,WAAW,CAAC;AAO7B,MAAM,iBAAiB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAEzF,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAAe,EAAE,QAAgB;IACrE,MAAM,cAAc,GAAG,MAAM,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAEzD,IAAI,cAAc,EAAE,CAAC;QACnB,OAAO,cAAc,CAAC;IACxB,CAAC;IAED,MAAM,kBAAkB,GAAG,MAAM,mBAAmB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAExE,IAAI,kBAAkB,EAAE,CAAC;QACvB,OAAO,kBAAkB,CAAC;IAC5B,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,QAAgB;IAC/C,MAAM,aAAa,GAAG,GAAG,QAAQ,MAAM,CAAC;IAExC,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC,CAAmB,CAAC;QACtF,MAAM,UAAU,GAAG,SAAS,CAAC,UAAU,IAAI,EAAE,CAAC;QAE9C,KAAK,MAAM,MAAM,IAAI,SAAS,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC;YAC7C,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;YAErF,IAAI,MAAM,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;gBACrC,OAAO,cAAc,CAAC;YACxB,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,KAAK,UAAU,mBAAmB,CAAC,OAAe,EAAE,QAAgB;IAClE,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IACtD,MAAM,cAAc,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAE9D,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACxC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,iBAAiB,GAAG,cAAc,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IAChE,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;IAEjD,KAAK,MAAM,SAAS,IAAI,iBAAiB,EAAE,CAAC;QAC1C,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,UAAU,CAAC,GAAG,EAAE,GAAG,UAAU,CAAC,IAAI,GAAG,SAAS,EAAE,CAAC,CAAC;QAE9F,IAAI,MAAM,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAChC,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,QAAgB;IACxC,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;QACvB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export interface WorkspaceTarget {
|
|
2
|
+
name: string;
|
|
3
|
+
dir: string;
|
|
4
|
+
packagePath: string;
|
|
5
|
+
relativeDir: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function discoverWorkspaces(startDir: string, filters: string[]): Promise<{
|
|
8
|
+
rootDir: string;
|
|
9
|
+
workspaces: WorkspaceTarget[];
|
|
10
|
+
}>;
|
|
11
|
+
//# sourceMappingURL=workspaceFinder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspaceFinder.d.ts","sourceRoot":"","sources":["../src/workspaceFinder.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB;AAWD,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EAAE,GAChB,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,eAAe,EAAE,CAAA;CAAE,CAAC,CAsB7D"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import fg from "fast-glob";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { findNearestPackageJson, readPackageJson } from "./packageReader.js";
|
|
4
|
+
export async function discoverWorkspaces(startDir, filters) {
|
|
5
|
+
const rootPackagePath = await findNearestPackageJson(startDir);
|
|
6
|
+
const rootDir = path.dirname(rootPackagePath);
|
|
7
|
+
const rootPackage = (await readPackageJson(rootPackagePath));
|
|
8
|
+
const workspacePatterns = normalizeWorkspacePatterns(rootPackage.workspaces);
|
|
9
|
+
const workspaces = workspacePatterns.length > 0
|
|
10
|
+
? await findDeclaredWorkspaces(rootDir, workspacePatterns)
|
|
11
|
+
: [createWorkspaceTarget(rootDir, rootPackagePath, rootPackage.name)];
|
|
12
|
+
const filteredWorkspaces = filters.length > 0
|
|
13
|
+
? workspaces.filter((workspace) => matchesWorkspaceFilter(workspace, filters))
|
|
14
|
+
: workspaces;
|
|
15
|
+
if (filteredWorkspaces.length === 0) {
|
|
16
|
+
throw new Error(`No workspaces matched: ${filters.join(", ")}`);
|
|
17
|
+
}
|
|
18
|
+
return {
|
|
19
|
+
rootDir,
|
|
20
|
+
workspaces: filteredWorkspaces,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
async function findDeclaredWorkspaces(rootDir, patterns) {
|
|
24
|
+
const packageFiles = await fg(patterns.map((pattern) => normalizeWorkspacePattern(pattern)), {
|
|
25
|
+
cwd: rootDir,
|
|
26
|
+
absolute: true,
|
|
27
|
+
onlyFiles: true,
|
|
28
|
+
ignore: ["**/node_modules/**", "**/dist/**", "**/.git/**"],
|
|
29
|
+
});
|
|
30
|
+
const workspaceTargets = await Promise.all(packageFiles.map(async (packagePath) => {
|
|
31
|
+
const packageJson = (await readPackageJson(packagePath));
|
|
32
|
+
return createWorkspaceTarget(path.dirname(packagePath), packagePath, packageJson.name, rootDir);
|
|
33
|
+
}));
|
|
34
|
+
return workspaceTargets.sort((left, right) => left.relativeDir.localeCompare(right.relativeDir));
|
|
35
|
+
}
|
|
36
|
+
function normalizeWorkspacePatterns(workspaces) {
|
|
37
|
+
if (Array.isArray(workspaces)) {
|
|
38
|
+
return workspaces;
|
|
39
|
+
}
|
|
40
|
+
if (workspaces?.packages) {
|
|
41
|
+
return workspaces.packages;
|
|
42
|
+
}
|
|
43
|
+
return [];
|
|
44
|
+
}
|
|
45
|
+
function normalizeWorkspacePattern(pattern) {
|
|
46
|
+
return pattern.endsWith("/package.json") ? pattern : `${pattern.replace(/\/$/, "")}/package.json`;
|
|
47
|
+
}
|
|
48
|
+
function createWorkspaceTarget(dir, packagePath, packageName, rootDir = dir) {
|
|
49
|
+
const relativeDir = path.relative(rootDir, dir) || ".";
|
|
50
|
+
return {
|
|
51
|
+
name: packageName ?? path.basename(dir),
|
|
52
|
+
dir,
|
|
53
|
+
packagePath,
|
|
54
|
+
relativeDir,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
function matchesWorkspaceFilter(workspace, filters) {
|
|
58
|
+
return filters.some((filter) => workspace.name === filter ||
|
|
59
|
+
workspace.relativeDir === filter ||
|
|
60
|
+
workspace.relativeDir.startsWith(filter));
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=workspaceFinder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspaceFinder.js","sourceRoot":"","sources":["../src/workspaceFinder.ts"],"names":[],"mappings":"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"}
|