@noahnu/unused-files 0.2.1 → 0.2.3
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 +12 -0
 - package/lib/api/index.js +12 -9
 - package/lib/api/utils.d.ts +1 -0
 - package/lib/api/utils.js +19 -0
 - package/lib/api/walkDependencyTree.js +11 -0
 - package/lib/command.js +17 -7
 - package/package.json +2 -2
 
    
        package/CHANGELOG.md
    CHANGED
    
    | 
         @@ -2,6 +2,18 @@ 
     | 
|
| 
       2 
2 
     | 
    
         | 
| 
       3 
3 
     | 
    
         
             
            <!-- MONOWEAVE:BELOW -->
         
     | 
| 
       4 
4 
     | 
    
         | 
| 
      
 5 
     | 
    
         
            +
            ## @noahnu/unused-files (v0.2.3) <a name="0.2.3"></a>
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
            Ignore builtins.
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
            ## @noahnu/unused-files (v0.2.2) <a name="0.2.2"></a>
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
            Filter out files based on source directories.
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
       5 
17 
     | 
    
         
             
            ## @noahnu/unused-files (v0.2.1) <a name="0.2.1"></a>
         
     | 
| 
       6 
18 
     | 
    
         | 
| 
       7 
19 
     | 
    
         
             
            Respect ignorePatterns for visiting files.
         
     | 
    
        package/lib/api/index.js
    CHANGED
    
    | 
         @@ -8,6 +8,7 @@ const node_fs_1 = __importDefault(require("node:fs")); 
     | 
|
| 
       8 
8 
     | 
    
         
             
            const node_path_1 = __importDefault(require("node:path"));
         
     | 
| 
       9 
9 
     | 
    
         
             
            const debug_1 = __importDefault(require("debug"));
         
     | 
| 
       10 
10 
     | 
    
         
             
            const fast_glob_1 = __importDefault(require("fast-glob"));
         
     | 
| 
      
 11 
     | 
    
         
            +
            const utils_1 = require("./utils");
         
     | 
| 
       11 
12 
     | 
    
         
             
            const walkDependencyTree_1 = require("./walkDependencyTree");
         
     | 
| 
       12 
13 
     | 
    
         
             
            const debug = (0, debug_1.default)('unused-files');
         
     | 
| 
       13 
