pruny 1.1.23 → 1.1.26

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 (2) hide show
  1. package/dist/index.js +56 -54
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -7651,7 +7651,7 @@ var API_METHOD_PATTERNS = [
7651
7651
  { regex: /fetch\s*\(\s*['"`]\/api\/([^'"`\s)]+)['"`]/g, method: undefined },
7652
7652
  { regex: /fetch\s*\(\s*`\/api\/([^`\s)]+)`/g, method: undefined },
7653
7653
  { regex: /['"`]\/api\/([^'"`\s]+)['"`]/g, method: undefined },
7654
- { regex: /['"`](?:https?:\/\/[^\/]+)?\/api\/([^'"`\s]+)['"`]/g, method: undefined }
7654
+ { regex: /['"`](?:https?:\/\/[^/]+)?\/api\/([^'"`\s]+)['"`]/g, method: undefined }
7655
7655
  ];
7656
7656
  function extractApiReferences(content) {
7657
7657
  const matches = [];
@@ -9531,79 +9531,84 @@ Config:`));
9531
9531
  console.log(JSON.stringify(result, null, 2));
9532
9532
  return;
9533
9533
  }
9534
- console.log(source_default.bold(`\uD83D\uDCCA Results
9534
+ const partiallyUnusedRoutes = result.routes.filter((r) => r.used && r.unusedMethods.length > 0);
9535
+ if (partiallyUnusedRoutes.length > 0) {
9536
+ console.log(source_default.yellow.bold(`⚠️ Partially Unused API Routes:
9535
9537
  `));
9536
- console.log(` Total routes: ${result.total}`);
9537
- console.log(source_default.green(` Full use: ${result.routes.filter((r) => r.used && r.unusedMethods.length === 0).length}`));
9538
- console.log(source_default.yellow(` Partial use: ${result.routes.filter((r) => r.used && r.unusedMethods.length > 0).length}`));
9539
- console.log(source_default.red(` Unused: ${result.unused}`));
9540
- if (result.publicAssets) {
9541
- console.log("");
9542
- console.log(source_default.bold("\uD83D\uDDBC️ Public Assets"));
9543
- console.log(` Total assets: ${result.publicAssets.total}`);
9544
- console.log(source_default.green(` Used assets: ${result.publicAssets.used}`));
9545
- console.log(source_default.red(` Unused assets: ${result.publicAssets.unused}`));
9546
- }
9547
- if (result.unusedFiles) {
9538
+ const tableData = partiallyUnusedRoutes.map((r) => ({
9539
+ Route: r.path,
9540
+ "Unused Methods": r.unusedMethods.join(", "),
9541
+ File: r.filePath
9542
+ }));
9543
+ console.table(tableData);
9548
9544
  console.log("");
9549
- console.log(source_default.bold("\uD83D\uDCC4 Source Files"));
9550
- console.log(source_default.red(` Unused files: ${result.unusedFiles.total}`));
9551
9545
  }
9552
- console.log("");
9553
9546
  const unusedRoutes = result.routes.filter((r) => !r.used);
9554
9547
  if (unusedRoutes.length > 0) {
9555
9548
  console.log(source_default.red.bold(`❌ Unused API Routes (Fully Unused):
9556
9549
  `));
9557
- for (const route of unusedRoutes) {
9558
- const methods = route.methods.length > 0 ? ` (${route.methods.join(", ")})` : "";
9559
- console.log(source_default.red(` ${route.path}${source_default.dim(methods)}`));
9560
- console.log(source_default.dim(` → ${route.filePath}`));
9561
- }
9562
- console.log("");
9563
- }
9564
- const partiallyUnusedRoutes = result.routes.filter((r) => r.used && r.unusedMethods.length > 0);
9565
- if (partiallyUnusedRoutes.length > 0) {
9566
- console.log(source_default.yellow.bold(`⚠️ Partially Unused API Routes:
9567
- `));
9568
- for (const route of partiallyUnusedRoutes) {
9569
- console.log(source_default.yellow(` ${route.path}`));
9570
- console.log(source_default.red(` ❌ Unused: ${route.unusedMethods.join(", ")}`));
9571
- console.log(source_default.dim(` → ${route.filePath}`));
9572
- }
9550
+ const tableData = unusedRoutes.map((r) => ({
9551
+ Route: r.path,
9552
+ Methods: r.methods.join(", "),
9553
+ File: r.filePath
9554
+ }));
9555
+ console.table(tableData);
9573
9556
  console.log("");
9574
9557
  }
9575
- if (unusedRoutes.length === 0 && partiallyUnusedRoutes.length === 0) {
9576
- console.log(source_default.green(`✅ All API routes and methods are used!
9577
- `));
9578
- }
9579
9558
  if (result.publicAssets) {
9580
9559
  const unusedAssets = result.publicAssets.assets.filter((a) => !a.used);
9581
9560
  if (unusedAssets.length > 0) {
9582
- console.log(source_default.red.bold(`❌ Unused Public Assets:
9561
+ console.log(source_default.red.bold(`\uD83D\uDDBC️ Unused Public Assets:
9583
9562
  `));
9584
- for (const asset of unusedAssets) {
9585
- console.log(source_default.red(` ${asset.relativePath}`));
9586
- console.log(source_default.dim(` → ${asset.path}`));
9587
- }
9563
+ const tableData = unusedAssets.map((a) => ({
9564
+ Asset: a.relativePath,
9565
+ Path: a.path.replace(process.cwd(), ".")
9566
+ }));
9567
+ console.table(tableData);
9588
9568
  console.log("");
9589
- } else if (result.publicAssets.total > 0) {
9590
- console.log(source_default.green(`✅ All public assets are used!
9591
- `));
9592
9569
  }
9593
9570
  }
9594
9571
  if (result.unusedFiles && result.unusedFiles.files.length > 0) {
9595
- console.log(source_default.red.bold(`❌ Unused Source Files:
9572
+ console.log(source_default.red.bold(`\uD83D\uDCC4 Unused Source Files:
9596
9573
  `));
9597
- for (const file of result.unusedFiles.files) {
9598
- const sizeKb = (file.size / 1024).toFixed(1);
9599
- console.log(source_default.red(` ${file.path} ${source_default.dim(`(${sizeKb} KB)`)}`));
9600
- }
9574
+ const tableData = result.unusedFiles.files.map((f) => ({
9575
+ File: f.path,
9576
+ Size: (f.size / 1024).toFixed(1) + " KB"
9577
+ }));
9578
+ console.table(tableData);
9601
9579
  console.log("");
9602
9580
  }
9581
+ if (unusedRoutes.length === 0 && partiallyUnusedRoutes.length === 0 && (!result.publicAssets || result.publicAssets.unused === 0)) {
9582
+ console.log(source_default.green(`✅ Everything is used! Clean as a whistle.
9583
+ `));
9584
+ }
9585
+ console.log(source_default.bold(`\uD83D\uDCCA Summary Report
9586
+ `));
9587
+ const summary = [
9588
+ { Category: "API Routes", Total: result.total, Used: result.used, Unused: result.unused }
9589
+ ];
9590
+ if (result.publicAssets) {
9591
+ summary.push({
9592
+ Category: "Public Assets",
9593
+ Total: result.publicAssets.total,
9594
+ Used: result.publicAssets.used,
9595
+ Unused: result.publicAssets.unused
9596
+ });
9597
+ }
9598
+ if (result.unusedFiles) {
9599
+ summary.push({
9600
+ Category: "Source Files",
9601
+ Total: "-",
9602
+ Used: "-",
9603
+ Unused: result.unusedFiles.total
9604
+ });
9605
+ }
9606
+ console.table(summary);
9607
+ console.log("");
9603
9608
  if (options.verbose) {
9604
9609
  const used = result.routes.filter((r) => r.used);
9605
9610
  if (used.length > 0) {
9606
- console.log(source_default.green.bold(`✅ Used routes:
9611
+ console.log(source_default.green.bold(`✅ Used routes (References):
9607
9612
  `));
9608
9613
  for (const route of used) {
9609
9614
  console.log(source_default.green(` ${route.path}`));
@@ -9634,9 +9639,6 @@ Config:`));
9634
9639
  }
9635
9640
  console.log(source_default.green(`
9636
9641
  ✅ Deleted ${unusedRoutes.length} unused route(s).
9637
- `));
9638
- } else {
9639
- console.log(source_default.yellow(`No unused routes to delete.
9640
9642
  `));
9641
9643
  }
9642
9644
  } else if (unusedRoutes.length > 0) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pruny",
3
- "version": "1.1.23",
3
+ "version": "1.1.26",
4
4
  "description": "Find and remove unused Next.js API routes",
5
5
  "type": "module",
6
6
  "files": [