From cf17e5c15f2e30cdd386fe8bb1cdfcb14f6ae385 Mon Sep 17 00:00:00 2001 From: Thomas GENTILHOMME Date: Sat, 4 Jun 2022 12:49:13 +0200 Subject: [PATCH] feat: detect Node.js core dependency prefixed with 'node:' --- src/utils/analyzeDependencies.js | 15 +++++++++++++-- test/utils/analyzeDependencies.spec.js | 21 +++++++++++++++++++++ 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/src/utils/analyzeDependencies.js b/src/utils/analyzeDependencies.js index 5256b3a9..61783ebc 100644 --- a/src/utils/analyzeDependencies.js +++ b/src/utils/analyzeDependencies.js @@ -15,7 +15,7 @@ export function analyzeDependencies(dependencies, deps = {}) { const thirdPartyDependencies = dependencies .map((name) => (packageDeps.includes(name) ? name : getPackageName(name))) .filter((name) => !name.startsWith(".")) - .filter((name) => !kNodeModules.has(name)) + .filter((name) => !isNodeCoreModule(name)) .filter((name) => !packageDevDeps.includes(name)) .filter((name) => !tryDependencies.has(name)); @@ -24,7 +24,7 @@ export function analyzeDependencies(dependencies, deps = {}) { thirdPartyDependencies ); const missingDependencies = [...new Set(difference(thirdPartyDependencies, packageDeps))]; - const nodeDependencies = dependencies.filter((name) => kNodeModules.has(name)); + const nodeDependencies = dependencies.filter((name) => isNodeCoreModule(name)); return { nodeDependencies, @@ -38,3 +38,14 @@ export function analyzeDependencies(dependencies, deps = {}) { } }; } + +/** + * @param {!string} moduleName + * @returns {boolean} + */ +function isNodeCoreModule(moduleName) { + const cleanModuleName = moduleName.startsWith("node:") ? moduleName.slice(5) : moduleName; + + // Note: We need to also check moduleName because builtins package only return true for 'node:test'. + return kNodeModules.has(cleanModuleName) || kNodeModules.has(moduleName); +} diff --git a/test/utils/analyzeDependencies.spec.js b/test/utils/analyzeDependencies.spec.js index d2f7ca78..ebf420db 100644 --- a/test/utils/analyzeDependencies.spec.js +++ b/test/utils/analyzeDependencies.spec.js @@ -24,6 +24,27 @@ test("analyzeDependencies should detect Node.js dependencies and also flag hasEx tape.end(); }); +test("analyzeDependencies should detect prefixed (namespaced 'node:') core dependencies", (tape) => { + const packageDeps = ["node:foobar"]; + const packageDevDeps = []; + + const result = analyzeDependencies([ + "node:fs", + "node:test", + "node:foobar" + ], { packageDeps, packageDevDeps, tryDependencies: new Set() }); + + tape.deepEqual(result, { + nodeDependencies: ["node:fs", "node:test"], + thirdPartyDependencies: ["node:foobar"], + unusedDependencies: [], + missingDependencies: [], + flags: { hasExternalCapacity: false, hasMissingOrUnusedDependency: false } + }); + + tape.end(); +}); + test("analyzeDependencies should be capable of detecting unused dependency 'koa'", (tape) => { const packageDeps = ["koa", "kleur"]; const packageDevDeps = ["mocha"];