Skip to content

Commit 5592233

Browse files
committed
ignore require() calls inside already browserified bundles
If a function expression declares a `require` parameter, its body is not analyzed for `require()` calls. This is mostly helpful for bundles that were already browserified, `detective` will ignore the calls to browser-pack's require runtime.
1 parent 6d6baae commit 5592233

File tree

3 files changed

+30
-0
lines changed

3 files changed

+30
-0
lines changed

index.js

+13
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ exports.find = function (src, opts) {
5050
function visit(node, st, c) {
5151
var hasRequire = wordRe.test(src.slice(node.start, node.end));
5252
if (!hasRequire) return;
53+
if (redefinesRequire(node)) return;
5354
walk.base[node.type](node, st, c);
5455
if (node.type !== 'CallExpression') return;
5556
if (isRequire(node)) {
@@ -76,6 +77,18 @@ exports.find = function (src, opts) {
7677
Statement: visit,
7778
Expression: visit
7879
});
80+
81+
// Detect `require` redefinitions in function parameter lists, like
82+
// in `[function(require,module.exports){` generated by browser-pack.
83+
// This is a simple way to address the 99% case without doing full scope analysis
84+
function redefinesRequire(node) {
85+
if (node.type === 'FunctionExpression') {
86+
return node.params.some(function (param) {
87+
return param.type === 'Identifier' && param.name === word;
88+
});
89+
}
90+
return false;
91+
}
7992

8093
return modules;
8194
};

test/files/scope.js

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
(function(modules){
2+
modules[1](function(i){return modules[i]()})
3+
})({1:[function (require,module,exports) {
4+
require('./y')
5+
},{'./y':2}],2:function(require,module,exports){
6+
console.log("abc")
7+
}})
8+
require('./z')

test/scope.js

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
var test = require('tap').test;
2+
var detective = require('../');
3+
var fs = require('fs');
4+
var src = fs.readFileSync(__dirname + '/files/scope.js');
5+
6+
test('scope', function (t) {
7+
t.plan(1);
8+
t.deepEqual(detective(src), [ './z' ]);
9+
});

0 commit comments

Comments
 (0)