redux-devtools/packages/remotedev-serialize/immutable/serialize.js
Nathan Bierema ad281ba07a
Add remotedev-serialize package (#562)
* Add remotedev-serialize package

* Update
2020-08-06 16:39:05 -04:00

88 lines
2.7 KiB
JavaScript

var helpers = require('../helpers');
var mark = helpers.mark;
var extract = helpers.extract;
var refer = helpers.refer;
var options = require('../constants/options');
module.exports = function serialize(
Immutable,
refs,
customReplacer,
customReviver
) {
function replacer(key, value) {
if (value instanceof Immutable.Record)
return refer(value, 'ImmutableRecord', 'toObject', 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', 'toObject');
if (Immutable.Map.isMap(value))
return mark(value, 'ImmutableMap', 'toObject');
if (Immutable.List.isList(value))
return mark(value, 'ImmutableList', 'toArray');
if (Immutable.OrderedSet.isOrderedSet(value))
return mark(value, 'ImmutableOrderedSet', 'toArray');
if (Immutable.Set.isSet(value))
return mark(value, 'ImmutableSet', 'toArray');
if (Immutable.Seq.isSeq(value))
return mark(value, 'ImmutableSeq', 'toArray');
if (Immutable.Stack.isStack(value))
return mark(value, 'ImmutableStack', 'toArray');
return value;
}
function reviver(key, value) {
if (
typeof value === 'object' &&
value !== null &&
'__serializedType__' in value
) {
var data = value.data;
switch (value.__serializedType__) {
case 'ImmutableMap':
return Immutable.Map(data);
case 'ImmutableOrderedMap':
return Immutable.OrderedMap(data);
case 'ImmutableList':
return Immutable.List(data);
case 'ImmutableRange':
return Immutable.Range(data._start, data._end, data._step);
case 'ImmutableRepeat':
return Immutable.Repeat(data._value, data.size);
case 'ImmutableSet':
return Immutable.Set(data);
case 'ImmutableOrderedSet':
return Immutable.OrderedSet(data);
case 'ImmutableSeq':
return Immutable.Seq(data);
case 'ImmutableStack':
return Immutable.Stack(data);
case 'ImmutableRecord':
return refs && refs[value.__serializedRef__]
? new refs[value.__serializedRef__](data)
: Immutable.Map(data);
default:
return data;
}
}
return value;
}
return {
replacer: customReplacer
? function(key, value) {
return customReplacer(key, value, replacer);
}
: replacer,
reviver: customReviver
? function(key, value) {
return customReviver(key, value, reviver);
}
: reviver,
options: options
};
};