Files
30-seconds-of-code/node_modules/gatsby/dist/utils/gatsby-dependents.js
2019-08-20 15:52:05 +02:00

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