optiprune 1.0.0

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 (57) hide show
  1. package/LICENSE +7 -0
  2. package/README.md +49 -0
  3. package/dist/cache.d.ts +14 -0
  4. package/dist/cache.js +36 -0
  5. package/dist/cache.js.map +1 -0
  6. package/dist/cli.d.ts +2 -0
  7. package/dist/cli.js +53 -0
  8. package/dist/cli.js.map +1 -0
  9. package/dist/config-loader.d.ts +4 -0
  10. package/dist/config-loader.js +68 -0
  11. package/dist/config-loader.js.map +1 -0
  12. package/dist/coverage-tracker.d.ts +39 -0
  13. package/dist/coverage-tracker.js +61 -0
  14. package/dist/coverage-tracker.js.map +1 -0
  15. package/dist/fs-utils.d.ts +33 -0
  16. package/dist/fs-utils.js +334 -0
  17. package/dist/fs-utils.js.map +1 -0
  18. package/dist/graph.d.ts +28 -0
  19. package/dist/graph.js +331 -0
  20. package/dist/graph.js.map +1 -0
  21. package/dist/index.d.ts +3 -0
  22. package/dist/index.js +313 -0
  23. package/dist/index.js.map +1 -0
  24. package/dist/instrument.d.ts +1 -0
  25. package/dist/instrument.js +20 -0
  26. package/dist/instrument.js.map +1 -0
  27. package/dist/instrumentation-plugin.d.ts +6 -0
  28. package/dist/instrumentation-plugin.js +84 -0
  29. package/dist/instrumentation-plugin.js.map +1 -0
  30. package/dist/layer2.d.ts +6 -0
  31. package/dist/layer2.js +227 -0
  32. package/dist/layer2.js.map +1 -0
  33. package/dist/layer3.d.ts +7 -0
  34. package/dist/layer3.js +244 -0
  35. package/dist/layer3.js.map +1 -0
  36. package/dist/layer4.d.ts +7 -0
  37. package/dist/layer4.js +90 -0
  38. package/dist/layer4.js.map +1 -0
  39. package/dist/layer5.d.ts +6 -0
  40. package/dist/layer5.js +141 -0
  41. package/dist/layer5.js.map +1 -0
  42. package/dist/layer6.d.ts +25 -0
  43. package/dist/layer6.js +183 -0
  44. package/dist/layer6.js.map +1 -0
  45. package/dist/parser.d.ts +24 -0
  46. package/dist/parser.js +481 -0
  47. package/dist/parser.js.map +1 -0
  48. package/dist/reporters.d.ts +3 -0
  49. package/dist/reporters.js +75 -0
  50. package/dist/reporters.js.map +1 -0
  51. package/dist/types.d.ts +205 -0
  52. package/dist/types.js +11 -0
  53. package/dist/types.js.map +1 -0
  54. package/dist/workspace.d.ts +6 -0
  55. package/dist/workspace.js +114 -0
  56. package/dist/workspace.js.map +1 -0
  57. package/package.json +112 -0
