Skip to content

Commit f78550a

Browse files
committed
Fallback to detective if konan fails
1 parent c80a7a2 commit f78550a

File tree

9 files changed

+3817
-53
lines changed

9 files changed

+3817
-53
lines changed

.editorconfig

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
# editorconfig.org
2+
root = true
3+
4+
[*]
5+
indent_style = space
6+
indent_size = 4
7+
end_of_line = lf
8+
charset = utf-8
9+
trim_trailing_whitespace = true
10+
insert_final_newline = true

index.js

Lines changed: 58 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ var relativePath = require('cached-path-relative')
44

55
var browserResolve = require('browser-resolve');
66
var nodeResolve = require('resolve');
7+
var detective = require('detective');
78
var konan = require('konan');
89
var through = require('through2');
910
var concat = require('concat-stream');
@@ -82,9 +83,9 @@ function Deps (opts) {
8283
var self = this;
8384
if (!(this instanceof Deps)) return new Deps(opts);
8485
Transform.call(this, { objectMode: true });
85-
86+
8687
if (!opts) opts = {};
87-
88+
8889
this.basedir = opts.basedir || process.cwd();
8990
this.cache = opts.cache;
9091
this.fileCache = opts.fileCache;
@@ -96,7 +97,7 @@ function Deps (opts) {
9697
this.walking = {};
9798
this.entries = [];
9899
this._input = [];
99-
100+
100101
this.paths = opts.paths || process.env.NODE_PATH || '';
101102
if (typeof this.paths === 'string') {
102103
var delimiter = path.delimiter || (process.platform === 'win32' ? ';' : ':');
@@ -107,7 +108,7 @@ function Deps (opts) {
107108
.map(function (p) {
108109
return path.resolve(self.basedir, p);
109110
});
110-
111+
111112
this.transforms = [].concat(opts.transform).filter(Boolean);
112113
this.globalTransforms = [].concat(opts.globalTransform).filter(Boolean);
113114
this.resolver = opts.resolve || browserResolve;
@@ -119,7 +120,7 @@ function Deps (opts) {
119120
if (!this.options.expose) this.options.expose = {};
120121
this.pending = 0;
121122
this.inputPending = 0;
122-
123+
123124
var topfile = path.join(this.basedir, '__fake.js');
124125
this.top = {
125126
id: topfile,
@@ -154,14 +155,14 @@ Deps.prototype._transform = function (row, enc, next) {
154155
this.transforms.push([ row.transform, row.options ]);
155156
return next();
156157
}
157-
158+
158159
self.pending ++;
159160
var basedir = defined(row.basedir, self.basedir);
160-
161+
161162
if (row.entry !== false) {
162163
self.entries.push(path.resolve(basedir, row.file || row.id));
163164
}
164-
165+
165166
self.lookupPackage(row.file, function (err, pkg) {
166167
if (err && self.options.ignoreMissing) {
167168
self.emit('missing', row.file, self.top);
@@ -190,7 +191,7 @@ Deps.prototype._flush = function () {
190191
}
191192
else files[w.file || w.id] = r;
192193
});
193-
194+
194195
Object.keys(files).forEach(function (key) {
195196
var r = files[key];
196197
var pkg = r.pkg || {};
@@ -207,7 +208,7 @@ Deps.prototype._flush = function () {
207208
Deps.prototype.resolve = function (id, parent, cb) {
208209
var self = this;
209210
var opts = self.options;
210-
211+
211212
if (xhas(self.cache, parent.id, 'deps', id)
212213
&& self.cache[parent.id].deps[id]) {
213214
var file = self.cache[parent.id].deps[id];
@@ -217,25 +218,25 @@ Deps.prototype.resolve = function (id, parent, cb) {
217218
cb(null, file, pkg);
218219
});
219220
}
220-
221+
221222
parent.packageFilter = function (p, x) {
222223
var pkgdir = dirname(x);
223224
if (opts.packageFilter) p = opts.packageFilter(p, x);
224225
p.__dirname = pkgdir;
225226

226227
return p;
227228
};
228-
229+
229230
if (opts.extensions) parent.extensions = opts.extensions;
230231
if (opts.modules) parent.modules = opts.modules;
231-
232+
232233
self.resolver(id, parent, function onresolve (err, file, pkg, fakePath) {
233234
if (err) return cb(err);
234235
if (!file) return cb(new Error(
235236
'module not found: "' + id + '" from file '
236237
+ parent.filename
237238
));
238-
239+
239240
if (!pkg || !pkg.__dirname) {
240241
self.lookupPackage(file, function (err, p) {
241242
if (err) return cb(err);
@@ -271,25 +272,25 @@ Deps.prototype.readFile = function (file, id, pkg) {
271272
Deps.prototype.getTransforms = function (file, pkg, opts) {
272273
if (!opts) opts = {};
273274
var self = this;
274-
275+
275276
var isTopLevel;
276277
if (opts.builtin || opts.inNodeModules) isTopLevel = false;
277278
else isTopLevel = this._isTopLevel(file);
278-
279+
279280
var transforms = [].concat(isTopLevel ? this.transforms : [])
280281
.concat(getTransforms(pkg, {
281282
globalTransform: this.globalTransforms,
282283
transformKey: this.options.transformKey
283284
}))
284285
;
285286
if (transforms.length === 0) return through();
286-
287+
287288
var pending = transforms.length;
288289
var streams = [];
289290
var input = through();
290291
var output = through();
291292
var dup = duplexer(input, output);
292-
293+
293294
for (var i = 0; i < transforms.length; i++) (function (i) {
294295
makeTransform(transforms[i], function (err, trs) {
295296
if (err) return self.emit('error', err)
@@ -298,7 +299,7 @@ Deps.prototype.getTransforms = function (file, pkg, opts) {
298299
});
299300
})(i);
300301
return dup;
301-
302+
302303
function done () {
303304
var middle = combine.apply(null, streams);
304305
middle.on('error', function (err) {
@@ -308,7 +309,7 @@ Deps.prototype.getTransforms = function (file, pkg, opts) {
308309
});
309310
input.pipe(middle).pipe(output);
310311
}
311-
312+
312313
function makeTransform (tr, cb) {
313314
var trOpts = {};
314315
if (Array.isArray(tr)) {
@@ -327,24 +328,24 @@ Deps.prototype.getTransforms = function (file, pkg, opts) {
327328
});
328329
}
329330
}
330-
331+
331332
function loadTransform (id, trOpts, cb) {
332333
var params = { basedir: dirname(file) };
333334
nodeResolve(id, params, function nr (err, res, again) {
334335
if (err && again) return cb && cb(err);
335-
336+
336337
if (err) {
337338
params.basedir = pkg.__dirname;
338339
return nodeResolve(id, params, function (e, r) {
339340
nr(e, r, true)
340341
});
341342
}
342-
343+
343344
if (!res) return cb(new Error(
344345
'cannot find transform module ' + tr
345346
+ ' while transforming ' + file
346347
));
347-
348+
348349
var r = require(res);
349350
if (typeof r !== 'function') {
350351
return cb(new Error(
@@ -353,7 +354,7 @@ Deps.prototype.getTransforms = function (file, pkg, opts) {
353354
+ 'Expected a transform function.'
354355
));
355356
}
356-
357+
357358
var trs = r(file, trOpts);
358359
self.emit('transform', trs, file);
359360
cb(null, trs);
@@ -366,7 +367,7 @@ Deps.prototype.walk = function (id, parent, cb) {
366367
var opts = self.options;
367368
var sortKey = parent.sortKey || '';
368369
this.pending ++;
369-
370+
370371
var rec = {};
371372
var input;
372373
if (typeof id === 'object') {
@@ -376,7 +377,7 @@ Deps.prototype.walk = function (id, parent, cb) {
376377
input = true;
377378
this.inputPending ++;
378379
}
379-
380+
380381
self.resolve(id, parent, function (err, file, pkg, fakePath) {
381382
// this is checked early because parent.modules is also modified
382383
// by this function.
@@ -393,15 +394,15 @@ Deps.prototype.walk = function (id, parent, cb) {
393394
self._emittedPkg[pkg.__dirname] = true;
394395
self.emit('package', pkg);
395396
}
396-
397+
397398
if (opts.postFilter && !opts.postFilter(id, file, pkg)) {
398399
if (--self.pending === 0) self.push(null);
399400
if (input) --self.inputPending;
400401
return cb && cb(null, undefined);
401402
}
402403
if (err && rec.source) {
403404
file = rec.file;
404-
405+
405406
var ts = self.getTransforms(file, pkg);
406407
ts.pipe(concat(function (body) {
407408
rec.source = body.toString('utf8');
@@ -422,7 +423,7 @@ Deps.prototype.walk = function (id, parent, cb) {
422423
return cb && cb(null, file);
423424
}
424425
self.visited[file] = true;
425-
426+
426427
if (rec.source) {
427428
var ts = self.getTransforms(file, pkg);
428429
ts.pipe(concat(function (body) {
@@ -431,10 +432,10 @@ Deps.prototype.walk = function (id, parent, cb) {
431432
}));
432433
return ts.end(rec.source);
433434
}
434-
435+
435436
var c = self.cache && self.cache[file];
436437
if (c) return fromDeps(file, c.source, c.package, fakePath, Object.keys(c.deps), sortKey);
437-
438+
438439
self.readFile(file, id, pkg)
439440
.pipe(self.getTransforms(fakePath || file, pkg, {
440441
builtin: builtin,
@@ -450,13 +451,13 @@ Deps.prototype.walk = function (id, parent, cb) {
450451
var deps = rec.noparse ? [] : self.parseDeps(file, src);
451452
if (deps) fromDeps(file, src, pkg, fakePath, deps, sortKey);
452453
}
453-
454+
454455
function fromDeps (file, src, pkg, fakePath, deps, sortKey) {
455456
var p = deps.length;
456457
var resolved = {};
457-
458+
458459
if (input) --self.inputPending;
459-
460+
460461
(function resolve () {
461462
if (self.inputPending > 0) return setTimeout(resolve);
462463
deps.forEach(function (id, i) {
@@ -481,19 +482,19 @@ Deps.prototype.walk = function (id, parent, cb) {
481482
});
482483
if (deps.length === 0) done();
483484
})();
484-
485+
485486
function done () {
486487
if (!rec.id) rec.id = file;
487488
if (!rec.source) rec.source = src;
488489
if (!rec.deps) rec.deps = resolved;
489490
if (!rec.file) rec.file = file;
490491
rec.sortKey = sortKey + '!' + file;
491-
492+
492493
if (self.entries.indexOf(file) >= 0) {
493494
rec.entry = true;
494495
}
495496
self.push(rec);
496-
497+
497498
if (cb) cb(null, file);
498499
if (-- self.pending === 0) self.push(null);
499500
}
@@ -503,13 +504,19 @@ Deps.prototype.walk = function (id, parent, cb) {
503504
Deps.prototype.parseDeps = function (file, src, cb) {
504505
if (this.options.noParse === true) return [];
505506
if (/\.json$/.test(file)) return [];
506-
507+
507508
if (Array.isArray(this.options.noParse)
508509
&& this.options.noParse.indexOf(file) >= 0) {
509510
return [];
510511
}
511-
512-
try { var deps = konan(src).strings }
512+
513+
try {
514+
try { var deps = konan(src).strings }
515+
catch (ex) {
516+
// konan does not support Vue (component) file, try to parse using detective (as a fallback)
517+
deps = detective(src)
518+
}
519+
}
513520
catch (ex) {
514521
var message = ex && ex.message ? ex.message : ex;
515522
this.emit('error', new Error(
@@ -522,14 +529,14 @@ Deps.prototype.parseDeps = function (file, src, cb) {
522529

523530
Deps.prototype.lookupPackage = function (file, cb) {
524531
var self = this;
525-
532+
526533
var cached = this.pkgCache[file];
527534
if (cached) return nextTick(cb, null, cached);
528535
if (cached === false) return nextTick(cb, null, undefined);
529-
536+
530537

531538
var dirs = parents(path.dirname(file || ''));
532-
539+
533540
(function next () {
534541
if (dirs.length === 0) {
535542
self.pkgCache[file] = false;
@@ -539,17 +546,17 @@ Deps.prototype.lookupPackage = function (file, cb) {
539546
if (dir.split(/[\\\/]/).slice(-1)[0] === 'node_modules') {
540547
return cb(null, undefined);
541548
}
542-
549+
543550
var pkgfile = path.join(dir, 'package.json');
544-
551+
545552
var cached = self.pkgCache[pkgfile];
546553
if (cached) return nextTick(cb, null, cached);
547554
else if (cached === false) return next();
548-
555+
549556
var pcached = self.pkgFileCachePending[pkgfile];
550557
if (pcached) return pcached.push(onpkg);
551558
pcached = self.pkgFileCachePending[pkgfile] = [];
552-
559+
553560
fs.readFile(pkgfile, function (err, src) {
554561
if (err) return onpkg();
555562
try { var pkg = JSON.parse(src) }
@@ -559,12 +566,12 @@ Deps.prototype.lookupPackage = function (file, cb) {
559566
].join('')))
560567
}
561568
pkg.__dirname = dir;
562-
569+
563570
self.pkgCache[pkgfile] = pkg;
564571
self.pkgCache[file] = pkg;
565572
onpkg(null, pkg);
566573
});
567-
574+
568575
function onpkg (err, pkg) {
569576
if (self.pkgFileCachePending[pkgfile]) {
570577
var fns = self.pkgFileCachePending[pkgfile];
@@ -580,7 +587,7 @@ Deps.prototype.lookupPackage = function (file, cb) {
580587
}
581588
})();
582589
};
583-
590+
584591
function getTransforms (pkg, opts) {
585592
var trx = [];
586593
if (opts.transformKey) {

0 commit comments

Comments
 (0)