diff --git a/index.js b/index.js index 30dd415..9ac1682 100644 --- a/index.js +++ b/index.js @@ -38,60 +38,7 @@ var reader = transit.reader('json', { } }); -var writer = transit.writer('json', { - handlers: transit.map([ - Immutable.Map, transit.makeWriteHandler({ - tag: function() { - return 'iM'; - }, - rep: function(m) { - var i = 0, a = new Array(2 * m.size); - m.forEach(function(v, k) { - a[i++] = k; - a[i++] = v; - }); - return a; - } - }), - Immutable.OrderedMap, transit.makeWriteHandler({ - tag: function() { - return 'iOM'; - }, - rep: function(m) { - var i = 0, a = new Array(2 * m.size); - m.forEach(function(v, k) { - a[i++] = k; - a[i++] = v; - }); - return a; - } - }), - Immutable.List, transit.makeWriteHandler({ - tag: function() { - return "iL"; - }, - rep: function(v) { - return v.toArray(); - } - }), - Immutable.Set, transit.makeWriteHandler({ - tag: function() { - return "iS"; - }, - rep: function(v) { - return v.toArray(); - } - }), - Function, transit.makeWriteHandler({ - tag: function() { - return '_'; - }, - rep: function() { - return null; - } - }) - ]) -}); +var writer = createWriter(false); exports.toJSON = toJSON; function toJSON(data) { @@ -102,3 +49,83 @@ exports.fromJSON = fromJSON; function fromJSON(data) { return reader.read(data); } + +function withFilter(predicate) { + var filteredWriter = createWriter(predicate); + return { + toJSON: function(data) { + return filteredWriter.write(data); + }, + fromJSON: fromJSON + } +} +exports.withFilter = withFilter; + +function createWriter(predicate) { + return transit.writer('json', { + handlers: transit.map([ + Immutable.Map, transit.makeWriteHandler({ + tag: function() { + return 'iM'; + }, + rep: function(m) { + var i = 0, a = new Array(2 * m.size); + if (predicate) { + m = m.filter(predicate); + } + m.forEach(function(v, k) { + a[i++] = k; + a[i++] = v; + }); + return a; + } + }), + Immutable.OrderedMap, transit.makeWriteHandler({ + tag: function() { + return 'iOM'; + }, + rep: function(m) { + var i = 0, a = new Array(2 * m.size); + if (predicate) { + m = m.filter(predicate); + } + m.forEach(function(v, k) { + a[i++] = k; + a[i++] = v; + }); + return a; + } + }), + Immutable.List, transit.makeWriteHandler({ + tag: function() { + return "iL"; + }, + rep: function(v) { + if (predicate) { + v = v.filter(predicate); + } + return v.toArray(); + } + }), + Immutable.Set, transit.makeWriteHandler({ + tag: function() { + return "iS"; + }, + rep: function(v) { + if (predicate) { + v = v.filter(predicate); + } + return v.toArray(); + } + }), + Function, transit.makeWriteHandler({ + tag: function() { + return '_'; + }, + rep: function() { + return null; + } + }) + ]) + }); +} \ No newline at end of file diff --git a/test/test.js b/test/test.js index 84c4a8b..c753ba5 100644 --- a/test/test.js +++ b/test/test.js @@ -101,4 +101,38 @@ describe('transit', function() { var result = transit.fromJSON(transit.toJSON(input)); expect(result.get('a')).to.eql(null); }); + describe('Using createWriter factory', function(){ + it('should ignore if predicate is false', function() { + var input = Immutable.Map({ a: 'foo', _b: 'bar', c: Immutable.Map({d: 'deep', _e: 'hide'})}); + var filter = transit.withFilter(function(val, key) { return key[0] !== '_'}); + var result = filter.fromJSON(filter.toJSON(input)); + expect(result.get('a')).to.eql('foo'); + expect(result.get('_b')).to.be.undefined; + expect(result.getIn(['c', 'd'])).to.eql('deep'); + expect(result.getIn(['c', '_e'])).to.be.undefined; + + input = Immutable.OrderedMap().set('a', 'baz').set('_b', 'bar').set('c', Immutable.OrderedMap({d: 'deep', _e: 'hide'})); + result = filter.fromJSON(filter.toJSON(input)); + expect(result.get('a')).to.eql('baz'); + expect(result.get('_b')).to.be.undefined; + expect(result.getIn(['c', 'd'])).to.eql('deep'); + expect(result.getIn(['c', '_e'])).to.be.undefined; + + input = Immutable.OrderedMap().set('a', 'baz').set('_b', 'bar').set('c', Immutable.Map({d: 'deep', _e: 'hide'})); + result = filter.fromJSON(filter.toJSON(input)); + expect(result.get('a')).to.eql('baz'); + expect(result.get('_b')).to.be.undefined; + expect(result.getIn(['c', 'd'])).to.eql('deep'); + expect(result.getIn(['c', '_e'])).to.be.undefined; + + input = Immutable.Set.of(1, 2, 3, 3, 'a') + filter = transit.withFilter(function(val, key) { return typeof val === 'number'}); + result = filter.fromJSON(filter.toJSON(input)); + expect(result.includes('a')).to.be.false; + + input = Immutable.List.of(1, 2, 3, 3, 'a') + result = filter.fromJSON(filter.toJSON(input)); + expect(result.includes('a')).to.be.false; + }); + }); });