@@ -0,0 +1,334 @@
1
+ import { promises as fs } from "node:fs";
2
+ import path from "pathe";
3
+ const SOURCE_EXTENSION_ALIASES = new Map([
4
+ [".js", [".ts", ".tsx", ".js", ".jsx"]],
5
+ [".jsx", [".tsx", ".jsx"]],
6
+ [".mjs", [".mts", ".mjs", ".ts", ".js"]],
7
+ [".cjs", [".cts", ".cjs", ".ts", ".js"]],
8
+ ]);
9
+ export const DEFAULT_EXTENSIONS = [
10
+ ".ts",
11
+ ".tsx",
12
+ ".mts",
13
+ ".cts",
14
+ ".js",
15
+ ".jsx",
16
+ ".mjs",
17
+ ".cjs",
18
+ ];
19
+ export const DEFAULT_IGNORE = [
20
+ "**/node_modules/**",
21
+ "**/.git/**",
22
+ "**/dist/**",
23
+ "**/build/**",
24
+ "**/coverage/**",
25
+ "**/.next/**",
26
+ "**/.turbo/**",
27
+ "**/.cache/**",
28
+ "**/vendor/**",
29
+ ];
30
+ /**
31
+ * Normalizes paths universally for all operating systems and virtual filesystems.
32
+ * Ensures Windows drive letters are capitalized and separators are POSIX-style.
33
+ */
34
+ export function normalizeCanonicalPath(filePath) {
35
+ if (!filePath)
36
+ return "";
37
+ // 1. Force backslashes to forward slashes
38
+ let posixPath = filePath.replace(/\\/g, "/");
39
+ // 2. Handle Windows Drive Letter (e.g., c:/ -> C:/)
40
+ // We check for the pattern "a:/" at the start
41
+ if (/^[a-z]:\//i.test(posixPath)) {
42
+ posixPath = posixPath.charAt(0).toUpperCase() + posixPath.slice(1);
43
+ }
44
+ // 3. Normalize using POSIX logic to avoid OS-specific quirks
45
+ const normalized = path.posix.normalize(posixPath);
46
+ // 4. Strip trailing slash unless it's the root
47
+ return normalized.length > 1 && normalized.endsWith("/")
48
+ ? normalized.slice(0, -1)
49
+ : normalized;
50
+ }
51
+ export function toPosix(value) {
52
+ return normalizeCanonicalPath(value);
53
+ }
54
+ export function normalizeAbsolute(value) {
55
+ // Use path.resolve first to get the OS-specific absolute path, then canonicalize
56
+ return normalizeCanonicalPath(path.resolve(value));
57
+ }
58
+ export function pathInside(parent, candidate) {
59
+ const p = normalizeCanonicalPath(parent);
60
+ const c = normalizeCanonicalPath(candidate);
61
+ const relative = path.posix.relative(p, c);
62
+ return relative === "" || (!relative.startsWith("..") && !path.posix.isAbsolute(relative));
63
+ }
64
+ function escapeRegex(value) {
65
+ return value.replace(/[|\\{}()[\]^$+?.]/g, "\\$&");
66
+ }
67
+ /** A deliberately small glob matcher supporting the configuration patterns this tool documents. */
68
+ export function globToRegExp(pattern) {
69
+ let source = "^";
70
+ const normalized = pattern.replace(/\\/g, "/");
71
+ for (let index = 0; index < normalized.length; index += 1) {
72
+ const char = normalized[index];
73
+ const next = normalized[index + 1];
74
+ if (char === "*" && next === "*") {
75
+ const after = normalized[index + 2];
76
+ if (after === "/") {
77
+ source += "(?:.*/)?";
78
+ index += 2;
79
+ }
80
+ else {
81
+ source += ".*";
82
+ index += 1;
83
+ }
84
+ }
85
+ else if (char === "*") {
86
+ source += "[^/]*";
87
+ }
88
+ else if (char === "?") {
89
+ source += "[^/]";
90
+ }
91
+ else {
92
+ source += escapeRegex(char ?? "");
93
+ }
94
+ }
95
+ source += "$";
96
+ return new RegExp(source);
97
+ }
98
+ export function compileGlobs(patterns) {
99
+ return patterns.map(globToRegExp);
100
+ }
101
+ export function matchesAnyGlob(relativePath, compiledPatterns) {
102
+ const normalized = toPosix(relativePath).replace(/^\.\//, "");
103
+ return compiledPatterns.some((pattern) => pattern.test(normalized));
104
+ }
105
+ export async function fileExists(candidate) {
106
+ try {
107
+ const status = await fs.stat(candidate);
108
+ return status.isFile();
109
+ }
110
+ catch {
111
+ return false;
112
+ }
113
+ }
114
+ export async function directoryExists(candidate) {
115
+ try {
116
+ const status = await fs.stat(candidate);
117
+ return status.isDirectory();
118
+ }
119
+ catch {
120
+ return false;
121
+ }
122
+ }
123
+ export async function discoverSourceFiles(rootDir, extensions, compiledIgnorePatterns) {
124
+ const discovered = [];
125
+ const normalizedRoot = normalizeAbsolute(rootDir);
126
+ async function walk(currentDirectory) {
127
+ let entries;
128
+ try {
129
+ entries = await fs.readdir(currentDirectory, { encoding: "utf8", withFileTypes: true });
130
+ }
131
+ catch {
132
+ return;
133
+ }
134
+ for (const entry of entries) {
135
+ const absolute = path.join(currentDirectory, entry.name.toString());
136
+ const relative = toPosix(path.posix.relative(normalizedRoot, normalizeAbsolute(absolute)));
137
+ const probe = entry.isDirectory() ? `${relative}/` : relative;
138
+ if (matchesAnyGlob(probe, compiledIgnorePatterns)) {
139
+ continue;
140
+ }
141
+ if (entry.isDirectory()) {
142
+ await walk(absolute);
143
+ }
144
+ else if (entry.isFile() && extensions.includes(path.extname(entry.name.toString()))) {
145
+ discovered.push(normalizeAbsolute(absolute));
146
+ }
147
+ }
148
+ }
149
+ await walk(normalizedRoot);
150
+ return discovered.sort((left, right) => left.localeCompare(right));
151
+ }
152
+ export function isLikelyLocalSpecifier(specifier) {
153
+ return specifier.startsWith(".") || specifier.startsWith("/") || specifier.startsWith("file:");
154
+ }
155
+ export function removeQueryAndHash(specifier) {
156
+ return specifier.replace(/[?#].*$/, "");
157
+ }
158
+ /**
159
+ * Resolves an import specifier against a set of known files.
160
+ * Uses POSIX path logic for consistency across platforms.
161
+ */
162
+ export function resolveLocalSpecifier(sourceFilePath, rawSpecifier, knownFiles, extensions = [".ts", ".tsx", ".js", ".jsx", ".json"]) {
163
+ const cleaned = removeQueryAndHash(rawSpecifier);
164
+ if (!isLikelyLocalSpecifier(cleaned)) {
165
+ return undefined;
166
+ }
167
+ // Use path.posix.dirname on a canonical path
168
+ const sourceDir = path.posix.dirname(normalizeCanonicalPath(sourceFilePath));
169
+ const absoluteBasePath = normalizeCanonicalPath(path.posix.resolve(sourceDir, cleaned));
170
+ const existsInKnown = (p) => knownFiles instanceof Set ? knownFiles.has(p) : knownFiles.has(p);
171
+ // Strategy A: Exact match
172
+ if (existsInKnown(absoluteBasePath)) {
173
+ return absoluteBasePath;
174
+ }
175
+ // Strategy B: Append extensions
176
+ for (const ext of extensions) {
177
+ const candidate = `${absoluteBasePath}${ext}`;
178
+ if (existsInKnown(candidate)) {
179
+ return candidate;
180
+ }
181
+ }
182
+ // Strategy C: Search for index file
183
+ for (const ext of extensions) {
184
+ const candidate = `${absoluteBasePath}/index${ext}`;
185
+ if (existsInKnown(candidate)) {
186
+ return candidate;
187
+ }
188
+ }
189
+ return undefined;
190
+ }
191
+ function candidateSpecifiers(fromFile, candidate) {
192
+ const from = normalizeCanonicalPath(fromFile);
193
+ const target = normalizeCanonicalPath(candidate);
194
+ // Use path.posix.relative on canonical paths
195
+ const relative = path.posix.relative(path.posix.dirname(from), target);
196
+ const withPrefix = relative.startsWith(".") ? relative : `./${relative}`;
197
+ const extension = path.posix.extname(withPrefix);
198
+ const withoutExtension = extension ? withPrefix.slice(0, -extension.length) : withPrefix;
199
+ const aliases = extension ? SOURCE_EXTENSION_ALIASES.get(extension) ?? [extension] : [""];
200
+ const mapped = aliases.map((alias) => `${withoutExtension}${alias}`);
201
+ return [...new Set([withPrefix, withoutExtension, ...mapped])];
202
+ }
203
+ export function resolveDynamicPattern(fromFile, prefix, suffix, knownFiles) {
204
+ if (!isLikelyLocalSpecifier(prefix)) {
205
+ return [];
206
+ }
207
+ const matches = [];
208
+ for (const candidate of knownFiles) {
209
+ const forms = candidateSpecifiers(fromFile, candidate);
210
+ if (forms.some((form) => form.startsWith(prefix) && form.endsWith(suffix))) {
211
+ matches.push(candidate);
212
+ }
213
+ }
214
+ return matches.sort((left, right) => left.localeCompare(right));
215
+ }
216
+ export function expandEntryPatterns(sourceFiles, rootDir, patterns) {
217
+ const matches = new Set();
218
+ const normalizedRoot = normalizeAbsolute(rootDir);
219
+ for (const pattern of patterns) {
220
+ const direct = normalizeAbsolute(path.resolve(rootDir, pattern));
221
+ if (sourceFiles.includes(direct)) {
222
+ matches.add(direct);
223
+ continue;
224
+ }
225
+ let p = toPosix(pattern).replace(/^\.\//, "");
226
+ if (path.posix.isAbsolute(p)) {
227
+ p = path.posix.relative(normalizedRoot, p);
228
+ }
229
+ const matcher = globToRegExp(p);
230
+ for (const sourceFile of sourceFiles) {
231
+ const relative = path.posix.relative(normalizedRoot, sourceFile);
232
+ if (matcher.test(relative)) {
233
+ matches.add(sourceFile);
234
+ }
235
+ }
236
+ }
237
+ return [...matches].sort((left, right) => left.localeCompare(right));
238
+ }
239
+ export async function discoverPackageEntryPatterns(rootDir) {
240
+ const packageFile = path.join(rootDir, "package.json");
241
+ try {
242
+ const parsed = JSON.parse(await fs.readFile(packageFile, "utf8"));
243
+ if (parsed === null || typeof parsed !== "object" || Array.isArray(parsed)) {
244
+ return [];
245
+ }
246
+ const packageJson = parsed;
247
+ const entries = new Set();
248
+ for (const field of ["main", "module", "browser", "types", "typings"]) {
249
+ if (typeof packageJson[field] === "string") {
250
+ entries.add(packageJson[field]);
251
+ }
252
+ }
253
+ collectPackageExportStrings(packageJson.exports, entries);
254
+ return [...entries]
255
+ .filter((entry) => entry.startsWith(".") || entry.startsWith("src/") || entry.startsWith("lib/"))
256
+ .map((entry) => entry.replace(/^\.\//, ""));
257
+ }
258
+ catch {
259
+ return [];
260
+ }
261
+ }
262
+ function collectPackageExportStrings(value, collected) {
263
+ if (typeof value === "string") {
264
+ collected.add(value);
265
+ }
266
+ else if (Array.isArray(value)) {
267
+ for (const item of value) {
268
+ collectPackageExportStrings(item, collected);
269
+ }
270
+ }
271
+ else if (value !== null && typeof value === "object") {
272
+ for (const nested of Object.values(value)) {
273
+ collectPackageExportStrings(nested, collected);
274
+ }
275
+ }
276
+ }
277
+ export function conventionalEntryPatterns() {
278
+ return [
279
+ "src/main.*",
280
+ "src/index.*",
281
+ "src/app.*",
282
+ "src/server.*",
283
+ "src/cli.*",
284
+ "app/**/*.{ts,tsx,js,jsx}",
285
+ "pages/**/*.{ts,tsx,js,jsx}",
286
+ ];
287
+ }
288
+ export function normalizedConventionalEntryPatterns() {
289
+ return [
290
+ "src/main.*",
291
+ "src/index.*",
292
+ "src/app.*",
293
+ "src/server.*",
294
+ "src/cli.*",
295
+ "app/**/*.ts",
296
+ "app/**/*.tsx",
297
+ "app/**/*.js",
298
+ "app/**/*.jsx",
299
+ "pages/**/*.ts",
300
+ "pages/**/*.tsx",
301
+ "pages/**/*.js",
302
+ "pages/**/*.jsx",
303
+ ];
304
+ }
305
+ export async function readJsonFile(candidate) {
306
+ try {
307
+ return JSON.parse(await fs.readFile(candidate, "utf8"));
308
+ }
309
+ catch {
310
+ return undefined;
311
+ }
312
+ }
313
+ export async function findNearestConfig(startDirectory) {
314
+ let current = normalizeAbsolute(startDirectory);
315
+ while (true) {
316
+ const candidate = path.join(current, "deadcode-sentinel.config.json");
317
+ if (await fileExists(candidate)) {
318
+ return candidate;
319
+ }
320
+ const parent = path.posix.dirname(current);
321
+ if (parent === current) {
322
+ return undefined;
323
+ }
324
+ current = parent;
325
+ }
326
+ }
327
+ export function relativeDisplayPath(rootDir, candidate) {
328
+ const relative = path.posix.relative(normalizeAbsolute(rootDir), normalizeAbsolute(candidate));
329
+ return relative || ".";
330
+ }
331
+ export async function rootLooksValid(rootDir) {
332
+ return directoryExists(rootDir);
333
+ }
334
+ //# sourceMappingURL=fs-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs-utils.js","sourceRoot":"","sources":["../src/fs-utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import type { AnalysisContext, DependencyEdge, ModuleRecord, ResolvedOptions, StronglyConnectedComponent } from "./types.js";
2
+ export interface GraphBuildResult {
3
+ components: StronglyConnectedComponent[];
4
+ reachable: Set<string>;
5
+ maybeReachable: Set<string>;
6
+ hasReachableUnknownDynamicBoundary: boolean;
7
+ usedExports: Set<string>;
8
+ }
9
+ export interface ImportUsage {
10
+ consumers: Set<string>;
11
+ names: Set<string>;
12
+ wildcard: boolean;
13
+ reExportOnly: boolean;
14
+ }
15
+ export declare function resolveDependencies(modules: Map<string, ModuleRecord>, options: ResolvedOptions): void;
16
+ export declare function edgeTargets(edge: DependencyEdge): string[];
17
+ /** Kosaraju with explicit stacks avoids stack overflows on deep graphs and cycles. */
18
+ export declare function stronglyConnectedComponents(modules: Map<string, ModuleRecord>): StronglyConnectedComponent[];
19
+ /**
20
+ * Traverse the graph iteratively. Pattern imports and edges extracted from malformed files
21
+ * propagate `maybe` reachability. A reachable completely unknown dynamic boundary makes every
22
+ * project module only maybe-reachable, preventing unsafe unreachable-file claims.
23
+ */
24
+ export declare function calculateReachability(modules: Map<string, ModuleRecord>, entryPoints: Set<string>): Pick<GraphBuildResult, "reachable" | "maybeReachable" | "hasReachableUnknownDynamicBoundary">;
25
+ export declare function buildImportUsage(modules: Map<string, ModuleRecord>): Map<string, ImportUsage>;
26
+ export declare function buildUsedExports(modules: Map<string, ModuleRecord>): Set<string>;
27
+ export declare function buildGraph(modules: Map<string, ModuleRecord>, entryPoints: Set<string>, options: ResolvedOptions): GraphBuildResult;
28
+ export declare function contextWithGraph(modules: Map<string, ModuleRecord>, entryPoints: Set<string>, options: ResolvedOptions): AnalysisContext;