From 26ca7d73ca9c45112f33579aa5a1293059010779 Mon Sep 17 00:00:00 2001 From: Jeff Barczewski Date: Sat, 30 Mar 2013 22:32:06 -0500 Subject: [PATCH] stream: objectMode transform should allow falsey values If a transform stream has objectMode = true, it should allow falsey values other than (null) like 0, false, ''. null is reserved to indicate stream eof but other falsey values should flow through properly. --- lib/_stream_transform.js | 2 +- test/simple/test-stream2-transform.js | 48 +++++++++++++++++++++++++++ 2 files changed, 49 insertions(+), 1 deletion(-) diff --git a/lib/_stream_transform.js b/lib/_stream_transform.js index bcadc4f7979..f246ef70a12 100644 --- a/lib/_stream_transform.js +++ b/lib/_stream_transform.js @@ -174,7 +174,7 @@ Transform.prototype._write = function(chunk, encoding, cb) { Transform.prototype._read = function(n) { var ts = this._transformState; - if (ts.writechunk && ts.writecb && !ts.transforming) { + if (ts.writechunk !== null && ts.writecb && !ts.transforming) { ts.transforming = true; this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform); } else { diff --git a/test/simple/test-stream2-transform.js b/test/simple/test-stream2-transform.js index 7a32a3cce8b..9a7778b098d 100644 --- a/test/simple/test-stream2-transform.js +++ b/test/simple/test-stream2-transform.js @@ -104,6 +104,28 @@ test('passthrough', function(t) { t.end(); }); +test('object passthrough', function (t) { + var pt = new PassThrough({ objectMode: true }); + + pt.write(1); + pt.write(true); + pt.write(false); + pt.write(0); + pt.write('foo'); + pt.write(''); + pt.write({ a: 'b'}); + pt.end(); + + t.equal(pt.read(), 1); + t.equal(pt.read(), true); + t.equal(pt.read(), false); + t.equal(pt.read(), 0); + t.equal(pt.read(), 'foo'); + t.equal(pt.read(), ''); + t.same(pt.read(), { a: 'b'}); + t.end(); +}); + test('simple transform', function(t) { var pt = new Transform; pt._transform = function(c, e, cb) { @@ -126,6 +148,32 @@ test('simple transform', function(t) { t.end(); }); +test('simple object transform', function(t) { + var pt = new Transform({ objectMode: true }); + pt._transform = function(c, e, cb) { + pt.push(JSON.stringify(c)); + cb(); + }; + + pt.write(1); + pt.write(true); + pt.write(false); + pt.write(0); + pt.write('foo'); + pt.write(''); + pt.write({ a: 'b'}); + pt.end(); + + t.equal(pt.read(), '1'); + t.equal(pt.read(), 'true'); + t.equal(pt.read(), 'false'); + t.equal(pt.read(), '0'); + t.equal(pt.read(), '"foo"'); + t.equal(pt.read(), '""'); + t.equal(pt.read(), '{"a":"b"}'); + t.end(); +}); + test('async passthrough', function(t) { var pt = new Transform; pt._transform = function(chunk, encoding, cb) {