Skip to content

Commit 26d3798

Browse files
committed
fix input stream handling
fixes #64
1 parent bb388ab commit 26d3798

File tree

5 files changed

+206
-5
lines changed

5 files changed

+206
-5
lines changed

index.js

+19-5
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ var combine = require('stream-combiner2');
1111
var duplexer = require('duplexer2');
1212
var xtend = require('xtend');
1313
var defined = require('defined');
14+
var isStream = require('is-stream');
1415

1516
var inherits = require('inherits');
1617
var Transform = require('readable-stream').Transform;
@@ -36,6 +37,7 @@ function Deps (opts) {
3637
this.walking = {};
3738
this.entries = [];
3839
this._input = [];
40+
this._inputOrder = 0;
3941

4042
this.paths = opts.paths || process.env.NODE_PATH || '';
4143
if (typeof this.paths === 'string') {
@@ -71,9 +73,6 @@ function Deps (opts) {
7173

7274
Deps.prototype._transform = function (row, enc, next) {
7375
var self = this;
74-
if (typeof row === 'string') {
75-
row = { file: row };
76-
}
7776
if (row.transform && row.global) {
7877
this.globalTransforms.push([ row.transform, row.options ]);
7978
return next();
@@ -84,8 +83,21 @@ Deps.prototype._transform = function (row, enc, next) {
8483
}
8584

8685
self.pending ++;
86+
self._inputOrder ++;
8787
var basedir = defined(row.basedir, self.basedir);
8888

89+
if (typeof row === 'string') {
90+
row = { file: row };
91+
}
92+
else if (isStream(row)) {
93+
row = {
94+
file: row.file || path.resolve(
95+
basedir,
96+
'_stream_' + self._inputOrder + '.js'
97+
),
98+
source: row
99+
};
100+
}
89101
if (row.entry !== false) {
90102
self.entries.push(path.resolve(basedir, row.file || row.id));
91103
}
@@ -336,7 +348,8 @@ Deps.prototype.walk = function (id, parent, cb) {
336348
rec.source = body.toString('utf8');
337349
fromSource(file, rec.source, pkg);
338350
}));
339-
return ts.end(rec.source);
351+
if (isStream(rec.source)) return rec.source.pipe(ts);
352+
else return ts.end(rec.source);
340353
}
341354
if (err && self.options.ignoreMissing) {
342355
if (--self.pending === 0) self.push(null);
@@ -358,7 +371,8 @@ Deps.prototype.walk = function (id, parent, cb) {
358371
rec.source = body.toString('utf8');
359372
fromSource(file, rec.source, pkg);
360373
}));
361-
return ts.end(rec.source);
374+
if (isStream(rec.source)) return rec.source.pipe(ts);
375+
else return ts.end(rec.source);
362376
}
363377

364378
var c = self.cache && self.cache[file];

package.json

+1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
"detective": "^4.0.0",
1515
"duplexer2": "0.0.2",
1616
"inherits": "^2.0.1",
17+
"is-stream": "^1.0.1",
1718
"parents": "^1.0.0",
1819
"readable-stream": "^1.1.13",
1920
"resolve": "^1.1.3",

test/bin.js

+63
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
var test = require('tap').test;
2+
var spawn = require('child_process').spawn;
3+
var path = require('path');
4+
var fs = require('fs');
5+
6+
var files = {
7+
main: path.join(__dirname, '/files/main.js'),
8+
foo: path.join(__dirname, '/files/foo.js'),
9+
bar: path.join(__dirname, '/files/bar.js')
10+
};
11+
var sources = {
12+
main: fs.readFileSync(files.main, 'utf8'),
13+
foo: fs.readFileSync(files.foo, 'utf8'),
14+
bar: fs.readFileSync(files.bar, 'utf8')
15+
};
16+
17+
test('bin', function (t) {
18+
t.plan(3);
19+
20+
var ps = spawn(process.execPath, [
21+
path.resolve(__dirname, '../bin/cmd.js'), '-',
22+
], {
23+
cwd: __dirname + '/files'
24+
});
25+
26+
var input = fs.createReadStream(files.main);
27+
input.pipe(ps.stdin);
28+
29+
var src = '';
30+
var err = '';
31+
ps.stdout.on('data', function (buf) { src += buf });
32+
ps.stderr.on('data', function (buf) { err += buf });
33+
34+
ps.on('exit', function (code) {
35+
t.equal(code, 0);
36+
t.equal(err, '');
37+
38+
var rows = JSON.parse(src);
39+
t.same(rows.sort(cmp), [
40+
{
41+
id: __dirname + '/files/_stream_1.js',
42+
file: __dirname + '/files/_stream_1.js',
43+
source: sources.main,
44+
entry: true,
45+
deps: { './foo': files.foo }
46+
},
47+
{
48+
id: files.foo,
49+
file: files.foo,
50+
source: sources.foo,
51+
deps: { './bar': files.bar }
52+
},
53+
{
54+
id: files.bar,
55+
file: files.bar,
56+
source: sources.bar,
57+
deps: {}
58+
}
59+
].sort(cmp));
60+
});
61+
});
62+
63+
function cmp (a, b) { return a.id < b.id ? -1 : 1 }

