UNPKG

2.09 kBJavaScriptView Raw
1"use strict";
2
3var _redux = require("../redux");
4
5var _lodash = require("lodash");
6
7const createRequireFromPath = require(`./create-require-from-path`);
8
9const {
10 join,
11 dirname
12} = require(`path`);
13
14const fs = require(`fs`);
15
16const {
17 promisify
18} = require(`util`);
19
20const readFile = promisify(fs.readFile);
21
22const getAllDependencies = (pkg, {
23 noDev
24} = {}) => new Set([...Object.entries(pkg.dependencies || {}), ...Object.entries(!noDev && pkg.devDependencies || {}), ...Object.entries(pkg.optionalDependencies || {})]);
25
26const readJSON = async file => {
27 const buffer = await readFile(file);
28 return JSON.parse(buffer.toString());
29};
30
31const getTreeFromNodeModules = async (dir, filterFn = () => true, results = new Map()) => {
32 const requireFromHere = createRequireFromPath(`${dir}/:internal:`);
33 let packageJSON;
34
35 try {
36 packageJSON = await readJSON(require.resolve(join(dir, `package.json`)));
37 } catch (error) {
38 packageJSON = {};
39 }
40
41 await Promise.all(Array.from(getAllDependencies(packageJSON)).map(async ([name, version]) => {
42 try {
43 const currentDependency = {
44 name,
45 version,
46 path: dirname(requireFromHere.resolve(`${name}/package.json`))
47 };
48
49 if (filterFn(currentDependency)) {
50 await getTreeFromNodeModules(currentDependency.path, filterFn, results);
51 if (!results.has(currentDependency.name)) results.set(currentDependency.name, currentDependency);
52 }
53 } catch (error) {// Sometimes dev dependencies of dependencies aren't installed
54 // when using `yarn`. This is okay and safe to ignore.
55 }
56 }));
57 return Array.from(results.values());
58}; // Returns [Object] with name and path
59
60
61module.exports = (0, _lodash.memoize)(async () => {
62 const {
63 program
64 } = _redux.store.getState();
65
66 const nodeModules = await getTreeFromNodeModules(program.directory, // Include anything that has `gatsby` in its name but not `gatsby` itself
67 dependency => /gatsby/.test(dependency.name) && dependency.name !== `gatsby`);
68 return nodeModules;
69});
70//# sourceMappingURL=gatsby-dependents.js.map
\No newline at end of file