1 | "use strict";
|
2 |
|
3 | var _redux = require("../redux");
|
4 |
|
5 | var _lodash = require("lodash");
|
6 |
|
7 | const createRequireFromPath = require(`./create-require-from-path`);
|
8 |
|
9 | const {
|
10 | join,
|
11 | dirname
|
12 | } = require(`path`);
|
13 |
|
14 | const fs = require(`fs`);
|
15 |
|
16 | const {
|
17 | promisify
|
18 | } = require(`util`);
|
19 |
|
20 | const readFile = promisify(fs.readFile);
|
21 |
|
22 | const getAllDependencies = (pkg, {
|
23 | noDev
|
24 | } = {}) => new Set([...Object.entries(pkg.dependencies || {}), ...Object.entries(!noDev && pkg.devDependencies || {}), ...Object.entries(pkg.optionalDependencies || {})]);
|
25 |
|
26 | const readJSON = async file => {
|
27 | const buffer = await readFile(file);
|
28 | return JSON.parse(buffer.toString());
|
29 | };
|
30 |
|
31 | const 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) {
|
54 |
|
55 | }
|
56 | }));
|
57 | return Array.from(results.values());
|
58 | };
|
59 |
|
60 |
|
61 | module.exports = (0, _lodash.memoize)(async () => {
|
62 | const {
|
63 | program
|
64 | } = _redux.store.getState();
|
65 |
|
66 | const nodeModules = await getTreeFromNodeModules(program.directory,
|
67 | dependency => /gatsby/.test(dependency.name) && dependency.name !== `gatsby`);
|
68 | return nodeModules;
|
69 | });
|
70 |
|
\ | No newline at end of file |