Skip to content

Commit 9e53a81

Browse files
committed
feat: add flags to scan full tree and dev deps (off by default)
1 parent 55d9fc6 commit 9e53a81

File tree

9 files changed

+87
-19
lines changed

9 files changed

+87
-19
lines changed

.gitignore

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
**/node_modules
2-
**/package-lock.json
3-
**/npm-shrinkwrap.json
2+
/package-lock.json
3+
/npm-shrinkwrap.json
44

55
coverage.*
66
*.log*

README.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,9 @@ Prints supported Node.js versions for the package at the git URL.
2626

2727
### Options
2828

29-
* `--deps` - include the support information of all dependencies
29+
* `--deep` - when used with --deps, include direct dev dependencies
30+
* `--deps` - include the support information of direct production dependencies
31+
* `--dev` - when used with --deps, include indirect dependencies
3032

3133
## Usage (library)
3234

bin/detect-node-support

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,25 +12,33 @@ const internals = {};
1212
internals.help = () => {
1313

1414
return `
15-
Usage: detect-node-support [--deps] [--json] <what>
15+
Usage: detect-node-support [--deps] [--dev] [--deep] [--json] <what>
1616
1717
<what> can be an npm package name, or a Github URL, or a path
1818
with a package.json.
1919
2020
Options:
21-
--deps Include the support information of all dependencies
21+
--deep When used with --deps, include indirect dependencies
22+
--deps Include the support information of direct production dependencies
23+
--dev When used with --deps, include direct dev dependencies
2224
--json Print JSON formatted output
2325
`;
2426
};
2527

