From 75e83f59056b7ef205694e5d93764cd99fe750f9 Mon Sep 17 00:00:00 2001 From: zoubin Date: Tue, 12 May 2015 16:37:50 +0800 Subject: [PATCH] resolve deps to row.id rather than row.file --- index.js | 14 ++++++---- test/cache_partial_expose.js | 8 +++--- test/resolve_deps_to_id.js | 53 ++++++++++++++++++++++++++++++++++++ 3 files changed, 66 insertions(+), 9 deletions(-) create mode 100644 test/resolve_deps_to_id.js diff --git a/index.js b/index.js index b0a159a..33481e5 100644 --- a/index.js +++ b/index.js @@ -34,7 +34,7 @@ function Deps (opts) { this._emittedPkg = {}; this.visited = {}; this.walking = {}; - this.entries = []; + this.entries = {}; this._input = []; this.paths = opts.paths || process.env.NODE_PATH || ''; @@ -87,7 +87,7 @@ Deps.prototype._transform = function (row, enc, next) { var basedir = defined(row.basedir, self.basedir); if (row.entry !== false) { - self.entries.push(path.resolve(basedir, row.file || row.id)); + self.entries[path.resolve(basedir, row.file || row.id)] = row.id; } self.lookupPackage(row.file, function (err, pkg) { @@ -199,7 +199,7 @@ Deps.prototype.getTransforms = function (file, pkg, opts) { var isTopLevel; if (opts.builtin) isTopLevel = false; - else isTopLevel = this.entries.some(function (main) { + else isTopLevel = Object.keys(this.entries).some(function (main) { var m = path.relative(path.dirname(main), file); return m.split(/[\\\/]/).indexOf('node_modules') < 0; }); @@ -398,7 +398,11 @@ Deps.prototype.walk = function (id, parent, cb) { package: pkg }; self.walk(id, current, function (err, r) { - resolved[id] = r; + if (typeof self.entries[r] !== 'undefined') { + resolved[id] = self.entries[r]; + } else { + resolved[id] = r; + } if (--p === 0) done(); }); }); @@ -411,7 +415,7 @@ Deps.prototype.walk = function (id, parent, cb) { if (!rec.deps) rec.deps = resolved; if (!rec.file) rec.file = file; - if (self.entries.indexOf(file) >= 0) { + if (self.entries.hasOwnProperty(file)) { rec.entry = true; } self.push(rec); diff --git a/test/cache_partial_expose.js b/test/cache_partial_expose.js index e851ab2..681ec0b 100644 --- a/test/cache_partial_expose.js +++ b/test/cache_partial_expose.js @@ -62,13 +62,13 @@ test('preserves expose and entry with partial cache', function(t) { id: files.bar, file: files.bar, source: sources.bar, - deps: {xyz: files.xyz} + deps: {xyz: 'xyz'} }, { file: files.foo, id: files.foo, source: sources.foo, - deps: {'./lib/abc': files.abc} + deps: {'./lib/abc': 'abc'} }, { id: 'abc', @@ -84,8 +84,8 @@ test('preserves expose and entry with partial cache', function(t) { source: sources.main, deps: { './bar': files.bar, - abc: files.abc, - xyz: files.xyz + abc: 'abc', + xyz: 'xyz' }, entry: true }, diff --git a/test/resolve_deps_to_id.js b/test/resolve_deps_to_id.js new file mode 100644 index 0000000..e102bc3 --- /dev/null +++ b/test/resolve_deps_to_id.js @@ -0,0 +1,53 @@ +var parser = require('../'); +var test = require('tape'); +var fs = require('fs'); +var path = require('path'); + +var files = { + main: path.join(__dirname, '/files/main.js'), + foo: path.join(__dirname, '/files/foo.js'), + bar: path.join(__dirname, '/files/bar.js') +}; + +var sources = Object.keys(files).reduce(function (acc, file) { + acc[file] = fs.readFileSync(files[file], 'utf8'); + return acc; +}, {}); + +test('deps resolve to id', function (t) { + t.plan(1); + var p = parser(); + var fooID = path.relative(process.cwd(), files.foo); + p.write({ file: files.main, entry: true }); + p.end({ file: files.foo, id: fooID, entry: true }); + + var rows = []; + p.on('data', function (row) { rows.push(row) }); + p.on('end', function () { + t.same(rows.sort(cmp), [ + { + id: files.main, + file: files.main, + source: sources.main, + entry: true, + deps: { './foo': fooID } + }, + { + id: fooID, + file: files.foo, + source: sources.foo, + entry: true, + deps: { './bar': files.bar } + }, + { + id: files.bar, + file: files.bar, + source: sources.bar, + deps: {} + } + ].sort(cmp)); + }); +}); + +function cmp (a, b) { return a.id < b.id ? -1 : 1 } +