| var Flatted = (function (Primitive, primitive) { |
| |
| /*! |
| * ISC License |
| * |
| * Copyright (c) 2018, Andrea Giammarchi, @WebReflection |
| * |
| * Permission to use, copy, modify, and/or distribute this software for any |
| * purpose with or without fee is hereby granted, provided that the above |
| * copyright notice and this permission notice appear in all copies. |
| * |
| * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH |
| * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY |
| * AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, |
| * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM |
| * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE |
| * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR |
| * PERFORMANCE OF THIS SOFTWARE. |
| */ |
| |
| var Flatted = { |
| |
| parse: function parse(text, reviver) { |
| var input = JSON.parse(text, Primitives).map(primitives); |
| var value = input[0]; |
| var $ = reviver || noop; |
| var tmp = typeof value === 'object' && value ? |
| revive(input, new Set, value, $) : |
| value; |
| return $.call({'': tmp}, '', tmp); |
| }, |
| |
| stringify: function stringify(value, replacer, space) { |
| for (var |
| firstRun, |
| known = new Map, |
| input = [], |
| output = [], |
| $ = replacer && typeof replacer === typeof input ? |
| function (k, v) { |
| if (k === '' || -1 < replacer.indexOf(k)) return v; |
| } : |
| (replacer || noop), |
| i = +set(known, input, $.call({'': value}, '', value)), |
| replace = function (key, value) { |
| if (firstRun) { |
| firstRun = !firstRun; |
| return value; |
| // this was invoking twice each root object |
| // return i < 1 ? value : $.call(this, key, value); |
| } |
| var after = $.call(this, key, value); |
| switch (typeof after) { |
| case 'object': |
| if (after === null) return after; |
| case primitive: |
| return known.get(after) || set(known, input, after); |
| } |
| return after; |
| }; |
| i < input.length; i++ |
| ) { |
| firstRun = true; |
| output[i] = JSON.stringify(input[i], replace, space); |
| } |
| return '[' + output.join(',') + ']'; |
| } |
| |
| }; |
| |
| return Flatted; |
| |
| function noop(key, value) { |
| return value; |
| } |
| |
| function revive(input, parsed, output, $) { |
| return Object.keys(output).reduce( |
| function (output, key) { |
| var value = output[key]; |
| if (value instanceof Primitive) { |
| var tmp = input[value]; |
| if (typeof tmp === 'object' && !parsed.has(tmp)) { |
| parsed.add(tmp); |
| output[key] = $.call(output, key, revive(input, parsed, tmp, $)); |
| } else { |
| output[key] = $.call(output, key, tmp); |
| } |
| } else |
| output[key] = $.call(output, key, value); |
| return output; |
| }, |
| output |
| ); |
| } |
| |
| function set(known, input, value) { |
| var index = Primitive(input.push(value) - 1); |
| known.set(value, index); |
| return index; |
| } |
| |
| // the two kinds of primitives |
| // 1. the real one |
| // 2. the wrapped one |
| |
| function primitives(value) { |
| return value instanceof Primitive ? Primitive(value) : value; |
| } |
| |
| function Primitives(key, value) { |
| return typeof value === primitive ? new Primitive(value) : value; |
| } |
| |
| }(String, 'string')); |
| module.exports = Flatted; |