-
Notifications
You must be signed in to change notification settings - Fork 22
/
Copy pathserialize.js
58 lines (55 loc) · 2.51 KB
/
serialize.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
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
}
};