@macfja/serializer
Version:
Transform any object, class, array, primitive to a serialized string and vice-versa
2 lines (1 loc) • 5.63 kB
JavaScript
!function(e,r){"object"==typeof exports&&"undefined"!=typeof module?r(exports):"function"==typeof define&&define.amd?define(["exports"],r):r((e="undefined"!=typeof globalThis?globalThis:e||self)["macfja-serializer"]={})}(this,(function(e){"use strict";var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,r){e.__proto__=r}||function(e,r){for(var t in r)Object.prototype.hasOwnProperty.call(r,t)&&(e[t]=r[t])},r(e,t)};var t=function(){return t=Object.assign||function(e){for(var r,t=1,n=arguments.length;t<n;t++)for(var o in r=arguments[t])Object.prototype.hasOwnProperty.call(r,o)&&(e[o]=r[o]);return e},t.apply(this,arguments)};function n(e,r,t){if(t||2===arguments.length)for(var n,o=0,i=r.length;o<i;o++)!n&&o in r||(n||(n=Array.prototype.slice.call(r,0,o)),n[o]=r[o]);return e.concat(n||Array.prototype.slice.call(r))}var o=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function n(){this.constructor=e}r(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}(t,e),t}(Error),i="#$@__constructor__",a="#$@__instance__",f="#$@__reference__",u={},c=new Set,s={};function l(e,r){if("string"==typeof e||"number"==typeof e&&!isNaN(e)&&Math.abs(e)!==1/0||null==e||"boolean"==typeof e)return e;var n=r.indexOf(e);if(-1!==n)return a+n;r.push(e);var o=r.length-1;if(e.constructor===Array){var u=e.map((function(e){return l(e,r)}));return u.unshift(f+o),u}if(e.constructor===Object){var y=Object.fromEntries(Object.entries(e).map((function(e){return[e[0],l(e[1],r)]})));return y[f]=o,y}c.add(e.constructor);var p={};p=Object.defineProperty(p,i,{value:e.constructor.name,enumerable:!0}),p=Object.defineProperty(p,f,{value:o,enumerable:!0});var d=function(e,r){if(!Object.keys(s).includes(e.constructor.name))return;return s[e.constructor.name].toPlain(e,(function(e){return l(e,r)}))}(e,r);return void 0!==d?t(t({},d),p):(Object.getOwnPropertyNames(e).forEach((function(t){Object.defineProperty(p,t,{value:l(e[t],r),enumerable:!0})})),p)}function y(e,r,t){var n;if("string"==typeof e&&0===e.indexOf(a))return t[p=parseInt(e.slice(a.length))];if("string"==typeof e||"number"==typeof e||null==e||"boolean"==typeof e)return e;if(e.constructor===Array){if(0===e.length)return[];var u=e.shift();if("string"!=typeof u||u.substring(0,f.length)!==f){if(0===Object.keys(t).length)return e.unshift(u),e;throw new o}var c=[];t[p=u.slice(f.length)]=c;for(var l=0;l<e.length;l++)c[l]=y(e[l],r,t);return c}if(e.constructor===Object){var p;if(null===(p=null!==(n=e[f])&&void 0!==n?n:null)){if(0===Object.keys(t).length)return e;throw new o}if(delete e[f],!Object.keys(e).includes(i)){c={};for(var d in t[p]=c,e)c[d]=y(e[d],r,t);return c}var b=e[i];delete e[i];var g=function(e,r,t,n){if(!Object.keys(s).includes(r))return;return s[r].fromPlain(e,(function(e){return y(e,t,n)}))}(e,b,r,t);if(void 0!==g)return g;if(!Object.keys(r).includes(b))throw new Error("The class "+b+" is not allowed");var v={};for(var d in t[p]=v,e)v[d]=y(e[d],r,t);return Object.setPrototypeOf(v,r[b].prototype),v}}function p(){c.clear()}function d(e){u[e.name]=e}function b(e,r,t){s[e]={toPlain:r,fromPlain:t}}!function(e,r){e("Date",(e=>({time:e.getTime()})),(function(e){let r=new Date;return r.setTime(e.time),r})),e("BigInt",(e=>({number:e.toString()})),(e=>BigInt(e.number))),e("String",(e=>({text:e.toString()})),(e=>new String(e.text))),e("RegExp",(e=>({source:e.source,flags:e.flags})),(e=>new RegExp(e.source,e.flags))),e("Number",(function(e){let r={nan:!1,infinity:!1,positive:!0,number:null};return Math.abs(e)===1/0?(r.infinity=!0,r.positive=Math.abs(e)===e,r):isNaN(e)?(r.nan=!0,r):(r.number=e.valueOf(),r)}),(function(e){return e.nan?NaN:e.infinity?1/0*(e.positive?1:-1):new Number(e.number)})),e("Map",((e,r)=>({data:Array.from(e.entries()).map((e=>r(e)))})),(function(e,r){const t=new Map;return e.data.map((e=>r(e))).forEach((([e,r])=>t.set(e,r))),t})),e("Set",((e,r)=>({data:Array.from(e.values()).map((e=>r(e)))})),(function(e,r){const t=new Set;return e.data.map((e=>r(e))).forEach((e=>t.add(e))),t})),e("ArrayBuffer",((e,r)=>({data:r(new Uint8Array(e))})),((e,r)=>r(e.data).buffer)),e("DataView",((e,r)=>({buffer:r(e.buffer),offset:e.byteOffset,length:e.byteLength})),((e,r)=>new DataView(r(e.buffer),e.offset,e.length))),["Error","EvalError","RangeError","AggregateError","ReferenceError","SyntaxError","TypeError","URIError","Int8Array","Uint8Array","Uint8ClampedArray","Int16Array","Uint16Array","Int32Array","Uint32Array","Float32Array","Float64Array","BigInt64Array","BigUint64Array"].forEach((e=>{const t="undefined"!=typeof globalThis&&globalThis||"undefined"!=typeof global&&global;t&&void 0!==t[e]&&r(t[e])}))}(b,d),e.addClassHandler=b,e.addGlobalAllowedClass=d,e.deserialize=function(e,r){if(void 0===r&&(r=void 0),"string"!=typeof e)return e;if(void 0===r&&(r={}),"undefined"!==e){r=Object.fromEntries(n(n([],Object.entries(r),!0),Object.entries(u),!0));try{return y(JSON.parse(e),r,{})}catch(r){return e}}},e.getCollectedClasses=function(e){void 0===e&&(e=!1);var r=Array.from(c);return e&&p(),r},e.resetCollectedClasses=p,e.serialize=function(e){return void 0===e?"undefined":JSON.stringify(l(e,[]))},e.setGlobalAllowedClasses=function(e,r){void 0===r&&(r=!1);var t={};e.constructor===Array&&(t=Object.fromEntries(e.map((function(e){return[e.name,e]})))),"object"==typeof e&&(t=e),u=r?Object.fromEntries(n(n([],Object.entries(u),!0),Object.entries(t),!0)):t},Object.defineProperty(e,"__esModule",{value:!0})}));