Comparing version 5.18.2 to 6.0.0
# typeson CHANGES | ||
## 6.0.0 | ||
### User-facing | ||
- Breaking change: Drop peerDeps (core-js-bundle, regenerator-runtime) and | ||
avoid need for `regenerator-runtime` | ||
- Docs: Corrected typo (@stephanemagnenat) | ||
### Dev-facing | ||
- Linting: Lint per lasest ash-nazg; lint hidden file | ||
- Build: Use "json" extension on RC file; indicate `default` exports for Rollup | ||
- Editorconfig: Enforce JSON spacing | ||
- Testing: Remove need for bootstrap file | ||
- npm: Add coverage in main `test` script | ||
- npm: Switch to server without reported vulnerabilities (`http-server`) | ||
- npm: Replace deprecated `rollup-plugin-babel` with `@rollup/plugin-babel` | ||
and make `babelHelpers` `bundled` value explicit | ||
- npm: Update devDeps (including changing updated ash-nazg peerDeps.) | ||
## 5.18.2 | ||
@@ -4,0 +24,0 @@ |
@@ -1,1 +0,1 @@ | ||
"use strict";function _typeof(e){return(_typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof 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,{parse:!0}),this.revive(JSON.parse(e,t),n)}},{key:"parseSync",value:function parseSync(e,t,n){return this.parse(e,t,_objectSpread2({throwOnBadSyncType:!0},n,{sync:!0}))}},{key:"parseAsync",value:function parseAsync(e,t,n){return this.parse(e,t,_objectSpread2({throwOnBadSyncType:!0},n,{sync:!1}))}},{key:"specialTypeNames",value:function specialTypeNames(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return n.returnTypeNames=!0,this.encapsulate(e,t,n)}},{key:"rootTypeName",value:function rootTypeName(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return n.iterateNone=!0,this.encapsulate(e,t,n)}},{key:"encapsulate",value:function encapsulate(t,n,r){var o=(r=_objectSpread2({sync:!0},this.options,{},r)).sync,u=this,p={},y=[],l=[],f=[],h=!("cyclic"in r)||r.cyclic,v=r.encapsulateObserver,d=_encapsulate("",t,h,n||{},f);function finish(e){var t=Object.values(p);if(r.iterateNone)return t.length?t[0]:Typeson.getJSONType(e);if(t.length){if(r.returnTypeNames)return _toConsumableArray(new Set(t));e&&isPlainObject(e)&&!c.call(e,"$types")?e.$types=p:e={$:e,$types:{$:p}}}else isObject(e)&&c.call(e,"$types")&&(e={$:e,$types:!0});return!r.returnTypeNames&&e}function checkPromises(e,t){return _checkPromises.apply(this,arguments)}function _checkPromises(){return(_checkPromises=_asyncToGenerator(regeneratorRuntime.mark((function _callee2(t,n){var r;return regeneratorRuntime.wrap((function _callee2$(o){for(;;)switch(o.prev=o.next){case 0:return o.next=2,Promise.all(n.map((function(e){return e[1].p})));case 2:return r=o.sent,o.next=5,Promise.all(r.map(function(){var r=_asyncToGenerator(regeneratorRuntime.mark((function _callee(r){var o,a,i,c,s,u,p,y,l,f,h,v,d,b;return regeneratorRuntime.wrap((function _callee$(O){for(;;)switch(O.prev=O.next){case 0:if(o=[],a=n.splice(0,1),i=_slicedToArray(a,1),c=i[0],s=_slicedToArray(c,7),u=s[0],p=s[2],y=s[3],l=s[4],f=s[5],h=s[6],v=_encapsulate(u,r,p,y,o,!0,h),d=hasConstructorOf(v,e),!u||!d){O.next=11;break}return O.next=8,v.p;case 8:return b=O.sent,l[f]=b,O.abrupt("return",checkPromises(t,o));case 11:return u?l[f]=v:t=d?v.p:v,O.abrupt("return",checkPromises(t,o));case 13:case"end":return O.stop()}}),_callee)})));return function(e){return r.apply(this,arguments)}}()));case 5:return o.abrupt("return",t);case 6:case"end":return o.stop()}}),_callee2)})))).apply(this,arguments)}function _adaptBuiltinStateObjectProperties(e,t,n){Object.assign(e,t);var r=s.map((function(t){var n=e[t];return delete e[t],n}));n(),s.forEach((function(t,n){e[t]=r[n]}))}function _encapsulate(t,n,o,s,f,h,d){var b,O={},_=_typeof(n),m=v?function(r){var a=d||s.type||Typeson.getJSONType(n);v(Object.assign(r||O,{keypath:t,value:n,cyclic:o,stateObj:s,promisesData:f,resolvingTypesonPromise:h,awaitingTypesonPromise:hasConstructorOf(n,e)},{type:a}))}:null;if(["string","boolean","number","undefined"].includes(_))return void 0===n||"number"===_&&(isNaN(n)||n===-1/0||n===1/0)?(b=s.replaced?n:replace(t,n,s,f,!1,h,m))!==n&&(O={replaced:b}):b=n,m&&m(),b;if(null===n)return m&&m(),n;if(o&&!s.iterateIn&&!s.iterateUnsetNumeric&&n&&"object"===_typeof(n)){var g=y.indexOf(n);if(!(g<0))return p[t]="#",m&&m({cyclicKeypath:l[g]}),"#"+l[g];!0===o&&(y.push(n),l.push(t))}var j,P=isPlainObject(n),S=i(n),T=(P||S)&&(!u.plainObjectReplacers.length||s.replaced)||s.iterateIn?n:replace(t,n,s,f,P||S,null,m);if(T!==n?(b=T,O={replaced:T}):""===t&&hasConstructorOf(n,e)?(f.push([t,n,o,s,void 0,void 0,s.type]),b=n):S&&"object"!==s.iterateIn||"array"===s.iterateIn?(j=new Array(n.length),O={clone:j}):(["function","symbol"].includes(_typeof(n))||"toJSON"in n||hasConstructorOf(n,e)||hasConstructorOf(n,Promise)||hasConstructorOf(n,ArrayBuffer))&&!P&&"object"!==s.iterateIn?b=n:(j={},s.addLength&&(j.length=n.length),O={clone:j}),m&&m(),r.iterateNone)return j||b;if(!j)return b;if(s.iterateIn){var w=function _loop(r){var a={ownKeys:c.call(n,r)};_adaptBuiltinStateObjectProperties(s,a,(function(){var a=t+(t?".":"")+escapeKeyPathComponent(r),i=_encapsulate(a,n[r],Boolean(o),s,f,h);hasConstructorOf(i,e)?f.push([a,i,Boolean(o),s,j,r,s.type]):void 0!==i&&(j[r]=i)}))};for(var A in n)w(A);m&&m({endIterateIn:!0,end:!0})}else a(n).forEach((function(r){var a=t+(t?".":"")+escapeKeyPathComponent(r);_adaptBuiltinStateObjectProperties(s,{ownKeys:!0},(function(){var t=_encapsulate(a,n[r],Boolean(o),s,f,h);hasConstructorOf(t,e)?f.push([a,t,Boolean(o),s,j,r,s.type]):void 0!==t&&(j[r]=t)}))})),m&&m({endIterateOwn:!0,end:!0});if(s.iterateUnsetNumeric){for(var k=n.length,C=function _loop2(r){if(!(r in n)){var a=t+(t?".":"")+r;_adaptBuiltinStateObjectProperties(s,{ownKeys:!1},(function(){var t=_encapsulate(a,void 0,Boolean(o),s,f,h);hasConstructorOf(t,e)?f.push([a,t,Boolean(o),s,j,r,s.type]):void 0!==t&&(j[r]=t)}))}},K=0;K<k;K++)C(K);m&&m({endIterateUnsetNumeric:!0,end:!0})}return j}function replace(e,t,n,r,a,i,c){for(var s=a?u.plainObjectReplacers:u.nonplainObjectReplacers,y=s.length;y--;){var l=s[y];if(l.test(t,n)){var f=l.type;if(u.revivers[f]){var v=p[e];p[e]=v?[f].concat(v):f}return Object.assign(n,{type:f,replaced:!0}),!o&&l.replaceAsync||l.replace?(c&&c({replacing:!0}),_encapsulate(e,l[o||!l.replaceAsync?"replace":"replaceAsync"](t,n),h&&"readonly",n,r,i,f)):(c&&c({typeDetected:!0}),_encapsulate(e,t,h&&"readonly",n,r,i,f))}}return t}return f.length?o&&r.throwOnBadSyncType?function(){throw new TypeError("Sync method requested but async result obtained")}():Promise.resolve(checkPromises(d,f)).then(finish):!o&&r.throwOnBadSyncType?function(){throw new TypeError("Async method requested but sync result obtained")}():r.stringification&&o?[finish(d)]:o?finish(d):Promise.resolve(finish(d))}},{key:"encapsulateSync",value:function encapsulateSync(e,t,n){return this.encapsulate(e,t,_objectSpread2({throwOnBadSyncType:!0},n,{sync:!0}))}},{key:"encapsulateAsync",value:function encapsulateAsync(e,t,n){return this.encapsulate(e,t,_objectSpread2({throwOnBadSyncType:!0},n,{sync:!1}))}},{key:"revive",value:function revive(t,n){var r=t&&t.$types;if(!r)return t;if(!0===r)return t.$;var o=(n=_objectSpread2({sync:!0},this.options,{},n)).sync,c=[],s={},u=!0;r.$&&isPlainObject(r.$)&&(t=t.$,r=r.$,u=!1);var y=this;function executeReviver(e,t){var n=_slicedToArray(y.revivers[e]||[],1)[0];if(!n)throw new Error("Unregistered type: "+e);return!o||"revive"in n?n[o&&n.revive?"revive":!o&&n.reviveAsync?"reviveAsync":"revive"](t,s):t}var l=[];function checkUndefined(e){return hasConstructorOf(e,p)?void 0:e}var f,h=function revivePlainObjects(){var n=[];if(Object.entries(r).forEach((function(e){var t=_slicedToArray(e,2),o=t[0],a=t[1];"#"!==a&&[].concat(a).forEach((function(e){_slicedToArray(y.revivers[e]||[null,{}],2)[1].plain&&(n.push({keypath:o,type:e}),delete r[o])}))})),n.length)return n.sort(nestedPathsFirst).reduce((function reducer(n,r){var o=r.keypath,a=r.type;if(isThenable(n))return n.then((function(e){return reducer(e,{keypath:o,type:a})}));var i=getByKeyPath(t,o);if(hasConstructorOf(i=executeReviver(a,i),e))return i.then((function(e){var n=setAtKeyPath(t,o,e);n===e&&(t=n)}));var c=setAtKeyPath(t,o,i);c===i&&(t=c)}),void 0)}();return hasConstructorOf(h,e)?f=h.then((function(){return t})):(f=function _revive(t,n,o,s,y){if(!u||"$types"!==t){var f=r[t],h=i(n);if(h||isPlainObject(n)){var v=h?new Array(n.length):{};for(a(n).forEach((function(r){var a=_revive(t+(t?".":"")+escapeKeyPathComponent(r),n[r],o||v,v,r),i=function set(e){return hasConstructorOf(e,p)?v[r]=void 0:void 0!==e&&(v[r]=e),e};hasConstructorOf(a,e)?l.push(a.then((function(e){return i(e)}))):i(a)})),n=v;c.length;){var d=_slicedToArray(c[0],4),b=d[0],O=d[1],_=d[2],m=d[3],g=getByKeyPath(b,O);if(void 0===g)break;_[m]=g,c.splice(0,1)}}if(!f)return n;if("#"===f){var j=getByKeyPath(o,n.slice(1));return void 0===j&&c.push([o,n.slice(1),s,y]),j}return[].concat(f).reduce((function reducer(t,n){return hasConstructorOf(t,e)?t.then((function(e){return reducer(e,n)})):executeReviver(n,t)}),n)}}("",t,null),l.length&&(f=e.resolve(f).then((function(t){return e.all([t].concat(l))})).then((function(e){return _slicedToArray(e,1)[0]})))),isThenable(f)?o&&n.throwOnBadSyncType?function(){throw new TypeError("Sync method requested but async result obtained")}():hasConstructorOf(f,e)?f.p.then(checkUndefined):f:!o&&n.throwOnBadSyncType?function(){throw new TypeError("Async method requested but sync result obtained")}():o?checkUndefined(f):Promise.resolve(checkUndefined(f))}},{key:"reviveSync",value:function reviveSync(e,t){return this.revive(e,_objectSpread2({throwOnBadSyncType:!0},t,{sync:!0}))}},{key:"reviveAsync",value:function reviveAsync(e,t){return this.revive(e,_objectSpread2({throwOnBadSyncType:!0},t,{sync:!1}))}},{key:"register",value:function register(e,t){return t=t||{},[].concat(e).forEach((function R(e){var n=this;if(i(e))return e.map((function(e){return R.call(n,e)}));e&&a(e).forEach((function(n){if("#"===n)throw new TypeError("# cannot be used as a type name as it is reserved for cyclic objects");if(Typeson.JSON_TYPES.includes(n))throw new TypeError("Plain JSON object types are reserved as type names");var r=e[n],o=r&&r.testPlainObjects?this.plainObjectReplacers:this.nonplainObjectReplacers,a=o.filter((function(e){return e.type===n}));if(a.length&&(o.splice(o.indexOf(a[0]),1),delete this.revivers[n],delete this.types[n]),"function"==typeof r){var c=r;r={test:function test(e){return e&&e.constructor===c},replace:function replace(e){return _objectSpread2({},e)},revive:function revive(e){return Object.assign(Object.create(c.prototype),e)}}}else if(i(r)){var s=_slicedToArray(r,3);r={test:s[0],replace:s[1],revive:s[2]}}if(r&&r.test){var u={type:n,test:r.test.bind(r)};r.replace&&(u.replace=r.replace.bind(r)),r.replaceAsync&&(u.replaceAsync=r.replaceAsync.bind(r));var p="number"==typeof t.fallback?t.fallback:t.fallback?0:1/0;if(r.testPlainObjects?this.plainObjectReplacers.splice(p,0,u):this.nonplainObjectReplacers.splice(p,0,u),r.revive||r.reviveAsync){var y={};r.revive&&(y.revive=r.revive.bind(r)),r.reviveAsync&&(y.reviveAsync=r.reviveAsync.bind(r)),this.revivers[n]=[y,{plain:r.testPlainObjects}]}this.types[n]=r}}),this)}),this),this}}]),Typeson}(),p=function Undefined(){_classCallCheck(this,Undefined)};p.__typeson__type__="TypesonUndefined",u.Undefined=p,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=r(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(e)},u.JSON_TYPES=["null","boolean","number","string","array","object"],module.exports=u; | ||
"use strict";function _typeof(e){return(_typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof 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 _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}function _slicedToArray(e,t){return function _arrayWithHoles(e){if(Array.isArray(e))return e}(e)||function _iterableToArrayLimit(e,t){if("undefined"==typeof Symbol||!(Symbol.iterator in Object(e)))return;var r=[],n=!0,o=!1,a=void 0;try{for(var i,c=e[Symbol.iterator]();!(n=(i=c.next()).done)&&(r.push(i.value),!t||r.length!==t);n=!0);}catch(e){o=!0,a=e}finally{try{n||null==c.return||c.return()}finally{if(o)throw a}}return r}(e,t)||_unsupportedIterableToArray(e,t)||function _nonIterableRest(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}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)||_unsupportedIterableToArray(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 _unsupportedIterableToArray(e,t){if(e){if("string"==typeof e)return _arrayLikeToArray(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);return"Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?_arrayLikeToArray(e,t):void 0}}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}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,r){var n=this;return new e((function(e,o){n.p.then((function(r){e(t?t(r):r)})).catch((function(e){return r?r(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,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,o=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(e))return!1;var a=n(e);if(!a)return null===t;var i=r.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))&&(!n(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 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)}function _await(e,t,r){return r?t?t(e):e:(e&&e.then||(e=Promise.resolve(e)),t?e.then(t):e)}var a=Object.keys,i=Array.isArray,c={}.hasOwnProperty,s=["type","replaced","iterateIn","iterateUnsetNumeric"];function _async(e){return function(){for(var t=[],r=0;r<arguments.length;r++)t[r]=arguments[r];try{return Promise.resolve(e.apply(this,t))}catch(e){return Promise.reject(e)}}}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(this,Typeson),this.options=e,this.plainObjectReplacers=[],this.nonplainObjectReplacers=[],this.revivers={},this.types={}}return function _createClass(e,t,r){return t&&_defineProperties(e.prototype,t),r&&_defineProperties(e,r),e}(Typeson,[{key:"stringify",value:function stringify(e,t,r,n){n=_objectSpread2(_objectSpread2(_objectSpread2({},this.options),n),{},{stringification:!0});var o=this.encapsulate(e,null,n);return i(o)?JSON.stringify(o[0],t,r):o.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(_objectSpread2({throwOnBadSyncType:!0},n),{},{sync:!0}))}},{key:"stringifyAsync",value:function stringifyAsync(e,t,r,n){return this.stringify(e,t,r,_objectSpread2(_objectSpread2({throwOnBadSyncType:!0},n),{},{sync:!1}))}},{key:"parse",value:function parse(e,t,r){return r=_objectSpread2(_objectSpread2(_objectSpread2({},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(_objectSpread2({throwOnBadSyncType:!0},r),{},{sync:!0}))}},{key:"parseAsync",value:function parseAsync(e,t,r){return this.parse(e,t,_objectSpread2(_objectSpread2({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 o=_async((function(t,r){return _await(Promise.all(r.map((function(e){return e[1].p}))),(function(n){return _await(Promise.all(n.map(_async((function(n){var a=!1,i=[],c=_slicedToArray(r.splice(0,1),1),s=_slicedToArray(c[0],7),u=s[0],p=s[2],y=s[3],l=s[4],f=s[5],h=s[6],v=_encapsulate(u,n,p,y,i,!0,h),d=hasConstructorOf(v,e);return function _invoke(e,t){var r=e();return r&&r.then?r.then(t):t(r)}((function(){if(u&&d)return _await(v.p,(function(e){return l[f]=e,a=!0,o(t,i)}))}),(function(e){return a?e:(u?l[f]=v:t=d?v.p:v,o(t,i))}))})))),(function(){return t}))}))})),u=(n=_objectSpread2(_objectSpread2({sync:!0},this.options),n)).sync,p=this,y={},l=[],f=[],h=[],v=!("cyclic"in n)||n.cyclic,d=n.encapsulateObserver,b=_encapsulate("",t,v,r||{},h);function finish(e){var t=Object.values(y);if(n.iterateNone)return t.length?t[0]:Typeson.getJSONType(e);if(t.length){if(n.returnTypeNames)return _toConsumableArray(new Set(t));e&&isPlainObject(e)&&!c.call(e,"$types")?e.$types=y:e={$:e,$types:{$:y}}}else isObject(e)&&c.call(e,"$types")&&(e={$:e,$types:!0});return!n.returnTypeNames&&e}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,o,s,u,h,v){var b,_={},O=_typeof(r),j=d?function(n){var a=v||s.type||Typeson.getJSONType(r);d(Object.assign(n||_,{keypath:t,value:r,cyclic:o,stateObj:s,promisesData:u,resolvingTypesonPromise:h,awaitingTypesonPromise:hasConstructorOf(r,e)},{type:a}))}:null;if(["string","boolean","number","undefined"].includes(O))return void 0===r||Number.isNaN(r)||r===Number.NEGATIVE_INFINITY||r===Number.POSITIVE_INFINITY?(b=s.replaced?r:replace(t,r,s,u,!1,h,j))!==r&&(_={replaced:b}):b=r,j&&j(),b;if(null===r)return j&&j(),r;if(o&&!s.iterateIn&&!s.iterateUnsetNumeric&&r&&"object"===_typeof(r)){var m=l.indexOf(r);if(!(m<0))return y[t]="#",j&&j({cyclicKeypath:f[m]}),"#"+f[m];!0===o&&(l.push(r),f.push(t))}var S,g=isPlainObject(r),P=i(r),T=(g||P)&&(!p.plainObjectReplacers.length||s.replaced)||s.iterateIn?r:replace(t,r,s,u,g||P,null,j);if(T!==r?(b=T,_={replaced:T}):""===t&&hasConstructorOf(r,e)?(u.push([t,r,o,s,void 0,void 0,s.type]),b=r):P&&"object"!==s.iterateIn||"array"===s.iterateIn?(S=new Array(r.length),_={clone:S}):(["function","symbol"].includes(_typeof(r))||"toJSON"in r||hasConstructorOf(r,e)||hasConstructorOf(r,Promise)||hasConstructorOf(r,ArrayBuffer))&&!g&&"object"!==s.iterateIn?b=r:(S={},s.addLength&&(S.length=r.length),_={clone:S}),j&&j(),n.iterateNone)return S||b;if(!S)return b;if(s.iterateIn){var w=function _loop(n){var a={ownKeys:c.call(r,n)};_adaptBuiltinStateObjectProperties(s,a,(function(){var a=t+(t?".":"")+escapeKeyPathComponent(n),i=_encapsulate(a,r[n],Boolean(o),s,u,h);hasConstructorOf(i,e)?u.push([a,i,Boolean(o),s,S,n,s.type]):void 0!==i&&(S[n]=i)}))};for(var A in r)w(A);j&&j({endIterateIn:!0,end:!0})}else a(r).forEach((function(n){var a=t+(t?".":"")+escapeKeyPathComponent(n);_adaptBuiltinStateObjectProperties(s,{ownKeys:!0},(function(){var t=_encapsulate(a,r[n],Boolean(o),s,u,h);hasConstructorOf(t,e)?u.push([a,t,Boolean(o),s,S,n,s.type]):void 0!==t&&(S[n]=t)}))})),j&&j({endIterateOwn:!0,end:!0});if(s.iterateUnsetNumeric){for(var C=r.length,k=function _loop2(n){if(!(n in r)){var a=t+(t?".":"")+n;_adaptBuiltinStateObjectProperties(s,{ownKeys:!1},(function(){var t=_encapsulate(a,void 0,Boolean(o),s,u,h);hasConstructorOf(t,e)?u.push([a,t,Boolean(o),s,S,n,s.type]):void 0!==t&&(S[n]=t)}))}},N=0;N<C;N++)k(N);j&&j({endIterateUnsetNumeric:!0,end:!0})}return S}function replace(e,t,r,n,o,a,i){for(var c=o?p.plainObjectReplacers:p.nonplainObjectReplacers,s=c.length;s--;){var l=c[s];if(l.test(t,r)){var f=l.type;if(p.revivers[f]){var h=y[e];y[e]=h?[f].concat(h):f}return Object.assign(r,{type:f,replaced:!0}),!u&&l.replaceAsync||l.replace?(i&&i({replacing:!0}),_encapsulate(e,l[u||!l.replaceAsync?"replace":"replaceAsync"](t,r),v&&"readonly",r,n,a,f)):(i&&i({typeDetected:!0}),_encapsulate(e,t,v&&"readonly",r,n,a,f))}}return t}return h.length?u&&n.throwOnBadSyncType?function(){throw new TypeError("Sync method requested but async result obtained")}():Promise.resolve(o(b,h)).then(finish):!u&&n.throwOnBadSyncType?function(){throw new TypeError("Async method requested but sync result obtained")}():n.stringification&&u?[finish(b)]:u?finish(b):Promise.resolve(finish(b))}},{key:"encapsulateSync",value:function encapsulateSync(e,t,r){return this.encapsulate(e,t,_objectSpread2(_objectSpread2({throwOnBadSyncType:!0},r),{},{sync:!0}))}},{key:"encapsulateAsync",value:function encapsulateAsync(e,t,r){return this.encapsulate(e,t,_objectSpread2(_objectSpread2({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 o=(r=_objectSpread2(_objectSpread2({sync:!0},this.options),r)).sync,c=[],s={},u=!0;n.$&&isPlainObject(n.$)&&(t=t.$,n=n.$,u=!1);var y=this;function executeReviver(e,t){var r=_slicedToArray(y.revivers[e]||[],1)[0];if(!r)throw new Error("Unregistered type: "+e);return o&&!("revive"in r)?t:r[o&&r.revive?"revive":!o&&r.reviveAsync?"reviveAsync":"revive"](t,s)}var l=[];function checkUndefined(e){return hasConstructorOf(e,p)?void 0:e}var f,h=function revivePlainObjects(){var r=[];if(Object.entries(n).forEach((function(e){var t=_slicedToArray(e,2),o=t[0],a=t[1];"#"!==a&&[].concat(a).forEach((function(e){_slicedToArray(y.revivers[e]||[null,{}],2)[1].plain&&(r.push({keypath:o,type:e}),delete n[o])}))})),r.length)return r.sort(nestedPathsFirst).reduce((function reducer(r,n){var o=n.keypath,a=n.type;if(isThenable(r))return r.then((function(e){return reducer(e,{keypath:o,type:a})}));var i=getByKeyPath(t,o);if(hasConstructorOf(i=executeReviver(a,i),e))return i.then((function(e){var r=setAtKeyPath(t,o,e);r===e&&(t=r)}));var c=setAtKeyPath(t,o,i);c===i&&(t=c)}),void 0)}();return hasConstructorOf(h,e)?f=h.then((function(){return t})):(f=function _revive(t,r,o,s,y){if(!u||"$types"!==t){var f=n[t],h=i(r);if(h||isPlainObject(r)){var v=h?new Array(r.length):{};for(a(r).forEach((function(n){var a=_revive(t+(t?".":"")+escapeKeyPathComponent(n),r[n],o||v,v,n),i=function set(e){return hasConstructorOf(e,p)?v[n]=void 0:void 0!==e&&(v[n]=e),e};hasConstructorOf(a,e)?l.push(a.then((function(e){return i(e)}))):i(a)})),r=v;c.length;){var d=_slicedToArray(c[0],4),b=d[0],_=d[1],O=d[2],j=d[3],m=getByKeyPath(b,_);if(void 0===m)break;O[j]=m,c.splice(0,1)}}if(!f)return r;if("#"===f){var S=getByKeyPath(o,r.slice(1));return void 0===S&&c.push([o,r.slice(1),s,y]),S}return[].concat(f).reduce((function reducer(t,r){return hasConstructorOf(t,e)?t.then((function(e){return reducer(e,r)})):executeReviver(r,t)}),r)}}("",t,null),l.length&&(f=e.resolve(f).then((function(t){return e.all([t].concat(l))})).then((function(e){return _slicedToArray(e,1)[0]})))),isThenable(f)?o&&r.throwOnBadSyncType?function(){throw new TypeError("Sync method requested but async result obtained")}():hasConstructorOf(f,e)?f.p.then(checkUndefined):f:!o&&r.throwOnBadSyncType?function(){throw new TypeError("Async method requested but sync result obtained")}():o?checkUndefined(f):Promise.resolve(checkUndefined(f))}},{key:"reviveSync",value:function reviveSync(e,t){return this.revive(e,_objectSpread2(_objectSpread2({throwOnBadSyncType:!0},t),{},{sync:!0}))}},{key:"reviveAsync",value:function reviveAsync(e,t){return this.revive(e,_objectSpread2(_objectSpread2({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(i(e))return e.map((function(e){return R.call(r,e)}));e&&a(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],o=n&&n.testPlainObjects?this.plainObjectReplacers:this.nonplainObjectReplacers,a=o.filter((function(e){return e.type===r}));if(a.length&&(o.splice(o.indexOf(a[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({},e)},revive:function revive(e){return Object.assign(Object.create(c.prototype),e)}}}else if(i(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 p="number"==typeof t.fallback?t.fallback:t.fallback?0:Number.POSITIVE_INFINITY;if(n.testPlainObjects?this.plainObjectReplacers.splice(p,0,u):this.nonplainObjectReplacers.splice(p,0,u),n.revive||n.reviveAsync){var y={};n.revive&&(y.revive=n.revive.bind(n)),n.reviveAsync&&(y.reviveAsync=n.reviveAsync.bind(n)),this.revivers[r]=[y,{plain:n.testPlainObjects}]}this.types[r]=n}}),this)}),this),this}}]),Typeson}(),p=function Undefined(){_classCallCheck(this,Undefined)};p.__typeson__type__="TypesonUndefined",u.Undefined=p,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(e)},u.JSON_TYPES=["null","boolean","number","string","array","object"],module.exports=u; |
function _typeof(obj) { | ||
"@babel/helpers - typeof"; | ||
if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { | ||
@@ -15,38 +17,2 @@ _typeof = function (obj) { | ||
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { | ||
try { | ||
var info = gen[key](arg); | ||
var value = info.value; | ||
} catch (error) { | ||
reject(error); | ||
return; | ||
} | ||
if (info.done) { | ||
resolve(value); | ||
} else { | ||
Promise.resolve(value).then(_next, _throw); | ||
} | ||
} | ||
function _asyncToGenerator(fn) { | ||
return function () { | ||
var self = this, | ||
args = arguments; | ||
return new Promise(function (resolve, reject) { | ||
var gen = fn.apply(self, args); | ||
function _next(value) { | ||
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); | ||
} | ||
function _throw(err) { | ||
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); | ||
} | ||
_next(undefined); | ||
}); | ||
}; | ||
} | ||
function _classCallCheck(instance, Constructor) { | ||
@@ -124,15 +90,11 @@ if (!(instance instanceof Constructor)) { | ||
function _slicedToArray(arr, i) { | ||
return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); | ||
return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); | ||
} | ||
function _toConsumableArray(arr) { | ||
return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); | ||
return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); | ||
} | ||
function _arrayWithoutHoles(arr) { | ||
if (Array.isArray(arr)) { | ||
for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) arr2[i] = arr[i]; | ||
return arr2; | ||
} | ||
if (Array.isArray(arr)) return _arrayLikeToArray(arr); | ||
} | ||
@@ -145,10 +107,7 @@ | ||
function _iterableToArray(iter) { | ||
if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); | ||
if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); | ||
} | ||
function _iterableToArrayLimit(arr, i) { | ||
if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === "[object Arguments]")) { | ||
return; | ||
} | ||
if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return; | ||
var _arr = []; | ||
@@ -179,11 +138,61 @@ var _n = true; | ||
function _unsupportedIterableToArray(o, minLen) { | ||
if (!o) return; | ||
if (typeof o === "string") return _arrayLikeToArray(o, minLen); | ||
var n = Object.prototype.toString.call(o).slice(8, -1); | ||
if (n === "Object" && o.constructor) n = o.constructor.name; | ||
if (n === "Map" || n === "Set") return Array.from(o); | ||
if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); | ||
} | ||
function _arrayLikeToArray(arr, len) { | ||
if (len == null || len > arr.length) len = arr.length; | ||
for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; | ||
return arr2; | ||
} | ||
function _nonIterableSpread() { | ||
throw new TypeError("Invalid attempt to spread non-iterable instance"); | ||
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 _nonIterableRest() { | ||
throw new TypeError("Invalid attempt to destructure non-iterable instance"); | ||
throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); | ||
} | ||
/** | ||
* @callback TypesonFulfilled | ||
* @returns {Promise<any>|any} | ||
*/ | ||
/** | ||
* @callback TypesonRejected | ||
* @returns {Promise<any>|any} | ||
*/ | ||
/** | ||
* @callback TypesonResolve | ||
* @param {any} value | ||
* @returns {Promise<any>} | ||
*/ | ||
/** | ||
* @callback TypesonReject | ||
* @param {Error|any} error | ||
* @returns {Promise<any>} | ||
*/ | ||
/** | ||
* @callback TypesonResolveReject | ||
* @param {TypesonResolve} typesonResolve | ||
* @param {TypesonReject} typesonReject | ||
* @returns {Promise<any>} | ||
*/ | ||
/* eslint-disable block-spacing, space-before-function-paren, | ||
space-before-blocks, space-infix-ops, semi, promise/avoid-new, | ||
jsdoc/require-jsdoc */ | ||
/** | ||
* We keep this function minimized so if using two instances of this | ||
@@ -194,6 +203,4 @@ * library, where one is minimized and one is not, it will still work | ||
* extends Promise` and add a string tag for detection. | ||
* @param {function} f | ||
* @param {TypesonResolveReject} f | ||
*/ | ||
// eslint-disable-next-line max-len | ||
// eslint-disable-next-line block-spacing, space-before-function-paren, space-before-blocks, space-infix-ops, semi, promise/avoid-new | ||
var TypesonPromise = function TypesonPromise(f) { | ||
@@ -203,3 +210,7 @@ _classCallCheck(this, TypesonPromise); | ||
this.p = new Promise(f); | ||
}; // eslint-disable-next-line max-len | ||
}; | ||
/* eslint-enable block-spacing, space-before-function-paren, | ||
space-before-blocks, space-infix-ops, semi, promise/avoid-new, | ||
jsdoc/require-jsdoc */ | ||
// eslint-disable-next-line max-len | ||
// class TypesonPromise extends Promise {get[Symbol.toStringTag](){return 'TypesonPromise'};} // eslint-disable-line keyword-spacing, space-before-function-paren, space-before-blocks, block-spacing, semi | ||
@@ -218,4 +229,4 @@ | ||
* | ||
* @param {function} [onFulfilled] | ||
* @param {function} [onRejected] | ||
* @param {TypesonFulfilled} [onFulfilled] | ||
* @param {TypesonRejected} [onRejected] | ||
* @returns {TypesonPromise} | ||
@@ -240,3 +251,3 @@ */ | ||
* | ||
* @param {function} onRejected | ||
* @param {TypesonRejected} onRejected | ||
* @returns {TypesonPromise} | ||
@@ -251,3 +262,3 @@ */ | ||
* | ||
* @param {Any} v | ||
* @param {any} v | ||
* @returns {TypesonPromise} | ||
@@ -264,3 +275,3 @@ */ | ||
* | ||
* @param {Any} v | ||
* @param {any} v | ||
* @returns {TypesonPromise} | ||
@@ -279,3 +290,3 @@ */ | ||
* | ||
* @param {Promise[]} promArr | ||
* @param {Promise<any>[]} promArr | ||
* @returns {TypesonPromise} | ||
@@ -295,8 +306,8 @@ */ | ||
toStr = _ref.toString, | ||
hasOwn = {}.hasOwnProperty, | ||
hasOwn$1 = {}.hasOwnProperty, | ||
getProto = Object.getPrototypeOf, | ||
fnToString = hasOwn.toString; | ||
fnToString = hasOwn$1.toString; | ||
/** | ||
* Second argument not in use internally, but provided for utility. | ||
* @param {Any} v | ||
* @param {any} v | ||
* @param {boolean} catchCheck | ||
@@ -311,3 +322,3 @@ * @returns {boolean} | ||
* | ||
* @param {Any} val | ||
* @param {any} val | ||
* @returns {string} | ||
@@ -323,4 +334,4 @@ */ | ||
* being identical so any minimization is expected of both. | ||
* @param {Any} a | ||
* @param {function} b | ||
* @param {any} a | ||
* @param {GenericFunction} b | ||
* @returns {boolean} | ||
@@ -341,3 +352,3 @@ */ | ||
var Ctor = hasOwn.call(proto, 'constructor') && proto.constructor; | ||
var Ctor = hasOwn$1.call(proto, 'constructor') && proto.constructor; | ||
@@ -364,3 +375,3 @@ if (typeof Ctor !== 'function') { | ||
* | ||
* @param {Any} val | ||
* @param {any} val | ||
* @returns {boolean} | ||
@@ -387,3 +398,3 @@ */ | ||
* | ||
* @param {Any} val | ||
* @param {any} val | ||
* @returns {boolean} | ||
@@ -409,3 +420,3 @@ */ | ||
* | ||
* @param {Any} v | ||
* @param {any} v | ||
* @returns {boolean} | ||
@@ -441,3 +452,3 @@ */ | ||
* @param {string} keyPath | ||
* @returns {Any} | ||
* @returns {any} | ||
*/ | ||
@@ -464,4 +475,4 @@ | ||
* @param {string} keyPath | ||
* @param {Any} value | ||
* @returns {Any} | ||
* @param {any} value | ||
* @returns {any} | ||
*/ | ||
@@ -497,5 +508,17 @@ | ||
function _await(value, then, direct) { | ||
if (direct) { | ||
return then ? then(value) : value; | ||
} | ||
if (!value || !value.then) { | ||
value = Promise.resolve(value); | ||
} | ||
return then ? value.then(then) : value; | ||
} | ||
var keys = Object.keys, | ||
isArray = Array.isArray, | ||
hasOwn$1 = {}.hasOwnProperty, | ||
hasOwn = {}.hasOwnProperty, | ||
internalStateObjPropsToIgnore = ['type', 'replaced', 'iterateIn', 'iterateUnsetNumeric']; | ||
@@ -511,2 +534,62 @@ /** | ||
function _async(f) { | ||
return function () { | ||
for (var args = [], i = 0; i < arguments.length; i++) { | ||
args[i] = arguments[i]; | ||
} | ||
try { | ||
return Promise.resolve(f.apply(this, args)); | ||
} catch (e) { | ||
return Promise.reject(e); | ||
} | ||
}; | ||
} | ||
/** | ||
* @callback Tester | ||
* @param {any} value | ||
* @param {StateObject} stateobj | ||
* @returns {boolean} | ||
*/ | ||
/** | ||
* @callback Replacer | ||
* @param {any} value | ||
* @param {StateObject} stateObj | ||
* @returns {any} Should be JSON-stringifiable | ||
*/ | ||
/** | ||
* @callback Reviver | ||
* @param {JSON} value | ||
* @param {StateObject} stateObj | ||
* @returns {any} | ||
*/ | ||
/** | ||
* @typedef {PlainObject} TypesonOptions | ||
* @property {boolean} stringification Auto-set by `stringify` | ||
*/ | ||
/** | ||
* An instance of this class can be used to call `stringify()` and `parse()`. | ||
* Typeson resolves cyclic references by default. Can also be extended to | ||
* support custom types using the register() method. | ||
* | ||
* @class | ||
* @param {{cyclic: boolean}} [options] - if cyclic (default true), | ||
* cyclic references will be handled gracefully. | ||
*/ | ||
function _invoke(body, then) { | ||
var result = body(); | ||
if (result && result.then) { | ||
return result.then(then); | ||
} | ||
return then(result); | ||
} | ||
function nestedPathsFirst(a, b) { | ||
@@ -530,16 +613,7 @@ if (a.keypath === '') { | ||
} | ||
/** | ||
* An instance of this class can be used to call `stringify()` and `parse()`. | ||
* Typeson resolves cyclic references by default. Can also be extended to | ||
* support custom types using the register() method. | ||
* | ||
* @class | ||
* @param {{cyclic: boolean}} [options] - if cyclic (default true), | ||
* cyclic references will be handled gracefully. | ||
*/ | ||
var Typeson = | ||
/*#__PURE__*/ | ||
function () { | ||
var Typeson = /*#__PURE__*/function () { | ||
/** | ||
* @param {TypesonOptions} options | ||
*/ | ||
function Typeson(options) { | ||
@@ -576,7 +650,7 @@ _classCallCheck(this, Typeson); | ||
* The `replacer` argument has nothing to do with our replacers. | ||
* @param {Any} obj | ||
* @param {any} obj | ||
* @param {JSONReplacer|string[]} replacer | ||
* @param {number|string} space | ||
* @param {object} opts | ||
* @returns {string|Promise} Promise resolves to a string | ||
* @param {TypesonOptions} opts | ||
* @returns {string|Promise<string>} Promise resolves to a string | ||
*/ | ||
@@ -588,3 +662,3 @@ | ||
value: function stringify(obj, replacer, space, opts) { | ||
opts = _objectSpread2({}, this.options, {}, opts, { | ||
opts = _objectSpread2(_objectSpread2(_objectSpread2({}, this.options), opts), {}, { | ||
stringification: true | ||
@@ -604,6 +678,6 @@ }); | ||
* Also sync but throws on non-sync result. | ||
* @param {Any} obj | ||
* @param {any} obj | ||
* @param {JSONReplacer|string[]} replacer | ||
* @param {number|string} space | ||
* @param {object} opts | ||
* @param {TypesonOptions} opts | ||
* @returns {string} | ||
@@ -615,5 +689,5 @@ */ | ||
value: function stringifySync(obj, replacer, space, opts) { | ||
return this.stringify(obj, replacer, space, _objectSpread2({ | ||
return this.stringify(obj, replacer, space, _objectSpread2(_objectSpread2({ | ||
throwOnBadSyncType: true | ||
}, opts, { | ||
}, opts), {}, { | ||
sync: true | ||
@@ -624,6 +698,6 @@ })); | ||
* | ||
* @param {Any} obj | ||
* @param {any} obj | ||
* @param {JSONReplacer|string[]} replacer | ||
* @param {number|string} space | ||
* @param {object} opts | ||
* @param {TypesonOptions} opts | ||
* @returns {Promise<string>} | ||
@@ -635,5 +709,5 @@ */ | ||
value: function stringifyAsync(obj, replacer, space, opts) { | ||
return this.stringify(obj, replacer, space, _objectSpread2({ | ||
return this.stringify(obj, replacer, space, _objectSpread2(_objectSpread2({ | ||
throwOnBadSyncType: true | ||
}, opts, { | ||
}, opts), {}, { | ||
sync: false | ||
@@ -643,8 +717,15 @@ })); | ||
/** | ||
* @callback JSONReviver | ||
* @param {string} key | ||
* @param {JSON} value | ||
* @returns {JSON} | ||
*/ | ||
/** | ||
* Parse Typeson back into an obejct. | ||
* Initial arguments works identical to those of `JSON.parse()`. | ||
* @param {string} text | ||
* @param {function} reviver This JSON reviver has nothing to do with | ||
* @param {JSONReviver} reviver This JSON reviver has nothing to do with | ||
* our revivers. | ||
* @param {object} opts | ||
* @param {TypesonOptions} opts | ||
* @returns {external:JSON} | ||
@@ -656,3 +737,3 @@ */ | ||
value: function parse(text, reviver, opts) { | ||
opts = _objectSpread2({}, this.options, {}, opts, { | ||
opts = _objectSpread2(_objectSpread2(_objectSpread2({}, this.options), opts), {}, { | ||
parse: true | ||
@@ -665,5 +746,5 @@ }); | ||
* @param {string} text | ||
* @param {function} reviver This JSON reviver has nothing to do with | ||
* @param {JSONReviver} reviver This JSON reviver has nothing to do with | ||
* our revivers. | ||
* @param {object} opts | ||
* @param {TypesonOptions} opts | ||
* @returns {external:JSON} | ||
@@ -675,5 +756,5 @@ */ | ||
value: function parseSync(text, reviver, opts) { | ||
return this.parse(text, reviver, _objectSpread2({ | ||
return this.parse(text, reviver, _objectSpread2(_objectSpread2({ | ||
throwOnBadSyncType: true | ||
}, opts, { | ||
}, opts), {}, { | ||
sync: true | ||
@@ -684,6 +765,6 @@ })); | ||
* @param {string} text | ||
* @param {function} reviver This JSON reviver has nothing to do with | ||
* @param {JSONReviver} reviver This JSON reviver has nothing to do with | ||
* our revivers. | ||
* @param {object} opts | ||
* @returns {Promise} Resolves to `external:JSON` | ||
* @param {TypesonOptions} opts | ||
* @returns {Promise<external:JSON>} Resolves to `external:JSON` | ||
*/ | ||
@@ -694,5 +775,5 @@ | ||
value: function parseAsync(text, reviver, opts) { | ||
return this.parse(text, reviver, _objectSpread2({ | ||
return this.parse(text, reviver, _objectSpread2(_objectSpread2({ | ||
throwOnBadSyncType: true | ||
}, opts, { | ||
}, opts), {}, { | ||
sync: false | ||
@@ -702,6 +783,10 @@ })); | ||
/** | ||
* @typedef {} StateObject | ||
*/ | ||
/** | ||
* | ||
* @param {Any} obj | ||
* @param {object} stateObj | ||
* @param {object} [opts={}] | ||
* @param {any} obj | ||
* @param {StateObject} stateObj | ||
* @param {TypesonOptions} [opts={}] | ||
* @returns {string[]|false} | ||
@@ -719,6 +804,6 @@ */ | ||
* | ||
* @param {Any} obj | ||
* @param {any} obj | ||
* @param {PlainObject} stateObj | ||
* @param {PlainObject} [opts={}] | ||
* @returns {Promise|GenericArray|PlainObject|string|false} | ||
* @returns {Promise<any>|GenericArray|PlainObject|string|false} | ||
*/ | ||
@@ -738,6 +823,6 @@ | ||
* This method is used internally by `Typeson.stringify()`. | ||
* @param {Any} obj - Object to encapsulate. | ||
* @param {any} obj - Object to encapsulate. | ||
* @param {PlainObject} stateObj | ||
* @param {PlainObject} opts | ||
* @returns {Promise|GenericArray|PlainObject|string|false} | ||
* @returns {Promise<any>|GenericArray|PlainObject|string|false} | ||
*/ | ||
@@ -748,5 +833,88 @@ | ||
value: function encapsulate(obj, stateObj, opts) { | ||
opts = _objectSpread2({ | ||
/** | ||
* | ||
* @param {any} ret | ||
* @param {GenericArray} promisesData | ||
* @returns {Promise<any>} | ||
*/ | ||
var checkPromises = _async(function (ret, promisesData) { | ||
return _await(Promise.all(promisesData.map(function (pd) { | ||
return pd[1].p; | ||
})), function (promResults) { | ||
return _await(Promise.all(promResults.map(_async(function (promResult) { | ||
var _exit = false; | ||
var newPromisesData = []; | ||
var _promisesData$splice = promisesData.splice(0, 1), | ||
_promisesData$splice2 = _slicedToArray(_promisesData$splice, 1), | ||
prData = _promisesData$splice2[0]; | ||
var _prData = _slicedToArray(prData, 7), | ||
keyPath = _prData[0], | ||
cyclic = _prData[2], | ||
stateObj = _prData[3], | ||
parentObj = _prData[4], | ||
key = _prData[5], | ||
detectedType = _prData[6]; | ||
var encaps = _encapsulate(keyPath, promResult, cyclic, stateObj, newPromisesData, true, detectedType); | ||
var isTypesonPromise = hasConstructorOf(encaps, TypesonPromise); // Handle case where an embedded custom type itself | ||
// returns a `Typeson.Promise` | ||
return _invoke(function () { | ||
if (keyPath && isTypesonPromise) { | ||
return _await(encaps.p, function (encaps2) { | ||
parentObj[key] = encaps2; | ||
_exit = true; | ||
return checkPromises(ret, newPromisesData); | ||
}); | ||
} | ||
}, function (_result) { | ||
if (_exit) return _result; | ||
if (keyPath) { | ||
parentObj[key] = encaps; | ||
} else if (isTypesonPromise) { | ||
ret = encaps.p; | ||
} else { | ||
// If this is itself a `Typeson.Promise` (because the | ||
// original value supplied was a `Promise` or | ||
// because the supplied custom type value resolved | ||
// to one), returning it below will be fine since | ||
// a `Promise` is expected anyways given current | ||
// config (and if not a `Promise`, it will be ready | ||
// as the resolve value) | ||
ret = encaps; | ||
} | ||
return checkPromises(ret, newPromisesData); | ||
}); | ||
}))), function () { | ||
return ret; | ||
}); | ||
}); | ||
}); | ||
/** | ||
* @typedef {PlainObject} OwnKeysObject | ||
* @property {boolean} ownKeys | ||
*/ | ||
/** | ||
* @callback BuiltinStateObjectPropertiesCallback | ||
* @returns {void} | ||
*/ | ||
/** | ||
* | ||
* @param {StateObject} stateObj | ||
* @param {OwnKeysObject} ownKeysObj | ||
* @param {BuiltinStateObjectPropertiesCallback} cb | ||
* @returns {undefined} | ||
*/ | ||
opts = _objectSpread2(_objectSpread2({ | ||
sync: true | ||
}, this.options, {}, opts); | ||
}, this.options), opts); | ||
var _opts = opts, | ||
@@ -770,3 +938,3 @@ sync = _opts.sync; | ||
* | ||
* @param {Any} ret | ||
* @param {any} ret | ||
* @returns {GenericArray|PlainObject|string|false} | ||
@@ -798,3 +966,3 @@ */ | ||
// own `$types` property (to avoid ambiguity) | ||
hasOwn$1.call(ret, '$types')) { | ||
hasOwn.call(ret, '$types')) { | ||
ret = { | ||
@@ -810,3 +978,3 @@ $: ret, | ||
} else if (isObject(ret) && hasOwn$1.call(ret, '$types')) { | ||
} else if (isObject(ret) && hasOwn.call(ret, '$types')) { | ||
ret = { | ||
@@ -824,115 +992,3 @@ $: ret, | ||
} | ||
/** | ||
* | ||
* @param {Any} ret | ||
* @param {GenericArray} promisesData | ||
* @returns {Promise<Any>} | ||
*/ | ||
function checkPromises(_x, _x2) { | ||
return _checkPromises.apply(this, arguments); | ||
} | ||
/** | ||
* | ||
* @param {object} stateObj | ||
* @param {object} ownKeysObj | ||
* @param {function} cb | ||
* @returns {undefined} | ||
*/ | ||
function _checkPromises() { | ||
_checkPromises = _asyncToGenerator( | ||
/*#__PURE__*/ | ||
regeneratorRuntime.mark(function _callee2(ret, promisesData) { | ||
var promResults; | ||
return regeneratorRuntime.wrap(function _callee2$(_context2) { | ||
while (1) { | ||
switch (_context2.prev = _context2.next) { | ||
case 0: | ||
_context2.next = 2; | ||
return Promise.all(promisesData.map(function (pd) { | ||
return pd[1].p; | ||
})); | ||
case 2: | ||
promResults = _context2.sent; | ||
_context2.next = 5; | ||
return Promise.all(promResults.map( | ||
/*#__PURE__*/ | ||
function () { | ||
var _ref = _asyncToGenerator( | ||
/*#__PURE__*/ | ||
regeneratorRuntime.mark(function _callee(promResult) { | ||
var newPromisesData, _promisesData$splice, _promisesData$splice2, prData, _prData, keyPath, cyclic, stateObj, parentObj, key, detectedType, encaps, isTypesonPromise, encaps2; | ||
return regeneratorRuntime.wrap(function _callee$(_context) { | ||
while (1) { | ||
switch (_context.prev = _context.next) { | ||
case 0: | ||
newPromisesData = []; | ||
_promisesData$splice = promisesData.splice(0, 1), _promisesData$splice2 = _slicedToArray(_promisesData$splice, 1), prData = _promisesData$splice2[0]; | ||
_prData = _slicedToArray(prData, 7), keyPath = _prData[0], cyclic = _prData[2], stateObj = _prData[3], parentObj = _prData[4], key = _prData[5], detectedType = _prData[6]; | ||
encaps = _encapsulate(keyPath, promResult, cyclic, stateObj, newPromisesData, true, detectedType); | ||
isTypesonPromise = hasConstructorOf(encaps, TypesonPromise); // Handle case where an embedded custom type itself | ||
// returns a `Typeson.Promise` | ||
if (!(keyPath && isTypesonPromise)) { | ||
_context.next = 11; | ||
break; | ||
} | ||
_context.next = 8; | ||
return encaps.p; | ||
case 8: | ||
encaps2 = _context.sent; | ||
parentObj[key] = encaps2; | ||
return _context.abrupt("return", checkPromises(ret, newPromisesData)); | ||
case 11: | ||
if (keyPath) { | ||
parentObj[key] = encaps; | ||
} else if (isTypesonPromise) { | ||
ret = encaps.p; | ||
} else { | ||
// If this is itself a `Typeson.Promise` (because the | ||
// original value supplied was a `Promise` or | ||
// because the supplied custom type value resolved | ||
// to one), returning it below will be fine since | ||
// a `Promise` is expected anyways given current | ||
// config (and if not a `Promise`, it will be ready | ||
// as the resolve value) | ||
ret = encaps; | ||
} | ||
return _context.abrupt("return", checkPromises(ret, newPromisesData)); | ||
case 13: | ||
case "end": | ||
return _context.stop(); | ||
} | ||
} | ||
}, _callee); | ||
})); | ||
return function (_x3) { | ||
return _ref.apply(this, arguments); | ||
}; | ||
}())); | ||
case 5: | ||
return _context2.abrupt("return", ret); | ||
case 6: | ||
case "end": | ||
return _context2.stop(); | ||
} | ||
} | ||
}, _callee2); | ||
})); | ||
return _checkPromises.apply(this, arguments); | ||
} | ||
function _adaptBuiltinStateObjectProperties(stateObj, ownKeysObj, cb) { | ||
@@ -944,3 +1000,3 @@ Object.assign(stateObj, ownKeysObj); | ||
return tmp; | ||
}); // eslint-disable-next-line callback-return | ||
}); // eslint-disable-next-line node/callback-return | ||
@@ -955,3 +1011,3 @@ cb(); | ||
* @param {string} keypath | ||
* @param {Any} value | ||
* @param {any} value | ||
* @param {boolean} cyclic | ||
@@ -962,3 +1018,3 @@ * @param {PlainObject} stateObj | ||
* @param {string} detectedType | ||
* @returns {Any} | ||
* @returns {any} | ||
*/ | ||
@@ -989,8 +1045,4 @@ | ||
if (['string', 'boolean', 'number', 'undefined'].includes($typeof)) { | ||
if (value === undefined || $typeof === 'number' && (isNaN(value) || value === -Infinity || value === Infinity)) { | ||
if (stateObj.replaced) { | ||
ret = value; | ||
} else { | ||
ret = replace(keypath, value, stateObj, promisesData, false, resolvingTypesonPromise, runObserver); | ||
} | ||
if (value === undefined || Number.isNaN(value) || value === Number.NEGATIVE_INFINITY || value === Number.POSITIVE_INFINITY) { | ||
ret = stateObj.replaced ? value : replace(keypath, value, stateObj, promisesData, false, resolvingTypesonPromise, runObserver); | ||
@@ -1064,2 +1116,3 @@ if (ret !== value) { | ||
} else if (isArr && stateObj.iterateIn !== 'object' || stateObj.iterateIn === 'array') { | ||
// eslint-disable-next-line unicorn/no-new-array -- Sparse | ||
clone = new Array(value.length); | ||
@@ -1100,3 +1153,3 @@ observerData = { | ||
var ownKeysObj = { | ||
ownKeys: hasOwn$1.call(value, key) | ||
ownKeys: hasOwn.call(value, key) | ||
}; | ||
@@ -1199,5 +1252,39 @@ | ||
/** | ||
* @typedef {PlainObject} KeyPathEvent | ||
* @property {string} cyclicKeypath | ||
*/ | ||
/** | ||
* @typedef {PlainObject} EndIterateInEvent | ||
* @property {boolean} endIterateIn | ||
* @property {boolean} end | ||
*/ | ||
/** | ||
* @typedef {PlainObject} EndIterateUnsetNumericEvent | ||
* @property {boolean} endIterateUnsetNumeric | ||
* @property {boolean} end | ||
*/ | ||
/** | ||
* @typedef {PlainObject} TypeDetectedEvent | ||
* @property {boolean} typeDetected | ||
*/ | ||
/** | ||
* @typedef {PlainObject} ReplacingEvent | ||
* @property {boolean} replacing | ||
*/ | ||
/** | ||
* @callback Observer | ||
* @param {KeyPathEvent|EndIterateInEvent|EndIterateUnsetNumericEvent| | ||
* TypeDetectedEvent|ReplacingEvent} [event] | ||
* @returns {void} | ||
*/ | ||
/** | ||
* | ||
* @param {string} keypath | ||
* @param {Any} value | ||
* @param {any} value | ||
* @param {PlainObject} stateObj | ||
@@ -1207,4 +1294,4 @@ * @param {GenericArray} promisesData | ||
* @param {boolean} resolvingTypesonPromise | ||
* @param {function} [runObserver] | ||
* @returns {*} | ||
* @param {Observer} [runObserver] | ||
* @returns {any} | ||
*/ | ||
@@ -1280,6 +1367,6 @@ | ||
* Also sync but throws on non-sync result. | ||
* @param {*} obj | ||
* @param {object} stateObj | ||
* @param {object} opts | ||
* @returns {*} | ||
* @param {any} obj | ||
* @param {StateObject} stateObj | ||
* @param {TypesonOptions} opts | ||
* @returns {any} | ||
*/ | ||
@@ -1290,5 +1377,5 @@ | ||
value: function encapsulateSync(obj, stateObj, opts) { | ||
return this.encapsulate(obj, stateObj, _objectSpread2({ | ||
return this.encapsulate(obj, stateObj, _objectSpread2(_objectSpread2({ | ||
throwOnBadSyncType: true | ||
}, opts, { | ||
}, opts), {}, { | ||
sync: true | ||
@@ -1298,6 +1385,6 @@ })); | ||
/** | ||
* @param {*} obj | ||
* @param {object} stateObj | ||
* @param {object} opts | ||
* @returns {*} | ||
* @param {any} obj | ||
* @param {StateObject} stateObj | ||
* @param {TypesonOptions} opts | ||
* @returns {any} | ||
*/ | ||
@@ -1308,5 +1395,5 @@ | ||
value: function encapsulateAsync(obj, stateObj, opts) { | ||
return this.encapsulate(obj, stateObj, _objectSpread2({ | ||
return this.encapsulate(obj, stateObj, _objectSpread2(_objectSpread2({ | ||
throwOnBadSyncType: true | ||
}, opts, { | ||
}, opts), {}, { | ||
sync: false | ||
@@ -1318,8 +1405,9 @@ })); | ||
* This method is used internally by `Typeson.parse()`. | ||
* @param {object} obj - Object to revive. If it has `$types` member, the | ||
* properties that are listed there will be replaced with its true type | ||
* instead of just plain objects. | ||
* @param {object} opts | ||
* @param {PlainObject} obj - Object to revive. If it has `$types` member, | ||
* the properties that are listed there will be replaced with its true | ||
* type instead of just plain objects. | ||
* @param {TypesonOptions} opts | ||
* @throws TypeError If mismatch between sync/async type and result | ||
* @returns {Promise|*} If async, returns a Promise that resolves to `*` | ||
* @returns {Promise<any>|any} If async, returns a Promise that resolves | ||
* to `any`. | ||
*/ | ||
@@ -1342,5 +1430,5 @@ | ||
opts = _objectSpread2({ | ||
opts = _objectSpread2(_objectSpread2({ | ||
sync: true | ||
}, this.options, {}, opts); | ||
}, this.options), opts); | ||
var _opts3 = opts, | ||
@@ -1363,5 +1451,5 @@ sync = _opts3.sync; | ||
* @callback RevivalReducer | ||
* @param {Any} value | ||
* @param {any} value | ||
* @param {string} type | ||
* @returns {Any} | ||
* @returns {any} | ||
*/ | ||
@@ -1372,10 +1460,11 @@ | ||
* @param {string} type | ||
* @param {Any} val | ||
* @returns {[type]} [description] | ||
* @param {any} val | ||
* @throws {Error} | ||
* @returns {any} | ||
*/ | ||
function executeReviver(type, val) { | ||
var _ref2 = that.revivers[type] || [], | ||
_ref3 = _slicedToArray(_ref2, 1), | ||
reviver = _ref3[0]; | ||
var _ref = that.revivers[type] || [], | ||
_ref2 = _slicedToArray(_ref, 1), | ||
reviver = _ref2[0]; | ||
@@ -1407,6 +1496,6 @@ if (!reviver) { | ||
var plainObjectTypes = []; | ||
Object.entries(types).forEach(function (_ref4) { | ||
var _ref5 = _slicedToArray(_ref4, 2), | ||
keypath = _ref5[0], | ||
type = _ref5[1]; | ||
Object.entries(types).forEach(function (_ref3) { | ||
var _ref4 = _slicedToArray(_ref3, 2), | ||
keypath = _ref4[0], | ||
type = _ref4[1]; | ||
@@ -1424,5 +1513,5 @@ if (type === '#') { | ||
[].concat(type).forEach(function (type) { | ||
var _ref6 = that.revivers[type] || [null, {}], | ||
_ref7 = _slicedToArray(_ref6, 2), | ||
plain = _ref7[1].plain; | ||
var _ref5 = that.revivers[type] || [null, {}], | ||
_ref6 = _slicedToArray(_ref5, 2), | ||
plain = _ref6[1].plain; | ||
@@ -1453,5 +1542,5 @@ if (!plain) { | ||
return plainObjectTypes.sort(nestedPathsFirst).reduce(function reducer(possibleTypesonPromise, _ref8) { | ||
var keypath = _ref8.keypath, | ||
type = _ref8.type; | ||
return plainObjectTypes.sort(nestedPathsFirst).reduce(function reducer(possibleTypesonPromise, _ref7) { | ||
var keypath = _ref7.keypath, | ||
type = _ref7.type; | ||
@@ -1499,7 +1588,7 @@ if (isThenable(possibleTypesonPromise)) { | ||
* @param {string} keypath | ||
* @param {Any} value | ||
* @param {?(Array|object)} target | ||
* @param {Array|object} [clone] | ||
* @param {any} value | ||
* @param {?(GenericArray|PlainObject)} target | ||
* @param {GenericArray|PlainObject} [clone] | ||
* @param {string} [key] | ||
* @returns {Any} | ||
* @returns {any} | ||
*/ | ||
@@ -1516,2 +1605,3 @@ | ||
if (isArr || isPlainObject(value)) { | ||
// eslint-disable-next-line unicorn/no-new-array -- Sparse | ||
var _clone = isArr ? new Array(value.length) : {}; // Iterate object or array | ||
@@ -1592,4 +1682,4 @@ | ||
* | ||
* @param {Any} retrn | ||
* @returns {undefined|Any} | ||
* @param {any} retrn | ||
* @returns {undefined|any} | ||
*/ | ||
@@ -1617,5 +1707,5 @@ | ||
r].concat(revivalPromises)); | ||
}).then(function (_ref9) { | ||
var _ref10 = _slicedToArray(_ref9, 1), | ||
r = _ref10[0]; | ||
}).then(function (_ref8) { | ||
var _ref9 = _slicedToArray(_ref8, 1), | ||
r = _ref9[0]; | ||
@@ -1635,5 +1725,5 @@ return r; | ||
* Also sync but throws on non-sync result. | ||
* @param {Any} obj | ||
* @param {object} opts | ||
* @returns {Any} | ||
* @param {any} obj | ||
* @param {TypesonOptions} opts | ||
* @returns {any} | ||
*/ | ||
@@ -1644,5 +1734,5 @@ | ||
value: function reviveSync(obj, opts) { | ||
return this.revive(obj, _objectSpread2({ | ||
return this.revive(obj, _objectSpread2(_objectSpread2({ | ||
throwOnBadSyncType: true | ||
}, opts, { | ||
}, opts), {}, { | ||
sync: true | ||
@@ -1652,5 +1742,5 @@ })); | ||
/** | ||
* @param {Any} obj | ||
* @param {object} opts | ||
* @returns {Promise} Resolves to `*` | ||
* @param {any} obj | ||
* @param {TypesonOptions} opts | ||
* @returns {Promise<any>} | ||
*/ | ||
@@ -1661,5 +1751,5 @@ | ||
value: function reviveAsync(obj, opts) { | ||
return this.revive(obj, _objectSpread2({ | ||
return this.revive(obj, _objectSpread2(_objectSpread2({ | ||
throwOnBadSyncType: true | ||
}, opts, { | ||
}, opts), {}, { | ||
sync: false | ||
@@ -1669,8 +1759,12 @@ })); | ||
/** | ||
* @typedef {Tester|Replacer|Reviver} Spec | ||
*/ | ||
/** | ||
* Register types. | ||
* For examples on how to use this method, see | ||
* {@link https://github.com/dfahlander/typeson-registry/tree/master/types}. | ||
* @param {object.<string,Function[]>[]} typeSpecSets - Types and | ||
* their functions [test, encapsulate, revive]; | ||
* @param {object} opts | ||
* @param {object<string,Spec[]>[]} typeSpecSets - | ||
* Types and their functions [test, encapsulate, revive]; | ||
* @param {TypesonOptions} opts | ||
* @returns {Typeson} | ||
@@ -1758,3 +1852,3 @@ */ | ||
var start = typeof opts.fallback === 'number' ? opts.fallback : opts.fallback ? 0 : Infinity; | ||
var start = typeof opts.fallback === 'number' ? opts.fallback : opts.fallback ? 0 : Number.POSITIVE_INFINITY; | ||
@@ -1761,0 +1855,0 @@ if (spec.testPlainObjects) { |
@@ -1,1 +0,1 @@ | ||
function _typeof(e){return(_typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof 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,{parse:!0}),this.revive(JSON.parse(e,t),n)}},{key:"parseSync",value:function parseSync(e,t,n){return this.parse(e,t,_objectSpread2({throwOnBadSyncType:!0},n,{sync:!0}))}},{key:"parseAsync",value:function parseAsync(e,t,n){return this.parse(e,t,_objectSpread2({throwOnBadSyncType:!0},n,{sync:!1}))}},{key:"specialTypeNames",value:function specialTypeNames(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return n.returnTypeNames=!0,this.encapsulate(e,t,n)}},{key:"rootTypeName",value:function rootTypeName(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return n.iterateNone=!0,this.encapsulate(e,t,n)}},{key:"encapsulate",value:function encapsulate(t,n,r){var o=(r=_objectSpread2({sync:!0},this.options,{},r)).sync,u=this,p={},y=[],l=[],f=[],h=!("cyclic"in r)||r.cyclic,v=r.encapsulateObserver,d=_encapsulate("",t,h,n||{},f);function finish(e){var t=Object.values(p);if(r.iterateNone)return t.length?t[0]:Typeson.getJSONType(e);if(t.length){if(r.returnTypeNames)return _toConsumableArray(new Set(t));e&&isPlainObject(e)&&!c.call(e,"$types")?e.$types=p:e={$:e,$types:{$:p}}}else isObject(e)&&c.call(e,"$types")&&(e={$:e,$types:!0});return!r.returnTypeNames&&e}function checkPromises(e,t){return _checkPromises.apply(this,arguments)}function _checkPromises(){return(_checkPromises=_asyncToGenerator(regeneratorRuntime.mark((function _callee2(t,n){var r;return regeneratorRuntime.wrap((function _callee2$(o){for(;;)switch(o.prev=o.next){case 0:return o.next=2,Promise.all(n.map((function(e){return e[1].p})));case 2:return r=o.sent,o.next=5,Promise.all(r.map(function(){var r=_asyncToGenerator(regeneratorRuntime.mark((function _callee(r){var o,a,i,c,s,u,p,y,l,f,h,v,d,b;return regeneratorRuntime.wrap((function _callee$(O){for(;;)switch(O.prev=O.next){case 0:if(o=[],a=n.splice(0,1),i=_slicedToArray(a,1),c=i[0],s=_slicedToArray(c,7),u=s[0],p=s[2],y=s[3],l=s[4],f=s[5],h=s[6],v=_encapsulate(u,r,p,y,o,!0,h),d=hasConstructorOf(v,e),!u||!d){O.next=11;break}return O.next=8,v.p;case 8:return b=O.sent,l[f]=b,O.abrupt("return",checkPromises(t,o));case 11:return u?l[f]=v:t=d?v.p:v,O.abrupt("return",checkPromises(t,o));case 13:case"end":return O.stop()}}),_callee)})));return function(e){return r.apply(this,arguments)}}()));case 5:return o.abrupt("return",t);case 6:case"end":return o.stop()}}),_callee2)})))).apply(this,arguments)}function _adaptBuiltinStateObjectProperties(e,t,n){Object.assign(e,t);var r=s.map((function(t){var n=e[t];return delete e[t],n}));n(),s.forEach((function(t,n){e[t]=r[n]}))}function _encapsulate(t,n,o,s,f,h,d){var b,O={},_=_typeof(n),m=v?function(r){var a=d||s.type||Typeson.getJSONType(n);v(Object.assign(r||O,{keypath:t,value:n,cyclic:o,stateObj:s,promisesData:f,resolvingTypesonPromise:h,awaitingTypesonPromise:hasConstructorOf(n,e)},{type:a}))}:null;if(["string","boolean","number","undefined"].includes(_))return void 0===n||"number"===_&&(isNaN(n)||n===-1/0||n===1/0)?(b=s.replaced?n:replace(t,n,s,f,!1,h,m))!==n&&(O={replaced:b}):b=n,m&&m(),b;if(null===n)return m&&m(),n;if(o&&!s.iterateIn&&!s.iterateUnsetNumeric&&n&&"object"===_typeof(n)){var g=y.indexOf(n);if(!(g<0))return p[t]="#",m&&m({cyclicKeypath:l[g]}),"#"+l[g];!0===o&&(y.push(n),l.push(t))}var j,P=isPlainObject(n),S=i(n),T=(P||S)&&(!u.plainObjectReplacers.length||s.replaced)||s.iterateIn?n:replace(t,n,s,f,P||S,null,m);if(T!==n?(b=T,O={replaced:T}):""===t&&hasConstructorOf(n,e)?(f.push([t,n,o,s,void 0,void 0,s.type]),b=n):S&&"object"!==s.iterateIn||"array"===s.iterateIn?(j=new Array(n.length),O={clone:j}):(["function","symbol"].includes(_typeof(n))||"toJSON"in n||hasConstructorOf(n,e)||hasConstructorOf(n,Promise)||hasConstructorOf(n,ArrayBuffer))&&!P&&"object"!==s.iterateIn?b=n:(j={},s.addLength&&(j.length=n.length),O={clone:j}),m&&m(),r.iterateNone)return j||b;if(!j)return b;if(s.iterateIn){var w=function _loop(r){var a={ownKeys:c.call(n,r)};_adaptBuiltinStateObjectProperties(s,a,(function(){var a=t+(t?".":"")+escapeKeyPathComponent(r),i=_encapsulate(a,n[r],Boolean(o),s,f,h);hasConstructorOf(i,e)?f.push([a,i,Boolean(o),s,j,r,s.type]):void 0!==i&&(j[r]=i)}))};for(var A in n)w(A);m&&m({endIterateIn:!0,end:!0})}else a(n).forEach((function(r){var a=t+(t?".":"")+escapeKeyPathComponent(r);_adaptBuiltinStateObjectProperties(s,{ownKeys:!0},(function(){var t=_encapsulate(a,n[r],Boolean(o),s,f,h);hasConstructorOf(t,e)?f.push([a,t,Boolean(o),s,j,r,s.type]):void 0!==t&&(j[r]=t)}))})),m&&m({endIterateOwn:!0,end:!0});if(s.iterateUnsetNumeric){for(var k=n.length,C=function _loop2(r){if(!(r in n)){var a=t+(t?".":"")+r;_adaptBuiltinStateObjectProperties(s,{ownKeys:!1},(function(){var t=_encapsulate(a,void 0,Boolean(o),s,f,h);hasConstructorOf(t,e)?f.push([a,t,Boolean(o),s,j,r,s.type]):void 0!==t&&(j[r]=t)}))}},K=0;K<k;K++)C(K);m&&m({endIterateUnsetNumeric:!0,end:!0})}return j}function replace(e,t,n,r,a,i,c){for(var s=a?u.plainObjectReplacers:u.nonplainObjectReplacers,y=s.length;y--;){var l=s[y];if(l.test(t,n)){var f=l.type;if(u.revivers[f]){var v=p[e];p[e]=v?[f].concat(v):f}return Object.assign(n,{type:f,replaced:!0}),!o&&l.replaceAsync||l.replace?(c&&c({replacing:!0}),_encapsulate(e,l[o||!l.replaceAsync?"replace":"replaceAsync"](t,n),h&&"readonly",n,r,i,f)):(c&&c({typeDetected:!0}),_encapsulate(e,t,h&&"readonly",n,r,i,f))}}return t}return f.length?o&&r.throwOnBadSyncType?function(){throw new TypeError("Sync method requested but async result obtained")}():Promise.resolve(checkPromises(d,f)).then(finish):!o&&r.throwOnBadSyncType?function(){throw new TypeError("Async method requested but sync result obtained")}():r.stringification&&o?[finish(d)]:o?finish(d):Promise.resolve(finish(d))}},{key:"encapsulateSync",value:function encapsulateSync(e,t,n){return this.encapsulate(e,t,_objectSpread2({throwOnBadSyncType:!0},n,{sync:!0}))}},{key:"encapsulateAsync",value:function encapsulateAsync(e,t,n){return this.encapsulate(e,t,_objectSpread2({throwOnBadSyncType:!0},n,{sync:!1}))}},{key:"revive",value:function revive(t,n){var r=t&&t.$types;if(!r)return t;if(!0===r)return t.$;var o=(n=_objectSpread2({sync:!0},this.options,{},n)).sync,c=[],s={},u=!0;r.$&&isPlainObject(r.$)&&(t=t.$,r=r.$,u=!1);var y=this;function executeReviver(e,t){var n=_slicedToArray(y.revivers[e]||[],1)[0];if(!n)throw new Error("Unregistered type: "+e);return!o||"revive"in n?n[o&&n.revive?"revive":!o&&n.reviveAsync?"reviveAsync":"revive"](t,s):t}var l=[];function checkUndefined(e){return hasConstructorOf(e,p)?void 0:e}var f,h=function revivePlainObjects(){var n=[];if(Object.entries(r).forEach((function(e){var t=_slicedToArray(e,2),o=t[0],a=t[1];"#"!==a&&[].concat(a).forEach((function(e){_slicedToArray(y.revivers[e]||[null,{}],2)[1].plain&&(n.push({keypath:o,type:e}),delete r[o])}))})),n.length)return n.sort(nestedPathsFirst).reduce((function reducer(n,r){var o=r.keypath,a=r.type;if(isThenable(n))return n.then((function(e){return reducer(e,{keypath:o,type:a})}));var i=getByKeyPath(t,o);if(hasConstructorOf(i=executeReviver(a,i),e))return i.then((function(e){var n=setAtKeyPath(t,o,e);n===e&&(t=n)}));var c=setAtKeyPath(t,o,i);c===i&&(t=c)}),void 0)}();return hasConstructorOf(h,e)?f=h.then((function(){return t})):(f=function _revive(t,n,o,s,y){if(!u||"$types"!==t){var f=r[t],h=i(n);if(h||isPlainObject(n)){var v=h?new Array(n.length):{};for(a(n).forEach((function(r){var a=_revive(t+(t?".":"")+escapeKeyPathComponent(r),n[r],o||v,v,r),i=function set(e){return hasConstructorOf(e,p)?v[r]=void 0:void 0!==e&&(v[r]=e),e};hasConstructorOf(a,e)?l.push(a.then((function(e){return i(e)}))):i(a)})),n=v;c.length;){var d=_slicedToArray(c[0],4),b=d[0],O=d[1],_=d[2],m=d[3],g=getByKeyPath(b,O);if(void 0===g)break;_[m]=g,c.splice(0,1)}}if(!f)return n;if("#"===f){var j=getByKeyPath(o,n.slice(1));return void 0===j&&c.push([o,n.slice(1),s,y]),j}return[].concat(f).reduce((function reducer(t,n){return hasConstructorOf(t,e)?t.then((function(e){return reducer(e,n)})):executeReviver(n,t)}),n)}}("",t,null),l.length&&(f=e.resolve(f).then((function(t){return e.all([t].concat(l))})).then((function(e){return _slicedToArray(e,1)[0]})))),isThenable(f)?o&&n.throwOnBadSyncType?function(){throw new TypeError("Sync method requested but async result obtained")}():hasConstructorOf(f,e)?f.p.then(checkUndefined):f:!o&&n.throwOnBadSyncType?function(){throw new TypeError("Async method requested but sync result obtained")}():o?checkUndefined(f):Promise.resolve(checkUndefined(f))}},{key:"reviveSync",value:function reviveSync(e,t){return this.revive(e,_objectSpread2({throwOnBadSyncType:!0},t,{sync:!0}))}},{key:"reviveAsync",value:function reviveAsync(e,t){return this.revive(e,_objectSpread2({throwOnBadSyncType:!0},t,{sync:!1}))}},{key:"register",value:function register(e,t){return t=t||{},[].concat(e).forEach((function R(e){var n=this;if(i(e))return e.map((function(e){return R.call(n,e)}));e&&a(e).forEach((function(n){if("#"===n)throw new TypeError("# cannot be used as a type name as it is reserved for cyclic objects");if(Typeson.JSON_TYPES.includes(n))throw new TypeError("Plain JSON object types are reserved as type names");var r=e[n],o=r&&r.testPlainObjects?this.plainObjectReplacers:this.nonplainObjectReplacers,a=o.filter((function(e){return e.type===n}));if(a.length&&(o.splice(o.indexOf(a[0]),1),delete this.revivers[n],delete this.types[n]),"function"==typeof r){var c=r;r={test:function test(e){return e&&e.constructor===c},replace:function replace(e){return _objectSpread2({},e)},revive:function revive(e){return Object.assign(Object.create(c.prototype),e)}}}else if(i(r)){var s=_slicedToArray(r,3);r={test:s[0],replace:s[1],revive:s[2]}}if(r&&r.test){var u={type:n,test:r.test.bind(r)};r.replace&&(u.replace=r.replace.bind(r)),r.replaceAsync&&(u.replaceAsync=r.replaceAsync.bind(r));var p="number"==typeof t.fallback?t.fallback:t.fallback?0:1/0;if(r.testPlainObjects?this.plainObjectReplacers.splice(p,0,u):this.nonplainObjectReplacers.splice(p,0,u),r.revive||r.reviveAsync){var y={};r.revive&&(y.revive=r.revive.bind(r)),r.reviveAsync&&(y.reviveAsync=r.reviveAsync.bind(r)),this.revivers[n]=[y,{plain:r.testPlainObjects}]}this.types[n]=r}}),this)}),this),this}}]),Typeson}(),p=function Undefined(){_classCallCheck(this,Undefined)};p.__typeson__type__="TypesonUndefined",u.Undefined=p,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=r(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(e)},u.JSON_TYPES=["null","boolean","number","string","array","object"];export default u; | ||
function _typeof(e){return(_typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof 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 _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}function _slicedToArray(e,t){return function _arrayWithHoles(e){if(Array.isArray(e))return e}(e)||function _iterableToArrayLimit(e,t){if("undefined"==typeof Symbol||!(Symbol.iterator in Object(e)))return;var r=[],n=!0,o=!1,a=void 0;try{for(var i,c=e[Symbol.iterator]();!(n=(i=c.next()).done)&&(r.push(i.value),!t||r.length!==t);n=!0);}catch(e){o=!0,a=e}finally{try{n||null==c.return||c.return()}finally{if(o)throw a}}return r}(e,t)||_unsupportedIterableToArray(e,t)||function _nonIterableRest(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}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)||_unsupportedIterableToArray(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 _unsupportedIterableToArray(e,t){if(e){if("string"==typeof e)return _arrayLikeToArray(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);return"Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?_arrayLikeToArray(e,t):void 0}}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}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,r){var n=this;return new e((function(e,o){n.p.then((function(r){e(t?t(r):r)})).catch((function(e){return r?r(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,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,o=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(e))return!1;var a=n(e);if(!a)return null===t;var i=r.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))&&(!n(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 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)}function _await(e,t,r){return r?t?t(e):e:(e&&e.then||(e=Promise.resolve(e)),t?e.then(t):e)}var a=Object.keys,i=Array.isArray,c={}.hasOwnProperty,s=["type","replaced","iterateIn","iterateUnsetNumeric"];function _async(e){return function(){for(var t=[],r=0;r<arguments.length;r++)t[r]=arguments[r];try{return Promise.resolve(e.apply(this,t))}catch(e){return Promise.reject(e)}}}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(this,Typeson),this.options=e,this.plainObjectReplacers=[],this.nonplainObjectReplacers=[],this.revivers={},this.types={}}return function _createClass(e,t,r){return t&&_defineProperties(e.prototype,t),r&&_defineProperties(e,r),e}(Typeson,[{key:"stringify",value:function stringify(e,t,r,n){n=_objectSpread2(_objectSpread2(_objectSpread2({},this.options),n),{},{stringification:!0});var o=this.encapsulate(e,null,n);return i(o)?JSON.stringify(o[0],t,r):o.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(_objectSpread2({throwOnBadSyncType:!0},n),{},{sync:!0}))}},{key:"stringifyAsync",value:function stringifyAsync(e,t,r,n){return this.stringify(e,t,r,_objectSpread2(_objectSpread2({throwOnBadSyncType:!0},n),{},{sync:!1}))}},{key:"parse",value:function parse(e,t,r){return r=_objectSpread2(_objectSpread2(_objectSpread2({},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(_objectSpread2({throwOnBadSyncType:!0},r),{},{sync:!0}))}},{key:"parseAsync",value:function parseAsync(e,t,r){return this.parse(e,t,_objectSpread2(_objectSpread2({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 o=_async((function(t,r){return _await(Promise.all(r.map((function(e){return e[1].p}))),(function(n){return _await(Promise.all(n.map(_async((function(n){var a=!1,i=[],c=_slicedToArray(r.splice(0,1),1),s=_slicedToArray(c[0],7),u=s[0],p=s[2],y=s[3],l=s[4],f=s[5],h=s[6],v=_encapsulate(u,n,p,y,i,!0,h),d=hasConstructorOf(v,e);return function _invoke(e,t){var r=e();return r&&r.then?r.then(t):t(r)}((function(){if(u&&d)return _await(v.p,(function(e){return l[f]=e,a=!0,o(t,i)}))}),(function(e){return a?e:(u?l[f]=v:t=d?v.p:v,o(t,i))}))})))),(function(){return t}))}))})),u=(n=_objectSpread2(_objectSpread2({sync:!0},this.options),n)).sync,p=this,y={},l=[],f=[],h=[],v=!("cyclic"in n)||n.cyclic,d=n.encapsulateObserver,b=_encapsulate("",t,v,r||{},h);function finish(e){var t=Object.values(y);if(n.iterateNone)return t.length?t[0]:Typeson.getJSONType(e);if(t.length){if(n.returnTypeNames)return _toConsumableArray(new Set(t));e&&isPlainObject(e)&&!c.call(e,"$types")?e.$types=y:e={$:e,$types:{$:y}}}else isObject(e)&&c.call(e,"$types")&&(e={$:e,$types:!0});return!n.returnTypeNames&&e}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,o,s,u,h,v){var b,_={},O=_typeof(r),j=d?function(n){var a=v||s.type||Typeson.getJSONType(r);d(Object.assign(n||_,{keypath:t,value:r,cyclic:o,stateObj:s,promisesData:u,resolvingTypesonPromise:h,awaitingTypesonPromise:hasConstructorOf(r,e)},{type:a}))}:null;if(["string","boolean","number","undefined"].includes(O))return void 0===r||Number.isNaN(r)||r===Number.NEGATIVE_INFINITY||r===Number.POSITIVE_INFINITY?(b=s.replaced?r:replace(t,r,s,u,!1,h,j))!==r&&(_={replaced:b}):b=r,j&&j(),b;if(null===r)return j&&j(),r;if(o&&!s.iterateIn&&!s.iterateUnsetNumeric&&r&&"object"===_typeof(r)){var m=l.indexOf(r);if(!(m<0))return y[t]="#",j&&j({cyclicKeypath:f[m]}),"#"+f[m];!0===o&&(l.push(r),f.push(t))}var S,g=isPlainObject(r),P=i(r),T=(g||P)&&(!p.plainObjectReplacers.length||s.replaced)||s.iterateIn?r:replace(t,r,s,u,g||P,null,j);if(T!==r?(b=T,_={replaced:T}):""===t&&hasConstructorOf(r,e)?(u.push([t,r,o,s,void 0,void 0,s.type]),b=r):P&&"object"!==s.iterateIn||"array"===s.iterateIn?(S=new Array(r.length),_={clone:S}):(["function","symbol"].includes(_typeof(r))||"toJSON"in r||hasConstructorOf(r,e)||hasConstructorOf(r,Promise)||hasConstructorOf(r,ArrayBuffer))&&!g&&"object"!==s.iterateIn?b=r:(S={},s.addLength&&(S.length=r.length),_={clone:S}),j&&j(),n.iterateNone)return S||b;if(!S)return b;if(s.iterateIn){var w=function _loop(n){var a={ownKeys:c.call(r,n)};_adaptBuiltinStateObjectProperties(s,a,(function(){var a=t+(t?".":"")+escapeKeyPathComponent(n),i=_encapsulate(a,r[n],Boolean(o),s,u,h);hasConstructorOf(i,e)?u.push([a,i,Boolean(o),s,S,n,s.type]):void 0!==i&&(S[n]=i)}))};for(var A in r)w(A);j&&j({endIterateIn:!0,end:!0})}else a(r).forEach((function(n){var a=t+(t?".":"")+escapeKeyPathComponent(n);_adaptBuiltinStateObjectProperties(s,{ownKeys:!0},(function(){var t=_encapsulate(a,r[n],Boolean(o),s,u,h);hasConstructorOf(t,e)?u.push([a,t,Boolean(o),s,S,n,s.type]):void 0!==t&&(S[n]=t)}))})),j&&j({endIterateOwn:!0,end:!0});if(s.iterateUnsetNumeric){for(var C=r.length,k=function _loop2(n){if(!(n in r)){var a=t+(t?".":"")+n;_adaptBuiltinStateObjectProperties(s,{ownKeys:!1},(function(){var t=_encapsulate(a,void 0,Boolean(o),s,u,h);hasConstructorOf(t,e)?u.push([a,t,Boolean(o),s,S,n,s.type]):void 0!==t&&(S[n]=t)}))}},N=0;N<C;N++)k(N);j&&j({endIterateUnsetNumeric:!0,end:!0})}return S}function replace(e,t,r,n,o,a,i){for(var c=o?p.plainObjectReplacers:p.nonplainObjectReplacers,s=c.length;s--;){var l=c[s];if(l.test(t,r)){var f=l.type;if(p.revivers[f]){var h=y[e];y[e]=h?[f].concat(h):f}return Object.assign(r,{type:f,replaced:!0}),!u&&l.replaceAsync||l.replace?(i&&i({replacing:!0}),_encapsulate(e,l[u||!l.replaceAsync?"replace":"replaceAsync"](t,r),v&&"readonly",r,n,a,f)):(i&&i({typeDetected:!0}),_encapsulate(e,t,v&&"readonly",r,n,a,f))}}return t}return h.length?u&&n.throwOnBadSyncType?function(){throw new TypeError("Sync method requested but async result obtained")}():Promise.resolve(o(b,h)).then(finish):!u&&n.throwOnBadSyncType?function(){throw new TypeError("Async method requested but sync result obtained")}():n.stringification&&u?[finish(b)]:u?finish(b):Promise.resolve(finish(b))}},{key:"encapsulateSync",value:function encapsulateSync(e,t,r){return this.encapsulate(e,t,_objectSpread2(_objectSpread2({throwOnBadSyncType:!0},r),{},{sync:!0}))}},{key:"encapsulateAsync",value:function encapsulateAsync(e,t,r){return this.encapsulate(e,t,_objectSpread2(_objectSpread2({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 o=(r=_objectSpread2(_objectSpread2({sync:!0},this.options),r)).sync,c=[],s={},u=!0;n.$&&isPlainObject(n.$)&&(t=t.$,n=n.$,u=!1);var y=this;function executeReviver(e,t){var r=_slicedToArray(y.revivers[e]||[],1)[0];if(!r)throw new Error("Unregistered type: "+e);return o&&!("revive"in r)?t:r[o&&r.revive?"revive":!o&&r.reviveAsync?"reviveAsync":"revive"](t,s)}var l=[];function checkUndefined(e){return hasConstructorOf(e,p)?void 0:e}var f,h=function revivePlainObjects(){var r=[];if(Object.entries(n).forEach((function(e){var t=_slicedToArray(e,2),o=t[0],a=t[1];"#"!==a&&[].concat(a).forEach((function(e){_slicedToArray(y.revivers[e]||[null,{}],2)[1].plain&&(r.push({keypath:o,type:e}),delete n[o])}))})),r.length)return r.sort(nestedPathsFirst).reduce((function reducer(r,n){var o=n.keypath,a=n.type;if(isThenable(r))return r.then((function(e){return reducer(e,{keypath:o,type:a})}));var i=getByKeyPath(t,o);if(hasConstructorOf(i=executeReviver(a,i),e))return i.then((function(e){var r=setAtKeyPath(t,o,e);r===e&&(t=r)}));var c=setAtKeyPath(t,o,i);c===i&&(t=c)}),void 0)}();return hasConstructorOf(h,e)?f=h.then((function(){return t})):(f=function _revive(t,r,o,s,y){if(!u||"$types"!==t){var f=n[t],h=i(r);if(h||isPlainObject(r)){var v=h?new Array(r.length):{};for(a(r).forEach((function(n){var a=_revive(t+(t?".":"")+escapeKeyPathComponent(n),r[n],o||v,v,n),i=function set(e){return hasConstructorOf(e,p)?v[n]=void 0:void 0!==e&&(v[n]=e),e};hasConstructorOf(a,e)?l.push(a.then((function(e){return i(e)}))):i(a)})),r=v;c.length;){var d=_slicedToArray(c[0],4),b=d[0],_=d[1],O=d[2],j=d[3],m=getByKeyPath(b,_);if(void 0===m)break;O[j]=m,c.splice(0,1)}}if(!f)return r;if("#"===f){var S=getByKeyPath(o,r.slice(1));return void 0===S&&c.push([o,r.slice(1),s,y]),S}return[].concat(f).reduce((function reducer(t,r){return hasConstructorOf(t,e)?t.then((function(e){return reducer(e,r)})):executeReviver(r,t)}),r)}}("",t,null),l.length&&(f=e.resolve(f).then((function(t){return e.all([t].concat(l))})).then((function(e){return _slicedToArray(e,1)[0]})))),isThenable(f)?o&&r.throwOnBadSyncType?function(){throw new TypeError("Sync method requested but async result obtained")}():hasConstructorOf(f,e)?f.p.then(checkUndefined):f:!o&&r.throwOnBadSyncType?function(){throw new TypeError("Async method requested but sync result obtained")}():o?checkUndefined(f):Promise.resolve(checkUndefined(f))}},{key:"reviveSync",value:function reviveSync(e,t){return this.revive(e,_objectSpread2(_objectSpread2({throwOnBadSyncType:!0},t),{},{sync:!0}))}},{key:"reviveAsync",value:function reviveAsync(e,t){return this.revive(e,_objectSpread2(_objectSpread2({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(i(e))return e.map((function(e){return R.call(r,e)}));e&&a(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],o=n&&n.testPlainObjects?this.plainObjectReplacers:this.nonplainObjectReplacers,a=o.filter((function(e){return e.type===r}));if(a.length&&(o.splice(o.indexOf(a[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({},e)},revive:function revive(e){return Object.assign(Object.create(c.prototype),e)}}}else if(i(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 p="number"==typeof t.fallback?t.fallback:t.fallback?0:Number.POSITIVE_INFINITY;if(n.testPlainObjects?this.plainObjectReplacers.splice(p,0,u):this.nonplainObjectReplacers.splice(p,0,u),n.revive||n.reviveAsync){var y={};n.revive&&(y.revive=n.revive.bind(n)),n.reviveAsync&&(y.reviveAsync=n.reviveAsync.bind(n)),this.revivers[r]=[y,{plain:n.testPlainObjects}]}this.types[r]=n}}),this)}),this),this}}]),Typeson}(),p=function Undefined(){_classCallCheck(this,Undefined)};p.__typeson__type__="TypesonUndefined",u.Undefined=p,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(e)},u.JSON_TYPES=["null","boolean","number","string","array","object"];export default u; |
(function (global, factory) { | ||
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : | ||
typeof define === 'function' && define.amd ? define(factory) : | ||
(global = global || self, global.Typeson = factory()); | ||
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Typeson = factory()); | ||
}(this, (function () { 'use strict'; | ||
function _typeof(obj) { | ||
"@babel/helpers - typeof"; | ||
if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { | ||
@@ -21,38 +23,2 @@ _typeof = function (obj) { | ||
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { | ||
try { | ||
var info = gen[key](arg); | ||
var value = info.value; | ||
} catch (error) { | ||
reject(error); | ||
return; | ||
} | ||
if (info.done) { | ||
resolve(value); | ||
} else { | ||
Promise.resolve(value).then(_next, _throw); | ||
} | ||
} | ||
function _asyncToGenerator(fn) { | ||
return function () { | ||
var self = this, | ||
args = arguments; | ||
return new Promise(function (resolve, reject) { | ||
var gen = fn.apply(self, args); | ||
function _next(value) { | ||
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); | ||
} | ||
function _throw(err) { | ||
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); | ||
} | ||
_next(undefined); | ||
}); | ||
}; | ||
} | ||
function _classCallCheck(instance, Constructor) { | ||
@@ -130,15 +96,11 @@ if (!(instance instanceof Constructor)) { | ||
function _slicedToArray(arr, i) { | ||
return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); | ||
return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); | ||
} | ||
function _toConsumableArray(arr) { | ||
return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); | ||
return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); | ||
} | ||
function _arrayWithoutHoles(arr) { | ||
if (Array.isArray(arr)) { | ||
for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) arr2[i] = arr[i]; | ||
return arr2; | ||
} | ||
if (Array.isArray(arr)) return _arrayLikeToArray(arr); | ||
} | ||
@@ -151,10 +113,7 @@ | ||
function _iterableToArray(iter) { | ||
if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); | ||
if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); | ||
} | ||
function _iterableToArrayLimit(arr, i) { | ||
if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === "[object Arguments]")) { | ||
return; | ||
} | ||
if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return; | ||
var _arr = []; | ||
@@ -185,11 +144,61 @@ var _n = true; | ||
function _unsupportedIterableToArray(o, minLen) { | ||
if (!o) return; | ||
if (typeof o === "string") return _arrayLikeToArray(o, minLen); | ||
var n = Object.prototype.toString.call(o).slice(8, -1); | ||
if (n === "Object" && o.constructor) n = o.constructor.name; | ||
if (n === "Map" || n === "Set") return Array.from(o); | ||
if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); | ||
} | ||
function _arrayLikeToArray(arr, len) { | ||
if (len == null || len > arr.length) len = arr.length; | ||
for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; | ||
return arr2; | ||
} | ||
function _nonIterableSpread() { | ||
throw new TypeError("Invalid attempt to spread non-iterable instance"); | ||
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 _nonIterableRest() { | ||
throw new TypeError("Invalid attempt to destructure non-iterable instance"); | ||
throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); | ||
} | ||
/** | ||
* @callback TypesonFulfilled | ||
* @returns {Promise<any>|any} | ||
*/ | ||
/** | ||
* @callback TypesonRejected | ||
* @returns {Promise<any>|any} | ||
*/ | ||
/** | ||
* @callback TypesonResolve | ||
* @param {any} value | ||
* @returns {Promise<any>} | ||
*/ | ||
/** | ||
* @callback TypesonReject | ||
* @param {Error|any} error | ||
* @returns {Promise<any>} | ||
*/ | ||
/** | ||
* @callback TypesonResolveReject | ||
* @param {TypesonResolve} typesonResolve | ||
* @param {TypesonReject} typesonReject | ||
* @returns {Promise<any>} | ||
*/ | ||
/* eslint-disable block-spacing, space-before-function-paren, | ||
space-before-blocks, space-infix-ops, semi, promise/avoid-new, | ||
jsdoc/require-jsdoc */ | ||
/** | ||
* We keep this function minimized so if using two instances of this | ||
@@ -200,6 +209,4 @@ * library, where one is minimized and one is not, it will still work | ||
* extends Promise` and add a string tag for detection. | ||
* @param {function} f | ||
* @param {TypesonResolveReject} f | ||
*/ | ||
// eslint-disable-next-line max-len | ||
// eslint-disable-next-line block-spacing, space-before-function-paren, space-before-blocks, space-infix-ops, semi, promise/avoid-new | ||
var TypesonPromise = function TypesonPromise(f) { | ||
@@ -209,3 +216,7 @@ _classCallCheck(this, TypesonPromise); | ||
this.p = new Promise(f); | ||
}; // eslint-disable-next-line max-len | ||
}; | ||
/* eslint-enable block-spacing, space-before-function-paren, | ||
space-before-blocks, space-infix-ops, semi, promise/avoid-new, | ||
jsdoc/require-jsdoc */ | ||
// eslint-disable-next-line max-len | ||
// class TypesonPromise extends Promise {get[Symbol.toStringTag](){return 'TypesonPromise'};} // eslint-disable-line keyword-spacing, space-before-function-paren, space-before-blocks, block-spacing, semi | ||
@@ -224,4 +235,4 @@ | ||
* | ||
* @param {function} [onFulfilled] | ||
* @param {function} [onRejected] | ||
* @param {TypesonFulfilled} [onFulfilled] | ||
* @param {TypesonRejected} [onRejected] | ||
* @returns {TypesonPromise} | ||
@@ -246,3 +257,3 @@ */ | ||
* | ||
* @param {function} onRejected | ||
* @param {TypesonRejected} onRejected | ||
* @returns {TypesonPromise} | ||
@@ -257,3 +268,3 @@ */ | ||
* | ||
* @param {Any} v | ||
* @param {any} v | ||
* @returns {TypesonPromise} | ||
@@ -270,3 +281,3 @@ */ | ||
* | ||
* @param {Any} v | ||
* @param {any} v | ||
* @returns {TypesonPromise} | ||
@@ -285,3 +296,3 @@ */ | ||
* | ||
* @param {Promise[]} promArr | ||
* @param {Promise<any>[]} promArr | ||
* @returns {TypesonPromise} | ||
@@ -301,8 +312,8 @@ */ | ||
toStr = _ref.toString, | ||
hasOwn = {}.hasOwnProperty, | ||
hasOwn$1 = {}.hasOwnProperty, | ||
getProto = Object.getPrototypeOf, | ||
fnToString = hasOwn.toString; | ||
fnToString = hasOwn$1.toString; | ||
/** | ||
* Second argument not in use internally, but provided for utility. | ||
* @param {Any} v | ||
* @param {any} v | ||
* @param {boolean} catchCheck | ||
@@ -317,3 +328,3 @@ * @returns {boolean} | ||
* | ||
* @param {Any} val | ||
* @param {any} val | ||
* @returns {string} | ||
@@ -329,4 +340,4 @@ */ | ||
* being identical so any minimization is expected of both. | ||
* @param {Any} a | ||
* @param {function} b | ||
* @param {any} a | ||
* @param {GenericFunction} b | ||
* @returns {boolean} | ||
@@ -347,3 +358,3 @@ */ | ||
var Ctor = hasOwn.call(proto, 'constructor') && proto.constructor; | ||
var Ctor = hasOwn$1.call(proto, 'constructor') && proto.constructor; | ||
@@ -370,3 +381,3 @@ if (typeof Ctor !== 'function') { | ||
* | ||
* @param {Any} val | ||
* @param {any} val | ||
* @returns {boolean} | ||
@@ -393,3 +404,3 @@ */ | ||
* | ||
* @param {Any} val | ||
* @param {any} val | ||
* @returns {boolean} | ||
@@ -415,3 +426,3 @@ */ | ||
* | ||
* @param {Any} v | ||
* @param {any} v | ||
* @returns {boolean} | ||
@@ -447,3 +458,3 @@ */ | ||
* @param {string} keyPath | ||
* @returns {Any} | ||
* @returns {any} | ||
*/ | ||
@@ -470,4 +481,4 @@ | ||
* @param {string} keyPath | ||
* @param {Any} value | ||
* @returns {Any} | ||
* @param {any} value | ||
* @returns {any} | ||
*/ | ||
@@ -503,5 +514,17 @@ | ||
function _await(value, then, direct) { | ||
if (direct) { | ||
return then ? then(value) : value; | ||
} | ||
if (!value || !value.then) { | ||
value = Promise.resolve(value); | ||
} | ||
return then ? value.then(then) : value; | ||
} | ||
var keys = Object.keys, | ||
isArray = Array.isArray, | ||
hasOwn$1 = {}.hasOwnProperty, | ||
hasOwn = {}.hasOwnProperty, | ||
internalStateObjPropsToIgnore = ['type', 'replaced', 'iterateIn', 'iterateUnsetNumeric']; | ||
@@ -517,2 +540,62 @@ /** | ||
function _async(f) { | ||
return function () { | ||
for (var args = [], i = 0; i < arguments.length; i++) { | ||
args[i] = arguments[i]; | ||
} | ||
try { | ||
return Promise.resolve(f.apply(this, args)); | ||
} catch (e) { | ||
return Promise.reject(e); | ||
} | ||
}; | ||
} | ||
/** | ||
* @callback Tester | ||
* @param {any} value | ||
* @param {StateObject} stateobj | ||
* @returns {boolean} | ||
*/ | ||
/** | ||
* @callback Replacer | ||
* @param {any} value | ||
* @param {StateObject} stateObj | ||
* @returns {any} Should be JSON-stringifiable | ||
*/ | ||
/** | ||
* @callback Reviver | ||
* @param {JSON} value | ||
* @param {StateObject} stateObj | ||
* @returns {any} | ||
*/ | ||
/** | ||
* @typedef {PlainObject} TypesonOptions | ||
* @property {boolean} stringification Auto-set by `stringify` | ||
*/ | ||
/** | ||
* An instance of this class can be used to call `stringify()` and `parse()`. | ||
* Typeson resolves cyclic references by default. Can also be extended to | ||
* support custom types using the register() method. | ||
* | ||
* @class | ||
* @param {{cyclic: boolean}} [options] - if cyclic (default true), | ||
* cyclic references will be handled gracefully. | ||
*/ | ||
function _invoke(body, then) { | ||
var result = body(); | ||
if (result && result.then) { | ||
return result.then(then); | ||
} | ||
return then(result); | ||
} | ||
function nestedPathsFirst(a, b) { | ||
@@ -536,16 +619,7 @@ if (a.keypath === '') { | ||
} | ||
/** | ||
* An instance of this class can be used to call `stringify()` and `parse()`. | ||
* Typeson resolves cyclic references by default. Can also be extended to | ||
* support custom types using the register() method. | ||
* | ||
* @class | ||
* @param {{cyclic: boolean}} [options] - if cyclic (default true), | ||
* cyclic references will be handled gracefully. | ||
*/ | ||
var Typeson = | ||
/*#__PURE__*/ | ||
function () { | ||
var Typeson = /*#__PURE__*/function () { | ||
/** | ||
* @param {TypesonOptions} options | ||
*/ | ||
function Typeson(options) { | ||
@@ -582,7 +656,7 @@ _classCallCheck(this, Typeson); | ||
* The `replacer` argument has nothing to do with our replacers. | ||
* @param {Any} obj | ||
* @param {any} obj | ||
* @param {JSONReplacer|string[]} replacer | ||
* @param {number|string} space | ||
* @param {object} opts | ||
* @returns {string|Promise} Promise resolves to a string | ||
* @param {TypesonOptions} opts | ||
* @returns {string|Promise<string>} Promise resolves to a string | ||
*/ | ||
@@ -594,3 +668,3 @@ | ||
value: function stringify(obj, replacer, space, opts) { | ||
opts = _objectSpread2({}, this.options, {}, opts, { | ||
opts = _objectSpread2(_objectSpread2(_objectSpread2({}, this.options), opts), {}, { | ||
stringification: true | ||
@@ -610,6 +684,6 @@ }); | ||
* Also sync but throws on non-sync result. | ||
* @param {Any} obj | ||
* @param {any} obj | ||
* @param {JSONReplacer|string[]} replacer | ||
* @param {number|string} space | ||
* @param {object} opts | ||
* @param {TypesonOptions} opts | ||
* @returns {string} | ||
@@ -621,5 +695,5 @@ */ | ||
value: function stringifySync(obj, replacer, space, opts) { | ||
return this.stringify(obj, replacer, space, _objectSpread2({ | ||
return this.stringify(obj, replacer, space, _objectSpread2(_objectSpread2({ | ||
throwOnBadSyncType: true | ||
}, opts, { | ||
}, opts), {}, { | ||
sync: true | ||
@@ -630,6 +704,6 @@ })); | ||
* | ||
* @param {Any} obj | ||
* @param {any} obj | ||
* @param {JSONReplacer|string[]} replacer | ||
* @param {number|string} space | ||
* @param {object} opts | ||
* @param {TypesonOptions} opts | ||
* @returns {Promise<string>} | ||
@@ -641,5 +715,5 @@ */ | ||
value: function stringifyAsync(obj, replacer, space, opts) { | ||
return this.stringify(obj, replacer, space, _objectSpread2({ | ||
return this.stringify(obj, replacer, space, _objectSpread2(_objectSpread2({ | ||
throwOnBadSyncType: true | ||
}, opts, { | ||
}, opts), {}, { | ||
sync: false | ||
@@ -649,8 +723,15 @@ })); | ||
/** | ||
* @callback JSONReviver | ||
* @param {string} key | ||
* @param {JSON} value | ||
* @returns {JSON} | ||
*/ | ||
/** | ||
* Parse Typeson back into an obejct. | ||
* Initial arguments works identical to those of `JSON.parse()`. | ||
* @param {string} text | ||
* @param {function} reviver This JSON reviver has nothing to do with | ||
* @param {JSONReviver} reviver This JSON reviver has nothing to do with | ||
* our revivers. | ||
* @param {object} opts | ||
* @param {TypesonOptions} opts | ||
* @returns {external:JSON} | ||
@@ -662,3 +743,3 @@ */ | ||
value: function parse(text, reviver, opts) { | ||
opts = _objectSpread2({}, this.options, {}, opts, { | ||
opts = _objectSpread2(_objectSpread2(_objectSpread2({}, this.options), opts), {}, { | ||
parse: true | ||
@@ -671,5 +752,5 @@ }); | ||
* @param {string} text | ||
* @param {function} reviver This JSON reviver has nothing to do with | ||
* @param {JSONReviver} reviver This JSON reviver has nothing to do with | ||
* our revivers. | ||
* @param {object} opts | ||
* @param {TypesonOptions} opts | ||
* @returns {external:JSON} | ||
@@ -681,5 +762,5 @@ */ | ||
value: function parseSync(text, reviver, opts) { | ||
return this.parse(text, reviver, _objectSpread2({ | ||
return this.parse(text, reviver, _objectSpread2(_objectSpread2({ | ||
throwOnBadSyncType: true | ||
}, opts, { | ||
}, opts), {}, { | ||
sync: true | ||
@@ -690,6 +771,6 @@ })); | ||
* @param {string} text | ||
* @param {function} reviver This JSON reviver has nothing to do with | ||
* @param {JSONReviver} reviver This JSON reviver has nothing to do with | ||
* our revivers. | ||
* @param {object} opts | ||
* @returns {Promise} Resolves to `external:JSON` | ||
* @param {TypesonOptions} opts | ||
* @returns {Promise<external:JSON>} Resolves to `external:JSON` | ||
*/ | ||
@@ -700,5 +781,5 @@ | ||
value: function parseAsync(text, reviver, opts) { | ||
return this.parse(text, reviver, _objectSpread2({ | ||
return this.parse(text, reviver, _objectSpread2(_objectSpread2({ | ||
throwOnBadSyncType: true | ||
}, opts, { | ||
}, opts), {}, { | ||
sync: false | ||
@@ -708,6 +789,10 @@ })); | ||
/** | ||
* @typedef {} StateObject | ||
*/ | ||
/** | ||
* | ||
* @param {Any} obj | ||
* @param {object} stateObj | ||
* @param {object} [opts={}] | ||
* @param {any} obj | ||
* @param {StateObject} stateObj | ||
* @param {TypesonOptions} [opts={}] | ||
* @returns {string[]|false} | ||
@@ -725,6 +810,6 @@ */ | ||
* | ||
* @param {Any} obj | ||
* @param {any} obj | ||
* @param {PlainObject} stateObj | ||
* @param {PlainObject} [opts={}] | ||
* @returns {Promise|GenericArray|PlainObject|string|false} | ||
* @returns {Promise<any>|GenericArray|PlainObject|string|false} | ||
*/ | ||
@@ -744,6 +829,6 @@ | ||
* This method is used internally by `Typeson.stringify()`. | ||
* @param {Any} obj - Object to encapsulate. | ||
* @param {any} obj - Object to encapsulate. | ||
* @param {PlainObject} stateObj | ||
* @param {PlainObject} opts | ||
* @returns {Promise|GenericArray|PlainObject|string|false} | ||
* @returns {Promise<any>|GenericArray|PlainObject|string|false} | ||
*/ | ||
@@ -754,5 +839,88 @@ | ||
value: function encapsulate(obj, stateObj, opts) { | ||
opts = _objectSpread2({ | ||
/** | ||
* | ||
* @param {any} ret | ||
* @param {GenericArray} promisesData | ||
* @returns {Promise<any>} | ||
*/ | ||
var checkPromises = _async(function (ret, promisesData) { | ||
return _await(Promise.all(promisesData.map(function (pd) { | ||
return pd[1].p; | ||
})), function (promResults) { | ||
return _await(Promise.all(promResults.map(_async(function (promResult) { | ||
var _exit = false; | ||
var newPromisesData = []; | ||
var _promisesData$splice = promisesData.splice(0, 1), | ||
_promisesData$splice2 = _slicedToArray(_promisesData$splice, 1), | ||
prData = _promisesData$splice2[0]; | ||
var _prData = _slicedToArray(prData, 7), | ||
keyPath = _prData[0], | ||
cyclic = _prData[2], | ||
stateObj = _prData[3], | ||
parentObj = _prData[4], | ||
key = _prData[5], | ||
detectedType = _prData[6]; | ||
var encaps = _encapsulate(keyPath, promResult, cyclic, stateObj, newPromisesData, true, detectedType); | ||
var isTypesonPromise = hasConstructorOf(encaps, TypesonPromise); // Handle case where an embedded custom type itself | ||
// returns a `Typeson.Promise` | ||
return _invoke(function () { | ||
if (keyPath && isTypesonPromise) { | ||
return _await(encaps.p, function (encaps2) { | ||
parentObj[key] = encaps2; | ||
_exit = true; | ||
return checkPromises(ret, newPromisesData); | ||
}); | ||
} | ||
}, function (_result) { | ||
if (_exit) return _result; | ||
if (keyPath) { | ||
parentObj[key] = encaps; | ||
} else if (isTypesonPromise) { | ||
ret = encaps.p; | ||
} else { | ||
// If this is itself a `Typeson.Promise` (because the | ||
// original value supplied was a `Promise` or | ||
// because the supplied custom type value resolved | ||
// to one), returning it below will be fine since | ||
// a `Promise` is expected anyways given current | ||
// config (and if not a `Promise`, it will be ready | ||
// as the resolve value) | ||
ret = encaps; | ||
} | ||
return checkPromises(ret, newPromisesData); | ||
}); | ||
}))), function () { | ||
return ret; | ||
}); | ||
}); | ||
}); | ||
/** | ||
* @typedef {PlainObject} OwnKeysObject | ||
* @property {boolean} ownKeys | ||
*/ | ||
/** | ||
* @callback BuiltinStateObjectPropertiesCallback | ||
* @returns {void} | ||
*/ | ||
/** | ||
* | ||
* @param {StateObject} stateObj | ||
* @param {OwnKeysObject} ownKeysObj | ||
* @param {BuiltinStateObjectPropertiesCallback} cb | ||
* @returns {undefined} | ||
*/ | ||
opts = _objectSpread2(_objectSpread2({ | ||
sync: true | ||
}, this.options, {}, opts); | ||
}, this.options), opts); | ||
var _opts = opts, | ||
@@ -776,3 +944,3 @@ sync = _opts.sync; | ||
* | ||
* @param {Any} ret | ||
* @param {any} ret | ||
* @returns {GenericArray|PlainObject|string|false} | ||
@@ -804,3 +972,3 @@ */ | ||
// own `$types` property (to avoid ambiguity) | ||
hasOwn$1.call(ret, '$types')) { | ||
hasOwn.call(ret, '$types')) { | ||
ret = { | ||
@@ -816,3 +984,3 @@ $: ret, | ||
} else if (isObject(ret) && hasOwn$1.call(ret, '$types')) { | ||
} else if (isObject(ret) && hasOwn.call(ret, '$types')) { | ||
ret = { | ||
@@ -830,115 +998,3 @@ $: ret, | ||
} | ||
/** | ||
* | ||
* @param {Any} ret | ||
* @param {GenericArray} promisesData | ||
* @returns {Promise<Any>} | ||
*/ | ||
function checkPromises(_x, _x2) { | ||
return _checkPromises.apply(this, arguments); | ||
} | ||
/** | ||
* | ||
* @param {object} stateObj | ||
* @param {object} ownKeysObj | ||
* @param {function} cb | ||
* @returns {undefined} | ||
*/ | ||
function _checkPromises() { | ||
_checkPromises = _asyncToGenerator( | ||
/*#__PURE__*/ | ||
regeneratorRuntime.mark(function _callee2(ret, promisesData) { | ||
var promResults; | ||
return regeneratorRuntime.wrap(function _callee2$(_context2) { | ||
while (1) { | ||
switch (_context2.prev = _context2.next) { | ||
case 0: | ||
_context2.next = 2; | ||
return Promise.all(promisesData.map(function (pd) { | ||
return pd[1].p; | ||
})); | ||
case 2: | ||
promResults = _context2.sent; | ||
_context2.next = 5; | ||
return Promise.all(promResults.map( | ||
/*#__PURE__*/ | ||
function () { | ||
var _ref = _asyncToGenerator( | ||
/*#__PURE__*/ | ||
regeneratorRuntime.mark(function _callee(promResult) { | ||
var newPromisesData, _promisesData$splice, _promisesData$splice2, prData, _prData, keyPath, cyclic, stateObj, parentObj, key, detectedType, encaps, isTypesonPromise, encaps2; | ||
return regeneratorRuntime.wrap(function _callee$(_context) { | ||
while (1) { | ||
switch (_context.prev = _context.next) { | ||
case 0: | ||
newPromisesData = []; | ||
_promisesData$splice = promisesData.splice(0, 1), _promisesData$splice2 = _slicedToArray(_promisesData$splice, 1), prData = _promisesData$splice2[0]; | ||
_prData = _slicedToArray(prData, 7), keyPath = _prData[0], cyclic = _prData[2], stateObj = _prData[3], parentObj = _prData[4], key = _prData[5], detectedType = _prData[6]; | ||
encaps = _encapsulate(keyPath, promResult, cyclic, stateObj, newPromisesData, true, detectedType); | ||
isTypesonPromise = hasConstructorOf(encaps, TypesonPromise); // Handle case where an embedded custom type itself | ||
// returns a `Typeson.Promise` | ||
if (!(keyPath && isTypesonPromise)) { | ||
_context.next = 11; | ||
break; | ||
} | ||
_context.next = 8; | ||
return encaps.p; | ||
case 8: | ||
encaps2 = _context.sent; | ||
parentObj[key] = encaps2; | ||
return _context.abrupt("return", checkPromises(ret, newPromisesData)); | ||
case 11: | ||
if (keyPath) { | ||
parentObj[key] = encaps; | ||
} else if (isTypesonPromise) { | ||
ret = encaps.p; | ||
} else { | ||
// If this is itself a `Typeson.Promise` (because the | ||
// original value supplied was a `Promise` or | ||
// because the supplied custom type value resolved | ||
// to one), returning it below will be fine since | ||
// a `Promise` is expected anyways given current | ||
// config (and if not a `Promise`, it will be ready | ||
// as the resolve value) | ||
ret = encaps; | ||
} | ||
return _context.abrupt("return", checkPromises(ret, newPromisesData)); | ||
case 13: | ||
case "end": | ||
return _context.stop(); | ||
} | ||
} | ||
}, _callee); | ||
})); | ||
return function (_x3) { | ||
return _ref.apply(this, arguments); | ||
}; | ||
}())); | ||
case 5: | ||
return _context2.abrupt("return", ret); | ||
case 6: | ||
case "end": | ||
return _context2.stop(); | ||
} | ||
} | ||
}, _callee2); | ||
})); | ||
return _checkPromises.apply(this, arguments); | ||
} | ||
function _adaptBuiltinStateObjectProperties(stateObj, ownKeysObj, cb) { | ||
@@ -950,3 +1006,3 @@ Object.assign(stateObj, ownKeysObj); | ||
return tmp; | ||
}); // eslint-disable-next-line callback-return | ||
}); // eslint-disable-next-line node/callback-return | ||
@@ -961,3 +1017,3 @@ cb(); | ||
* @param {string} keypath | ||
* @param {Any} value | ||
* @param {any} value | ||
* @param {boolean} cyclic | ||
@@ -968,3 +1024,3 @@ * @param {PlainObject} stateObj | ||
* @param {string} detectedType | ||
* @returns {Any} | ||
* @returns {any} | ||
*/ | ||
@@ -995,8 +1051,4 @@ | ||
if (['string', 'boolean', 'number', 'undefined'].includes($typeof)) { | ||
if (value === undefined || $typeof === 'number' && (isNaN(value) || value === -Infinity || value === Infinity)) { | ||
if (stateObj.replaced) { | ||
ret = value; | ||
} else { | ||
ret = replace(keypath, value, stateObj, promisesData, false, resolvingTypesonPromise, runObserver); | ||
} | ||
if (value === undefined || Number.isNaN(value) || value === Number.NEGATIVE_INFINITY || value === Number.POSITIVE_INFINITY) { | ||
ret = stateObj.replaced ? value : replace(keypath, value, stateObj, promisesData, false, resolvingTypesonPromise, runObserver); | ||
@@ -1070,2 +1122,3 @@ if (ret !== value) { | ||
} else if (isArr && stateObj.iterateIn !== 'object' || stateObj.iterateIn === 'array') { | ||
// eslint-disable-next-line unicorn/no-new-array -- Sparse | ||
clone = new Array(value.length); | ||
@@ -1106,3 +1159,3 @@ observerData = { | ||
var ownKeysObj = { | ||
ownKeys: hasOwn$1.call(value, key) | ||
ownKeys: hasOwn.call(value, key) | ||
}; | ||
@@ -1205,5 +1258,39 @@ | ||
/** | ||
* @typedef {PlainObject} KeyPathEvent | ||
* @property {string} cyclicKeypath | ||
*/ | ||
/** | ||
* @typedef {PlainObject} EndIterateInEvent | ||
* @property {boolean} endIterateIn | ||
* @property {boolean} end | ||
*/ | ||
/** | ||
* @typedef {PlainObject} EndIterateUnsetNumericEvent | ||
* @property {boolean} endIterateUnsetNumeric | ||
* @property {boolean} end | ||
*/ | ||
/** | ||
* @typedef {PlainObject} TypeDetectedEvent | ||
* @property {boolean} typeDetected | ||
*/ | ||
/** | ||
* @typedef {PlainObject} ReplacingEvent | ||
* @property {boolean} replacing | ||
*/ | ||
/** | ||
* @callback Observer | ||
* @param {KeyPathEvent|EndIterateInEvent|EndIterateUnsetNumericEvent| | ||
* TypeDetectedEvent|ReplacingEvent} [event] | ||
* @returns {void} | ||
*/ | ||
/** | ||
* | ||
* @param {string} keypath | ||
* @param {Any} value | ||
* @param {any} value | ||
* @param {PlainObject} stateObj | ||
@@ -1213,4 +1300,4 @@ * @param {GenericArray} promisesData | ||
* @param {boolean} resolvingTypesonPromise | ||
* @param {function} [runObserver] | ||
* @returns {*} | ||
* @param {Observer} [runObserver] | ||
* @returns {any} | ||
*/ | ||
@@ -1286,6 +1373,6 @@ | ||
* Also sync but throws on non-sync result. | ||
* @param {*} obj | ||
* @param {object} stateObj | ||
* @param {object} opts | ||
* @returns {*} | ||
* @param {any} obj | ||
* @param {StateObject} stateObj | ||
* @param {TypesonOptions} opts | ||
* @returns {any} | ||
*/ | ||
@@ -1296,5 +1383,5 @@ | ||
value: function encapsulateSync(obj, stateObj, opts) { | ||
return this.encapsulate(obj, stateObj, _objectSpread2({ | ||
return this.encapsulate(obj, stateObj, _objectSpread2(_objectSpread2({ | ||
throwOnBadSyncType: true | ||
}, opts, { | ||
}, opts), {}, { | ||
sync: true | ||
@@ -1304,6 +1391,6 @@ })); | ||
/** | ||
* @param {*} obj | ||
* @param {object} stateObj | ||
* @param {object} opts | ||
* @returns {*} | ||
* @param {any} obj | ||
* @param {StateObject} stateObj | ||
* @param {TypesonOptions} opts | ||
* @returns {any} | ||
*/ | ||
@@ -1314,5 +1401,5 @@ | ||
value: function encapsulateAsync(obj, stateObj, opts) { | ||
return this.encapsulate(obj, stateObj, _objectSpread2({ | ||
return this.encapsulate(obj, stateObj, _objectSpread2(_objectSpread2({ | ||
throwOnBadSyncType: true | ||
}, opts, { | ||
}, opts), {}, { | ||
sync: false | ||
@@ -1324,8 +1411,9 @@ })); | ||
* This method is used internally by `Typeson.parse()`. | ||
* @param {object} obj - Object to revive. If it has `$types` member, the | ||
* properties that are listed there will be replaced with its true type | ||
* instead of just plain objects. | ||
* @param {object} opts | ||
* @param {PlainObject} obj - Object to revive. If it has `$types` member, | ||
* the properties that are listed there will be replaced with its true | ||
* type instead of just plain objects. | ||
* @param {TypesonOptions} opts | ||
* @throws TypeError If mismatch between sync/async type and result | ||
* @returns {Promise|*} If async, returns a Promise that resolves to `*` | ||
* @returns {Promise<any>|any} If async, returns a Promise that resolves | ||
* to `any`. | ||
*/ | ||
@@ -1348,5 +1436,5 @@ | ||
opts = _objectSpread2({ | ||
opts = _objectSpread2(_objectSpread2({ | ||
sync: true | ||
}, this.options, {}, opts); | ||
}, this.options), opts); | ||
var _opts3 = opts, | ||
@@ -1369,5 +1457,5 @@ sync = _opts3.sync; | ||
* @callback RevivalReducer | ||
* @param {Any} value | ||
* @param {any} value | ||
* @param {string} type | ||
* @returns {Any} | ||
* @returns {any} | ||
*/ | ||
@@ -1378,10 +1466,11 @@ | ||
* @param {string} type | ||
* @param {Any} val | ||
* @returns {[type]} [description] | ||
* @param {any} val | ||
* @throws {Error} | ||
* @returns {any} | ||
*/ | ||
function executeReviver(type, val) { | ||
var _ref2 = that.revivers[type] || [], | ||
_ref3 = _slicedToArray(_ref2, 1), | ||
reviver = _ref3[0]; | ||
var _ref = that.revivers[type] || [], | ||
_ref2 = _slicedToArray(_ref, 1), | ||
reviver = _ref2[0]; | ||
@@ -1413,6 +1502,6 @@ if (!reviver) { | ||
var plainObjectTypes = []; | ||
Object.entries(types).forEach(function (_ref4) { | ||
var _ref5 = _slicedToArray(_ref4, 2), | ||
keypath = _ref5[0], | ||
type = _ref5[1]; | ||
Object.entries(types).forEach(function (_ref3) { | ||
var _ref4 = _slicedToArray(_ref3, 2), | ||
keypath = _ref4[0], | ||
type = _ref4[1]; | ||
@@ -1430,5 +1519,5 @@ if (type === '#') { | ||
[].concat(type).forEach(function (type) { | ||
var _ref6 = that.revivers[type] || [null, {}], | ||
_ref7 = _slicedToArray(_ref6, 2), | ||
plain = _ref7[1].plain; | ||
var _ref5 = that.revivers[type] || [null, {}], | ||
_ref6 = _slicedToArray(_ref5, 2), | ||
plain = _ref6[1].plain; | ||
@@ -1459,5 +1548,5 @@ if (!plain) { | ||
return plainObjectTypes.sort(nestedPathsFirst).reduce(function reducer(possibleTypesonPromise, _ref8) { | ||
var keypath = _ref8.keypath, | ||
type = _ref8.type; | ||
return plainObjectTypes.sort(nestedPathsFirst).reduce(function reducer(possibleTypesonPromise, _ref7) { | ||
var keypath = _ref7.keypath, | ||
type = _ref7.type; | ||
@@ -1505,7 +1594,7 @@ if (isThenable(possibleTypesonPromise)) { | ||
* @param {string} keypath | ||
* @param {Any} value | ||
* @param {?(Array|object)} target | ||
* @param {Array|object} [clone] | ||
* @param {any} value | ||
* @param {?(GenericArray|PlainObject)} target | ||
* @param {GenericArray|PlainObject} [clone] | ||
* @param {string} [key] | ||
* @returns {Any} | ||
* @returns {any} | ||
*/ | ||
@@ -1522,2 +1611,3 @@ | ||
if (isArr || isPlainObject(value)) { | ||
// eslint-disable-next-line unicorn/no-new-array -- Sparse | ||
var _clone = isArr ? new Array(value.length) : {}; // Iterate object or array | ||
@@ -1598,4 +1688,4 @@ | ||
* | ||
* @param {Any} retrn | ||
* @returns {undefined|Any} | ||
* @param {any} retrn | ||
* @returns {undefined|any} | ||
*/ | ||
@@ -1623,5 +1713,5 @@ | ||
r].concat(revivalPromises)); | ||
}).then(function (_ref9) { | ||
var _ref10 = _slicedToArray(_ref9, 1), | ||
r = _ref10[0]; | ||
}).then(function (_ref8) { | ||
var _ref9 = _slicedToArray(_ref8, 1), | ||
r = _ref9[0]; | ||
@@ -1641,5 +1731,5 @@ return r; | ||
* Also sync but throws on non-sync result. | ||
* @param {Any} obj | ||
* @param {object} opts | ||
* @returns {Any} | ||
* @param {any} obj | ||
* @param {TypesonOptions} opts | ||
* @returns {any} | ||
*/ | ||
@@ -1650,5 +1740,5 @@ | ||
value: function reviveSync(obj, opts) { | ||
return this.revive(obj, _objectSpread2({ | ||
return this.revive(obj, _objectSpread2(_objectSpread2({ | ||
throwOnBadSyncType: true | ||
}, opts, { | ||
}, opts), {}, { | ||
sync: true | ||
@@ -1658,5 +1748,5 @@ })); | ||
/** | ||
* @param {Any} obj | ||
* @param {object} opts | ||
* @returns {Promise} Resolves to `*` | ||
* @param {any} obj | ||
* @param {TypesonOptions} opts | ||
* @returns {Promise<any>} | ||
*/ | ||
@@ -1667,5 +1757,5 @@ | ||
value: function reviveAsync(obj, opts) { | ||
return this.revive(obj, _objectSpread2({ | ||
return this.revive(obj, _objectSpread2(_objectSpread2({ | ||
throwOnBadSyncType: true | ||
}, opts, { | ||
}, opts), {}, { | ||
sync: false | ||
@@ -1675,8 +1765,12 @@ })); | ||
/** | ||
* @typedef {Tester|Replacer|Reviver} Spec | ||
*/ | ||
/** | ||
* Register types. | ||
* For examples on how to use this method, see | ||
* {@link https://github.com/dfahlander/typeson-registry/tree/master/types}. | ||
* @param {object.<string,Function[]>[]} typeSpecSets - Types and | ||
* their functions [test, encapsulate, revive]; | ||
* @param {object} opts | ||
* @param {object<string,Spec[]>[]} typeSpecSets - | ||
* Types and their functions [test, encapsulate, revive]; | ||
* @param {TypesonOptions} opts | ||
* @returns {Typeson} | ||
@@ -1764,3 +1858,3 @@ */ | ||
var start = typeof opts.fallback === 'number' ? opts.fallback : opts.fallback ? 0 : Infinity; | ||
var start = typeof opts.fallback === 'number' ? opts.fallback : opts.fallback ? 0 : Number.POSITIVE_INFINITY; | ||
@@ -1767,0 +1861,0 @@ if (spec.testPlainObjects) { |
@@ -1,1 +0,1 @@ | ||
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e=e||self).Typeson=t()}(this,(function(){"use strict";function _typeof(e){return(_typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function asyncGeneratorStep(e,t,n,r,o,i,a){try{var c=e[i](a),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 i=e.apply(t,n);function _next(e){asyncGeneratorStep(i,r,o,_next,_throw,"next",e)}function _throw(e){asyncGeneratorStep(i,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,i=void 0;try{for(var a,c=e[Symbol.iterator]();!(r=(a=c.next()).done)&&(n.push(a.value),!t||n.length!==t);r=!0);}catch(e){o=!0,i=e}finally{try{r||null==c.return||c.return()}finally{if(o)throw i}}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 i=r(e);if(!i)return null===t;var a=n.call(i,"constructor")&&i.constructor;return"function"!=typeof a?null===t:t===a||(null!==t&&o.call(a)===o.call(t)||"function"==typeof t&&"string"==typeof a.__typeson__type__&&a.__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 i=Object.keys,a=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 a(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,{parse:!0}),this.revive(JSON.parse(e,t),n)}},{key:"parseSync",value:function parseSync(e,t,n){return this.parse(e,t,_objectSpread2({throwOnBadSyncType:!0},n,{sync:!0}))}},{key:"parseAsync",value:function parseAsync(e,t,n){return this.parse(e,t,_objectSpread2({throwOnBadSyncType:!0},n,{sync:!1}))}},{key:"specialTypeNames",value:function specialTypeNames(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return n.returnTypeNames=!0,this.encapsulate(e,t,n)}},{key:"rootTypeName",value:function rootTypeName(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return n.iterateNone=!0,this.encapsulate(e,t,n)}},{key:"encapsulate",value:function encapsulate(t,n,r){var o=(r=_objectSpread2({sync:!0},this.options,{},r)).sync,u=this,p={},y=[],l=[],f=[],h=!("cyclic"in r)||r.cyclic,v=r.encapsulateObserver,d=_encapsulate("",t,h,n||{},f);function finish(e){var t=Object.values(p);if(r.iterateNone)return t.length?t[0]:Typeson.getJSONType(e);if(t.length){if(r.returnTypeNames)return _toConsumableArray(new Set(t));e&&isPlainObject(e)&&!c.call(e,"$types")?e.$types=p:e={$:e,$types:{$:p}}}else isObject(e)&&c.call(e,"$types")&&(e={$:e,$types:!0});return!r.returnTypeNames&&e}function checkPromises(e,t){return _checkPromises.apply(this,arguments)}function _checkPromises(){return(_checkPromises=_asyncToGenerator(regeneratorRuntime.mark((function _callee2(t,n){var r;return regeneratorRuntime.wrap((function _callee2$(o){for(;;)switch(o.prev=o.next){case 0:return o.next=2,Promise.all(n.map((function(e){return e[1].p})));case 2:return r=o.sent,o.next=5,Promise.all(r.map(function(){var r=_asyncToGenerator(regeneratorRuntime.mark((function _callee(r){var o,i,a,c,s,u,p,y,l,f,h,v,d,b;return regeneratorRuntime.wrap((function _callee$(O){for(;;)switch(O.prev=O.next){case 0:if(o=[],i=n.splice(0,1),a=_slicedToArray(i,1),c=a[0],s=_slicedToArray(c,7),u=s[0],p=s[2],y=s[3],l=s[4],f=s[5],h=s[6],v=_encapsulate(u,r,p,y,o,!0,h),d=hasConstructorOf(v,e),!u||!d){O.next=11;break}return O.next=8,v.p;case 8:return b=O.sent,l[f]=b,O.abrupt("return",checkPromises(t,o));case 11:return u?l[f]=v:t=d?v.p:v,O.abrupt("return",checkPromises(t,o));case 13:case"end":return O.stop()}}),_callee)})));return function(e){return r.apply(this,arguments)}}()));case 5:return o.abrupt("return",t);case 6:case"end":return o.stop()}}),_callee2)})))).apply(this,arguments)}function _adaptBuiltinStateObjectProperties(e,t,n){Object.assign(e,t);var r=s.map((function(t){var n=e[t];return delete e[t],n}));n(),s.forEach((function(t,n){e[t]=r[n]}))}function _encapsulate(t,n,o,s,f,h,d){var b,O={},_=_typeof(n),m=v?function(r){var i=d||s.type||Typeson.getJSONType(n);v(Object.assign(r||O,{keypath:t,value:n,cyclic:o,stateObj:s,promisesData:f,resolvingTypesonPromise:h,awaitingTypesonPromise:hasConstructorOf(n,e)},{type:i}))}:null;if(["string","boolean","number","undefined"].includes(_))return void 0===n||"number"===_&&(isNaN(n)||n===-1/0||n===1/0)?(b=s.replaced?n:replace(t,n,s,f,!1,h,m))!==n&&(O={replaced:b}):b=n,m&&m(),b;if(null===n)return m&&m(),n;if(o&&!s.iterateIn&&!s.iterateUnsetNumeric&&n&&"object"===_typeof(n)){var g=y.indexOf(n);if(!(g<0))return p[t]="#",m&&m({cyclicKeypath:l[g]}),"#"+l[g];!0===o&&(y.push(n),l.push(t))}var j,P=isPlainObject(n),S=a(n),T=(P||S)&&(!u.plainObjectReplacers.length||s.replaced)||s.iterateIn?n:replace(t,n,s,f,P||S,null,m);if(T!==n?(b=T,O={replaced:T}):""===t&&hasConstructorOf(n,e)?(f.push([t,n,o,s,void 0,void 0,s.type]),b=n):S&&"object"!==s.iterateIn||"array"===s.iterateIn?(j=new Array(n.length),O={clone:j}):(["function","symbol"].includes(_typeof(n))||"toJSON"in n||hasConstructorOf(n,e)||hasConstructorOf(n,Promise)||hasConstructorOf(n,ArrayBuffer))&&!P&&"object"!==s.iterateIn?b=n:(j={},s.addLength&&(j.length=n.length),O={clone:j}),m&&m(),r.iterateNone)return j||b;if(!j)return b;if(s.iterateIn){var w=function _loop(r){var i={ownKeys:c.call(n,r)};_adaptBuiltinStateObjectProperties(s,i,(function(){var i=t+(t?".":"")+escapeKeyPathComponent(r),a=_encapsulate(i,n[r],Boolean(o),s,f,h);hasConstructorOf(a,e)?f.push([i,a,Boolean(o),s,j,r,s.type]):void 0!==a&&(j[r]=a)}))};for(var A in n)w(A);m&&m({endIterateIn:!0,end:!0})}else i(n).forEach((function(r){var i=t+(t?".":"")+escapeKeyPathComponent(r);_adaptBuiltinStateObjectProperties(s,{ownKeys:!0},(function(){var t=_encapsulate(i,n[r],Boolean(o),s,f,h);hasConstructorOf(t,e)?f.push([i,t,Boolean(o),s,j,r,s.type]):void 0!==t&&(j[r]=t)}))})),m&&m({endIterateOwn:!0,end:!0});if(s.iterateUnsetNumeric){for(var k=n.length,C=function _loop2(r){if(!(r in n)){var i=t+(t?".":"")+r;_adaptBuiltinStateObjectProperties(s,{ownKeys:!1},(function(){var t=_encapsulate(i,void 0,Boolean(o),s,f,h);hasConstructorOf(t,e)?f.push([i,t,Boolean(o),s,j,r,s.type]):void 0!==t&&(j[r]=t)}))}},K=0;K<k;K++)C(K);m&&m({endIterateUnsetNumeric:!0,end:!0})}return j}function replace(e,t,n,r,i,a,c){for(var s=i?u.plainObjectReplacers:u.nonplainObjectReplacers,y=s.length;y--;){var l=s[y];if(l.test(t,n)){var f=l.type;if(u.revivers[f]){var v=p[e];p[e]=v?[f].concat(v):f}return Object.assign(n,{type:f,replaced:!0}),!o&&l.replaceAsync||l.replace?(c&&c({replacing:!0}),_encapsulate(e,l[o||!l.replaceAsync?"replace":"replaceAsync"](t,n),h&&"readonly",n,r,a,f)):(c&&c({typeDetected:!0}),_encapsulate(e,t,h&&"readonly",n,r,a,f))}}return t}return f.length?o&&r.throwOnBadSyncType?function(){throw new TypeError("Sync method requested but async result obtained")}():Promise.resolve(checkPromises(d,f)).then(finish):!o&&r.throwOnBadSyncType?function(){throw new TypeError("Async method requested but sync result obtained")}():r.stringification&&o?[finish(d)]:o?finish(d):Promise.resolve(finish(d))}},{key:"encapsulateSync",value:function encapsulateSync(e,t,n){return this.encapsulate(e,t,_objectSpread2({throwOnBadSyncType:!0},n,{sync:!0}))}},{key:"encapsulateAsync",value:function encapsulateAsync(e,t,n){return this.encapsulate(e,t,_objectSpread2({throwOnBadSyncType:!0},n,{sync:!1}))}},{key:"revive",value:function revive(t,n){var r=t&&t.$types;if(!r)return t;if(!0===r)return t.$;var o=(n=_objectSpread2({sync:!0},this.options,{},n)).sync,c=[],s={},u=!0;r.$&&isPlainObject(r.$)&&(t=t.$,r=r.$,u=!1);var y=this;function executeReviver(e,t){var n=_slicedToArray(y.revivers[e]||[],1)[0];if(!n)throw new Error("Unregistered type: "+e);return!o||"revive"in n?n[o&&n.revive?"revive":!o&&n.reviveAsync?"reviveAsync":"revive"](t,s):t}var l=[];function checkUndefined(e){return hasConstructorOf(e,p)?void 0:e}var f,h=function revivePlainObjects(){var n=[];if(Object.entries(r).forEach((function(e){var t=_slicedToArray(e,2),o=t[0],i=t[1];"#"!==i&&[].concat(i).forEach((function(e){_slicedToArray(y.revivers[e]||[null,{}],2)[1].plain&&(n.push({keypath:o,type:e}),delete r[o])}))})),n.length)return n.sort(nestedPathsFirst).reduce((function reducer(n,r){var o=r.keypath,i=r.type;if(isThenable(n))return n.then((function(e){return reducer(e,{keypath:o,type:i})}));var a=getByKeyPath(t,o);if(hasConstructorOf(a=executeReviver(i,a),e))return a.then((function(e){var n=setAtKeyPath(t,o,e);n===e&&(t=n)}));var c=setAtKeyPath(t,o,a);c===a&&(t=c)}),void 0)}();return hasConstructorOf(h,e)?f=h.then((function(){return t})):(f=function _revive(t,n,o,s,y){if(!u||"$types"!==t){var f=r[t],h=a(n);if(h||isPlainObject(n)){var v=h?new Array(n.length):{};for(i(n).forEach((function(r){var i=_revive(t+(t?".":"")+escapeKeyPathComponent(r),n[r],o||v,v,r),a=function set(e){return hasConstructorOf(e,p)?v[r]=void 0:void 0!==e&&(v[r]=e),e};hasConstructorOf(i,e)?l.push(i.then((function(e){return a(e)}))):a(i)})),n=v;c.length;){var d=_slicedToArray(c[0],4),b=d[0],O=d[1],_=d[2],m=d[3],g=getByKeyPath(b,O);if(void 0===g)break;_[m]=g,c.splice(0,1)}}if(!f)return n;if("#"===f){var j=getByKeyPath(o,n.slice(1));return void 0===j&&c.push([o,n.slice(1),s,y]),j}return[].concat(f).reduce((function reducer(t,n){return hasConstructorOf(t,e)?t.then((function(e){return reducer(e,n)})):executeReviver(n,t)}),n)}}("",t,null),l.length&&(f=e.resolve(f).then((function(t){return e.all([t].concat(l))})).then((function(e){return _slicedToArray(e,1)[0]})))),isThenable(f)?o&&n.throwOnBadSyncType?function(){throw new TypeError("Sync method requested but async result obtained")}():hasConstructorOf(f,e)?f.p.then(checkUndefined):f:!o&&n.throwOnBadSyncType?function(){throw new TypeError("Async method requested but sync result obtained")}():o?checkUndefined(f):Promise.resolve(checkUndefined(f))}},{key:"reviveSync",value:function reviveSync(e,t){return this.revive(e,_objectSpread2({throwOnBadSyncType:!0},t,{sync:!0}))}},{key:"reviveAsync",value:function reviveAsync(e,t){return this.revive(e,_objectSpread2({throwOnBadSyncType:!0},t,{sync:!1}))}},{key:"register",value:function register(e,t){return t=t||{},[].concat(e).forEach((function R(e){var n=this;if(a(e))return e.map((function(e){return R.call(n,e)}));e&&i(e).forEach((function(n){if("#"===n)throw new TypeError("# cannot be used as a type name as it is reserved for cyclic objects");if(Typeson.JSON_TYPES.includes(n))throw new TypeError("Plain JSON object types are reserved as type names");var r=e[n],o=r&&r.testPlainObjects?this.plainObjectReplacers:this.nonplainObjectReplacers,i=o.filter((function(e){return e.type===n}));if(i.length&&(o.splice(o.indexOf(i[0]),1),delete this.revivers[n],delete this.types[n]),"function"==typeof r){var c=r;r={test:function test(e){return e&&e.constructor===c},replace:function replace(e){return _objectSpread2({},e)},revive:function revive(e){return Object.assign(Object.create(c.prototype),e)}}}else if(a(r)){var s=_slicedToArray(r,3);r={test:s[0],replace:s[1],revive:s[2]}}if(r&&r.test){var u={type:n,test:r.test.bind(r)};r.replace&&(u.replace=r.replace.bind(r)),r.replaceAsync&&(u.replaceAsync=r.replaceAsync.bind(r));var p="number"==typeof t.fallback?t.fallback:t.fallback?0:1/0;if(r.testPlainObjects?this.plainObjectReplacers.splice(p,0,u):this.nonplainObjectReplacers.splice(p,0,u),r.revive||r.reviveAsync){var y={};r.revive&&(y.revive=r.revive.bind(r)),r.reviveAsync&&(y.reviveAsync=r.reviveAsync.bind(r)),this.revivers[n]=[y,{plain:r.testPlainObjects}]}this.types[n]=r}}),this)}),this),this}}]),Typeson}(),p=function Undefined(){_classCallCheck(this,Undefined)};return p.__typeson__type__="TypesonUndefined",u.Undefined=p,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=r(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(e)},u.JSON_TYPES=["null","boolean","number","string","array","object"],u})); | ||
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).Typeson=t()}(this,(function(){"use strict";function _typeof(e){return(_typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof 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 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("undefined"==typeof Symbol||!(Symbol.iterator in Object(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)||_unsupportedIterableToArray(e,t)||function _nonIterableRest(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}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)||_unsupportedIterableToArray(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 _unsupportedIterableToArray(e,t){if(e){if("string"==typeof e)return _arrayLikeToArray(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?_arrayLikeToArray(e,t):void 0}}function _arrayLikeToArray(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}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)}function _await(e,t,n){return n?t?t(e):e:(e&&e.then||(e=Promise.resolve(e)),t?e.then(t):e)}var a=Object.keys,i=Array.isArray,c={}.hasOwnProperty,s=["type","replaced","iterateIn","iterateUnsetNumeric"];function _async(e){return function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];try{return Promise.resolve(e.apply(this,t))}catch(e){return Promise.reject(e)}}}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(_objectSpread2(_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(_objectSpread2({throwOnBadSyncType:!0},r),{},{sync:!0}))}},{key:"stringifyAsync",value:function stringifyAsync(e,t,n,r){return this.stringify(e,t,n,_objectSpread2(_objectSpread2({throwOnBadSyncType:!0},r),{},{sync:!1}))}},{key:"parse",value:function parse(e,t,n){return n=_objectSpread2(_objectSpread2(_objectSpread2({},this.options),n),{},{parse:!0}),this.revive(JSON.parse(e,t),n)}},{key:"parseSync",value:function parseSync(e,t,n){return this.parse(e,t,_objectSpread2(_objectSpread2({throwOnBadSyncType:!0},n),{},{sync:!0}))}},{key:"parseAsync",value:function parseAsync(e,t,n){return this.parse(e,t,_objectSpread2(_objectSpread2({throwOnBadSyncType:!0},n),{},{sync:!1}))}},{key:"specialTypeNames",value:function specialTypeNames(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return n.returnTypeNames=!0,this.encapsulate(e,t,n)}},{key:"rootTypeName",value:function rootTypeName(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return n.iterateNone=!0,this.encapsulate(e,t,n)}},{key:"encapsulate",value:function encapsulate(t,n,r){var o=_async((function(t,n){return _await(Promise.all(n.map((function(e){return e[1].p}))),(function(r){return _await(Promise.all(r.map(_async((function(r){var a=!1,i=[],c=_slicedToArray(n.splice(0,1),1),s=_slicedToArray(c[0],7),u=s[0],p=s[2],y=s[3],l=s[4],f=s[5],h=s[6],v=_encapsulate(u,r,p,y,i,!0,h),d=hasConstructorOf(v,e);return function _invoke(e,t){var n=e();return n&&n.then?n.then(t):t(n)}((function(){if(u&&d)return _await(v.p,(function(e){return l[f]=e,a=!0,o(t,i)}))}),(function(e){return a?e:(u?l[f]=v:t=d?v.p:v,o(t,i))}))})))),(function(){return t}))}))})),u=(r=_objectSpread2(_objectSpread2({sync:!0},this.options),r)).sync,p=this,y={},l=[],f=[],h=[],v=!("cyclic"in r)||r.cyclic,d=r.encapsulateObserver,b=_encapsulate("",t,v,n||{},h);function finish(e){var t=Object.values(y);if(r.iterateNone)return t.length?t[0]:Typeson.getJSONType(e);if(t.length){if(r.returnTypeNames)return _toConsumableArray(new Set(t));e&&isPlainObject(e)&&!c.call(e,"$types")?e.$types=y:e={$:e,$types:{$:y}}}else isObject(e)&&c.call(e,"$types")&&(e={$:e,$types:!0});return!r.returnTypeNames&&e}function _adaptBuiltinStateObjectProperties(e,t,n){Object.assign(e,t);var r=s.map((function(t){var n=e[t];return delete e[t],n}));n(),s.forEach((function(t,n){e[t]=r[n]}))}function _encapsulate(t,n,o,s,u,h,v){var b,_={},O=_typeof(n),j=d?function(r){var a=v||s.type||Typeson.getJSONType(n);d(Object.assign(r||_,{keypath:t,value:n,cyclic:o,stateObj:s,promisesData:u,resolvingTypesonPromise:h,awaitingTypesonPromise:hasConstructorOf(n,e)},{type:a}))}:null;if(["string","boolean","number","undefined"].includes(O))return void 0===n||Number.isNaN(n)||n===Number.NEGATIVE_INFINITY||n===Number.POSITIVE_INFINITY?(b=s.replaced?n:replace(t,n,s,u,!1,h,j))!==n&&(_={replaced:b}):b=n,j&&j(),b;if(null===n)return j&&j(),n;if(o&&!s.iterateIn&&!s.iterateUnsetNumeric&&n&&"object"===_typeof(n)){var m=l.indexOf(n);if(!(m<0))return y[t]="#",j&&j({cyclicKeypath:f[m]}),"#"+f[m];!0===o&&(l.push(n),f.push(t))}var S,g=isPlainObject(n),T=i(n),P=(g||T)&&(!p.plainObjectReplacers.length||s.replaced)||s.iterateIn?n:replace(t,n,s,u,g||T,null,j);if(P!==n?(b=P,_={replaced:P}):""===t&&hasConstructorOf(n,e)?(u.push([t,n,o,s,void 0,void 0,s.type]),b=n):T&&"object"!==s.iterateIn||"array"===s.iterateIn?(S=new Array(n.length),_={clone:S}):(["function","symbol"].includes(_typeof(n))||"toJSON"in n||hasConstructorOf(n,e)||hasConstructorOf(n,Promise)||hasConstructorOf(n,ArrayBuffer))&&!g&&"object"!==s.iterateIn?b=n:(S={},s.addLength&&(S.length=n.length),_={clone:S}),j&&j(),r.iterateNone)return S||b;if(!S)return b;if(s.iterateIn){var w=function _loop(r){var a={ownKeys:c.call(n,r)};_adaptBuiltinStateObjectProperties(s,a,(function(){var a=t+(t?".":"")+escapeKeyPathComponent(r),i=_encapsulate(a,n[r],Boolean(o),s,u,h);hasConstructorOf(i,e)?u.push([a,i,Boolean(o),s,S,r,s.type]):void 0!==i&&(S[r]=i)}))};for(var A in n)w(A);j&&j({endIterateIn:!0,end:!0})}else a(n).forEach((function(r){var a=t+(t?".":"")+escapeKeyPathComponent(r);_adaptBuiltinStateObjectProperties(s,{ownKeys:!0},(function(){var t=_encapsulate(a,n[r],Boolean(o),s,u,h);hasConstructorOf(t,e)?u.push([a,t,Boolean(o),s,S,r,s.type]):void 0!==t&&(S[r]=t)}))})),j&&j({endIterateOwn:!0,end:!0});if(s.iterateUnsetNumeric){for(var C=n.length,k=function _loop2(r){if(!(r in n)){var a=t+(t?".":"")+r;_adaptBuiltinStateObjectProperties(s,{ownKeys:!1},(function(){var t=_encapsulate(a,void 0,Boolean(o),s,u,h);hasConstructorOf(t,e)?u.push([a,t,Boolean(o),s,S,r,s.type]):void 0!==t&&(S[r]=t)}))}},N=0;N<C;N++)k(N);j&&j({endIterateUnsetNumeric:!0,end:!0})}return S}function replace(e,t,n,r,o,a,i){for(var c=o?p.plainObjectReplacers:p.nonplainObjectReplacers,s=c.length;s--;){var l=c[s];if(l.test(t,n)){var f=l.type;if(p.revivers[f]){var h=y[e];y[e]=h?[f].concat(h):f}return Object.assign(n,{type:f,replaced:!0}),!u&&l.replaceAsync||l.replace?(i&&i({replacing:!0}),_encapsulate(e,l[u||!l.replaceAsync?"replace":"replaceAsync"](t,n),v&&"readonly",n,r,a,f)):(i&&i({typeDetected:!0}),_encapsulate(e,t,v&&"readonly",n,r,a,f))}}return t}return h.length?u&&r.throwOnBadSyncType?function(){throw new TypeError("Sync method requested but async result obtained")}():Promise.resolve(o(b,h)).then(finish):!u&&r.throwOnBadSyncType?function(){throw new TypeError("Async method requested but sync result obtained")}():r.stringification&&u?[finish(b)]:u?finish(b):Promise.resolve(finish(b))}},{key:"encapsulateSync",value:function encapsulateSync(e,t,n){return this.encapsulate(e,t,_objectSpread2(_objectSpread2({throwOnBadSyncType:!0},n),{},{sync:!0}))}},{key:"encapsulateAsync",value:function encapsulateAsync(e,t,n){return this.encapsulate(e,t,_objectSpread2(_objectSpread2({throwOnBadSyncType:!0},n),{},{sync:!1}))}},{key:"revive",value:function revive(t,n){var r=t&&t.$types;if(!r)return t;if(!0===r)return t.$;var o=(n=_objectSpread2(_objectSpread2({sync:!0},this.options),n)).sync,c=[],s={},u=!0;r.$&&isPlainObject(r.$)&&(t=t.$,r=r.$,u=!1);var y=this;function executeReviver(e,t){var n=_slicedToArray(y.revivers[e]||[],1)[0];if(!n)throw new Error("Unregistered type: "+e);return o&&!("revive"in n)?t:n[o&&n.revive?"revive":!o&&n.reviveAsync?"reviveAsync":"revive"](t,s)}var l=[];function checkUndefined(e){return hasConstructorOf(e,p)?void 0:e}var f,h=function revivePlainObjects(){var n=[];if(Object.entries(r).forEach((function(e){var t=_slicedToArray(e,2),o=t[0],a=t[1];"#"!==a&&[].concat(a).forEach((function(e){_slicedToArray(y.revivers[e]||[null,{}],2)[1].plain&&(n.push({keypath:o,type:e}),delete r[o])}))})),n.length)return n.sort(nestedPathsFirst).reduce((function reducer(n,r){var o=r.keypath,a=r.type;if(isThenable(n))return n.then((function(e){return reducer(e,{keypath:o,type:a})}));var i=getByKeyPath(t,o);if(hasConstructorOf(i=executeReviver(a,i),e))return i.then((function(e){var n=setAtKeyPath(t,o,e);n===e&&(t=n)}));var c=setAtKeyPath(t,o,i);c===i&&(t=c)}),void 0)}();return hasConstructorOf(h,e)?f=h.then((function(){return t})):(f=function _revive(t,n,o,s,y){if(!u||"$types"!==t){var f=r[t],h=i(n);if(h||isPlainObject(n)){var v=h?new Array(n.length):{};for(a(n).forEach((function(r){var a=_revive(t+(t?".":"")+escapeKeyPathComponent(r),n[r],o||v,v,r),i=function set(e){return hasConstructorOf(e,p)?v[r]=void 0:void 0!==e&&(v[r]=e),e};hasConstructorOf(a,e)?l.push(a.then((function(e){return i(e)}))):i(a)})),n=v;c.length;){var d=_slicedToArray(c[0],4),b=d[0],_=d[1],O=d[2],j=d[3],m=getByKeyPath(b,_);if(void 0===m)break;O[j]=m,c.splice(0,1)}}if(!f)return n;if("#"===f){var S=getByKeyPath(o,n.slice(1));return void 0===S&&c.push([o,n.slice(1),s,y]),S}return[].concat(f).reduce((function reducer(t,n){return hasConstructorOf(t,e)?t.then((function(e){return reducer(e,n)})):executeReviver(n,t)}),n)}}("",t,null),l.length&&(f=e.resolve(f).then((function(t){return e.all([t].concat(l))})).then((function(e){return _slicedToArray(e,1)[0]})))),isThenable(f)?o&&n.throwOnBadSyncType?function(){throw new TypeError("Sync method requested but async result obtained")}():hasConstructorOf(f,e)?f.p.then(checkUndefined):f:!o&&n.throwOnBadSyncType?function(){throw new TypeError("Async method requested but sync result obtained")}():o?checkUndefined(f):Promise.resolve(checkUndefined(f))}},{key:"reviveSync",value:function reviveSync(e,t){return this.revive(e,_objectSpread2(_objectSpread2({throwOnBadSyncType:!0},t),{},{sync:!0}))}},{key:"reviveAsync",value:function reviveAsync(e,t){return this.revive(e,_objectSpread2(_objectSpread2({throwOnBadSyncType:!0},t),{},{sync:!1}))}},{key:"register",value:function register(e,t){return t=t||{},[].concat(e).forEach((function R(e){var n=this;if(i(e))return e.map((function(e){return R.call(n,e)}));e&&a(e).forEach((function(n){if("#"===n)throw new TypeError("# cannot be used as a type name as it is reserved for cyclic objects");if(Typeson.JSON_TYPES.includes(n))throw new TypeError("Plain JSON object types are reserved as type names");var r=e[n],o=r&&r.testPlainObjects?this.plainObjectReplacers:this.nonplainObjectReplacers,a=o.filter((function(e){return e.type===n}));if(a.length&&(o.splice(o.indexOf(a[0]),1),delete this.revivers[n],delete this.types[n]),"function"==typeof r){var c=r;r={test:function test(e){return e&&e.constructor===c},replace:function replace(e){return _objectSpread2({},e)},revive:function revive(e){return Object.assign(Object.create(c.prototype),e)}}}else if(i(r)){var s=_slicedToArray(r,3);r={test:s[0],replace:s[1],revive:s[2]}}if(r&&r.test){var u={type:n,test:r.test.bind(r)};r.replace&&(u.replace=r.replace.bind(r)),r.replaceAsync&&(u.replaceAsync=r.replaceAsync.bind(r));var p="number"==typeof t.fallback?t.fallback:t.fallback?0:Number.POSITIVE_INFINITY;if(r.testPlainObjects?this.plainObjectReplacers.splice(p,0,u):this.nonplainObjectReplacers.splice(p,0,u),r.revive||r.reviveAsync){var y={};r.revive&&(y.revive=r.revive.bind(r)),r.reviveAsync&&(y.reviveAsync=r.reviveAsync.bind(r)),this.revivers[n]=[y,{plain:r.testPlainObjects}]}this.types[n]=r}}),this)}),this),this}}]),Typeson}(),p=function Undefined(){_classCallCheck(this,Undefined)};return p.__typeson__type__="TypesonUndefined",u.Undefined=p,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=r(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(e)},u.JSON_TYPES=["null","boolean","number","string","array","object"],u})); |
{ | ||
"name": "typeson", | ||
"version": "5.18.2", | ||
"version": "6.0.0", | ||
"description": "Preserves types over JSON, BSON or socket.io", | ||
@@ -11,3 +11,3 @@ "main": "./dist/typeson-commonjs2.min.js", | ||
"eslint": "eslint --ext js,md,html .", | ||
"start": "static -p 8092", | ||
"start": "http-server -p 8092", | ||
"rollup": "rollup -c", | ||
@@ -17,6 +17,5 @@ "open-test": "open-cli http://localhost:8092/test/ && npm start", | ||
"open-coverage": "open-cli http://localhost:8092/coverage/ && npm start", | ||
"mocha": "mocha --require esm --require test/bootstrap/node test/test.js", | ||
"mocha": "mocha --require esm --require chai/register-assert --require chai/register-expect test/test.js", | ||
"mocha-cov": "rm -Rf node_modules/.cache/esm && nyc --reporter=html --reporter=text npm run mocha", | ||
"test-cov": "npm run rollup && npm run eslint && npm run mocha-cov", | ||
"test": "npm run rollup && npm run eslint && npm run mocha" | ||
"test": "npm run rollup && npm run eslint && npm run mocha-cov" | ||
}, | ||
@@ -54,47 +53,41 @@ "nyc": { | ||
}, | ||
"peerDependencies": { | ||
"core-js-bundle": "^3.6.4", | ||
"regenerator-runtime": "^0.13.3" | ||
}, | ||
"dependencies": {}, | ||
"devDependencies": { | ||
"@babel/core": "^7.8.3", | ||
"@babel/preset-env": "^7.8.3", | ||
"@mysticatea/eslint-plugin": "^13.0.0", | ||
"@rollup/plugin-replace": "^2.3.0", | ||
"base64-arraybuffer-es6": "^0.5.0", | ||
"chai": "^4.2.0", | ||
"core-js-bundle": "^3.6.4", | ||
"eslint": "^6.8.0", | ||
"eslint-config-ash-nazg": "16.5.0", | ||
"eslint-config-standard": "^14.1.0", | ||
"eslint-plugin-array-func": "^3.1.3", | ||
"eslint-plugin-chai-expect": "^2.1.0", | ||
"eslint-plugin-chai-friendly": "^0.5.0", | ||
"eslint-plugin-compat": "^3.3.0", | ||
"eslint-plugin-eslint-comments": "^3.1.2", | ||
"eslint-plugin-html": "^6.0.0", | ||
"eslint-plugin-import": "^2.20.0", | ||
"eslint-plugin-jsdoc": "^20.3.1", | ||
"eslint-plugin-markdown": "^1.0.1", | ||
"eslint-plugin-no-unsanitized": "^3.0.2", | ||
"eslint-plugin-no-use-extend-native": "^0.4.1", | ||
"eslint-plugin-node": "^11.0.0", | ||
"eslint-plugin-promise": "^4.2.1", | ||
"eslint-plugin-sonarjs": "^0.5.0", | ||
"eslint-plugin-standard": "^4.0.1", | ||
"eslint-plugin-unicorn": "^15.0.1", | ||
"@babel/core": "^7.13.8", | ||
"@babel/preset-env": "^7.13.8", | ||
"@brettz9/eslint-plugin": "^1.0.3", | ||
"@rollup/plugin-babel": "^5.3.0", | ||
"@rollup/plugin-replace": "^2.4.1", | ||
"babel-plugin-transform-async-to-promises": "^0.8.15", | ||
"base64-arraybuffer-es6": "^0.6.0", | ||
"chai": "^4.3.0", | ||
"eslint": "^7.20.0", | ||
"eslint-config-ash-nazg": "29.8.0", | ||
"eslint-config-standard": "^16.0.2", | ||
"eslint-plugin-array-func": "^3.1.7", | ||
"eslint-plugin-chai-expect": "^2.2.0", | ||
"eslint-plugin-chai-friendly": "^0.6.0", | ||
"eslint-plugin-compat": "^3.9.0", | ||
"eslint-plugin-eslint-comments": "^3.2.0", | ||
"eslint-plugin-html": "^6.1.1", | ||
"eslint-plugin-import": "^2.22.1", | ||
"eslint-plugin-jsdoc": "^32.2.0", | ||
"eslint-plugin-markdown": "^2.0.0", | ||
"eslint-plugin-no-unsanitized": "^3.1.4", | ||
"eslint-plugin-no-use-extend-native": "^0.5.0", | ||
"eslint-plugin-node": "^11.1.0", | ||
"eslint-plugin-promise": "^4.3.1", | ||
"eslint-plugin-radar": "^0.2.1", | ||
"eslint-plugin-standard": "^4.1.0", | ||
"eslint-plugin-unicorn": "^28.0.2", | ||
"esm": "^3.2.25", | ||
"mocha": "^7.0.0", | ||
"node-static": "0.7.11", | ||
"nyc": "^15.0.0", | ||
"open-cli": "^5.0.0", | ||
"regenerator-runtime": "^0.13.3", | ||
"rollup": "1.29.1", | ||
"rollup-plugin-babel": "^4.3.3", | ||
"http-server": "^0.12.3", | ||
"mocha": "^8.3.0", | ||
"nyc": "^15.1.0", | ||
"open-cli": "^6.0.1", | ||
"rollup": "2.40.0", | ||
"rollup-plugin-re": "^1.0.7", | ||
"rollup-plugin-terser": "^5.2.0", | ||
"typescript": "^3.7.5" | ||
"rollup-plugin-terser": "^7.0.2" | ||
}, | ||
"tonicExample": "var Typeson = require('typeson');\nvar TSON = new Typeson().register(require('typeson-registry/presets/builtin'));\n\nTSON.stringify({foo: new Date()}, null, 2);" | ||
} |
@@ -311,3 +311,3 @@ # typeson.js | ||
### Instace methods | ||
### Instance methods | ||
@@ -596,3 +596,3 @@ #### `stringify` (obj, [replacer], [space], [options]) | ||
// Do something more useful in real code | ||
if (new Date().getTime() % 2) { | ||
if (Date.now() % 2) { | ||
reject(new Error('Better luck next time')); | ||
@@ -599,0 +599,0 @@ return; |
246
typeson.js
@@ -54,2 +54,28 @@ /* eslint-disable no-shadow */ | ||
/** | ||
* @callback Tester | ||
* @param {any} value | ||
* @param {StateObject} stateobj | ||
* @returns {boolean} | ||
*/ | ||
/** | ||
* @callback Replacer | ||
* @param {any} value | ||
* @param {StateObject} stateObj | ||
* @returns {any} Should be JSON-stringifiable | ||
*/ | ||
/** | ||
* @callback Reviver | ||
* @param {JSON} value | ||
* @param {StateObject} stateObj | ||
* @returns {any} | ||
*/ | ||
/** | ||
* @typedef {PlainObject} TypesonOptions | ||
* @property {boolean} stringification Auto-set by `stringify` | ||
*/ | ||
/** | ||
* An instance of this class can be used to call `stringify()` and `parse()`. | ||
@@ -64,2 +90,5 @@ * Typeson resolves cyclic references by default. Can also be extended to | ||
class Typeson { | ||
/** | ||
* @param {TypesonOptions} options | ||
*/ | ||
constructor (options) { | ||
@@ -97,7 +126,7 @@ this.options = options; | ||
* The `replacer` argument has nothing to do with our replacers. | ||
* @param {Any} obj | ||
* @param {any} obj | ||
* @param {JSONReplacer|string[]} replacer | ||
* @param {number|string} space | ||
* @param {object} opts | ||
* @returns {string|Promise} Promise resolves to a string | ||
* @param {TypesonOptions} opts | ||
* @returns {string|Promise<string>} Promise resolves to a string | ||
*/ | ||
@@ -117,6 +146,6 @@ stringify (obj, replacer, space, opts) { | ||
* Also sync but throws on non-sync result. | ||
* @param {Any} obj | ||
* @param {any} obj | ||
* @param {JSONReplacer|string[]} replacer | ||
* @param {number|string} space | ||
* @param {object} opts | ||
* @param {TypesonOptions} opts | ||
* @returns {string} | ||
@@ -132,6 +161,6 @@ */ | ||
* | ||
* @param {Any} obj | ||
* @param {any} obj | ||
* @param {JSONReplacer|string[]} replacer | ||
* @param {number|string} space | ||
* @param {object} opts | ||
* @param {TypesonOptions} opts | ||
* @returns {Promise<string>} | ||
@@ -146,8 +175,15 @@ */ | ||
/** | ||
* @callback JSONReviver | ||
* @param {string} key | ||
* @param {JSON} value | ||
* @returns {JSON} | ||
*/ | ||
/** | ||
* Parse Typeson back into an obejct. | ||
* Initial arguments works identical to those of `JSON.parse()`. | ||
* @param {string} text | ||
* @param {function} reviver This JSON reviver has nothing to do with | ||
* @param {JSONReviver} reviver This JSON reviver has nothing to do with | ||
* our revivers. | ||
* @param {object} opts | ||
* @param {TypesonOptions} opts | ||
* @returns {external:JSON} | ||
@@ -163,5 +199,5 @@ */ | ||
* @param {string} text | ||
* @param {function} reviver This JSON reviver has nothing to do with | ||
* @param {JSONReviver} reviver This JSON reviver has nothing to do with | ||
* our revivers. | ||
* @param {object} opts | ||
* @param {TypesonOptions} opts | ||
* @returns {external:JSON} | ||
@@ -178,6 +214,6 @@ */ | ||
* @param {string} text | ||
* @param {function} reviver This JSON reviver has nothing to do with | ||
* @param {JSONReviver} reviver This JSON reviver has nothing to do with | ||
* our revivers. | ||
* @param {object} opts | ||
* @returns {Promise} Resolves to `external:JSON` | ||
* @param {TypesonOptions} opts | ||
* @returns {Promise<external:JSON>} Resolves to `external:JSON` | ||
*/ | ||
@@ -193,6 +229,10 @@ parseAsync (text, reviver, opts) { | ||
/** | ||
* @typedef {} StateObject | ||
*/ | ||
/** | ||
* | ||
* @param {Any} obj | ||
* @param {object} stateObj | ||
* @param {object} [opts={}] | ||
* @param {any} obj | ||
* @param {StateObject} stateObj | ||
* @param {TypesonOptions} [opts={}] | ||
* @returns {string[]|false} | ||
@@ -207,6 +247,6 @@ */ | ||
* | ||
* @param {Any} obj | ||
* @param {any} obj | ||
* @param {PlainObject} stateObj | ||
* @param {PlainObject} [opts={}] | ||
* @returns {Promise|GenericArray|PlainObject|string|false} | ||
* @returns {Promise<any>|GenericArray|PlainObject|string|false} | ||
*/ | ||
@@ -223,6 +263,6 @@ rootTypeName (obj, stateObj, opts = {}) { | ||
* This method is used internally by `Typeson.stringify()`. | ||
* @param {Any} obj - Object to encapsulate. | ||
* @param {any} obj - Object to encapsulate. | ||
* @param {PlainObject} stateObj | ||
* @param {PlainObject} opts | ||
* @returns {Promise|GenericArray|PlainObject|string|false} | ||
* @returns {Promise<any>|GenericArray|PlainObject|string|false} | ||
*/ | ||
@@ -250,3 +290,3 @@ encapsulate (obj, stateObj, opts) { | ||
* | ||
* @param {Any} ret | ||
* @param {any} ret | ||
* @returns {GenericArray|PlainObject|string|false} | ||
@@ -291,5 +331,5 @@ */ | ||
* | ||
* @param {Any} ret | ||
* @param {any} ret | ||
* @param {GenericArray} promisesData | ||
* @returns {Promise<Any>} | ||
* @returns {Promise<any>} | ||
*/ | ||
@@ -345,6 +385,16 @@ async function checkPromises (ret, promisesData) { | ||
/** | ||
* @typedef {PlainObject} OwnKeysObject | ||
* @property {boolean} ownKeys | ||
*/ | ||
/** | ||
* @callback BuiltinStateObjectPropertiesCallback | ||
* @returns {void} | ||
*/ | ||
/** | ||
* | ||
* @param {object} stateObj | ||
* @param {object} ownKeysObj | ||
* @param {function} cb | ||
* @param {StateObject} stateObj | ||
* @param {OwnKeysObject} ownKeysObj | ||
* @param {BuiltinStateObjectPropertiesCallback} cb | ||
* @returns {undefined} | ||
@@ -361,3 +411,3 @@ */ | ||
}); | ||
// eslint-disable-next-line callback-return | ||
// eslint-disable-next-line node/callback-return | ||
cb(); | ||
@@ -372,3 +422,3 @@ internalStateObjPropsToIgnore.forEach((prop, i) => { | ||
* @param {string} keypath | ||
* @param {Any} value | ||
* @param {any} value | ||
* @param {boolean} cyclic | ||
@@ -379,3 +429,3 @@ * @param {PlainObject} stateObj | ||
* @param {string} detectedType | ||
* @returns {Any} | ||
* @returns {any} | ||
*/ | ||
@@ -411,14 +461,15 @@ function _encapsulate ( | ||
)) { | ||
if (value === undefined || ($typeof === 'number' && | ||
(isNaN(value) || value === -Infinity || | ||
value === Infinity) | ||
)) { | ||
if (stateObj.replaced) { | ||
ret = value; | ||
} else { | ||
ret = replace( | ||
if (value === undefined || | ||
( | ||
Number.isNaN(value) || | ||
value === Number.NEGATIVE_INFINITY || | ||
value === Number.POSITIVE_INFINITY | ||
) | ||
) { | ||
ret = stateObj.replaced | ||
? value | ||
: replace( | ||
keypath, value, stateObj, promisesData, | ||
false, resolvingTypesonPromise, runObserver | ||
); | ||
} | ||
if (ret !== value) { | ||
@@ -500,2 +551,3 @@ observerData = {replaced: ret}; | ||
) { | ||
// eslint-disable-next-line unicorn/no-new-array -- Sparse | ||
clone = new Array(value.length); | ||
@@ -635,5 +687,39 @@ observerData = {clone}; | ||
/** | ||
* @typedef {PlainObject} KeyPathEvent | ||
* @property {string} cyclicKeypath | ||
*/ | ||
/** | ||
* @typedef {PlainObject} EndIterateInEvent | ||
* @property {boolean} endIterateIn | ||
* @property {boolean} end | ||
*/ | ||
/** | ||
* @typedef {PlainObject} EndIterateUnsetNumericEvent | ||
* @property {boolean} endIterateUnsetNumeric | ||
* @property {boolean} end | ||
*/ | ||
/** | ||
* @typedef {PlainObject} TypeDetectedEvent | ||
* @property {boolean} typeDetected | ||
*/ | ||
/** | ||
* @typedef {PlainObject} ReplacingEvent | ||
* @property {boolean} replacing | ||
*/ | ||
/** | ||
* @callback Observer | ||
* @param {KeyPathEvent|EndIterateInEvent|EndIterateUnsetNumericEvent| | ||
* TypeDetectedEvent|ReplacingEvent} [event] | ||
* @returns {void} | ||
*/ | ||
/** | ||
* | ||
* @param {string} keypath | ||
* @param {Any} value | ||
* @param {any} value | ||
* @param {PlainObject} stateObj | ||
@@ -643,4 +729,4 @@ * @param {GenericArray} promisesData | ||
* @param {boolean} resolvingTypesonPromise | ||
* @param {function} [runObserver] | ||
* @returns {*} | ||
* @param {Observer} [runObserver] | ||
* @returns {any} | ||
*/ | ||
@@ -735,6 +821,6 @@ function replace ( | ||
* Also sync but throws on non-sync result. | ||
* @param {*} obj | ||
* @param {object} stateObj | ||
* @param {object} opts | ||
* @returns {*} | ||
* @param {any} obj | ||
* @param {StateObject} stateObj | ||
* @param {TypesonOptions} opts | ||
* @returns {any} | ||
*/ | ||
@@ -748,6 +834,6 @@ encapsulateSync (obj, stateObj, opts) { | ||
/** | ||
* @param {*} obj | ||
* @param {object} stateObj | ||
* @param {object} opts | ||
* @returns {*} | ||
* @param {any} obj | ||
* @param {StateObject} stateObj | ||
* @param {TypesonOptions} opts | ||
* @returns {any} | ||
*/ | ||
@@ -763,8 +849,9 @@ encapsulateAsync (obj, stateObj, opts) { | ||
* This method is used internally by `Typeson.parse()`. | ||
* @param {object} obj - Object to revive. If it has `$types` member, the | ||
* properties that are listed there will be replaced with its true type | ||
* instead of just plain objects. | ||
* @param {object} opts | ||
* @param {PlainObject} obj - Object to revive. If it has `$types` member, | ||
* the properties that are listed there will be replaced with its true | ||
* type instead of just plain objects. | ||
* @param {TypesonOptions} opts | ||
* @throws TypeError If mismatch between sync/async type and result | ||
* @returns {Promise|*} If async, returns a Promise that resolves to `*` | ||
* @returns {Promise<any>|any} If async, returns a Promise that resolves | ||
* to `any`. | ||
*/ | ||
@@ -804,5 +891,5 @@ revive (obj, opts) { | ||
* @callback RevivalReducer | ||
* @param {Any} value | ||
* @param {any} value | ||
* @param {string} type | ||
* @returns {Any} | ||
* @returns {any} | ||
*/ | ||
@@ -813,4 +900,5 @@ | ||
* @param {string} type | ||
* @param {Any} val | ||
* @returns {[type]} [description] | ||
* @param {any} val | ||
* @throws {Error} | ||
* @returns {any} | ||
*/ | ||
@@ -925,7 +1013,7 @@ function executeReviver (type, val) { | ||
* @param {string} keypath | ||
* @param {Any} value | ||
* @param {?(Array|object)} target | ||
* @param {Array|object} [clone] | ||
* @param {any} value | ||
* @param {?(GenericArray|PlainObject)} target | ||
* @param {GenericArray|PlainObject} [clone] | ||
* @param {string} [key] | ||
* @returns {Any} | ||
* @returns {any} | ||
*/ | ||
@@ -939,2 +1027,3 @@ function _revive (keypath, value, target, clone, key) { | ||
if (isArr || isPlainObject(value)) { | ||
// eslint-disable-next-line unicorn/no-new-array -- Sparse | ||
const clone = isArr ? new Array(value.length) : {}; | ||
@@ -945,3 +1034,4 @@ // Iterate object or array | ||
keypath + (keypath ? '.' : '') + | ||
escapeKeyPathComponent(k), value[k], | ||
escapeKeyPathComponent(k), | ||
value[k], | ||
target || clone, | ||
@@ -1010,4 +1100,4 @@ clone, | ||
* | ||
* @param {Any} retrn | ||
* @returns {undefined|Any} | ||
* @param {any} retrn | ||
* @returns {undefined|any} | ||
*/ | ||
@@ -1063,5 +1153,5 @@ function checkUndefined (retrn) { | ||
* Also sync but throws on non-sync result. | ||
* @param {Any} obj | ||
* @param {object} opts | ||
* @returns {Any} | ||
* @param {any} obj | ||
* @param {TypesonOptions} opts | ||
* @returns {any} | ||
*/ | ||
@@ -1075,5 +1165,5 @@ reviveSync (obj, opts) { | ||
/** | ||
* @param {Any} obj | ||
* @param {object} opts | ||
* @returns {Promise} Resolves to `*` | ||
* @param {any} obj | ||
* @param {TypesonOptions} opts | ||
* @returns {Promise<any>} | ||
*/ | ||
@@ -1087,8 +1177,12 @@ reviveAsync (obj, opts) { | ||
/** | ||
* @typedef {Tester|Replacer|Reviver} Spec | ||
*/ | ||
/** | ||
* Register types. | ||
* For examples on how to use this method, see | ||
* {@link https://github.com/dfahlander/typeson-registry/tree/master/types}. | ||
* @param {object.<string,Function[]>[]} typeSpecSets - Types and | ||
* their functions [test, encapsulate, revive]; | ||
* @param {object} opts | ||
* @param {object<string,Spec[]>[]} typeSpecSets - | ||
* Types and their functions [test, encapsulate, revive]; | ||
* @param {TypesonOptions} opts | ||
* @returns {Typeson} | ||
@@ -1157,3 +1251,3 @@ */ | ||
? opts.fallback | ||
: (opts.fallback ? 0 : Infinity); | ||
: (opts.fallback ? 0 : Number.POSITIVE_INFINITY); | ||
if (spec.testPlainObjects) { | ||
@@ -1160,0 +1254,0 @@ this.plainObjectReplacers.splice(start, 0, replacerObj); |
@@ -8,3 +8,3 @@ const {toString: toStr} = {}, | ||
* Second argument not in use internally, but provided for utility. | ||
* @param {Any} v | ||
* @param {any} v | ||
* @param {boolean} catchCheck | ||
@@ -21,3 +21,3 @@ * @returns {boolean} | ||
* | ||
* @param {Any} val | ||
* @param {any} val | ||
* @returns {string} | ||
@@ -32,4 +32,4 @@ */ | ||
* being identical so any minimization is expected of both. | ||
* @param {Any} a | ||
* @param {function} b | ||
* @param {any} a | ||
* @param {GenericFunction} b | ||
* @returns {boolean} | ||
@@ -66,3 +66,3 @@ */ | ||
* | ||
* @param {Any} val | ||
* @param {any} val | ||
* @returns {boolean} | ||
@@ -85,3 +85,3 @@ */ | ||
* | ||
* @param {Any} val | ||
* @param {any} val | ||
* @returns {boolean} | ||
@@ -103,3 +103,3 @@ */ | ||
* | ||
* @param {Any} v | ||
* @param {any} v | ||
* @returns {boolean} | ||
@@ -132,3 +132,3 @@ */ | ||
* @param {string} keyPath | ||
* @returns {Any} | ||
* @returns {any} | ||
*/ | ||
@@ -155,4 +155,4 @@ function getByKeyPath (obj, keyPath) { | ||
* @param {string} keyPath | ||
* @param {Any} value | ||
* @returns {Any} | ||
* @param {any} value | ||
* @returns {any} | ||
*/ | ||
@@ -159,0 +159,0 @@ function setAtKeyPath (obj, keyPath, value) { |
/** | ||
* @callback TypesonFulfilled | ||
* @returns {Promise<any>|any} | ||
*/ | ||
/** | ||
* @callback TypesonRejected | ||
* @returns {Promise<any>|any} | ||
*/ | ||
/** | ||
* @callback TypesonResolve | ||
* @param {any} value | ||
* @returns {Promise<any>} | ||
*/ | ||
/** | ||
* @callback TypesonReject | ||
* @param {Error|any} error | ||
* @returns {Promise<any>} | ||
*/ | ||
/** | ||
* @callback TypesonResolveReject | ||
* @param {TypesonResolve} typesonResolve | ||
* @param {TypesonReject} typesonReject | ||
* @returns {Promise<any>} | ||
*/ | ||
/* eslint-disable block-spacing, space-before-function-paren, | ||
space-before-blocks, space-infix-ops, semi, promise/avoid-new, | ||
jsdoc/require-jsdoc */ | ||
/** | ||
* We keep this function minimized so if using two instances of this | ||
@@ -7,7 +39,9 @@ * library, where one is minimized and one is not, it will still work | ||
* extends Promise` and add a string tag for detection. | ||
* @param {function} f | ||
* @param {TypesonResolveReject} f | ||
*/ | ||
// eslint-disable-next-line max-len | ||
// eslint-disable-next-line block-spacing, space-before-function-paren, space-before-blocks, space-infix-ops, semi, promise/avoid-new | ||
class TypesonPromise{constructor(f){this.p=new Promise(f)}} | ||
/* eslint-enable block-spacing, space-before-function-paren, | ||
space-before-blocks, space-infix-ops, semi, promise/avoid-new, | ||
jsdoc/require-jsdoc */ | ||
// eslint-disable-next-line max-len | ||
@@ -27,4 +61,4 @@ // class TypesonPromise extends Promise {get[Symbol.toStringTag](){return 'TypesonPromise'};} // eslint-disable-line keyword-spacing, space-before-function-paren, space-before-blocks, block-spacing, semi | ||
* | ||
* @param {function} [onFulfilled] | ||
* @param {function} [onRejected] | ||
* @param {TypesonFulfilled} [onFulfilled] | ||
* @param {TypesonRejected} [onRejected] | ||
* @returns {TypesonPromise} | ||
@@ -46,3 +80,3 @@ */ | ||
* | ||
* @param {function} onRejected | ||
* @param {TypesonRejected} onRejected | ||
* @returns {TypesonPromise} | ||
@@ -55,3 +89,3 @@ */ | ||
* | ||
* @param {Any} v | ||
* @param {any} v | ||
* @returns {TypesonPromise} | ||
@@ -66,3 +100,3 @@ */ | ||
* | ||
* @param {Any} v | ||
* @param {any} v | ||
* @returns {TypesonPromise} | ||
@@ -78,3 +112,3 @@ */ | ||
* | ||
* @param {Promise[]} promArr | ||
* @param {Promise<any>[]} promArr | ||
* @returns {TypesonPromise} | ||
@@ -81,0 +115,0 @@ */ |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
264199
0
35
4763