diff --git a/index.js b/index.js index a35b763..5eb5ffa 100644 --- a/index.js +++ b/index.js @@ -1,13 +1,13 @@ var jsan = require('jsan'); var serialize = require('./serialize'); -module.exports = function(Immutable) { +module.exports = function(Immutable, refs) { return { stringify: function(data) { - return jsan.stringify(data, serialize(Immutable).replacer, null, true); + return jsan.stringify(data, serialize(Immutable, refs).replacer, null, true); }, parse: function(data) { - return jsan.parse(data, serialize(Immutable).reviver); + return jsan.parse(data, serialize(Immutable, refs).reviver); }, serialize: serialize } diff --git a/serialize.js b/serialize.js index 304733f..c414894 100644 --- a/serialize.js +++ b/serialize.js @@ -12,10 +12,22 @@ function extract(data, type) { }; } -module.exports = function serialize(Immutable) { +function refer(data, type, isArray, refs) { + var r = mark(data, type, isArray); + for (var i = 0; i < refs.length; i++) { + var ref = refs[i]; + if (typeof ref === 'function' && data instanceof ref) { + r.__remotedevRef__ = i; + return r; + } + } + return r; +} + +module.exports = function serialize(Immutable, refs) { return { replacer: function(key, value) { - if (value instanceof Immutable.Record) return mark(value, 'ImmutableRecord'); + if (value instanceof Immutable.Record) return refer(value, 'ImmutableRecord', false, refs); if (value instanceof Immutable.Range) return extract(value, 'ImmutableRange'); if (value instanceof Immutable.Repeat) return extract(value, 'ImmutableRepeat'); if (Immutable.OrderedMap.isOrderedMap(value)) return mark(value, 'ImmutableOrderedMap'); @@ -41,7 +53,9 @@ module.exports = function serialize(Immutable) { case 'ImmutableOrderedSet': return Immutable.OrderedSet(data); case 'ImmutableSeq': return Immutable.Seq(data); case 'ImmutableStack': return Immutable.Stack(data); - default: return Immutable.fromJS(data); + case 'ImmutableRecord': + return (refs && refs[value.__remotedevRef__] || Immutable.Map)(data); + default: return data; } } return value; diff --git a/test/__snapshots__/serialize.spec.js.snap b/test/__snapshots__/serialize.spec.js.snap index 7664ebb..d9bc702 100644 --- a/test/__snapshots__/serialize.spec.js.snap +++ b/test/__snapshots__/serialize.spec.js.snap @@ -1,3 +1,5 @@ +exports[`Record stringify 1`] = `"{\"data\":{\"a\":1,\"b\":3},\"__remotedevType__\":\"ImmutableRecord\",\"__remotedevRef__\":0}"`; + exports[`Stringify list 1`] = `"{\"data\":[1,2,3,4,5,6,7,8,9,10],\"__remotedevType__\":\"ImmutableList\"}"`; exports[`Stringify map 1`] = `"{\"data\":{\"a\":1,\"b\":2,\"c\":3,\"d\":4},\"__remotedevType__\":\"ImmutableMap\"}"`; diff --git a/test/serialize.spec.js b/test/serialize.spec.js index dfdf339..6dc51f5 100644 --- a/test/serialize.spec.js +++ b/test/serialize.spec.js @@ -33,3 +33,23 @@ describe('Parse', function () { }); }); }); + +describe('Record', function () { + var ABRecord = Immutable.Record({ a:1, b:2 }); + var myRecord = new ABRecord({ b:3 }); + + var serialize = Serialize(Immutable, [ABRecord]); + var stringify = serialize.stringify; + var parse = serialize.parse; + var stringifiedRecord; + + it('stringify', function() { + stringifiedRecord = stringify(myRecord); + expect(stringifiedRecord).toMatchSnapshot(); + }); + + it('parse', function() { + stringifiedRecord = stringify(myRecord); + expect(parse(stringifiedRecord)).toEqual(myRecord); + }); +});