test/source_fake_stream.js

+60
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
var parser = require('../');
2+
var test = require('tap').test;
3+
var fs = require('fs');
4+
var path = require('path');
5+
var through = require('through2');
6+
7+
var files = {
8+
main: path.join(__dirname, '/files/_stream_1.js'),
9+
foo: path.join(__dirname, '/files/foo.js'),
10+
bar: path.join(__dirname, '/files/bar.js'),
11+
extra: path.join(__dirname, '/files/extra.js')
12+
};
13+
var sources = {
14+
foo: fs.readFileSync(files.foo, 'utf8'),
15+
bar: fs.readFileSync(files.bar, 'utf8'),
16+
extra: fs.readFileSync(files.extra, 'utf8'),
17+
main: "console.log(require('./foo')(5)); require('./extra.js')"
18+
};
19+
20+
test('source fake stream', function (t) {
21+
t.plan(1);
22+
var p = parser({ basedir: __dirname + '/files' });
23+
var s = through();
24+
p.end(s);
25+
s.end(sources.main);
26+
27+
var rows = [];
28+
p.on('data', function (row) { rows.push(row) });
29+
p.on('end', function () {
30+
t.same(rows.sort(cmp), [
31+
{
32+
id: files.main,
33+
file: files.main,
34+
source: sources.main,
35+
entry: true,
36+
deps: { './foo': files.foo, './extra.js': files.extra }
37+
},
38+
{
39+
id: files.foo,
40+
file: files.foo,
41+
source: sources.foo,
42+
deps: { './bar': files.bar }
43+
},
44+
{
45+
id: files.bar,
46+
file: files.bar,
47+
source: sources.bar,
48+
deps: {}
49+
},
50+
{
51+
id: files.extra,
52+
file: files.extra,
53+
source: sources.extra,
54+
deps: {}
55+
},
56+
].sort(cmp));
57+
});
58+
});
59+
60+
function cmp (a, b) { return a.id < b.id ? -1 : 1 }

test/source_real_stream.js

+63
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
var parser = require('../');
2+
var test = require('tap').test;
3+
var fs = require('fs');
4+
var path = require('path');
5+
var through = require('through2');
6+
7+
var files = {
8+
main: path.join(__dirname, '/files/main.js'),
9+
foo: path.join(__dirname, '/files/foo.js'),
10+
bar: path.join(__dirname, '/files/bar.js'),
11+
extra: path.join(__dirname, '/files/extra.js')
12+
};
13+
var sources = {
14+
foo: fs.readFileSync(files.foo, 'utf8'),
15+
bar: fs.readFileSync(files.bar, 'utf8'),
16+
extra: fs.readFileSync(files.extra, 'utf8'),
17+
main: "console.log(require('./foo')(5)); require('./extra.js')"
18+
};
19+
20+
test('source real stream', function (t) {
21+
t.plan(1);
22+
var p = parser();
23+
var s = through();
24+
p.end({
25+
file: files.main,
26+
source: s
27+
});
28+
s.end(sources.main);
29+
30+
var rows = [];
31+
p.on('data', function (row) { rows.push(row) });
32+
p.on('end', function () {
33+
t.same(rows.sort(cmp), [
34+
{
35+
id: files.main,
36+
file: files.main,
37+
source: sources.main,
38+
entry: true,
39+
deps: { './foo': files.foo, './extra.js': files.extra }
40+
},
41+
{
42+
id: files.foo,
43+
file: files.foo,
44+
source: sources.foo,
45+
deps: { './bar': files.bar }
46+
},
47+
{
48+
id: files.bar,
49+
file: files.bar,
50+
source: sources.bar,
51+
deps: {}
52+
},
53+
{
54+
id: files.extra,
55+
file: files.extra,
56+
source: sources.extra,
57+
deps: {}
58+
},
59+
].sort(cmp));
60+
});
61+
});
62+
63+
function cmp (a, b) { return a.id < b.id ? -1 : 1 }

0 commit comments

Comments
 (0)