diff --git a/.github/helpers/npm-audit/find-direct-dependencies.cjs b/.github/helpers/npm-audit/find-direct-dependencies.cjs index 4b8c1e8..c23b5f9 100644 --- a/.github/helpers/npm-audit/find-direct-dependencies.cjs +++ b/.github/helpers/npm-audit/find-direct-dependencies.cjs @@ -1,14 +1,32 @@ -const fs = require('fs'); -const path = require('path'); +const fs = require("fs"); +const path = require("path"); // Function to find direct dependencies of a specified dependency -const findDirectDependencies = (dependencyName) => { +const findDirectDependencies = (dependencyName, directoryPath) => { // Read and parse the package-lock.json file - const packageLock = JSON.parse(fs.readFileSync(path.resolve(__dirname, '../../../package-lock.json'), 'utf-8')); + const packageLock = JSON.parse( + fs.readFileSync( + path.resolve(__dirname, `../../../${directoryPath}/package-lock.json`), + "utf-8" + ) + ); + const packageJson = JSON.parse( + fs.readFileSync( + path.resolve(__dirname, `../../../${directoryPath}/package.json`), + "utf-8" + ) + ); + + const dependencies = { + ...packageJson.dependencies, + ...packageJson.devDependencies, + }; const packages = packageLock.packages || {}; const directDependencies = new Set(); - let isDirect = false; + + // Check if the specified dependency is a direct dependency + const isDirect = dependencies.hasOwnProperty(dependencyName); // Function to find dependencies iteratively using a stack const findDependencies = (startPackage) => { @@ -23,27 +41,27 @@ const findDirectDependencies = (dependencyName) => { const currentPackage = packages[packageName]; if (!currentPackage || !currentPackage.dependencies) continue; - for (const [name] of Object.entries(currentPackage.dependencies)) { - const newPath = [...path, name]; + for (const name of Object.keys(currentPackage.dependencies)) { const packageKey = `node_modules/${name}`; - if (name === dependencyName) { - // Add the top-level dependency to the set if it leads to the specified dependency - directDependencies.add(path[0]); + if (!visited.has(packageKey)) { + stack.push({ packageName: packageKey, path: [...path, name] }); + } + if (name !== dependencyName && dependencies.hasOwnProperty(name)) { + directDependencies.add(name); } - stack.push({ packageName: packageKey, path: newPath }); } } }; // Check direct dependencies in the root package - const rootPackage = packages[''] || {}; - const rootDependencies = { ...rootPackage.dependencies, ...rootPackage.devDependencies }; - - // If the specified dependency is a direct dependency, set the flag and add to the set - if (rootDependencies && rootDependencies[dependencyName]) { - isDirect = true; - directDependencies.add(dependencyName); - } else { + const rootPackage = packages[""] || {}; + const rootDependencies = { + ...rootPackage.dependencies, + ...rootPackage.devDependencies, + }; + + // If the specified dependency is a direct dependency, do nothing + if (!isDirect) { // Iterate through each root dependency and find the specified dependency for (const rootDep in rootDependencies) { const packageKey = `node_modules/${rootDep}`; @@ -52,7 +70,10 @@ const findDirectDependencies = (dependencyName) => { } // Return the result indicating if it's a direct dependency and the direct dependencies - return { isDirect, directDependencies: Array.from(directDependencies) }; + return { + isDirect, + directDependencies: Array.from(directDependencies), + }; }; module.exports = findDirectDependencies;