@tsed/json-mapper
Version:
Json mapper module for Ts.ED Framework
2 lines • 33.3 kB
JavaScript
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("@tsed/core"),require("@tsed/schema")):"function"==typeof define&&define.amd?define(["@tsed/core","@tsed/schema"],t):"object"==typeof exports?exports["@tsed/json-mapper"]=t(require("@tsed/core"),require("@tsed/schema")):e["@tsed/json-mapper"]=t(e["@tsed/core"],e["@tsed/schema"])}(self,((__WEBPACK_EXTERNAL_MODULE__414__,__WEBPACK_EXTERNAL_MODULE__538__)=>(()=>{"use strict";var __webpack_modules__={872:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{__webpack_require__.d(__webpack_exports__,{J:()=>JsonMapperCompiler});var _tsed_core__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__(414),_tsed_core__WEBPACK_IMPORTED_MODULE_0___default=__webpack_require__.n(_tsed_core__WEBPACK_IMPORTED_MODULE_0__);class JsonMapperCompiler{constructor(){this.cache=new Map,this.mappers={},this.schemes={},this.constructors={},this.globals={isCollection:_tsed_core__WEBPACK_IMPORTED_MODULE_0__.isCollection,isClass:_tsed_core__WEBPACK_IMPORTED_MODULE_0__.isClass,isObject:_tsed_core__WEBPACK_IMPORTED_MODULE_0__.isObject,classOf:_tsed_core__WEBPACK_IMPORTED_MODULE_0__.classOf,nameOf:_tsed_core__WEBPACK_IMPORTED_MODULE_0__.nameOf,hasJsonMethod:_tsed_core__WEBPACK_IMPORTED_MODULE_0__.hasJsonMethod,isMongooseObject:_tsed_core__WEBPACK_IMPORTED_MODULE_0__.isMongooseObject,isNil:_tsed_core__WEBPACK_IMPORTED_MODULE_0__.isNil,isDate:_tsed_core__WEBPACK_IMPORTED_MODULE_0__.isDate,objectKeys:_tsed_core__WEBPACK_IMPORTED_MODULE_0__.objectKeys,isMomentObject:_tsed_core__WEBPACK_IMPORTED_MODULE_0__.isMomentObject},this.addGlobal("alterIgnore",this.alterIgnore.bind(this)),this.addGlobal("alterValue",this.alterValue.bind(this)),this.addGlobal("execMapper",this.execMapper.bind(this)),this.addGlobal("compileAndMap",this.map.bind(this))}addTypeMapper(e,t){const r=(0,_tsed_core__WEBPACK_IMPORTED_MODULE_0__.nameOf)(e);return this.cache.set(e,(new Map).set("typeMapper",{id:r,fn:t})),this.mappers[r]=t,this}removeTypeMapper(e){const t=this.cache.get(e);if(t){const{id:r}=t.get("typeMapper");delete this.mappers[r],this.cache.delete(e)}}addGlobal(e,t){return this.globals[e]=t,this}eval(mapper,{id,groupsId,model}){this.addGlobal("cache",this.cache);const{globals,schemes}=this,injectGlobals=Object.keys(globals).map((e=>`const ${e} = globals.${e};`)).join("\n");eval(`${injectGlobals};\n\n cache.get(model).set(groupsId, { id: '${id}', fn: ${mapper} })`);const store=this.cache.get(model).get(groupsId);return this.mappers[id]=store.fn,store}createContext(e){const{cache:t}=this;return{...e,cache:t}}compile(e,t,r={}){const i=(0,_tsed_core__WEBPACK_IMPORTED_MODULE_0__.isString)(e)?e:this.getType(e),n=this.getGroupsId(t);let o=this.cache.get(i)||this.cache.get((0,_tsed_core__WEBPACK_IMPORTED_MODULE_0__.nameOf)(i));if(o||(o=new Map,this.cache.set(i,o)),o.has("typeMapper"))return o.get("typeMapper");if(!o.has(n)){const s=this.getId(i,n);o.set(n,{id:s});const a=r.mapper?r.mapper(s,t):this.createMapper(i,s,t);try{return this.eval(a,{id:s,model:i,groupsId:n})}catch(t){throw new Error(`Fail to compile mapper for ${(0,_tsed_core__WEBPACK_IMPORTED_MODULE_0__.nameOf)(e)}. See the error above: ${t.message}.\n${a}`)}}return o.get(n)}execMapper(e,t,r){return(0,_tsed_core__WEBPACK_IMPORTED_MODULE_0__.isObjectID)(t)?t.toString():this.mappers[e||(0,_tsed_core__WEBPACK_IMPORTED_MODULE_0__.nameOf)((0,_tsed_core__WEBPACK_IMPORTED_MODULE_0__.classOf)(t))](t,r)}getType(e){if(!e)return Object;if((0,_tsed_core__WEBPACK_IMPORTED_MODULE_0__.isClass)(e)&&!(0,_tsed_core__WEBPACK_IMPORTED_MODULE_0__.isCollection)(e)){const t=[Array,Map,Set].find((t=>(0,_tsed_core__WEBPACK_IMPORTED_MODULE_0__.ancestorsOf)(e).includes(t)));if(t)return t}return e}alterIgnore(e,t){let r=this.schemes[e]?.$hooks?.alter("ignore",!1,[t]);if(r)return r}alterGroups(e,t){return!1!==t&&e.$hooks.alter("groups",!1,[t])}getGroupsId(e){return!1===e?"default":0===e.length?"-":e.join(",")}getId(e,t){return`${(0,_tsed_core__WEBPACK_IMPORTED_MODULE_0__.isString)(e)?e:(0,_tsed_core__WEBPACK_IMPORTED_MODULE_0__.nameOf)(e)}:${(0,_tsed_core__WEBPACK_IMPORTED_MODULE_0__.getRandomId)()}:${t}`}getSchemaId(e,t){return`${e}:${t}`}}},414:e=>{e.exports=__WEBPACK_EXTERNAL_MODULE__414__},538:e=>{e.exports=__WEBPACK_EXTERNAL_MODULE__538__}},__webpack_module_cache__={};function __webpack_require__(e){var t=__webpack_module_cache__[e];if(void 0!==t)return t.exports;var r=__webpack_module_cache__[e]={exports:{}};return __webpack_modules__[e](r,r.exports,__webpack_require__),r.exports}__webpack_require__.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return __webpack_require__.d(t,{a:t}),t},__webpack_require__.d=(e,t)=>{for(var r in t)__webpack_require__.o(t,r)&&!__webpack_require__.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},__webpack_require__.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),__webpack_require__.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var __webpack_exports__={};__webpack_require__.r(__webpack_exports__),__webpack_require__.d(__webpack_exports__,{AfterDeserialize:()=>AfterDeserialize,BeforeDeserialize:()=>BeforeDeserialize,CastError:()=>CastError,DateMapper:()=>DateMapper,JsonDeserializer:()=>JsonDeserializer,JsonMapper:()=>JsonMapper,JsonMapperCompiler:()=>JsonMapperCompiler.J,JsonMapperSettings:()=>JsonMapperSettings,JsonSerializer:()=>JsonSerializer,OnDeserialize:()=>OnDeserialize,OnSerialize:()=>OnSerialize,PrimitiveMapper:()=>PrimitiveMapper,SymbolMapper:()=>SymbolMapper,Writer:()=>Writer,alterAfterDeserialize:()=>alterAfterDeserialize,alterBeforeDeserialize:()=>alterBeforeDeserialize,alterOnDeserialize:()=>alterOnDeserialize,alterOnSerialize:()=>alterOnSerialize,deserialize:()=>deserialize,getJsonMapperTypes:()=>getJsonMapperTypes,getObjectProperties:()=>getObjectProperties,registerJsonTypeMapper:()=>registerJsonTypeMapper,serialize:()=>serialize});var extendStatics=function(e,t){return extendStatics=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r])},extendStatics(e,t)};function __extends(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function r(){this.constructor=e}extendStatics(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}var __assign=function(){return __assign=Object.assign||function(e){for(var t,r=1,i=arguments.length;r<i;r++)for(var n in t=arguments[r])Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n]);return e},__assign.apply(this,arguments)};function __rest(e,t){var r={};for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&t.indexOf(i)<0&&(r[i]=e[i]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var n=0;for(i=Object.getOwnPropertySymbols(e);n<i.length;n++)t.indexOf(i[n])<0&&Object.prototype.propertyIsEnumerable.call(e,i[n])&&(r[i[n]]=e[i[n]])}return r}function __decorate(e,t,r,i){var n,o=arguments.length,s=o<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,r):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(e,t,r,i);else for(var a=e.length-1;a>=0;a--)(n=e[a])&&(s=(o<3?n(s):o>3?n(t,r,s):n(t,r))||s);return o>3&&s&&Object.defineProperty(t,r,s),s}function __param(e,t){return function(r,i){t(r,i,e)}}function __esDecorate(e,t,r,i,n,o){function s(e){if(void 0!==e&&"function"!=typeof e)throw new TypeError("Function expected");return e}for(var a,c=i.kind,p="getter"===c?"get":"setter"===c?"set":"value",l=!t&&e?i.static?e:e.prototype:null,_=t||(l?Object.getOwnPropertyDescriptor(l,i.name):{}),u=!1,d=r.length-1;d>=0;d--){var h={};for(var f in i)h[f]="access"===f?{}:i[f];for(var f in i.access)h.access[f]=i.access[f];h.addInitializer=function(e){if(u)throw new TypeError("Cannot add initializers after decoration has completed");o.push(s(e||null))};var m=(0,r[d])("accessor"===c?{get:_.get,set:_.set}:_[p],h);if("accessor"===c){if(void 0===m)continue;if(null===m||"object"!=typeof m)throw new TypeError("Object expected");(a=s(m.get))&&(_.get=a),(a=s(m.set))&&(_.set=a),(a=s(m.init))&&n.unshift(a)}else(a=s(m))&&("field"===c?n.unshift(a):_[p]=a)}l&&Object.defineProperty(l,i.name,_),u=!0}function __runInitializers(e,t,r){for(var i=arguments.length>2,n=0;n<t.length;n++)r=i?t[n].call(e,r):t[n].call(e);return i?r:void 0}function __propKey(e){return"symbol"==typeof e?e:"".concat(e)}function __setFunctionName(e,t,r){return"symbol"==typeof t&&(t=t.description?"[".concat(t.description,"]"):""),Object.defineProperty(e,"name",{configurable:!0,value:r?"".concat(r," ",t):t})}function __metadata(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)}function __awaiter(e,t,r,i){return new(r||(r=Promise))((function(n,o){function s(e){try{c(i.next(e))}catch(e){o(e)}}function a(e){try{c(i.throw(e))}catch(e){o(e)}}function c(e){var t;e.done?n(e.value):(t=e.value,t instanceof r?t:new r((function(e){e(t)}))).then(s,a)}c((i=i.apply(e,t||[])).next())}))}function __generator(e,t){var r,i,n,o={label:0,sent:function(){if(1&n[0])throw n[1];return n[1]},trys:[],ops:[]},s=Object.create(("function"==typeof Iterator?Iterator:Object).prototype);return s.next=a(0),s.throw=a(1),s.return=a(2),"function"==typeof Symbol&&(s[Symbol.iterator]=function(){return this}),s;function a(a){return function(c){return function(a){if(r)throw new TypeError("Generator is already executing.");for(;s&&(s=0,a[0]&&(o=0)),o;)try{if(r=1,i&&(n=2&a[0]?i.return:a[0]?i.throw||((n=i.return)&&n.call(i),0):i.next)&&!(n=n.call(i,a[1])).done)return n;switch(i=0,n&&(a=[2&a[0],n.value]),a[0]){case 0:case 1:n=a;break;case 4:return o.label++,{value:a[1],done:!1};case 5:o.label++,i=a[1],a=[0];continue;case 7:a=o.ops.pop(),o.trys.pop();continue;default:if(!((n=(n=o.trys).length>0&&n[n.length-1])||6!==a[0]&&2!==a[0])){o=0;continue}if(3===a[0]&&(!n||a[1]>n[0]&&a[1]<n[3])){o.label=a[1];break}if(6===a[0]&&o.label<n[1]){o.label=n[1],n=a;break}if(n&&o.label<n[2]){o.label=n[2],o.ops.push(a);break}n[2]&&o.ops.pop(),o.trys.pop();continue}a=t.call(e,o)}catch(e){a=[6,e],i=0}finally{r=n=0}if(5&a[0])throw a[1];return{value:a[0]?a[1]:void 0,done:!0}}([a,c])}}}var __createBinding=Object.create?function(e,t,r,i){void 0===i&&(i=r);var n=Object.getOwnPropertyDescriptor(t,r);n&&!("get"in n?!t.__esModule:n.writable||n.configurable)||(n={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,i,n)}:function(e,t,r,i){void 0===i&&(i=r),e[i]=t[r]};function __exportStar(e,t){for(var r in e)"default"===r||Object.prototype.hasOwnProperty.call(t,r)||__createBinding(t,e,r)}function __values(e){var t="function"==typeof Symbol&&Symbol.iterator,r=t&&e[t],i=0;if(r)return r.call(e);if(e&&"number"==typeof e.length)return{next:function(){return e&&i>=e.length&&(e=void 0),{value:e&&e[i++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function __read(e,t){var r="function"==typeof Symbol&&e[Symbol.iterator];if(!r)return e;var i,n,o=r.call(e),s=[];try{for(;(void 0===t||t-- >0)&&!(i=o.next()).done;)s.push(i.value)}catch(e){n={error:e}}finally{try{i&&!i.done&&(r=o.return)&&r.call(o)}finally{if(n)throw n.error}}return s}function __spread(){for(var e=[],t=0;t<arguments.length;t++)e=e.concat(__read(arguments[t]));return e}function __spreadArrays(){for(var e=0,t=0,r=arguments.length;t<r;t++)e+=arguments[t].length;var i=Array(e),n=0;for(t=0;t<r;t++)for(var o=arguments[t],s=0,a=o.length;s<a;s++,n++)i[n]=o[s];return i}function __spreadArray(e,t,r){if(r||2===arguments.length)for(var i,n=0,o=t.length;n<o;n++)!i&&n in t||(i||(i=Array.prototype.slice.call(t,0,n)),i[n]=t[n]);return e.concat(i||Array.prototype.slice.call(t))}function __await(e){return this instanceof __await?(this.v=e,this):new __await(e)}function __asyncGenerator(e,t,r){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var i,n=r.apply(e,t||[]),o=[];return i=Object.create(("function"==typeof AsyncIterator?AsyncIterator:Object).prototype),s("next"),s("throw"),s("return",(function(e){return function(t){return Promise.resolve(t).then(e,p)}})),i[Symbol.asyncIterator]=function(){return this},i;function s(e,t){n[e]&&(i[e]=function(t){return new Promise((function(r,i){o.push([e,t,r,i])>1||a(e,t)}))},t&&(i[e]=t(i[e])))}function a(e,t){try{(r=n[e](t)).value instanceof __await?Promise.resolve(r.value.v).then(c,p):l(o[0][2],r)}catch(e){l(o[0][3],e)}var r}function c(e){a("next",e)}function p(e){a("throw",e)}function l(e,t){e(t),o.shift(),o.length&&a(o[0][0],o[0][1])}}function __asyncDelegator(e){var t,r;return t={},i("next"),i("throw",(function(e){throw e})),i("return"),t[Symbol.iterator]=function(){return this},t;function i(i,n){t[i]=e[i]?function(t){return(r=!r)?{value:__await(e[i](t)),done:!1}:n?n(t):t}:n}}function __asyncValues(e){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var t,r=e[Symbol.asyncIterator];return r?r.call(e):(e="function"==typeof __values?__values(e):e[Symbol.iterator](),t={},i("next"),i("throw"),i("return"),t[Symbol.asyncIterator]=function(){return this},t);function i(r){t[r]=e[r]&&function(t){return new Promise((function(i,n){!function(e,t,r,i){Promise.resolve(i).then((function(t){e({value:t,done:r})}),t)}(i,n,(t=e[r](t)).done,t.value)}))}}}function __makeTemplateObject(e,t){return Object.defineProperty?Object.defineProperty(e,"raw",{value:t}):e.raw=t,e}var __setModuleDefault=Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t};function __importStar(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)"default"!==r&&Object.prototype.hasOwnProperty.call(e,r)&&__createBinding(t,e,r);return __setModuleDefault(t,e),t}function __importDefault(e){return e&&e.__esModule?e:{default:e}}function __classPrivateFieldGet(e,t,r,i){if("a"===r&&!i)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!i:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===r?i:"a"===r?i.call(e):i?i.value:t.get(e)}function __classPrivateFieldSet(e,t,r,i,n){if("m"===i)throw new TypeError("Private method is not writable");if("a"===i&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===i?n.call(e,r):n?n.value=r:t.set(e,r),r}function __classPrivateFieldIn(e,t){if(null===t||"object"!=typeof t&&"function"!=typeof t)throw new TypeError("Cannot use 'in' operator on non-object");return"function"==typeof e?t===e:e.has(t)}function __addDisposableResource(e,t,r){if(null!=t){if("object"!=typeof t&&"function"!=typeof t)throw new TypeError("Object expected.");var i,n;if(r){if(!Symbol.asyncDispose)throw new TypeError("Symbol.asyncDispose is not defined.");i=t[Symbol.asyncDispose]}if(void 0===i){if(!Symbol.dispose)throw new TypeError("Symbol.dispose is not defined.");i=t[Symbol.dispose],r&&(n=i)}if("function"!=typeof i)throw new TypeError("Object not disposable.");n&&(i=function(){try{n.call(this)}catch(e){return Promise.reject(e)}}),e.stack.push({value:t,dispose:i,async:r})}else r&&e.stack.push({async:!0});return t}var _SuppressedError="function"==typeof SuppressedError?SuppressedError:function(e,t,r){var i=new Error(r);return i.name="SuppressedError",i.error=e,i.suppressed=t,i};function __disposeResources(e){function t(t){e.error=e.hasError?new _SuppressedError(t,e.error,"An error was suppressed during disposal."):t,e.hasError=!0}var r,i=0;return function n(){for(;r=e.stack.pop();)try{if(!r.async&&1===i)return i=0,e.stack.push(r),Promise.resolve().then(n);if(r.dispose){var o=r.dispose.call(r.value);if(r.async)return i|=2,Promise.resolve(o).then(n,(function(e){return t(e),n()}))}else i|=1}catch(e){t(e)}if(1===i)return e.hasError?Promise.reject(e.error):Promise.resolve();if(e.hasError)throw e.error}()}const tslib_es6={__extends,__assign,__rest,__decorate,__param,__metadata,__awaiter,__generator,__createBinding,__exportStar,__values,__read,__spread,__spreadArrays,__spreadArray,__await,__asyncGenerator,__asyncDelegator,__asyncValues,__makeTemplateObject,__importStar,__importDefault,__classPrivateFieldGet,__classPrivateFieldSet,__classPrivateFieldIn,__addDisposableResource,__disposeResources};var core_=__webpack_require__(414);const JsonMapperTypesContainer=new Map;function registerJsonTypeMapper(e,t){JsonMapperTypesContainer.set(e,new t)}function getJsonMapperTypes(){return JsonMapperTypesContainer}function JsonMapper(...e){return t=>{e.forEach((e=>{registerJsonTypeMapper(e,t)}))}}let DateMapper=class{deserialize(e){return(0,core_.isBoolean)(e)||null==e?e:new Date(e)}serialize(e){return e?new Date(e).toISOString():e}};function isNullish(e){return[null,"null"].includes(e)}DateMapper=__decorate([JsonMapper(Date)],DateMapper);class CastError extends Error{constructor(e){super(`Cast error. ${e}`),this.name="CAST_ERROR"}}let PrimitiveMapper=class{deserialize(e,t){return this[(0,core_.nameOf)(t.type)]?this[(0,core_.nameOf)(t.type)](e,t):void 0}serialize(e,t){return this[(0,core_.nameOf)(t?.type)]&&"object"!=typeof e?this[(0,core_.nameOf)(t.type)](e,t):e}String(e){return null===e?null:""+e}Boolean(e){return!!["true","1",!0].includes(e)||!["false","0",!1].includes(e)&&(isNullish(e)?null:void 0!==e?!!e:void 0)}Number(e){if(isNullish(e))return null;if(void 0===e)return e;const t=+e;if(isNaN(t))throw new CastError("Expression value is not a number.");return t}BigInt(e){return isNullish(e)?null:BigInt(e)}};PrimitiveMapper=__decorate([JsonMapper(String,Number,Boolean,BigInt)],PrimitiveMapper);let SymbolMapper=class{deserialize(e){return Symbol.for(e)}serialize(e){return e.toString().replace("Symbol(","").replace(")","")}};SymbolMapper=__decorate([JsonMapper(Symbol)],SymbolMapper);var schema_=__webpack_require__(538);function AfterDeserialize(e){return(0,schema_.JsonEntityFn)((t=>{t.schema.$hooks.on("afterDeserialize",e)}))}function BeforeDeserialize(e){return(0,schema_.JsonEntityFn)((t=>{t.schema.$hooks.on("beforeDeserialize",e)}))}function OnDeserialize(e){return(0,schema_.JsonEntityFn)((t=>{t.schema.$hooks.on("onDeserialize",e)}))}function OnSerialize(e){return(0,schema_.JsonEntityFn)((t=>{t.schema.$hooks.on("onSerialize",e)}))}function alterAfterDeserialize(e,t,r){return t?.$hooks?.alter("afterDeserialize",e,[r])}function alterBeforeDeserialize(e,t,r){return t?.$hooks?.alter("beforeDeserialize",e,[r])}function alterOnDeserialize(e,t,r){return e.$hooks.alter("onDeserialize",t,[r])}var JsonMapperCompiler=__webpack_require__(872);const JsonMapperSettings={disableUnsecureConstructor:!0,additionalProperties:!1,strictGroups:!1};class Writer{static{this.object={assign:(...e)=>`{ ${e.filter(Boolean).join(", ")} }`}}constructor(e){this.body=[],this._root=e}static indent(e){return e.map((e=>`\t${e}`))}static mapper(e,t,r){return`execMapper('${e}', ${t}, ${r})`}static mapperFrom(e,t){return`execMapper(nameOf(classOf(${e})), ${e}, ${t})`}static options(...e){return(e=e.filter(Boolean)).length?Writer.object.assign("...options",...e):"options"}add(...e){return(e=e.filter((e=>void 0!==e))).length&&this.body.push(...e),this}arrow(...e){this.add(`(${e}) => {`);const t=this.new();return this.add("}"),t}build(){const e=this.body.flatMap((e=>e instanceof Writer?e.build():e));return this._indent?e.map((e=>"\t"+e)):e}callMapper(e,t,...r){return this.set(t,Writer.mapper(e,t,Writer.options(...r)))}returnCallMapper(e,t,...r){return this.return(Writer.mapper(e,t,Writer.options(...r)))}const(e,t){return this.add(`const ${e} = ${t};`),this}each(e,t=[]){const r=this.add(e+".forEach(("+t.join(", ")+") => {").new();return this.add("});"),r}if(e){const t=new IfWriter(e,this);return this.add(t),t}switch(e){const t=new SwitchWriter(e);return this.add(t),t}indent(e){return this._indent=e,this}new(e=!0){const t=new Writer(this.root());return t.indent(e),this.add(t),t}return(e){return this.add(`return ${e};`),this.root()}root(){return this._root||this}set(e,t){return this.add(`${e} = ${t};`),this}toString(){return this.build().join("\n")}}class IfWriter extends Writer{constructor(e,t){super(),this.condition=e,this._root=t}else(){const e=new Writer(this._root);return this.elseWriter=e,e}build(){return[`if (${this.condition}) {`,...Writer.indent(super.build()),"}",this.elseWriter?["else {",...Writer.indent(this.elseWriter.build()),"}"]:[]].flat()}}class SwitchWriter extends Writer{#e=new Map;constructor(e){super(),this.input=e}case(e){const t=new Writer;return this.#e.set(e,t),t}build(){return[`switch (${this.input}) {`,...Writer.indent(Array.from(this.#e.entries()).flatMap((([e,t])=>["default"===e?`${e}:`:`case ${e}:`,...Writer.indent(t.build())]))),"}"].flat()}}function isDeserializable(e,t){return!(t.collectionType&&(0,core_.isNil)(e)||void 0===e||(0,core_.isEmpty)(t.type)||t.type===Object&&!t.collectionType)}function varKey(e){return`__${e}`}function mapParamStoreOptions(e,t){return{...t,store:void 0,type:e.getBestType(),collectionType:e.collectionType,groups:e.parameter.groups,generics:e.nestedGenerics}}function getGenericIndex(e){return e.parent.schema.genericLabels.indexOf(e.itemSchema.genericType)}class JsonDeserializer extends JsonMapperCompiler.J{constructor(){super(),this.constructors={},this.addGlobal("newInstanceOf",this.newInstanceOf.bind(this)),this.addGlobal("alterBeforeDeserialize",this.alterBeforeDeserialize.bind(this)),this.addGlobal("alterAfterDeserialize",this.alterAfterDeserialize.bind(this)),this.addTypeMapper(Object,this.mapObject.bind(this)),this.addTypeMapper(Array,this.mapArray.bind(this)),this.addTypeMapper(Map,this.mapMap.bind(this)),this.addTypeMapper(Set,this.mapSet.bind(this)),this.addTypeMapper("ObjectId",(e=>String(e)))}map(e,t={}){if(!isDeserializable(e,t=this.mapOptions(t)))return e;!t.collectionType&&(0,core_.isArray)(e)&&(t.collectionType=Array);const r=t.type||(0,core_.classOf)(e),i=this.compile(r,t.groups);return t.collectionType?this.compile(t.collectionType,t.groups).fn(e,{...t,id:i.id}):i.fn(e,this.createContext(t))}compile(e,t){if([WeakMap,WeakSet].includes(e))throw new Error(`${(0,core_.nameOf)(e)} is not supported by JsonMapper.`);return super.compile(e,t)}eval(e,{id:t,groupsId:r,model:i}){return this.constructors[t]=i,super.eval(e,{id:t,groupsId:r,model:i})}newInstanceOf(e,t,r){try{return new this.constructors[e](r.disableUnsecureConstructor?{}:t)}catch(e){return t}}createMapper(e,t,r){const i=schema_.JsonEntityStore.from(e),n=new Set,o=[...(0,schema_.getPropertiesStores)(i).values()],s=(new Writer).arrow("input","options");return s.if("isNil(input)").return("input"),i.schema.hasDiscriminator&&s.add(this.mapDiscriminator(i,r)),i.schema.$hooks?.has("beforeDeserialize")&&(this.schemes[t]=i.schema,s.set("input",`alterBeforeDeserialize('${t}', input, options)`)),s.const("generics","options.generics[0]"),i.schema.genericLabels?.length?s.set("options","{...options, self: input, generics: [...options.generics].slice(1)}"):s.set("options","{...options, self: input}"),s.const("obj",`newInstanceOf('${t}', input, options)`),s.add(...o.flatMap((e=>{const i=e.propertyName;if(n.add(String(e.parent.schema.getAliasOf(i)||i)),!(e.schema?.$ignore&&(0,core_.isBoolean)(e.schema?.$ignore)||e.isGetterOnly()||e.schema?.$hooks?.has("groups")&&this.alterGroups(e.schema,r)))return this.mapProperty(e,t,r)}))),s.add(this.mapAdditionalProperties(i,n,r)),i.schema.$hooks?.has("afterDeserialize")?(this.schemes[t]=i.schema,s.return(`alterAfterDeserialize('${t}', obj, options)`).root().toString()):s.return("obj").root().toString()}alterValue(e,t,r){return alterOnDeserialize(this.schemes[e],t,r)}mapDiscriminator(e,t){const r=new Writer,i=e.schema.discriminator(),n=r.switch(`input['${i.propertyName}']`);return i.values.forEach(((e,r)=>{const i=this.compile(e,t);n.case(`'${r}'`).returnCallMapper(i.id,"input")})),r}mapProperty(e,t,r){const i=String(e.propertyKey),n=String(e.parent.schema.getAliasOf(i)||i),o=this.getSchemaId(t,i),s=e.itemSchema.get("format"),a=s&&`options: {format: '${s}'}`;let c=(new Writer).add(`// Map ${i} ${t} ${r||""}`);const p=i!==n?`options.useAlias ? '${n}' : '${i}'`:`'${i}'`;e.schema?.$hooks?.has("ignore")&&(this.schemes[o]=e.schema,c=c.if(`!alterIgnore('${o}', {...options, self: input})`));const l=e.schema?.$hooks?.has("onDeserialize");let _=`input[${p}]`;l&&(this.schemes[o]=e.schema,_=`alterValue('${o}', input[${p}], ${Writer.options(a)})`);const u=c.set(`let ${varKey(i)}`,_).if(`${varKey(i)} !== undefined`);return this.getPropertyFiller(e,t,r,a)(l?u.if(`${varKey(i)} === input.${i}`):u),u.set(`obj.${i}`,varKey(i)),r&&r.includes("partial")&&u.else().add(`delete obj.${i}`),c.root()}getPropertyFiller(e,t,r,i){const n=String(e.propertyKey),o=this.getSchemaId(t,n),s=e.itemSchema.nestedGenerics;if(e.itemSchema.isGeneric&&!s?.length){const t=getGenericIndex(e),r=Writer.options(i,`type: generics[${t}]`);return e=>e.set(varKey(n),`compileAndMap(${varKey(n)}, ${r})`)}const a=e.itemSchema.hasDiscriminator?e.itemSchema.discriminator().base:e.getBestType(),c=this.compile(a,r);return e.isCollection?t=>t.callMapper((0,core_.nameOf)(e.collectionType),varKey(n),`id: '${c.id}'`,i):s?.length?(this.schemes[o]=e.schema,e=>e.callMapper(c.id,varKey(n),i,`generics: schemes['${o}'].nestedGenerics`)):e=>e.callMapper(c.id,varKey(n),i)}mapOptions({groups:e,useAlias:t=!0,types:r,...i}){if(i.store instanceof schema_.JsonParameterStore)return this.mapOptions(mapParamStoreOptions(i.store,i));(r=r||getJsonMapperTypes()).forEach(((e,t)=>{if(![Array,Set,Map].includes(t)){const r=(0,core_.nameOf)(t);(0,core_.nameOf)(t)in e?this.addTypeMapper(t,e[r].bind(e)):this.addTypeMapper(t,((r,i)=>e.deserialize(r,{...i,type:t})))}}));const n=i.strictGroups??JsonMapperSettings.strictGroups;return{...i,additionalProperties:i.additionalProperties??JsonMapperSettings.additionalProperties,disableUnsecureConstructor:i.disableUnsecureConstructor??JsonMapperSettings.disableUnsecureConstructor,groups:void 0===e?!!n&&[]:e||!1,useAlias:t,customMappers:{},generics:i.generics||[]}}mapAdditionalProperties(e,t,r){const i=e.schema.get("additionalProperties"),n=[...t.values()].map((e=>`'${e}'`)).join(", "),o=new Writer;o.add("// add additional properties");let s=o.each("objectKeys(input)",["key"]);if(n.length&&(s=s.if(`![${n}].includes(key)`)),(0,core_.isClass)(i)){const e=this.compile(i.getComputedType(),r);return s.set("obj[key]",Writer.mapper(e.id,"input[key]","options")),o}return i?(s.set("obj[key]","input[key]"),o):(s.if("options.additionalProperties && obj[key] === undefined").set("obj[key]","input[key]"),o)}mapObject(e,t){return e}mapSet(e,t){if((0,core_.isNil)(e))return e;const r=new Set;return(0,core_.objectKeys)(e).forEach((i=>{r.add(this.mapItem(e[i],t))})),r}mapArray(e,t){return(0,core_.isNil)(e)?e:[].concat(e).map((e=>this.mapItem(e,t)))}mapMap(e,t){if((0,core_.isNil)(e))return e;const r=new Map;return(0,core_.objectKeys)(e).forEach((i=>{r.set(i,this.mapItem(e[i],t))})),r}mapItem(e,{id:t,...r}){return this.execMapper(t,e,r)}alterBeforeDeserialize(e,t,r){return alterBeforeDeserialize(t,this.schemes[e],r)}alterAfterDeserialize(e,t,r){return alterAfterDeserialize(t,this.schemes[e],r)}}function alterOnSerialize(e,t,r){return e.$hooks.alter("onSerialize",t,[r])}function getObjectProperties(e){return Object.entries(e).filter((([,e])=>!(0,core_.isFunction)(e)))}const getCollectionType=e=>(0,core_.isArray)(e)?"Array":e instanceof Set?"Set":e instanceof Map?"Map":void 0;function getBestType(e,t){const r=(0,core_.classOf)(t);return!r||(0,core_.isClassObject)(r)||(0,core_.isCollection)(t)?e||Object:r}function JsonSerializer_varKey(e){return`__${e}`}class JsonSerializer extends JsonMapperCompiler.J{constructor(){super(),this.addTypeMapper(Object,this.mapObject.bind(this)),this.addTypeMapper(Array,this.mapArray.bind(this)),this.addTypeMapper(Map,this.mapMap.bind(this)),this.addTypeMapper(Set,this.mapSet.bind(this)),this.addGlobal("mapJSON",this.mapJSON.bind(this)),this.addTypeMapper("ObjectId",(e=>String(e)))}map(e,t={}){if((0,core_.isNil)(e))return e;const r=getBestType((t=this.mapOptions(t)).type,e);return this.compile(r,t.groups).fn(e,this.createContext(t))}alterValue(e,t,r){return alterOnSerialize(this.schemes[e],t,r)}createMapper(e,t,r){const i=schema_.JsonEntityStore.from(e),n=new Set,o=[...(0,schema_.getPropertiesStores)(i).values()],s=(new Writer).arrow("input","options");return s.if("isNil(input)").return("input"),s.const("obj","{}"),s.set("options","{...options, self: input}"),s.add(this.mapPrecondition(t)),o.length?(s.add(...o.flatMap((e=>{if(n.add(e.propertyKey),!(e.schema?.$ignore&&(0,core_.isBoolean)(e.schema?.$ignore)||e.schema?.$hooks?.has("groups")&&this.alterGroups(e.schema,r)))return this.mapProperty(e,t,r)}))),s.add(this.mapDiscriminatorKeyValue(i)),s.add(this.mapAdditionalProperties(i,n)),s.return("obj").root().toString()):s.return("isObject(input) ? {...input} : input").root().toString()}mapOptions({groups:e,useAlias:t=!0,types:r,...i}){(r=r||getJsonMapperTypes()).forEach(((e,t)=>{[Array,Set,Map].includes(t)||this.addTypeMapper(t,((r,i)=>e.serialize(r,{...i,type:t})))}));const n=i.strictGroups??JsonMapperSettings.strictGroups;return{...i,groups:void 0===e?!!n&&[]:e||!1,useAlias:t,customMappers:{}}}mapProperty(e,t,r){const i=String(e.propertyKey),n=String(e.parent.schema.getAliasOf(i)||i),o=this.getSchemaId(t,i),s=e.itemSchema.get("format"),a=s&&`options: {format: '${s}'}`;let c=(new Writer).add(`// Map ${i} ${t} ${r||""}`);e.schema?.$hooks?.has("ignore")&&(this.schemes[o]=e.schema,c=c.if(`!alterIgnore('${o}', {...options, self: input})`));const p=e.schema?.$hooks?.has("onSerialize");let l=`input.${i}`;p&&(this.schemes[o]=e.schema,l=`alterValue('${o}', input.${i}, ${Writer.options(a)})`),c=c.set(`let ${JsonSerializer_varKey(i)}`,l).if(`${JsonSerializer_varKey(i)} !== undefined`);return this.getPropertyFiller(e,i,r,a)(p?c.if(`${JsonSerializer_varKey(i)} === input.${i}`):c),n!==i?c.set(`obj[options.useAlias ? '${n}' : '${i}']`,JsonSerializer_varKey(i)):c.set(`obj.${i}`,JsonSerializer_varKey(i)),c.root()}getPropertyFiller(e,t,r,i){const n=e.itemSchema.isGeneric,o=e.itemSchema.hasDiscriminator;if(e.isCollection){const s=e.getBestType();let a;if(o){const i=e.parent.targetName;a=this.compile(`Discriminator:${i}:${t}`,r,{mapper:()=>this.createDiscriminatorMapper(e,r)})}else a=n?{id:""}:this.compile(s,r);return r=>r.callMapper((0,core_.nameOf)(e.collectionType),JsonSerializer_varKey(t),`id: '${a.id}'`,i)}if(n)return e=>e.set(JsonSerializer_varKey(t),`compileAndMap(${JsonSerializer_varKey(t)}, options)`);let s;if(o){const i=e.parent.targetName;s=this.compile(`Discriminator:${i}:${t}`,r,{mapper:()=>this.createDiscriminatorMapper(e,r)})}else s=this.compile(e.getBestType(),r);return e=>e.callMapper(s.id,JsonSerializer_varKey(t),i)}createDiscriminatorMapper(e,t){const r=e.itemSchema.discriminator(),i=(new Writer).arrow("input","options"),n=i.switch("nameOf(classOf(input))");return r.values.forEach(((e,r)=>{const i=this.compile(e,t);n.case(`'${(0,core_.nameOf)(e)}'`).returnCallMapper(i.id,"input")})),i.root().toString()}mapPrecondition(e){const t=new Writer;return t.if("input && isCollection(input)").return(Writer.mapperFrom("input",`{...options, id: '${e}'}`)),t.if("hasJsonMethod(input)").return(`mapJSON(input, {...options, id: '${e}'})`),t}mapDiscriminatorKeyValue(e){if(e.discriminatorAncestor){const t=e.discriminatorAncestor.schema.discriminator(),r=t.getDefaultValue(e.target);if(r){const e=new Writer;return e.if(`!obj.${t.propertyName}`).set(`obj.${t.propertyName}`,`'${r}'`),e}}}mapAdditionalProperties(e,t){if(e.schema.get("additionalProperties")){const e=[...t.values()].map((e=>`'${e}'`)).join(", "),r=new Writer;return r.add("// add additional properties"),r.each("objectKeys(input)",["key"]).if(`![${e}].includes(key)`).set("obj[key]","input[key]"),r}}mapObject(e,{type:t,...r}){return e&&(0,core_.isPrimitive)(e)||!e?e:e&&(0,core_.isCollection)(e)?this.execMapper(getCollectionType(e),e,r):(0,core_.hasJsonMethod)(e)?this.mapJSON(e,r):getObjectProperties(e).filter((([,e])=>void 0!==e)).reduce(((e,[t,i])=>{if((0,core_.isNil)(i))return{...e,[t]:i};const n=this.compile((0,core_.classOf)(i),r.groups);return{...e,[t]:n.fn(i,r)}}),{})}mapSet(e,t){return(0,core_.isNil)(e)?e:[...e.values()].map((e=>this.mapItem(e,t)))}mapArray(e,t){return(0,core_.isNil)(e)?e:[].concat(e).map((e=>this.mapItem(e,t)))}mapMap(e,t){return(0,core_.isNil)(e)?e:[...e.entries()].reduce(((e,[r,i])=>({...e,[r]:this.mapItem(i,t)})),{})}mapItem(e,{id:t,...r}){return!t&&e?this.compile((0,core_.classOf)(e),r.groups).fn(e,r):t?this.execMapper(t,e,r):e}mapJSON(e,{id:t,...r}){return(0,core_.isMongooseObject)(e)?e.toJSON({...r,id:t}):(t=t||(0,core_.nameOf)((0,core_.classOf)(e)),this.mappers[t]&&((0,core_.isDate)(e)||(0,core_.isMomentObject)(e))?this.execMapper(t,e,r):(e=e.toJSON(),(0,core_.isObject)(e)?this.execMapper(t,e,r):e))}}const deserializer=new JsonDeserializer;function deserialize(e,t){return deserializer.map(e,t)}const serializer=new JsonSerializer;function serialize(e,t){return serializer.map(e,t)}return __webpack_exports__})()));
//# sourceMappingURL=json-mapper.umd.min.js.map