1 | #!/usr/bin/env node
|
2 |
|
3 | const { resolve } = require('path');
|
4 |
|
5 | const npmCheck = require('npm-check');
|
6 |
|
7 | const { asyncForEach, isDirectory, readDir, readJson } = require('./utils/utils');
|
8 |
|
9 | const ignoreDirectories = {
|
10 | '.cache': true,
|
11 | '.git': true,
|
12 | '.idea': true,
|
13 | '_volumes': true,
|
14 | 'node_modules': true
|
15 | };
|
16 |
|
17 | async function walkRec(dir) {
|
18 | const names = await readDir(resolve(dir));
|
19 | if (names.includes('package.json')) {
|
20 | const path = resolve(dir, 'package.json');
|
21 | const json = await readJson(path);
|
22 | if (json.dependencies) {
|
23 | const state = await npmCheck({ cwd: dir });
|
24 | const packages = state
|
25 | .get('packages')
|
26 | .filter(({ bump, packageWanted }) => bump && packageWanted)
|
27 | .sort((pa, pb) => {
|
28 | const { devDependency: da, moduleName: na } = pa;
|
29 | const { devDependency: db, moduleName: nb } = pb;
|
30 | if (da === db) { return +(na > nb) || +(na === nb) - 1; }
|
31 | else if (da && !db) { return -1; }
|
32 | else { return 1; }
|
33 | });
|
34 | if (packages.length) {
|
35 | console.log(`\n# ${path}:`);
|
36 | packages.forEach((spec) => {
|
37 | const { bump, devDependency, homepage, latest, moduleName, packageWanted } = spec;
|
38 | const devType = devDependency ? 'D' : 'P';
|
39 |
|
40 | console.log(`- (${devType}) ${moduleName} - ${packageWanted} >> ${latest} - ${homepage}`);
|
41 | });
|
42 | }
|
43 | return;
|
44 | }
|
45 | }
|
46 | await asyncForEach(readDir(dir), async (name) => {
|
47 | const subdir = resolve(dir, name);
|
48 | if ((await isDirectory(subdir)) && !ignoreDirectories[name]) {
|
49 | await walkRec(subdir);
|
50 | }
|
51 | });
|
52 | }
|
53 |
|
54 |
|
55 |
|
56 | const path = resolve(process.argv[2] || '../');
|
57 | console.log(`Checking for outdated dependencies in ${path} ...`);
|
58 | walkRec(path)
|
59 | .catch((error) => {
|
60 | console.error(error);
|
61 | process.exit(1);
|
62 | });
|