UNPKG

1.21 kBJavaScriptView Raw
1var strict = require('./modes/strict');
2var types = require('./types');
3var isObject = types.isObject;
4var isFunction = require('lodash.isfunction');
5var transform = require('lodash.transform');
6var type = types.type;
7
8/* eslint no-use-before-define:0 */
9
10function serializeArray(arr) {
11 return arr.map(serialize.bind(null));
12}
13
14function serializeTransformer(res, val, key) {
15 res[key] = serialize(val);
16 return res;
17}
18
19function serializeObject(obj) {
20 var value = obj;
21 if (isFunction(obj.serialize)) {
22 value = obj.serialize();
23 }
24 return transform(value, serializeTransformer, {});
25}
26
27function serializePrimitive(value) {
28 var t = type(value);
29 if (strict.serialize.hasOwnProperty(t) === false) {
30 return value;
31 }
32
33 var caster = strict.serialize[t];
34 return caster(value);
35}
36
37/**
38 * Format values with extra extended json type data.
39 *
40 * @param {Any} value - What to wrap as a `{$<type>: <encoded>}` object.
41 * @return {Any}
42 * @api private
43 */
44function serialize(value) {
45 if (Array.isArray(value) === true) {
46 return serializeArray(value);
47 }
48 if (isObject(value) === false) {
49 return serializePrimitive(value);
50 }
51 return serializeObject(value);
52}
53
54module.exports = serialize;