26-
exports.main = async ({ _: [what], deps, json }) => {
28+
exports.main = async ({ _: [what], deps, deep, dev, json }) => {
2729

2830
if (!what) {
2931
console.log(internals.help());
3032
return;
3133
}
3234

33-
const result = await NodeSupport.detect(what, { deps });
35+
if (!deps && (deep || dev)) {
36+
console.log('--deep and --dev can only be used together with --deps\n');
37+
console.log(internals.help());
38+
return;
39+
}
40+
41+
const result = await NodeSupport.detect(what, { deps, deep, dev });
3442

3543
if (json) {
3644
console.log(JSON.stringify(result, null, ' '));
@@ -40,7 +48,7 @@ exports.main = async ({ _: [what], deps, json }) => {
4048
}
4149
};
4250

43-
exports.main(Minimist(process.argv.slice(2), { boolean: ['deps', 'json'] }))
51+
exports.main(Minimist(process.argv.slice(2), { boolean: ['deps', 'dev', 'deep', 'json'] }))
4452
.catch((err) => {
4553

4654
console.error(err);

lib/deps.js

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,9 @@ internals.walk = (node, callback) => {
2121
};
2222

2323

24-
exports.resolve = async ({ packageJson, lockfile }) => {
24+
exports.resolve = async ({ packageJson, lockfile }, options) => {
25+
26+
const { deep, dev } = options;
2527

2628
const path = Tempy.directory();
2729
Fs.writeFileSync(Path.join(path, 'package.json'), JSON.stringify(packageJson, null, ' '));
@@ -38,11 +40,17 @@ exports.resolve = async ({ packageJson, lockfile }) => {
3840

3941
internals.walk(arborist.idealTree, (node) => {
4042

41-
if (node === arborist.idealTree) {
43+
if (node.isTop) {
44+
return;
45+
}
46+
47+
if (!dev && node.dev) {
48+
// only include dev deps when `options.dev` flag is set
4249
return;
4350
}
4451

45-
if (node.dev) {
52+
if (!deep && !node.parent.isTop) {
53+
// only include deep deps when `options.deep` flag is set
4654
return;
4755
}
4856

@@ -71,11 +79,11 @@ internals.tryLoad = async (loadFile, filename) => {
7179
}
7280
};
7381

74-
exports.detect = async ({ packageJson, loadFile }) => {
82+
exports.detect = async ({ packageJson, loadFile }, options) => {
7583

7684
const lockfile = (await internals.tryLoad(loadFile, 'package-lock.json')) || (await internals.tryLoad(loadFile, 'npm-shrinkwrap.json'));
7785

78-
const versions = await exports.resolve({ packageJson, lockfile });
86+
const versions = await exports.resolve({ packageJson, lockfile }, options);
7987

8088
const support = [];
8189

lib/index.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,12 @@
33
const Deps = require('./deps');
44
const Package = require('./package');
55

6-
exports.detect = async function (what, { deps } = {}) {
6+
exports.detect = async function (what, { deps, deep, dev } = {}) {
77

88
const { result, meta } = await Package.detect(what);
99

1010
if (deps) {
11-
result.dependencies = await Deps.detect(meta);
11+
result.dependencies = await Deps.detect(meta, { deep, dev });
1212
}
1313

1414
return result;

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
},
3838
"dependencies": {
3939
"@hapi/wreck": "^17.0.0",
40-
"@npmcli/arborist": "0.0.0-pre.13",
40+
"@npmcli/arborist": "0.0.0-pre.14",
4141
"@pkgjs/nv": "0.0.3",
4242
"git-url-parse": "^11.1.2",
4343
"js-yaml": "^3.13.1",

test/deps.js

Lines changed: 44 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,53 @@ describe('Deps', () => {
1313

1414
describe('resolve', () => {
1515

16-
it('returns flattened list of deps', async () => {
16+
it('returns flattened list of direct prod deps', async () => {
1717

1818
const result = await Deps.resolve({
19-
packageJson: JSON.parse(Fs.readFileSync(Path.join(__dirname, 'fixtures', 'deps-test-package.json'))),
20-
lockfile: JSON.parse(Fs.readFileSync(Path.join(__dirname, 'fixtures', 'deps-test-lock.json')))
19+
packageJson: JSON.parse(Fs.readFileSync(Path.join(__dirname, 'fixtures', 'deps-test', 'package.json'))),
20+
lockfile: JSON.parse(Fs.readFileSync(Path.join(__dirname, 'fixtures', 'deps-test', 'npm-shrinkwrap.json')))
21+
}, {});
22+
23+
expect(result).to.equal({
24+
'ci-info': ['1.6.0'],
25+
'is-ci': ['2.0.0']
26+
});
27+
});
28+
29+
it('returns flattened list of all deps', async () => {
30+
31+
const result = await Deps.resolve({
32+
packageJson: JSON.parse(Fs.readFileSync(Path.join(__dirname, 'fixtures', 'deps-test', 'package.json'))),
33+
lockfile: JSON.parse(Fs.readFileSync(Path.join(__dirname, 'fixtures', 'deps-test', 'npm-shrinkwrap.json')))
34+
}, { deep: true, dev: true });
35+
36+
expect(result).to.equal({
37+
'ci-info': ['1.6.0', '2.0.0'],
38+
'is-ci': ['2.0.0'],
39+
'ms': ['2.1.2']
2140
});
41+
});
42+
43+
it('returns flattened list of deps (only direct)', async () => {
44+
45+
const result = await Deps.resolve({
46+
packageJson: JSON.parse(Fs.readFileSync(Path.join(__dirname, 'fixtures', 'deps-test', 'package.json'))),
47+
lockfile: JSON.parse(Fs.readFileSync(Path.join(__dirname, 'fixtures', 'deps-test', 'npm-shrinkwrap.json')))
48+
}, { dev: true });
49+
50+
expect(result).to.equal({
51+
'ci-info': ['1.6.0'],
52+
'is-ci': ['2.0.0'],
53+
'ms': ['2.1.2']
54+
});
55+
});
56+
57+
it('returns flattened list of deps (only prod)', async () => {
58+
59+
const result = await Deps.resolve({
60+
packageJson: JSON.parse(Fs.readFileSync(Path.join(__dirname, 'fixtures', 'deps-test', 'package.json'))),
61+
lockfile: JSON.parse(Fs.readFileSync(Path.join(__dirname, 'fixtures', 'deps-test', 'npm-shrinkwrap.json')))
62+
}, { deep: true });
2263

2364
expect(result).to.equal({
2465
'ci-info': ['1.6.0', '2.0.0'],

test/fixtures/deps-test-lock.json renamed to test/fixtures/deps-test/npm-shrinkwrap.json

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

test/fixtures/deps-test-package.json renamed to test/fixtures/deps-test/package.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,8 @@
33
"dependencies": {
44
"is-ci": "^2.0.0",
55
"ci-info": "^1.6.0"
6+
},
7+
"devDependencies": {
8+
"ms": "^2.1.2"
69
}
710
}

0 commit comments

Comments
 (0)