70 lines
2.0 KiB
JavaScript
70 lines
2.0 KiB
JavaScript
"use strict";
|
|
|
|
var _redux = require("../redux");
|
|
|
|
var _lodash = require("lodash");
|
|
|
|
const createRequireFromPath = require(`./create-require-from-path`);
|
|
|
|
const {
|
|
join,
|
|
dirname
|
|
} = require(`path`);
|
|
|
|
const fs = require(`fs`);
|
|
|
|
const {
|
|
promisify
|
|
} = require(`util`);
|
|
|
|
const readFile = promisify(fs.readFile);
|
|
|
|
const getAllDependencies = (pkg, {
|
|
noDev
|
|
} = {}) => new Set([...Object.entries(pkg.dependencies || {}), ...Object.entries(!noDev && pkg.devDependencies || {}), ...Object.entries(pkg.optionalDependencies || {})]);
|
|
|
|
const readJSON = async file => {
|
|
const buffer = await readFile(file);
|
|
return JSON.parse(buffer.toString());
|
|
};
|
|
|
|
const getTreeFromNodeModules = async (dir, filterFn = () => true, results = new Map()) => {
|
|
const requireFromHere = createRequireFromPath(`${dir}/:internal:`);
|
|
let packageJSON;
|
|
|
|
try {
|
|
packageJSON = await readJSON(require.resolve(join(dir, `package.json`)));
|
|
} catch (error) {
|
|
packageJSON = {};
|
|
}
|
|
|
|
await Promise.all(Array.from(getAllDependencies(packageJSON)).map(async ([name, version]) => {
|
|
try {
|
|
const currentDependency = {
|
|
name,
|
|
version,
|
|
path: dirname(requireFromHere.resolve(`${name}/package.json`))
|
|
};
|
|
|
|
if (filterFn(currentDependency)) {
|
|
await getTreeFromNodeModules(currentDependency.path, filterFn, results);
|
|
if (!results.has(currentDependency.name)) results.set(currentDependency.name, currentDependency);
|
|
}
|
|
} catch (error) {// Sometimes dev dependencies of dependencies aren't installed
|
|
// when using `yarn`. This is okay and safe to ignore.
|
|
}
|
|
}));
|
|
return Array.from(results.values());
|
|
}; // Returns [Object] with name and path
|
|
|
|
|
|
module.exports = (0, _lodash.memoize)(async () => {
|
|
const {
|
|
program
|
|
} = _redux.store.getState();
|
|
|
|
const nodeModules = await getTreeFromNodeModules(program.directory, // Include anything that has `gatsby` in its name but not `gatsby` itself
|
|
dependency => /gatsby/.test(dependency.name) && dependency.name !== `gatsby`);
|
|
return nodeModules;
|
|
});
|
|
//# sourceMappingURL=gatsby-dependents.js.map
|