14 
     | 
    
         
             
            async function findUnusedFiles({ entryFiles, ignorePatterns = ['**/node_modules'], sourceDirectories = [], resolvers, depth, cwd = process.cwd(), }) {
         
     | 
| 
         @@ -19,14 +20,14 @@ async function findUnusedFiles({ entryFiles, ignorePatterns = ['**/node_modules' 
     | 
|
| 
       19 
20 
     | 
    
         
             
                        absolute: true,
         
     | 
| 
       20 
21 
     | 
    
         
             
                        cwd,
         
     | 
| 
       21 
22 
     | 
    
         
             
                    });
         
     | 
| 
       22 
     | 
    
         
            -
                    return Promise.all(files.map(async (file) => await  
     | 
| 
      
 23 
     | 
    
         
            +
                    return Promise.all(files.map(async (file) => await (0, utils_1.resolveRealpath)(file)));
         
     | 
| 
       23 
24 
     | 
    
         
             
                };
         
     | 
| 
       24 
25 
     | 
    
         
             
                const sourceDirs = sourceDirectories.length > 0 ? sourceDirectories : [cwd];
         
     | 
| 
       25 
26 
     | 
    
         
             
                const files = new Set([].concat(...(await Promise.all(sourceDirs.map((source) => globFromSource(source))))));
         
     | 
| 
       26 
27 
     | 
    
         
             
                const unvisitedFiles = new Set(files);
         
     | 
| 
       27 
28 
     | 
    
         
             
                const visitedFiles = new Set();
         
     | 
| 
       28 
29 
     | 
    
         
             
                for (const entryFile of entryFiles) {
         
     | 
| 
       29 
     | 
    
         
            -
                    const entry = await  
     | 
| 
      
 30 
     | 
    
         
            +
                    const entry = await (0, utils_1.resolveRealpath)(node_path_1.default.resolve(cwd, entryFile));
         
     | 
| 
       30 
31 
     | 
    
         
             
                    unvisitedFiles.delete(entry);
         
     | 
| 
       31 
32 
     | 
    
         
             
                    for await (const { source, dependency } of (0, walkDependencyTree_1.walkDependencyTree)(entry, {
         
     | 
| 
       32 
33 
     | 
    
         
             
                        resolvers,
         
     | 
| 
         @@ -39,7 +40,7 @@ async function findUnusedFiles({ entryFiles, ignorePatterns = ['**/node_modules' 
     | 
|
| 
       39 
40 
     | 
    
         
             
                            debug(`${source}: ${dependency} [dependency]`);
         
     | 
| 
       40 
41 
     | 
    
         
             
                        }
         
     | 
| 
       41 
42 
     | 
    
         
             
                        else {
         
     | 
| 
       42 
     | 
    
         
            -
                            const realpath = await  
     | 
| 
      
 43 
     | 
    
         
            +
                            const realpath = await (0, utils_1.resolveRealpath)(dependency);
         
     | 
| 
       43 
44 
     | 
    
         
             
                            if (files.has(realpath)) {
         
     | 
| 
       44 
45 
     | 
    
         
             
                                resolvedDependency = realpath;
         
     | 
| 
       45 
46 
     | 
    
         
             
                            }
         
     | 
| 
         @@ -50,12 +51,14 @@ async function findUnusedFiles({ entryFiles, ignorePatterns = ['**/node_modules' 
     | 
|
| 
       50 
51 
     | 
    
         
             
                        unvisitedFiles.delete(resolvedDependency);
         
     | 
| 
       51 
52 
     | 
    
         
             
                    }
         
     | 
| 
       52 
53 
     | 
    
         
             
                }
         
     | 
| 
      
 54 
     | 
    
         
            +
                const unused = Array.from(unvisitedFiles.intersection(files))
         
     | 
| 
      
 55 
     | 
    
         
            +
                    .map((abspath) => node_path_1.default.relative(cwd, abspath))
         
     | 
| 
      
 56 
     | 
    
         
            +
                    .sort();
         
     | 
| 
      
 57 
     | 
    
         
            +
                const used = Array.from(visitedFiles.intersection(files))
         
     | 
| 
      
 58 
     | 
    
         
            +
                    .map((abspath) => node_path_1.default.relative(cwd, abspath))
         
     | 
| 
      
 59 
     | 
    
         
            +
                    .sort();
         
     | 
| 
       53 
60 
     | 
    
         
             
                return {
         
     | 
| 
       54 
     | 
    
         
            -
                    unused 
     | 
| 
       55 
     | 
    
         
            -
             
     | 
| 
       56 
     | 
    
         
            -
                        .sort(),
         
     | 
| 
       57 
     | 
    
         
            -
                    used: Array.from(visitedFiles)
         
     | 
| 
       58 
     | 
    
         
            -
                        .map((abspath) => node_path_1.default.relative(cwd, abspath))
         
     | 
| 
       59 
     | 
    
         
            -
                        .sort(),
         
     | 
| 
      
 61 
     | 
    
         
            +
                    unused,
         
     | 
| 
      
 62 
     | 
    
         
            +
                    used,
         
     | 
| 
       60 
63 
     | 
    
         
             
                };
         
     | 
| 
       61 
64 
     | 
    
         
             
            }
         
     | 
| 
         @@ -0,0 +1 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            export declare function resolveRealpath(request: string): Promise<string>;
         
     | 
    
        package/lib/api/utils.js
    ADDED
    
    | 
         @@ -0,0 +1,19 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            "use strict";
         
     | 
| 
      
 2 
     | 
    
         
            +
            var __importDefault = (this && this.__importDefault) || function (mod) {
         
     | 
| 
      
 3 
     | 
    
         
            +
                return (mod && mod.__esModule) ? mod : { "default": mod };
         
     | 
| 
      
 4 
     | 
    
         
            +
            };
         
     | 
| 
      
 5 
     | 
    
         
            +
            Object.defineProperty(exports, "__esModule", { value: true });
         
     | 
| 
      
 6 
     | 
    
         
            +
            exports.resolveRealpath = resolveRealpath;
         
     | 
| 
      
 7 
     | 
    
         
            +
            const node_fs_1 = __importDefault(require("node:fs"));
         
     | 
| 
      
 8 
     | 
    
         
            +
            const node_module_1 = require("node:module");
         
     | 
| 
      
 9 
     | 
    
         
            +
            async function resolveRealpath(request) {
         
     | 
| 
      
 10 
     | 
    
         
            +
                if ((0, node_module_1.isBuiltin)(request)) {
         
     | 
| 
      
 11 
     | 
    
         
            +
                    return request;
         
     | 
| 
      
 12 
     | 
    
         
            +
                }
         
     | 
| 
      
 13 
     | 
    
         
            +
                try {
         
     | 
| 
      
 14 
     | 
    
         
            +
                    return await node_fs_1.default.promises.realpath(request);
         
     | 
| 
      
 15 
     | 
    
         
            +
                }
         
     | 
| 
      
 16 
     | 
    
         
            +
                catch {
         
     | 
| 
      
 17 
     | 
    
         
            +
                    return request;
         
     | 
| 
      
 18 
     | 
    
         
            +
                }
         
     | 
| 
      
 19 
     | 
    
         
            +
            }
         
     | 
| 
         @@ -5,10 +5,12 @@ var __importDefault = (this && this.__importDefault) || function (mod) { 
     | 
|
| 
       5 
5 
     | 
    
         
             
            Object.defineProperty(exports, "__esModule", { value: true });
         
     | 
| 
       6 
6 
     | 
    
         
             
            exports.walkDependencyTree = walkDependencyTree;
         
     | 
| 
       7 
7 
     | 
    
         
             
            const node_fs_1 = __importDefault(require("node:fs"));
         
     | 
| 
      
 8 
     | 
    
         
            +
            const node_module_1 = require("node:module");
         
     | 
| 
       8 
9 
     | 
    
         
             
            const node_path_1 = __importDefault(require("node:path"));
         
     | 
| 
       9 
10 
     | 
    
         
             
            const typescript_estree_1 = require("@typescript-eslint/typescript-estree");
         
     | 
| 
       10 
11 
     | 
    
         
             
            const debug_1 = __importDefault(require("debug"));
         
     | 
| 
       11 
12 
     | 
    
         
             
            const micromatch_1 = __importDefault(require("micromatch"));
         
     | 
| 
      
 13 
     | 
    
         
            +
            const utils_1 = require("./utils");
         
     | 
| 
       12 
14 
     | 
    
         
             
            const debug = (0, debug_1.default)('unused-files:parse');
         
     | 
| 
       13 
15 
     | 
    
         
             
            const DEFAULT_DEPTH_LIMIT = -1; // no depth limit
         
     | 
| 
       14 
16 
     | 
    
         
             
            const VALID_EXTENSIONS = new Set(['ts', 'tsx', 'mts', 'cts', 'js', 'jsx', 'mjs', 'cjs']);
         
     | 
| 
         @@ -18,6 +20,8 @@ async function* walkDependencyTree(source, { resolvers, visited, depth = DEFAULT 
     | 
|
| 
       18 
20 
     | 
    
         
             
                    debug(`${source}: Unknown file extension '${ext}' [skipping]`);
         
     | 
| 
       19 
21 
     | 
    
         
             
                    return;
         
     | 
| 
       20 
22 
     | 
    
         
             
                }
         
     | 
| 
      
 23 
     | 
    
         
            +
                // Convert to realpath if possible
         
     | 
| 
      
 24 
     | 
    
         
            +
                source = await (0, utils_1.resolveRealpath)(source);
         
     | 
| 
       21 
25 
     | 
    
         
             
                const visitedSet = visited ?? new Set();
         
     | 
| 
       22 
26 
     | 
    
         
             
                if (visitedSet.has(source))
         
     | 
| 
       23 
27 
     | 
    
         
             
                    return;
         
     | 
| 
         @@ -88,6 +92,13 @@ async function* walkDependencyTree(source, { resolvers, visited, depth = DEFAULT 
     | 
|
| 
       88 
92 
     | 
    
         
             
                    return undefined;
         
     | 
| 
       89 
93 
     | 
    
         
             
                };
         
     | 
| 
       90 
94 
     | 
    
         
             
                for (const importFrom of Array.from(importFroms)) {
         
     | 
| 
      
 95 
     | 
    
         
            +
                    if ((0, node_module_1.isBuiltin)(importFrom))
         
     | 
| 
      
 96 
     | 
    
         
            +
                        continue;
         
     | 
| 
      
 97 
     | 
    
         
            +
                    if (ignorePatterns && micromatch_1.default.isMatch(importFrom, ignorePatterns)) {
         
     | 
| 
      
 98 
     | 
    
         
            +
                        // ignorePatterns is used on the initial request so it doesn't get to the resolvers
         
     | 
| 
      
 99 
     | 
    
         
            +
                        // as well as on the returned result
         
     | 
| 
      
 100 
     | 
    
         
            +
                        continue;
         
     | 
| 
      
 101 
     | 
    
         
            +
                    }
         
     | 
| 
       91 
102 
     | 
    
         
             
                    const absPath = await resolveToAbsPath(importFrom);
         
     | 
| 
       92 
103 
     | 
    
         
             
                    if (absPath) {
         
     | 
| 
       93 
104 
     | 
    
         
             
                        if (ignorePatterns && micromatch_1.default.isMatch(absPath, ignorePatterns)) {
         
     | 
    
        package/lib/command.js
    CHANGED
    
    | 
         @@ -15,13 +15,23 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? ( 
     | 
|
| 
       15 
15 
     | 
    
         
             
            }) : function(o, v) {
         
     | 
| 
       16 
16 
     | 
    
         
             
                o["default"] = v;
         
     | 
| 
       17 
17 
     | 
    
         
             
            });
         
     | 
| 
       18 
     | 
    
         
            -
            var __importStar = (this && this.__importStar) || function ( 
     | 
| 
       19 
     | 
    
         
            -
                 
     | 
| 
       20 
     | 
    
         
            -
             
     | 
| 
       21 
     | 
    
         
            -
             
     | 
| 
       22 
     | 
    
         
            -
             
     | 
| 
       23 
     | 
    
         
            -
             
     | 
| 
       24 
     | 
    
         
            -
            };
         
     | 
| 
      
 18 
     | 
    
         
            +
            var __importStar = (this && this.__importStar) || (function () {
         
     | 
| 
      
 19 
     | 
    
         
            +
                var ownKeys = function(o) {
         
     | 
| 
      
 20 
     | 
    
         
            +
                    ownKeys = Object.getOwnPropertyNames || function (o) {
         
     | 
| 
      
 21 
     | 
    
         
            +
                        var ar = [];
         
     | 
| 
      
 22 
     | 
    
         
            +
                        for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
         
     | 
| 
      
 23 
     | 
    
         
            +
                        return ar;
         
     | 
| 
      
 24 
     | 
    
         
            +
                    };
         
     | 
| 
      
 25 
     | 
    
         
            +
                    return ownKeys(o);
         
     | 
| 
      
 26 
     | 
    
         
            +
                };
         
     | 
| 
      
 27 
     | 
    
         
            +
                return function (mod) {
         
     | 
| 
      
 28 
     | 
    
         
            +
                    if (mod && mod.__esModule) return mod;
         
     | 
| 
      
 29 
     | 
    
         
            +
                    var result = {};
         
     | 
| 
      
 30 
     | 
    
         
            +
                    if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
         
     | 
| 
      
 31 
     | 
    
         
            +
                    __setModuleDefault(result, mod);
         
     | 
| 
      
 32 
     | 
    
         
            +
                    return result;
         
     | 
| 
      
 33 
     | 
    
         
            +
                };
         
     | 
| 
      
 34 
     | 
    
         
            +
            })();
         
     | 
| 
       25 
35 
     | 
    
         
             
            Object.defineProperty(exports, "__esModule", { value: true });
         
     | 
| 
       26 
36 
     | 
    
         
             
            exports.BaseCommand = void 0;
         
     | 
| 
       27 
37 
     | 
    
         
             
            const clipanion_1 = require("clipanion");
         
     | 
    
        package/package.json
    CHANGED
    
    | 
         @@ -1,6 +1,6 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            {
         
     | 
| 
       2 
2 
     | 
    
         
             
              "name": "@noahnu/unused-files",
         
     | 
| 
       3 
     | 
    
         
            -
              "version": "0.2. 
     | 
| 
      
 3 
     | 
    
         
            +
              "version": "0.2.3",
         
     | 
| 
       4 
4 
     | 
    
         
             
              "repository": {
         
     | 
| 
       5 
5 
     | 
    
         
             
                "type": "git",
         
     | 
| 
       6 
6 
     | 
    
         
             
                "url": "https://github.com/noahnu/nodejs-tools.git",
         
     | 
| 
         @@ -43,7 +43,7 @@ 
     | 
|
| 
       43 
43 
     | 
    
         
             
                "@noahnu/internal-test-utils": "0.0.0",
         
     | 
| 
       44 
44 
     | 
    
         
             
                "@types/micromatch": "^4.0.9",
         
     | 
| 
       45 
45 
     | 
    
         
             
                "@types/node": "^22.9.0",
         
     | 
| 
       46 
     | 
    
         
            -
                "typescript": "^5. 
     | 
| 
      
 46 
     | 
    
         
            +
                "typescript": "^5.7.2"
         
     | 
| 
       47 
47 
     | 
    
         
             
              },
         
     | 
| 
       48 
48 
     | 
    
         
             
              "types": "./lib/api/index.d.ts"
         
     | 
| 
       49 
49 
     | 
    
         
             
            }
         
     |