UNPKG

7.17 kBSource Map (JSON)View Raw
1{"version":3,"file":"serialize.js","sources":["../src/serialize.js"],"sourcesContent":["import _ from 'lodash';\nimport jsonSS from 'json-stringify-safe';\n\n// patterns\nconst stackDelim = /\\n\\s*/g;\n\n// util\nconst pass = (key, val) => val;\n\nconst isNewIterable = val => {\n const isMap = (Map && val instanceof Map);\n const isSet = (Set && val instanceof Set);\n const isWeakMap = (WeakMap && val instanceof WeakMap);\n const isWeakSet = (WeakSet && val instanceof WeakSet);\n\n return isMap || isSet || isWeakMap || isWeakSet;\n};\n\n// Though it might be a nice touch to spread generators too, it’d be way too\n// presumptuous (could have side effects, could be infinite). As it is,\n// functions and generators both just disappear into the night, though the\n// user can change this with a custom replacer.\nconst errReplacer = (val, withStack) => {\n // Errors do not serialize nicely with JSON.stringify because none of the\n // properties of interest are ‘own’ properties.\n\n const err = { name: val.name || 'Error', message: val.message };\n\n // Though custom errors could have some own properties:\n Object.assign(err, val);\n\n // For the stack, we convert to an array for the sake of readability.\n\n if (withStack) err.stack = val.stack && val.stack.split(stackDelim);\n\n return err;\n};\n\nconst flat = (serialize, arraysToo) =>\n (obj) => {\n const serializedObj = JSON.parse(serialize(obj));\n if (!_.isObject(serializedObj)) return serializedObj;\n\n const flatObj = _.reduce(serializedObj, function _flat(target, val, key) {\n const keyContext = this.slice();\n keyContext.push(key);\n\n const joinedKey = keyContext.join('.');\n const newTarget = target;\n if (!_.isObject(val)) {\n newTarget[joinedKey] = val;\n } else if (!arraysToo && _.isArray(val)) {\n newTarget[joinedKey] = val.map(newVal => {\n if (!_.isObject(newVal)) return newVal;\n\n return _.reduce(newVal, _flat, {}, []);\n });\n } else {\n _.reduce(val, _flat, newTarget, keyContext);\n }\n\n return newTarget;\n }, {}, []);\n\n return jsonSS(flatObj);\n };\n\n// build serializer\nconst build = ({\n flatten, flattenArrays, replacer = pass,\n withStack\n}) => {\n // We augment the default JSON.stringify serialization behavior with\n // handling for a number of values that otherwise return nonsense values or\n // nothing at all. In addition to numeric outliers, a number of other basic\n // JS objects (post-ES6 especially) aren’t in the JSON spec, presumably\n // because it would have been too obvious that we were tricking everyone\n // else into making our lives easier. This augmented behavior is useful in a\n // JS environment since we’re not apt to think ‘I am going to log JSON!’; we\n // just want to dump objects in the log hole.\n\n // If the user supplied a custom replacer, it is applied first.\n const replace = _.flow(replacer, val => {\n // Prototypeless object\n if (_.isObject(val) && !Object.getPrototypeOf(val)) {\n return val;\n }\n\n if (_.isObject(val) && !(val instanceof Object)) {\n return val;\n }\n\n // Trouble primitives\n if (_.isNaN(val)) return 'NaN';\n if (val === Infinity) return 'Infinity';\n if (val === -Infinity) return '-Infinity';\n if (1 / val === -Infinity) return '-0';\n if (typeof val === 'symbol') return val.toString();\n\n // Trouble objects\n if (_.isError(val)) return errReplacer(val, withStack);\n if (_.isArguments(val)) return _.toArray(val);\n if (_.isRegExp(val)) return val.toString();\n if (isNewIterable(val)) return [...val];\n\n // - Error, regexp, maps and sets would have been `{}`\n // - Arguments would have been `{\"0\": \"arg1\", \"1\": \"arg2\" }`\n // - NaN and +/-Infinity would have been `null` (wtf?)\n // - -0 would have been 0 (yes I’m being overly thorough)\n // - Symbols would have been undefined\n\n // Note: numeric literals in base-whatever are just standard decimal\n // integers internally, so 0b1 will be \"1\" -- the original notation\n // can’t be preserved. JSON does preserve exponent suffixes though.\n return val;\n });\n\n // json-stringify-safe is a JSON.stringify wrapper that takes care of\n // circular references.\n const serialize = _.partial(jsonSS, _, replace);\n\n return flatten ? flat(serialize, flattenArrays) : serialize;\n};\n\nexport { build as default };\n"],"names":[],"mappings":"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"}
\No newline at end of file