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.
Files changed (56) hide show
  1. package/CHANGELOG.md +62 -0
  2. package/LICENSE +21 -0
  3. package/README.md +343 -0
  4. package/dist/aiClient.d.ts +4 -0
  5. package/dist/aiClient.d.ts.map +1 -0
  6. package/dist/aiClient.js +152 -0
  7. package/dist/aiClient.js.map +1 -0
  8. package/dist/aiConfig.d.ts +19 -0
  9. package/dist/aiConfig.d.ts.map +1 -0
  10. package/dist/aiConfig.js +28 -0
  11. package/dist/aiConfig.js.map +1 -0
  12. package/dist/config.d.ts +26 -0
  13. package/dist/config.d.ts.map +1 -0
  14. package/dist/config.js +32 -0
  15. package/dist/config.js.map +1 -0
  16. package/dist/fileFinder.d.ts +2 -0
  17. package/dist/fileFinder.d.ts.map +1 -0
  18. package/dist/fileFinder.js +14 -0
  19. package/dist/fileFinder.js.map +1 -0
  20. package/dist/findings.d.ts +13 -0
  21. package/dist/findings.d.ts.map +1 -0
  22. package/dist/findings.js +52 -0
  23. package/dist/findings.js.map +1 -0
  24. package/dist/importParser.d.ts +6 -0
  25. package/dist/importParser.d.ts.map +1 -0
  26. package/dist/importParser.js +36 -0
  27. package/dist/importParser.js.map +1 -0
  28. package/dist/index.d.ts +3 -0
  29. package/dist/index.d.ts.map +1 -0
  30. package/dist/index.js +185 -0
  31. package/dist/index.js.map +1 -0
  32. package/dist/packageReader.d.ts +14 -0
  33. package/dist/packageReader.d.ts.map +1 -0
  34. package/dist/packageReader.js +51 -0
  35. package/dist/packageReader.js.map +1 -0
  36. package/dist/reporters.d.ts +42 -0
  37. package/dist/reporters.d.ts.map +1 -0
  38. package/dist/reporters.js +138 -0
  39. package/dist/reporters.js.map +1 -0
  40. package/dist/scan.d.ts +25 -0
  41. package/dist/scan.d.ts.map +1 -0
  42. package/dist/scan.js +152 -0
  43. package/dist/scan.js.map +1 -0
  44. package/dist/scriptParser.d.ts +7 -0
  45. package/dist/scriptParser.d.ts.map +1 -0
  46. package/dist/scriptParser.js +117 -0
  47. package/dist/scriptParser.js.map +1 -0
  48. package/dist/sourceMapper.d.ts +2 -0
  49. package/dist/sourceMapper.d.ts.map +1 -0
  50. package/dist/sourceMapper.js +57 -0
  51. package/dist/sourceMapper.js.map +1 -0
  52. package/dist/workspaceFinder.d.ts +11 -0
  53. package/dist/workspaceFinder.d.ts.map +1 -0
  54. package/dist/workspaceFinder.js +62 -0
  55. package/dist/workspaceFinder.js.map +1 -0
  56. 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
@@ -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,2 @@
1
+ export declare function mapToSourcePath(rootDir: string, filePath: string): Promise<string>;
2
+ //# sourceMappingURL=sourceMapper.d.ts.map
@@ -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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"}