Skip to content

Commit dccf473

Browse files
committed
Adds nodeModuleNamesOnly option to only return node_module packages. Useful for serverless bundling!
1 parent 051f7ae commit dccf473

File tree

4 files changed

+59
-12
lines changed

4 files changed

+59
-12
lines changed

main.js

Lines changed: 37 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,39 @@ function getRelativePath(filename) {
1313
return result;
1414
}
1515

16+
function getNodeModuleName(filename) {
17+
let foundNodeModules = false;
18+
let moduleName = [];
19+
20+
let s = filename.split(path.sep);
21+
for(let entry of s) {
22+
if(foundNodeModules) {
23+
moduleName.push(entry);
24+
if(!entry.startsWith("@")) {
25+
return moduleName.join("/");
26+
}
27+
}
28+
29+
if(entry === "node_modules") {
30+
foundNodeModules = true;
31+
}
32+
}
33+
34+
return false;
35+
}
36+
1637
/* unordered */
17-
function getDependenciesFor(filename, avoidCircular, allowNotFound = false) {
38+
function getDependenciesFor(filename, avoidCircular, optionsArg = {}) {
39+
let options = Object.assign({
40+
allowNotFound: false,
41+
nodeModuleNamesOnly: false,
42+
}, optionsArg);
1843
let absoluteFilename = getAbsolutePath(filename)
1944

2045
try {
2146
require(absoluteFilename);
2247
} catch(e) {
23-
if(e.code === "MODULE_NOT_FOUND" && allowNotFound) {
48+
if(e.code === "MODULE_NOT_FOUND" && options.allowNotFound) {
2449
// do nothing
2550
} else {
2651
throw e;
@@ -39,14 +64,14 @@ function getDependenciesFor(filename, avoidCircular, allowNotFound = false) {
3964
let dependencies = new Set();
4065

4166
if(!mod) {
42-
if(!allowNotFound) {
67+
if(!options.allowNotFound) {
4368
throw new Error(`Could not find ${filename} in @11ty/dependency-tree`);
4469
}
4570
} else {
4671
let relativeFilename = getRelativePath(mod.filename);
4772
if(!avoidCircular) {
4873
avoidCircular = {};
49-
} else {
74+
} else if(!options.nodeModuleNamesOnly) {
5075
dependencies.add(relativeFilename);
5176
}
5277

@@ -55,10 +80,14 @@ function getDependenciesFor(filename, avoidCircular, allowNotFound = false) {
5580
if(mod.children) {
5681
for(let child of mod.children) {
5782
let relativeChildFilename = getRelativePath(child.filename);
58-
if(relativeChildFilename.indexOf("node_modules") === -1 && // filter out node_modules
83+
let nodeModuleName = getNodeModuleName(child.filename);
84+
85+
if(options.nodeModuleNamesOnly && nodeModuleName) {
86+
dependencies.add(nodeModuleName);
87+
} else if(nodeModuleName === false && // filter out node_modules
5988
!dependencies.has(relativeChildFilename) && // avoid infinite looping with circular deps
6089
!avoidCircular[relativeChildFilename] ) {
61-
for(let dependency of getDependenciesFor(relativeChildFilename, avoidCircular, allowNotFound)) {
90+
for(let dependency of getDependenciesFor(relativeChildFilename, avoidCircular, options)) {
6291
dependencies.add(dependency);
6392
}
6493
}
@@ -70,7 +99,8 @@ function getDependenciesFor(filename, avoidCircular, allowNotFound = false) {
7099
}
71100

72101
function getCleanDependencyListFor(filename, options = {}) {
73-
return Array.from( getDependenciesFor(filename, null, options.allowNotFound) );
102+
return Array.from( getDependenciesFor(filename, null, options) );
74103
}
75104

76105
module.exports = getCleanDependencyListFor;
106+
module.exports.getNodeModuleName = getNodeModuleName;

package.json

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,13 @@
1313
},
1414
"license": "MIT",
1515
"devDependencies": {
16-
"ava": "^2.4.0"
16+
"ava": "^3.15.0"
1717
},
1818
"ava": {
1919
"files": [
2020
"./test/*.js"
2121
],
22-
"sources": [
23-
"./main.js",
22+
"ignoredByWatcher": [
2423
"./test/stubs/**"
2524
]
2625
}

test/mainTest.js

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import test from "ava";
2-
import DependencyTree from "../main.js";
1+
const test = require("ava");
2+
const DependencyTree = require("../main.js");
33

44
test("Nonexistent", t => {
55
t.throws(() => {
@@ -63,4 +63,18 @@ test("dot dot (dependency is up a directory)", t => {
6363
t.deepEqual(DependencyTree("./test/stubs/dotdot/dotdot.js").sort(), [
6464
"./test/stubs/simple2.js"
6565
]);
66+
});
67+
68+
test("only node_modules", t => {
69+
t.deepEqual(DependencyTree("./test/stubs/uses_node_modules.js", {
70+
nodeModuleNamesOnly: true
71+
}).sort(), [
72+
"@sindresorhus/is",
73+
"lodash",
74+
]);
75+
});
76+
77+
test("getNodeModuleName", t => {
78+
t.is(DependencyTree.getNodeModuleName("./eleventy-dependency-tree/node_modules/lodash/lodash.js"), "lodash");
79+
t.is(DependencyTree.getNodeModuleName("./eleventy-dependency-tree/node_modules/@sindresorhus/is/dist/index.js"), "@sindresorhus/is");
6680
});

test/stubs/uses_node_modules.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
const is = require("@sindresorhus/is");
2+
const child1 = require("./parent/child1.js");
3+
4+
module.exports = {};

0 commit comments

Comments
 (0)