Skip to content

Commit 363cfdc

Browse files
use undeclared-identifiers (#76)
undeclared-identifiers collects references to undeclared identifiers and their properties. It does much less work than lexical-scope so it is quite a bit faster. before: # jquery ok ~432 ms (0 s + 432086435 ns) after: # jquery ok ~223 ms (0 s + 223387040 ns)
1 parent 0b28c4a commit 363cfdc

File tree

5 files changed

+66
-9
lines changed

5 files changed

+66
-9
lines changed

index.js

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1-
var parseScope = require('lexical-scope');
1+
var undeclaredIdentifiers = require('undeclared-identifiers');
22
var through = require('through2');
33
var merge = require('xtend');
4+
var parse = require('acorn-node').parse;
45

56
var path = require('path');
67
var isAbsolute = path.isAbsolute || require('path-is-absolute');
@@ -104,9 +105,9 @@ module.exports = function (file, opts) {
104105
}
105106

106107
try {
107-
var scope = opts.always
108-
? { globals: { implicit: varNames } }
109-
: parseScope('(function(){\n' + source + '\n})()')
108+
var undeclared = opts.always
109+
? { identifiers: varNames, properties: [] }
110+
: undeclaredIdentifiers(parse(source), { wildcard: true })
110111
;
111112
}
112113
catch (err) {
@@ -123,8 +124,8 @@ module.exports = function (file, opts) {
123124
varNames.forEach(function (name) {
124125
if (!/\./.test(name)) return;
125126
var parts = name.split('.')
126-
var prop = (scope.globals.implicitProperties || {})[parts[0]]
127-
if (!prop || prop.length !== 1 || prop[0] !== parts[1]) return;
127+
var prop = undeclared.properties.indexOf(name)
128+
if (prop === -1 || countprops(undeclared.properties, parts[0]) > 1) return;
128129
var value = vars[name](file, basedir);
129130
if (!value) return;
130131
globals[parts[0]] = '{'
@@ -134,7 +135,7 @@ module.exports = function (file, opts) {
134135
varNames.forEach(function (name) {
135136
if (/\./.test(name)) return;
136137
if (globals[name]) return;
137-
if (scope.globals.implicit.indexOf(name) < 0) return;
138+
if (undeclared.identifiers.indexOf(name) < 0) return;
138139
var value = vars[name](file, basedir);
139140
if (!value) return;
140141
globals[name] = value;
@@ -185,3 +186,9 @@ function closeOver (globals, src, file, opts) {
185186
return combineSourceMap.removeComments(wrappedSource) + "\n"
186187
+ sourceMap.comment();
187188
}
189+
190+
function countprops (props, name) {
191+
return props.filter(function (prop) {
192+
return prop.slice(0, name.length + 1) === name + '.';
193+
}).length;
194+
}

package.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,19 @@
88
},
99
"dependencies": {
1010
"JSONStream": "^1.0.3",
11+
"acorn-node": "^1.5.2",
1112
"combine-source-map": "^0.8.0",
1213
"concat-stream": "^1.6.1",
1314
"is-buffer": "^1.1.0",
14-
"lexical-scope": "^1.2.0",
1515
"path-is-absolute": "^1.0.1",
1616
"process": "~0.11.0",
1717
"through2": "^2.0.0",
18+
"undeclared-identifiers": "^1.1.2",
1819
"xtend": "^4.0.0"
1920
},
2021
"devDependencies": {
2122
"browser-pack": "^6.0.0",
22-
"buffer": "^3.0.0",
23+
"buffer": "^4.9.1",
2324
"convert-source-map": "~1.1.0",
2425
"module-deps": "^4.0.2",
2526
"nanobench": "^2.1.1",

test/isbuffer.js

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@ var bpack = require('browser-pack');
44
var insert = require('../');
55
var concat = require('concat-stream');
66
var vm = require('vm');
7+
// use is-buffer instead of builtin Buffer.isBuffer. The builtin
8+
// does `instanceof` which does not work on the browserified version
9+
var isBuffer = require('is-buffer');
710

811
test('isbuffer', function (t) {
912
t.plan(5);
@@ -22,6 +25,40 @@ test('isbuffer', function (t) {
2225
deps.end({ id: 'main', file: __dirname + '/isbuffer/main.js' });
2326
});
2427

28+
test('isbuffer (and Buffer.from)', function (t) {
29+
t.plan(5);
30+
var deps = mdeps()
31+
var pack = bpack({ raw: true, hasExports: true });
32+
deps.pipe(pack).pipe(concat(function (src) {
33+
var c = { global: {} };
34+
vm.runInNewContext(src, c);
35+
t.equal(c.require('main')(c.require('main').a()), true, 'is a buffer');
36+
t.equal(c.require('main')('wow'), false, 'is not a buffer');
37+
t.equal(isBuffer(c.require('main').a()), true, 'is a buffer');
38+
t.ok(/require\("buffer"\)/.test(src), 'buffer required in source')
39+
t.equal(c.require('main').a().toString('hex'), 'abcd', 'is a buffer');
40+
}));
41+
deps.write({ transform: inserter, global: true });
42+
deps.end({ id: 'main', file: __dirname + '/isbuffer/both.js' });
43+
});
44+
45+
test('isbuffer (and new Buffer)', function (t) {
46+
t.plan(5);
47+
var deps = mdeps()
48+
var pack = bpack({ raw: true, hasExports: true });
49+
deps.pipe(pack).pipe(concat(function (src) {
50+
var c = { global: {} };
51+
vm.runInNewContext(src, c);
52+
t.equal(c.require('main')(c.require('main').a()), true, 'is a buffer');
53+
t.equal(c.require('main')('wow'), false, 'is not a buffer');
54+
t.equal(isBuffer(c.require('main').a()), true, 'is a buffer');
55+
t.ok(/require\("buffer"\)/.test(src), 'buffer required in source')
56+
t.equal(c.require('main').a().toString('utf8'), 'abcd', 'is a buffer');
57+
}));
58+
deps.write({ transform: inserter, global: true });
59+
deps.end({ id: 'main', file: __dirname + '/isbuffer/new.js' });
60+
});
61+
2562
function inserter (file) {
2663
return insert(file, { basedir: __dirname + '/isbuffer' });
2764
}

test/isbuffer/both.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
module.exports = function (buf) {
2+
return Buffer.isBuffer(buf);
3+
};
4+
module.exports.a = function () {
5+
return Buffer.from('abcd', 'hex');
6+
};

test/isbuffer/new.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
module.exports = function (buf) {
2+
return Buffer.isBuffer(buf);
3+
};
4+
module.exports.a = function () {
5+
return new Buffer('abcd');
6+
};

0 commit comments

Comments
 (0)