UNPKG

@mikeal/realistic-structured-clone

Version:

A pure JS implementation of the structured clone algorithm (or at least something pretty close to that)

854 lines (843 loc) 65 kB
(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.realisticStructuredClone = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(_dereq_,module,exports){ 'use strict'; var Typeson = _dereq_('typeson'); var structuredCloningThrowing = _dereq_('typeson-registry/dist/presets/structured-cloning-throwing'); // http://stackoverflow.com/a/33268326/786644 - works in browser, worker, and Node.js var TSON = new Typeson().register(structuredCloningThrowing); function realisticStructuredClone(obj) { return TSON.revive(TSON.encapsulate(obj)); } module.exports = realisticStructuredClone; },{"typeson":3,"typeson-registry/dist/presets/structured-cloning-throwing":2}],2:[function(_dereq_,module,exports){ "use strict"; var _typeof2 = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; !function (e, t) { "object" == (typeof exports === "undefined" ? "undefined" : _typeof2(exports)) && "undefined" != typeof module ? module.exports = t() : "function" == typeof define && define.amd ? define(t) : ((e = "undefined" != typeof globalThis ? globalThis : e || self).Typeson = e.Typeson || {}, e.Typeson.presets = e.Typeson.presets || {}, e.Typeson.presets.structuredCloningThrowing = t()); }(undefined, function () { "use strict"; function _typeof(e) { return (_typeof = "function" == typeof Symbol && "symbol" == _typeof2(Symbol.iterator) ? function (e) { return typeof e === "undefined" ? "undefined" : _typeof2(e); } : function (e) { return e && "function" == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? "symbol" : typeof e === "undefined" ? "undefined" : _typeof2(e); })(e); }function _classCallCheck(e, t) { if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function"); }function _defineProperties(e, t) { for (var r = 0; r < t.length; r++) { var n = t[r];n.enumerable = n.enumerable || !1, n.configurable = !0, "value" in n && (n.writable = !0), Object.defineProperty(e, n.key, n); } }function _defineProperty(e, t, r) { return t in e ? Object.defineProperty(e, t, { value: r, enumerable: !0, configurable: !0, writable: !0 }) : e[t] = r, e; }function ownKeys(e, t) { var r = Object.keys(e);if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e);t && (n = n.filter(function (t) { return Object.getOwnPropertyDescriptor(e, t).enumerable; })), r.push.apply(r, n); }return r; }function _toConsumableArray(e) { return function _arrayWithoutHoles(e) { if (Array.isArray(e)) return _arrayLikeToArray(e); }(e) || function _iterableToArray(e) { if ("undefined" != typeof Symbol && Symbol.iterator in Object(e)) return Array.from(e); }(e) || function _unsupportedIterableToArray(e, t) { if (!e) return;if ("string" == typeof e) return _arrayLikeToArray(e, t);var r = Object.prototype.toString.call(e).slice(8, -1);"Object" === r && e.constructor && (r = e.constructor.name);if ("Map" === r || "Set" === r) return Array.from(e);if ("Arguments" === r || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)) return _arrayLikeToArray(e, t); }(e) || function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }(); }function _arrayLikeToArray(e, t) { (null == t || t > e.length) && (t = e.length);for (var r = 0, n = new Array(t); r < t; r++) { n[r] = e[r]; }return n; }function _typeof$1(e) { return (_typeof$1 = "function" == typeof Symbol && "symbol" === _typeof(Symbol.iterator) ? function _typeof$1(e) { return _typeof(e); } : function _typeof$1(e) { return e && "function" == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? "symbol" : _typeof(e); })(e); }function asyncGeneratorStep(e, t, r, n, i, o, a) { try { var c = e[o](a), s = c.value; } catch (e) { return void r(e); }c.done ? t(s) : Promise.resolve(s).then(n, i); }function _asyncToGenerator(e) { return function () { var t = this, r = arguments;return new Promise(function (n, i) { var o = e.apply(t, r);function _next(e) { asyncGeneratorStep(o, n, i, _next, _throw, "next", e); }function _throw(e) { asyncGeneratorStep(o, n, i, _next, _throw, "throw", e); }_next(void 0); }); }; }function _classCallCheck$1(e, t) { if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function"); }function _defineProperties$1(e, t) { for (var r = 0; r < t.length; r++) { var n = t[r];n.enumerable = n.enumerable || !1, n.configurable = !0, "value" in n && (n.writable = !0), Object.defineProperty(e, n.key, n); } }function _defineProperty$1(e, t, r) { return t in e ? Object.defineProperty(e, t, { value: r, enumerable: !0, configurable: !0, writable: !0 }) : e[t] = r, e; }function ownKeys$1(e, t) { var r = Object.keys(e);if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e);t && (n = n.filter(function (t) { return Object.getOwnPropertyDescriptor(e, t).enumerable; })), r.push.apply(r, n); }return r; }function _objectSpread2$1(e) { for (var t = 1; t < arguments.length; t++) { var r = null != arguments[t] ? arguments[t] : {};t % 2 ? ownKeys$1(Object(r), !0).forEach(function (t) { _defineProperty$1(e, t, r[t]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(r)) : ownKeys$1(Object(r)).forEach(function (t) { Object.defineProperty(e, t, Object.getOwnPropertyDescriptor(r, t)); }); }return e; }function _slicedToArray(e, t) { return function _arrayWithHoles(e) { if (Array.isArray(e)) return e; }(e) || function _iterableToArrayLimit(e, t) { if (!(Symbol.iterator in Object(e)) && "[object Arguments]" !== Object.prototype.toString.call(e)) return;var r = [], n = !0, i = !1, o = void 0;try { for (var a, c = e[Symbol.iterator](); !(n = (a = c.next()).done) && (r.push(a.value), !t || r.length !== t); n = !0) {} } catch (e) { i = !0, o = e; } finally { try { n || null == c.return || c.return(); } finally { if (i) throw o; } }return r; }(e, t) || function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); }(); }function _toConsumableArray$1(e) { return function _arrayWithoutHoles$1(e) { if (Array.isArray(e)) { for (var t = 0, r = new Array(e.length); t < e.length; t++) { r[t] = e[t]; }return r; } }(e) || function _iterableToArray$1(e) { if (Symbol.iterator in Object(e) || "[object Arguments]" === Object.prototype.toString.call(e)) return Array.from(e); }(e) || function _nonIterableSpread$1() { throw new TypeError("Invalid attempt to spread non-iterable instance"); }(); }var e = function TypesonPromise(e) { _classCallCheck$1(this, TypesonPromise), this.p = new Promise(e); };e.__typeson__type__ = "TypesonPromise", "undefined" != typeof Symbol && (e.prototype[Symbol.toStringTag] = "TypesonPromise"), e.prototype.then = function (t, r) { var n = this;return new e(function (e, i) { n.p.then(function (r) { e(t ? t(r) : r); }).catch(function (e) { return r ? r(e) : Promise.reject(e); }).then(e, i); }); }, e.prototype.catch = function (e) { return this.then(null, e); }, e.resolve = function (t) { return new e(function (e) { e(t); }); }, e.reject = function (t) { return new e(function (e, r) { r(t); }); }, ["all", "race"].forEach(function (t) { e[t] = function (r) { return new e(function (e, n) { Promise[t](r.map(function (e) { return e && e.constructor && "TypesonPromise" === e.constructor.__typeson__type__ ? e.p : e; })).then(e, n); }); }; });var t = {}.toString, r = {}.hasOwnProperty, n = Object.getPrototypeOf, i = r.toString;function isThenable(e, t) { return isObject(e) && "function" == typeof e.then && (!t || "function" == typeof e.catch); }function toStringTag(e) { return t.call(e).slice(8, -1); }function hasConstructorOf(e, t) { if (!e || "object" !== _typeof$1(e)) return !1;var o = n(e);if (!o) return null === t;var a = r.call(o, "constructor") && o.constructor;return "function" != typeof a ? null === t : t === a || null !== t && i.call(a) === i.call(t) || "function" == typeof t && "string" == typeof a.__typeson__type__ && a.__typeson__type__ === t.__typeson__type__; }function isPlainObject(e) { return !(!e || "Object" !== toStringTag(e)) && (!n(e) || hasConstructorOf(e, Object)); }function isObject(e) { return e && "object" === _typeof$1(e); }function escapeKeyPathComponent(e) { return e.replace(/~/g, "~0").replace(/\./g, "~1"); }function unescapeKeyPathComponent(e) { return e.replace(/~1/g, ".").replace(/~0/g, "~"); }function getByKeyPath(e, t) { if ("" === t) return e;var r = t.indexOf(".");if (r > -1) { var n = e[unescapeKeyPathComponent(t.slice(0, r))];return void 0 === n ? void 0 : getByKeyPath(n, t.slice(r + 1)); }return e[unescapeKeyPathComponent(t)]; }function setAtKeyPath(e, t, r) { if ("" === t) return r;var n = t.indexOf(".");return n > -1 ? setAtKeyPath(e[unescapeKeyPathComponent(t.slice(0, n))], t.slice(n + 1), r) : (e[unescapeKeyPathComponent(t)] = r, e); }var o = Object.keys, a = Array.isArray, c = {}.hasOwnProperty, s = ["type", "replaced", "iterateIn", "iterateUnsetNumeric"];function nestedPathsFirst(e, t) { if ("" === e.keypath) return -1;var r = e.keypath.match(/\./g) || 0, n = t.keypath.match(/\./g) || 0;return r && (r = r.length), n && (n = n.length), r > n ? -1 : r < n ? 1 : e.keypath < t.keypath ? -1 : e.keypath > t.keypath; }var u = function () { function Typeson(e) { _classCallCheck$1(this, Typeson), this.options = e, this.plainObjectReplacers = [], this.nonplainObjectReplacers = [], this.revivers = {}, this.types = {}; }return function _createClass$1(e, t, r) { return t && _defineProperties$1(e.prototype, t), r && _defineProperties$1(e, r), e; }(Typeson, [{ key: "stringify", value: function stringify(e, t, r, n) { n = _objectSpread2$1({}, this.options, {}, n, { stringification: !0 });var i = this.encapsulate(e, null, n);return a(i) ? JSON.stringify(i[0], t, r) : i.then(function (e) { return JSON.stringify(e, t, r); }); } }, { key: "stringifySync", value: function stringifySync(e, t, r, n) { return this.stringify(e, t, r, _objectSpread2$1({ throwOnBadSyncType: !0 }, n, { sync: !0 })); } }, { key: "stringifyAsync", value: function stringifyAsync(e, t, r, n) { return this.stringify(e, t, r, _objectSpread2$1({ throwOnBadSyncType: !0 }, n, { sync: !1 })); } }, { key: "parse", value: function parse(e, t, r) { return r = _objectSpread2$1({}, this.options, {}, r, { parse: !0 }), this.revive(JSON.parse(e, t), r); } }, { key: "parseSync", value: function parseSync(e, t, r) { return this.parse(e, t, _objectSpread2$1({ throwOnBadSyncType: !0 }, r, { sync: !0 })); } }, { key: "parseAsync", value: function parseAsync(e, t, r) { return this.parse(e, t, _objectSpread2$1({ throwOnBadSyncType: !0 }, r, { sync: !1 })); } }, { key: "specialTypeNames", value: function specialTypeNames(e, t) { var r = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : {};return r.returnTypeNames = !0, this.encapsulate(e, t, r); } }, { key: "rootTypeName", value: function rootTypeName(e, t) { var r = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : {};return r.iterateNone = !0, this.encapsulate(e, t, r); } }, { key: "encapsulate", value: function encapsulate(t, r, n) { var i = (n = _objectSpread2$1({ sync: !0 }, this.options, {}, n)).sync, u = this, f = {}, l = [], p = [], y = [], v = !("cyclic" in n) || n.cyclic, h = n.encapsulateObserver, d = _encapsulate("", t, v, r || {}, y);function finish(e) { var t = Object.values(f);if (n.iterateNone) return t.length ? t[0] : Typeson.getJSONType(e);if (t.length) { if (n.returnTypeNames) return _toConsumableArray$1(new Set(t));e && isPlainObject(e) && !c.call(e, "$types") ? e.$types = f : e = { $: e, $types: { $: f } }; } else isObject(e) && c.call(e, "$types") && (e = { $: e, $types: !0 });return !n.returnTypeNames && e; }function checkPromises(e, t) { return _checkPromises.apply(this, arguments); }function _checkPromises() { return (_checkPromises = _asyncToGenerator(regeneratorRuntime.mark(function _callee2(t, r) { var n;return regeneratorRuntime.wrap(function _callee2$(i) { for (;;) { switch (i.prev = i.next) {case 0: return i.next = 2, Promise.all(r.map(function (e) { return e[1].p; }));case 2: return n = i.sent, i.next = 5, Promise.all(n.map(function () { var n = _asyncToGenerator(regeneratorRuntime.mark(function _callee(n) { var i, o, a, c, s, u, f, l, p, y, v, h, d, b;return regeneratorRuntime.wrap(function _callee$(g) { for (;;) { switch (g.prev = g.next) {case 0: if (i = [], o = r.splice(0, 1), a = _slicedToArray(o, 1), c = a[0], s = _slicedToArray(c, 7), u = s[0], f = s[2], l = s[3], p = s[4], y = s[5], v = s[6], h = _encapsulate(u, n, f, l, i, !0, v), d = hasConstructorOf(h, e), !u || !d) { g.next = 11;break; }return g.next = 8, h.p;case 8: return b = g.sent, p[y] = b, g.abrupt("return", checkPromises(t, i));case 11: return u ? p[y] = h : t = d ? h.p : h, g.abrupt("return", checkPromises(t, i));case 13:case "end": return g.stop();} } }, _callee); }));return function (e) { return n.apply(this, arguments); }; }()));case 5: return i.abrupt("return", t);case 6:case "end": return i.stop();} } }, _callee2); }))).apply(this, arguments); }function _adaptBuiltinStateObjectProperties(e, t, r) { Object.assign(e, t);var n = s.map(function (t) { var r = e[t];return delete e[t], r; });r(), s.forEach(function (t, r) { e[t] = n[r]; }); }function _encapsulate(t, r, i, s, y, v, d) { var b, g = {}, m = _typeof$1(r), O = h ? function (n) { var o = d || s.type || Typeson.getJSONType(r);h(Object.assign(n || g, { keypath: t, value: r, cyclic: i, stateObj: s, promisesData: y, resolvingTypesonPromise: v, awaitingTypesonPromise: hasConstructorOf(r, e) }, { type: o })); } : null;if (["string", "boolean", "number", "undefined"].includes(m)) return void 0 === r || "number" === m && (isNaN(r) || r === -1 / 0 || r === 1 / 0) ? (b = s.replaced ? r : replace(t, r, s, y, !1, v, O)) !== r && (g = { replaced: b }) : b = r, O && O(), b;if (null === r) return O && O(), r;if (i && !s.iterateIn && !s.iterateUnsetNumeric && r && "object" === _typeof$1(r)) { var _ = l.indexOf(r);if (!(_ < 0)) return f[t] = "#", O && O({ cyclicKeypath: p[_] }), "#" + p[_];!0 === i && (l.push(r), p.push(t)); }var w, j = isPlainObject(r), S = a(r), T = (j || S) && (!u.plainObjectReplacers.length || s.replaced) || s.iterateIn ? r : replace(t, r, s, y, j || S, null, O);if (T !== r ? (b = T, g = { replaced: T }) : "" === t && hasConstructorOf(r, e) ? (y.push([t, r, i, s, void 0, void 0, s.type]), b = r) : S && "object" !== s.iterateIn || "array" === s.iterateIn ? (w = new Array(r.length), g = { clone: w }) : (["function", "symbol"].includes(_typeof$1(r)) || "toJSON" in r || hasConstructorOf(r, e) || hasConstructorOf(r, Promise) || hasConstructorOf(r, ArrayBuffer)) && !j && "object" !== s.iterateIn ? b = r : (w = {}, s.addLength && (w.length = r.length), g = { clone: w }), O && O(), n.iterateNone) return w || b;if (!w) return b;if (s.iterateIn) { var A = function _loop(n) { var o = { ownKeys: c.call(r, n) };_adaptBuiltinStateObjectProperties(s, o, function () { var o = t + (t ? "." : "") + escapeKeyPathComponent(n), a = _encapsulate(o, r[n], Boolean(i), s, y, v);hasConstructorOf(a, e) ? y.push([o, a, Boolean(i), s, w, n, s.type]) : void 0 !== a && (w[n] = a); }); };for (var P in r) { A(P); }O && O({ endIterateIn: !0, end: !0 }); } else o(r).forEach(function (n) { var o = t + (t ? "." : "") + escapeKeyPathComponent(n);_adaptBuiltinStateObjectProperties(s, { ownKeys: !0 }, function () { var t = _encapsulate(o, r[n], Boolean(i), s, y, v);hasConstructorOf(t, e) ? y.push([o, t, Boolean(i), s, w, n, s.type]) : void 0 !== t && (w[n] = t); }); }), O && O({ endIterateOwn: !0, end: !0 });if (s.iterateUnsetNumeric) { for (var C = r.length, k = function _loop2(n) { if (!(n in r)) { var o = t + (t ? "." : "") + n;_adaptBuiltinStateObjectProperties(s, { ownKeys: !1 }, function () { var t = _encapsulate(o, void 0, Boolean(i), s, y, v);hasConstructorOf(t, e) ? y.push([o, t, Boolean(i), s, w, n, s.type]) : void 0 !== t && (w[n] = t); }); } }, $ = 0; $ < C; $++) { k($); }O && O({ endIterateUnsetNumeric: !0, end: !0 }); }return w; }function replace(e, t, r, n, o, a, c) { for (var s = o ? u.plainObjectReplacers : u.nonplainObjectReplacers, l = s.length; l--;) { var p = s[l];if (p.test(t, r)) { var y = p.type;if (u.revivers[y]) { var h = f[e];f[e] = h ? [y].concat(h) : y; }return Object.assign(r, { type: y, replaced: !0 }), !i && p.replaceAsync || p.replace ? (c && c({ replacing: !0 }), _encapsulate(e, p[i || !p.replaceAsync ? "replace" : "replaceAsync"](t, r), v && "readonly", r, n, a, y)) : (c && c({ typeDetected: !0 }), _encapsulate(e, t, v && "readonly", r, n, a, y)); } }return t; }return y.length ? i && n.throwOnBadSyncType ? function () { throw new TypeError("Sync method requested but async result obtained"); }() : Promise.resolve(checkPromises(d, y)).then(finish) : !i && n.throwOnBadSyncType ? function () { throw new TypeError("Async method requested but sync result obtained"); }() : n.stringification && i ? [finish(d)] : i ? finish(d) : Promise.resolve(finish(d)); } }, { key: "encapsulateSync", value: function encapsulateSync(e, t, r) { return this.encapsulate(e, t, _objectSpread2$1({ throwOnBadSyncType: !0 }, r, { sync: !0 })); } }, { key: "encapsulateAsync", value: function encapsulateAsync(e, t, r) { return this.encapsulate(e, t, _objectSpread2$1({ throwOnBadSyncType: !0 }, r, { sync: !1 })); } }, { key: "revive", value: function revive(t, r) { var n = t && t.$types;if (!n) return t;if (!0 === n) return t.$;var i = (r = _objectSpread2$1({ sync: !0 }, this.options, {}, r)).sync, c = [], s = {}, u = !0;n.$ && isPlainObject(n.$) && (t = t.$, n = n.$, u = !1);var l = this;function executeReviver(e, t) { var r = _slicedToArray(l.revivers[e] || [], 1)[0];if (!r) throw new Error("Unregistered type: " + e);return i && !("revive" in r) ? t : r[i && r.revive ? "revive" : !i && r.reviveAsync ? "reviveAsync" : "revive"](t, s); }var p = [];function checkUndefined(e) { return hasConstructorOf(e, f) ? void 0 : e; }var y, v = function revivePlainObjects() { var r = [];if (Object.entries(n).forEach(function (e) { var t = _slicedToArray(e, 2), i = t[0], o = t[1];"#" !== o && [].concat(o).forEach(function (e) { _slicedToArray(l.revivers[e] || [null, {}], 2)[1].plain && (r.push({ keypath: i, type: e }), delete n[i]); }); }), r.length) return r.sort(nestedPathsFirst).reduce(function reducer(r, n) { var i = n.keypath, o = n.type;if (isThenable(r)) return r.then(function (e) { return reducer(e, { keypath: i, type: o }); });var a = getByKeyPath(t, i);if (hasConstructorOf(a = executeReviver(o, a), e)) return a.then(function (e) { var r = setAtKeyPath(t, i, e);r === e && (t = r); });var c = setAtKeyPath(t, i, a);c === a && (t = c); }, void 0); }();return hasConstructorOf(v, e) ? y = v.then(function () { return t; }) : (y = function _revive(t, r, i, s, l) { if (!u || "$types" !== t) { var y = n[t], v = a(r);if (v || isPlainObject(r)) { var h = v ? new Array(r.length) : {};for (o(r).forEach(function (n) { var o = _revive(t + (t ? "." : "") + escapeKeyPathComponent(n), r[n], i || h, h, n), a = function set(e) { return hasConstructorOf(e, f) ? h[n] = void 0 : void 0 !== e && (h[n] = e), e; };hasConstructorOf(o, e) ? p.push(o.then(function (e) { return a(e); })) : a(o); }), r = h; c.length;) { var d = _slicedToArray(c[0], 4), b = d[0], g = d[1], m = d[2], O = d[3], _ = getByKeyPath(b, g);if (void 0 === _) break;m[O] = _, c.splice(0, 1); } }if (!y) return r;if ("#" === y) { var w = getByKeyPath(i, r.slice(1));return void 0 === w && c.push([i, r.slice(1), s, l]), w; }return [].concat(y).reduce(function reducer(t, r) { return hasConstructorOf(t, e) ? t.then(function (e) { return reducer(e, r); }) : executeReviver(r, t); }, r); } }("", t, null), p.length && (y = e.resolve(y).then(function (t) { return e.all([t].concat(p)); }).then(function (e) { return _slicedToArray(e, 1)[0]; }))), isThenable(y) ? i && r.throwOnBadSyncType ? function () { throw new TypeError("Sync method requested but async result obtained"); }() : hasConstructorOf(y, e) ? y.p.then(checkUndefined) : y : !i && r.throwOnBadSyncType ? function () { throw new TypeError("Async method requested but sync result obtained"); }() : i ? checkUndefined(y) : Promise.resolve(checkUndefined(y)); } }, { key: "reviveSync", value: function reviveSync(e, t) { return this.revive(e, _objectSpread2$1({ throwOnBadSyncType: !0 }, t, { sync: !0 })); } }, { key: "reviveAsync", value: function reviveAsync(e, t) { return this.revive(e, _objectSpread2$1({ throwOnBadSyncType: !0 }, t, { sync: !1 })); } }, { key: "register", value: function register(e, t) { return t = t || {}, [].concat(e).forEach(function R(e) { var r = this;if (a(e)) return e.map(function (e) { return R.call(r, e); });e && o(e).forEach(function (r) { if ("#" === r) throw new TypeError("# cannot be used as a type name as it is reserved for cyclic objects");if (Typeson.JSON_TYPES.includes(r)) throw new TypeError("Plain JSON object types are reserved as type names");var n = e[r], i = n && n.testPlainObjects ? this.plainObjectReplacers : this.nonplainObjectReplacers, o = i.filter(function (e) { return e.type === r; });if (o.length && (i.splice(i.indexOf(o[0]), 1), delete this.revivers[r], delete this.types[r]), "function" == typeof n) { var c = n;n = { test: function test(e) { return e && e.constructor === c; }, replace: function replace(e) { return _objectSpread2$1({}, e); }, revive: function revive(e) { return Object.assign(Object.create(c.prototype), e); } }; } else if (a(n)) { var s = _slicedToArray(n, 3);n = { test: s[0], replace: s[1], revive: s[2] }; }if (n && n.test) { var u = { type: r, test: n.test.bind(n) };n.replace && (u.replace = n.replace.bind(n)), n.replaceAsync && (u.replaceAsync = n.replaceAsync.bind(n));var f = "number" == typeof t.fallback ? t.fallback : t.fallback ? 0 : 1 / 0;if (n.testPlainObjects ? this.plainObjectReplacers.splice(f, 0, u) : this.nonplainObjectReplacers.splice(f, 0, u), n.revive || n.reviveAsync) { var l = {};n.revive && (l.revive = n.revive.bind(n)), n.reviveAsync && (l.reviveAsync = n.reviveAsync.bind(n)), this.revivers[r] = [l, { plain: n.testPlainObjects }]; }this.types[r] = n; } }, this); }, this), this; } }]), Typeson; }(), f = function Undefined() { _classCallCheck$1(this, Undefined); };f.__typeson__type__ = "TypesonUndefined", u.Undefined = f, u.Promise = e, u.isThenable = isThenable, u.toStringTag = toStringTag, u.hasConstructorOf = hasConstructorOf, u.isObject = isObject, u.isPlainObject = isPlainObject, u.isUserObject = function isUserObject(e) { if (!e || "Object" !== toStringTag(e)) return !1;var t = n(e);return !t || hasConstructorOf(e, Object) || isUserObject(t); }, u.escapeKeyPathComponent = escapeKeyPathComponent, u.unescapeKeyPathComponent = unescapeKeyPathComponent, u.getByKeyPath = getByKeyPath, u.getJSONType = function getJSONType(e) { return null === e ? "null" : Array.isArray(e) ? "array" : _typeof$1(e); }, u.JSON_TYPES = ["null", "boolean", "number", "string", "array", "object"];for (var l = { userObject: { test: function test(e, t) { return u.isUserObject(e); }, replace: function replace(e) { return function _objectSpread2(e) { for (var t = 1; t < arguments.length; t++) { var r = null != arguments[t] ? arguments[t] : {};t % 2 ? ownKeys(Object(r), !0).forEach(function (t) { _defineProperty(e, t, r[t]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(r)) : ownKeys(Object(r)).forEach(function (t) { Object.defineProperty(e, t, Object.getOwnPropertyDescriptor(r, t)); }); }return e; }({}, e); }, revive: function revive(e) { return e; } } }, p = [{ arrayNonindexKeys: { testPlainObjects: !0, test: function test(e, t) { return !!Array.isArray(e) && (Object.keys(e).some(function (e) { return String(Number.parseInt(e)) !== e; }) && (t.iterateIn = "object", t.addLength = !0), !0); }, replace: function replace(e, t) { return t.iterateUnsetNumeric = !0, e; }, revive: function revive(e) { if (Array.isArray(e)) return e;var t = [];return Object.keys(e).forEach(function (r) { var n = e[r];t[r] = n; }), t; } } }, { sparseUndefined: { test: function test(e, t) { return void 0 === e && !1 === t.ownKeys; }, replace: function replace(e) { return 0; }, revive: function revive(e) {} } }], y = { undef: { test: function test(e, t) { return void 0 === e && (t.ownKeys || !("ownKeys" in t)); }, replace: function replace(e) { return 0; }, revive: function revive(e) { return new u.Undefined(); } } }, v = { StringObject: { test: function test(e) { return "String" === u.toStringTag(e) && "object" === _typeof(e); }, replace: function replace(e) { return String(e); }, revive: function revive(e) { return new String(e); } }, BooleanObject: { test: function test(e) { return "Boolean" === u.toStringTag(e) && "object" === _typeof(e); }, replace: function replace(e) { return Boolean(e); }, revive: function revive(e) { return new Boolean(e); } }, NumberObject: { test: function test(e) { return "Number" === u.toStringTag(e) && "object" === _typeof(e); }, replace: function replace(e) { return Number(e); }, revive: function revive(e) { return new Number(e); } } }, h = [{ nan: { test: function test(e) { return Number.isNaN(e); }, replace: function replace(e) { return "NaN"; }, revive: function revive(e) { return Number.NaN; } } }, { infinity: { test: function test(e) { return e === 1 / 0; }, replace: function replace(e) { return "Infinity"; }, revive: function revive(e) { return 1 / 0; } } }, { negativeInfinity: { test: function test(e) { return e === -1 / 0; }, replace: function replace(e) { return "-Infinity"; }, revive: function revive(e) { return -1 / 0; } } }], d = { date: { test: function test(e) { return "Date" === u.toStringTag(e); }, replace: function replace(e) { var t = e.getTime();return Number.isNaN(t) ? "NaN" : t; }, revive: function revive(e) { return "NaN" === e ? new Date(Number.NaN) : new Date(e); } } }, b = { regexp: { test: function test(e) { return "RegExp" === u.toStringTag(e); }, replace: function replace(e) { return { source: e.source, flags: (e.global ? "g" : "") + (e.ignoreCase ? "i" : "") + (e.multiline ? "m" : "") + (e.sticky ? "y" : "") + (e.unicode ? "u" : "") }; }, revive: function revive(e) { var t = e.source, r = e.flags;return new RegExp(t, r); } } }, g = { map: { test: function test(e) { return "Map" === u.toStringTag(e); }, replace: function replace(e) { return _toConsumableArray(e.entries()); }, revive: function revive(e) { return new Map(e); } } }, m = { set: { test: function test(e) { return "Set" === u.toStringTag(e); }, replace: function replace(e) { return _toConsumableArray(e.values()); }, revive: function revive(e) { return new Set(e); } } }, O = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", _ = new Uint8Array(256), w = 0; w < O.length; w++) { _[O.charCodeAt(w)] = w; }var j = function encode(e, t, r) { null == r && (r = e.byteLength);for (var n = new Uint8Array(e, t || 0, r), i = n.length, o = "", a = 0; a < i; a += 3) { o += O[n[a] >> 2], o += O[(3 & n[a]) << 4 | n[a + 1] >> 4], o += O[(15 & n[a + 1]) << 2 | n[a + 2] >> 6], o += O[63 & n[a + 2]]; }return i % 3 == 2 ? o = o.slice(0, -1) + "=" : i % 3 == 1 && (o = o.slice(0, -2) + "=="), o; }, S = function decode(e) { var t, r, n, i, o = e.length, a = .75 * e.length, c = 0;"=" === e[e.length - 1] && (a--, "=" === e[e.length - 2] && a--);for (var s = new ArrayBuffer(a), u = new Uint8Array(s), f = 0; f < o; f += 4) { t = _[e.charCodeAt(f)], r = _[e.charCodeAt(f + 1)], n = _[e.charCodeAt(f + 2)], i = _[e.charCodeAt(f + 3)], u[c++] = t << 2 | r >> 4, u[c++] = (15 & r) << 4 | n >> 2, u[c++] = (3 & n) << 6 | 63 & i; }return s; }, T = { arraybuffer: { test: function test(e) { return "ArrayBuffer" === u.toStringTag(e); }, replace: function replace(e, t) { t.buffers || (t.buffers = []);var r = t.buffers.indexOf(e);return r > -1 ? { index: r } : (t.buffers.push(e), j(e)); }, revive: function revive(e, t) { if (t.buffers || (t.buffers = []), "object" === _typeof(e)) return t.buffers[e.index];var r = S(e);return t.buffers.push(r), r; } } }, A = "undefined" == typeof self ? global : self, P = {};["Int8Array", "Uint8Array", "Uint8ClampedArray", "Int16Array", "Uint16Array", "Int32Array", "Uint32Array", "Float32Array", "Float64Array"].forEach(function (e) { var t = e, r = A[t];r && (P[e.toLowerCase()] = { test: function test(e) { return u.toStringTag(e) === t; }, replace: function replace(e, t) { var r = e.buffer, n = e.byteOffset, i = e.length;t.buffers || (t.buffers = []);var o = t.buffers.indexOf(r);return o > -1 ? { index: o, byteOffset: n, length: i } : (t.buffers.push(r), { encoded: j(r), byteOffset: n, length: i }); }, revive: function revive(e, t) { t.buffers || (t.buffers = []);var n, i = e.byteOffset, o = e.length, a = e.encoded, c = e.index;return "index" in e ? n = t.buffers[c] : (n = S(a), t.buffers.push(n)), new r(n, i, o); } }); });var C = { dataview: { test: function test(e) { return "DataView" === u.toStringTag(e); }, replace: function replace(e, t) { var r = e.buffer, n = e.byteOffset, i = e.byteLength;t.buffers || (t.buffers = []);var o = t.buffers.indexOf(r);return o > -1 ? { index: o, byteOffset: n, byteLength: i } : (t.buffers.push(r), { encoded: j(r), byteOffset: n, byteLength: i }); }, revive: function revive(e, t) { t.buffers || (t.buffers = []);var r, n = e.byteOffset, i = e.byteLength, o = e.encoded, a = e.index;return "index" in e ? r = t.buffers[a] : (r = S(o), t.buffers.push(r)), new DataView(r, n, i); } } }, k = { IntlCollator: { test: function test(e) { return u.hasConstructorOf(e, Intl.Collator); }, replace: function replace(e) { return e.resolvedOptions(); }, revive: function revive(e) { return new Intl.Collator(e.locale, e); } }, IntlDateTimeFormat: { test: function test(e) { return u.hasConstructorOf(e, Intl.DateTimeFormat); }, replace: function replace(e) { return e.resolvedOptions(); }, revive: function revive(e) { return new Intl.DateTimeFormat(e.locale, e); } }, IntlNumberFormat: { test: function test(e) { return u.hasConstructorOf(e, Intl.NumberFormat); }, replace: function replace(e) { return e.resolvedOptions(); }, revive: function revive(e) { return new Intl.NumberFormat(e.locale, e); } } };function string2arraybuffer(e) { for (var t = new Uint8Array(e.length), r = 0; r < e.length; r++) { t[r] = e.charCodeAt(r); }return t.buffer; }var $ = { file: { test: function test(e) { return "File" === u.toStringTag(e); }, replace: function replace(e) { var t = new XMLHttpRequest();if (t.overrideMimeType("text/plain; charset=x-user-defined"), t.open("GET", URL.createObjectURL(e), !1), t.send(), 200 !== t.status && 0 !== t.status) throw new Error("Bad File access: " + t.status);return { type: e.type, stringContents: t.responseText, name: e.name, lastModified: e.lastModified }; }, revive: function revive(e) { var t = e.name, r = e.type, n = e.stringContents, i = e.lastModified;return new File([string2arraybuffer(n)], t, { type: r, lastModified: i }); }, replaceAsync: function replaceAsync(e) { return new u.Promise(function (t, r) { var n = new FileReader();n.addEventListener("load", function () { t({ type: e.type, stringContents: n.result, name: e.name, lastModified: e.lastModified }); }), n.addEventListener("error", function () { r(n.error); }), n.readAsBinaryString(e); }); } } }, N = { bigint: { test: function test(e) { return "bigint" == typeof e; }, replace: function replace(e) { return String(e); }, revive: function revive(e) { return BigInt(e); } } }, B = { bigintObject: { test: function test(e) { return "object" === _typeof(e) && u.hasConstructorOf(e, BigInt); }, replace: function replace(e) { return String(e); }, revive: function revive(e) { return new Object(BigInt(e)); } } }, E = { cryptokey: { test: function test(e) { return "CryptoKey" === u.toStringTag(e) && e.extractable; }, replaceAsync: function replaceAsync(e) { return new u.Promise(function (t, r) { crypto.subtle.exportKey("jwk", e).catch(function (e) { r(e); }).then(function (r) { t({ jwk: r, algorithm: e.algorithm, usages: e.usages }); }); }); }, revive: function revive(e) { var t = e.jwk, r = e.algorithm, n = e.usages;return crypto.subtle.importKey("jwk", t, r, !0, n); } } };return [l, y, p, v, h, d, b, { imagedata: { test: function test(e) { return "ImageData" === u.toStringTag(e); }, replace: function replace(e) { return { array: _toConsumableArray(e.data), width: e.width, height: e.height }; }, revive: function revive(e) { return new ImageData(new Uint8ClampedArray(e.array), e.width, e.height); } } }, { imagebitmap: { test: function test(e) { return "ImageBitmap" === u.toStringTag(e) || e && e.dataset && "ImageBitmap" === e.dataset.toStringTag; }, replace: function replace(e) { var t = document.createElement("canvas");return t.getContext("2d").drawImage(e, 0, 0), t.toDataURL(); }, revive: function revive(e) { var t = document.createElement("canvas"), r = t.getContext("2d"), n = document.createElement("img");return n.addEventListener("load", function () { r.drawImage(n, 0, 0); }), n.src = e, t; }, reviveAsync: function reviveAsync(e) { var t = document.createElement("canvas"), r = t.getContext("2d"), n = document.createElement("img");return n.addEventListener("load", function () { r.drawImage(n, 0, 0); }), n.src = e, createImageBitmap(t); } } }, $, { file: $.file, filelist: { test: function test(e) { return "FileList" === u.toStringTag(e); }, replace: function replace(e) { for (var t = [], r = 0; r < e.length; r++) { t[r] = e.item(r); }return t; }, revive: function revive(e) { return new (function () { function FileList() { _classCallCheck(this, FileList), this._files = arguments[0], this.length = this._files.length; }return function _createClass(e, t, r) { return t && _defineProperties(e.prototype, t), r && _defineProperties(e, r), e; }(FileList, [{ key: "item", value: function item(e) { return this._files[e]; } }, { key: Symbol.toStringTag, get: function get() { return "FileList"; } }]), FileList; }())(e); } } }, { blob: { test: function test(e) { return "Blob" === u.toStringTag(e); }, replace: function replace(e) { var t = new XMLHttpRequest();if (t.overrideMimeType("text/plain; charset=x-user-defined"), t.open("GET", URL.createObjectURL(e), !1), t.send(), 200 !== t.status && 0 !== t.status) throw new Error("Bad Blob access: " + t.status);return { type: e.type, stringContents: t.responseText }; }, revive: function revive(e) { var t = e.type, r = e.stringContents;return new Blob([string2arraybuffer(r)], { type: t }); }, replaceAsync: function replaceAsync(e) { return new u.Promise(function (t, r) { var n = new FileReader();n.addEventListener("load", function () { t({ type: e.type, stringContents: n.result }); }), n.addEventListener("error", function () { r(n.error); }), n.readAsBinaryString(e); }); } } }].concat("function" == typeof Map ? g : [], "function" == typeof Set ? m : [], "function" == typeof ArrayBuffer ? T : [], "function" == typeof Uint8Array ? P : [], "function" == typeof DataView ? C : [], "undefined" != typeof Intl ? k : [], "undefined" != typeof crypto ? E : [], "undefined" != typeof BigInt ? [N, B] : []).concat({ checkDataCloneException: { test: function test(e) { var t = {}.toString.call(e).slice(8, -1);if (["symbol", "function"].includes(_typeof(e)) || ["Arguments", "Module", "Error", "Promise", "WeakMap", "WeakSet", "Event", "MessageChannel"].includes(t) || e && "object" === _typeof(e) && "number" == typeof e.nodeType && "function" == typeof e.insertBefore) throw new DOMException("The object cannot be cloned.", "DataCloneError");return !1; } } }); }); },{}],3:[function(_dereq_,module,exports){ "use strict"; var _typeof2 = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; function _typeof(e) { return (_typeof = "function" == typeof Symbol && "symbol" == _typeof2(Symbol.iterator) ? function (e) { return typeof e === "undefined" ? "undefined" : _typeof2(e); } : function (e) { return e && "function" == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? "symbol" : typeof e === "undefined" ? "undefined" : _typeof2(e); })(e); }function asyncGeneratorStep(e, t, n, r, o, a, i) { try { var c = e[a](i), s = c.value; } catch (e) { return void n(e); }c.done ? t(s) : Promise.resolve(s).then(r, o); }function _asyncToGenerator(e) { return function () { var t = this, n = arguments;return new Promise(function (r, o) { var a = e.apply(t, n);function _next(e) { asyncGeneratorStep(a, r, o, _next, _throw, "next", e); }function _throw(e) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", e); }_next(void 0); }); }; }function _classCallCheck(e, t) { if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function"); }function _defineProperties(e, t) { for (var n = 0; n < t.length; n++) { var r = t[n];r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(e, r.key, r); } }function _defineProperty(e, t, n) { return t in e ? Object.defineProperty(e, t, { value: n, enumerable: !0, configurable: !0, writable: !0 }) : e[t] = n, e; }function ownKeys(e, t) { var n = Object.keys(e);if (Object.getOwnPropertySymbols) { var r = Object.getOwnPropertySymbols(e);t && (r = r.filter(function (t) { return Object.getOwnPropertyDescriptor(e, t).enumerable; })), n.push.apply(n, r); }return n; }function _objectSpread2(e) { for (var t = 1; t < arguments.length; t++) { var n = null != arguments[t] ? arguments[t] : {};t % 2 ? ownKeys(Object(n), !0).forEach(function (t) { _defineProperty(e, t, n[t]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(n)) : ownKeys(Object(n)).forEach(function (t) { Object.defineProperty(e, t, Object.getOwnPropertyDescriptor(n, t)); }); }return e; }function _slicedToArray(e, t) { return function _arrayWithHoles(e) { if (Array.isArray(e)) return e; }(e) || function _iterableToArrayLimit(e, t) { if (!(Symbol.iterator in Object(e) || "[object Arguments]" === Object.prototype.toString.call(e))) return;var n = [], r = !0, o = !1, a = void 0;try { for (var i, c = e[Symbol.iterator](); !(r = (i = c.next()).done) && (n.push(i.value), !t || n.length !== t); r = !0) {} } catch (e) { o = !0, a = e; } finally { try { r || null == c.return || c.return(); } finally { if (o) throw a; } }return n; }(e, t) || function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); }(); }function _toConsumableArray(e) { return function _arrayWithoutHoles(e) { if (Array.isArray(e)) { for (var t = 0, n = new Array(e.length); t < e.length; t++) { n[t] = e[t]; }return n; } }(e) || function _iterableToArray(e) { if (Symbol.iterator in Object(e) || "[object Arguments]" === Object.prototype.toString.call(e)) return Array.from(e); }(e) || function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); }(); }var e = function TypesonPromise(e) { _classCallCheck(this, TypesonPromise), this.p = new Promise(e); };e.__typeson__type__ = "TypesonPromise", "undefined" != typeof Symbol && (e.prototype[Symbol.toStringTag] = "TypesonPromise"), e.prototype.then = function (t, n) { var r = this;return new e(function (e, o) { r.p.then(function (n) { e(t ? t(n) : n); }).catch(function (e) { return n ? n(e) : Promise.reject(e); }).then(e, o); }); }, e.prototype.catch = function (e) { return this.then(null, e); }, e.resolve = function (t) { return new e(function (e) { e(t); }); }, e.reject = function (t) { return new e(function (e, n) { n(t); }); }, ["all", "race"].forEach(function (t) { e[t] = function (n) { return new e(function (e, r) { Promise[t](n.map(function (e) { return e && e.constructor && "TypesonPromise" === e.constructor.__typeson__type__ ? e.p : e; })).then(e, r); }); }; });var t = {}.toString, n = {}.hasOwnProperty, r = Object.getPrototypeOf, o = n.toString;function isThenable(e, t) { return isObject(e) && "function" == typeof e.then && (!t || "function" == typeof e.catch); }function toStringTag(e) { return t.call(e).slice(8, -1); }function hasConstructorOf(e, t) { if (!e || "object" !== _typeof(e)) return !1;var a = r(e);if (!a) return null === t;var i = n.call(a, "constructor") && a.constructor;return "function" != typeof i ? null === t : t === i || null !== t && o.call(i) === o.call(t) || "function" == typeof t && "string" == typeof i.__typeson__type__ && i.__typeson__type__ === t.__typeson__type__; }function isPlainObject(e) { return !(!e || "Object" !== toStringTag(e)) && (!r(e) || hasConstructorOf(e, Object)); }function isObject(e) { return e && "object" === _typeof(e); }function escapeKeyPathComponent(e) { return e.replace(/~/g, "~0").replace(/\./g, "~1"); }function unescapeKeyPathComponent(e) { return e.replace(/~1/g, ".").replace(/~0/g, "~"); }function getByKeyPath(e, t) { if ("" === t) return e;var n = t.indexOf(".");if (n > -1) { var r = e[unescapeKeyPathComponent(t.slice(0, n))];return void 0 === r ? void 0 : getByKeyPath(r, t.slice(n + 1)); }return e[unescapeKeyPathComponent(t)]; }function setAtKeyPath(e, t, n) { if ("" === t) return n;var r = t.indexOf(".");return r > -1 ? setAtKeyPath(e[unescapeKeyPathComponent(t.slice(0, r))], t.slice(r + 1), n) : (e[unescapeKeyPathComponent(t)] = n, e); }var a = Object.keys, i = Array.isArray, c = {}.hasOwnProperty, s = ["type", "replaced", "iterateIn", "iterateUnsetNumeric"];function nestedPathsFirst(e, t) { if ("" === e.keypath) return -1;var n = e.keypath.match(/\./g) || 0, r = t.keypath.match(/\./g) || 0;return n && (n = n.length), r && (r = r.length), n > r ? -1 : n < r ? 1 : e.keypath < t.keypath ? -1 : e.keypath > t.keypath; }var u = function () { function Typeson(e) { _classCallCheck(this, Typeson), this.options = e, this.plainObjectReplacers = [], this.nonplainObjectReplacers = [], this.revivers = {}, this.types = {}; }return function _createClass(e, t, n) { return t && _defineProperties(e.prototype, t), n && _defineProperties(e, n), e; }(Typeson, [{ key: "stringify", value: function stringify(e, t, n, r) { r = _objectSpread2({}, this.options, {}, r, { stringification: !0 });var o = this.encapsulate(e, null, r);return i(o) ? JSON.stringify(o[0], t, n) : o.then(function (e) { return JSON.stringify(e, t, n); }); } }, { key: "stringifySync", value: function stringifySync(e, t, n, r) { return this.stringify(e, t, n, _objectSpread2({ throwOnBadSyncType: !0 }, r, { sync: !0 })); } }, { key: "stringifyAsync", value: function stringifyAsync(e, t, n, r) { return this.stringify(e, t, n, _objectSpread2({ throwOnBadSyncType: !0 }, r, { sync: !1 })); } }, { key: "parse", value: function parse(e, t, n) { return n = _objectSpread2({}, this.options, {}, n