Skip to content

Commit c9bfb24

Browse files
committed
Be really strict about the kind of redefinition we expect
1 parent 3a7077d commit c9bfb24

3 files changed

Lines changed: 17 additions & 11 deletions

File tree

index.js

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ exports.find = function (src, opts) {
4949
function visit(node, st, c) {
5050
var hasRequire = wordRe.test(src.slice(node.start, node.end));
5151
if (!hasRequire) return;
52-
if (redefinesRequire(node)) return;
52+
if (isBundledDefinition(node)) return;
5353
walk.base[node.type](node, st, c);
5454
if (node.type !== 'CallExpression') return;
5555
if (isRequire(node)) {
@@ -78,15 +78,17 @@ exports.find = function (src, opts) {
7878
});
7979

8080
// Detect `require` redefinitions in function parameter lists, like
81-
// in `[function(require,module,exports){` generated by browser-pack.
81+
// in `{0:[function(require,module,exports){` generated by browser-pack.
8282
// This is a simple way to address the 99% case without doing full scope analysis
83-
function redefinesRequire(node) {
84-
if (node.type === 'FunctionExpression') {
85-
return node.params.some(function (param) {
86-
return param.type === 'Identifier' && param.name === word;
87-
});
88-
}
89-
return false;
83+
function isBundledDefinition(node) {
84+
if (node.type !== 'ObjectExpression') return false;
85+
if (node.properties.length < 1) return false;
86+
var arr = node.properties[0].value;
87+
if (arr.type !== 'ArrayExpression') return false;
88+
if (arr.elements.length < 2) return false;
89+
if (arr.elements[0].type !== 'FunctionExpression') return false;
90+
var fn = arr.elements[0];
91+
return fn.params.length > 0 && fn.params[0].type === 'Identifier' && fn.params[0].name === word;
9092
}
9193

9294
return modules;

test/files/scope.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
11
(function(modules){
22
modules[1](function(i){return modules[i]()})
33
})({1:[function (require,module,exports) {
4-
require('./y')
4+
require('./y') // inside a bundle; should not be detected
55
},{'./y':2}],2:function(require,module,exports){
66
console.log("abc")
77
}})
8+
9+
(function (require) {
10+
require('./x'); // not inside a bundle; should be detected
11+
}(require)); // (because someone might do this)
812
require('./z')

test/scope.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,5 @@ var src = fs.readFileSync(__dirname + '/files/scope.js');
55

66
test('scope', function (t) {
77
t.plan(1);
8-
t.deepEqual(detective(src), [ './z' ]);
8+
t.deepEqual(detective(src), [ './x', './z' ]);
99
});

0 commit comments

Comments
 (0)