@decaf-ts/db-decorators
Version:
Agnostic database decorators and repository
3 lines (2 loc) • 27.2 kB
JavaScript
import{Decoration as e,Metadata as t,propMetadata as r,apply as n,metadata as s}from"@decaf-ts/decoration";import{__decorate as o,__metadata as a}from"tslib";import{ModelKeys as i,validator as c,Validator as l,isEqual as u,DEFAULT_ERROR_MESSAGES as d,Validation as f,Hashing as p,type as h,Model as E,innerValidationDecorator as g,date as y,required as m,ValidationKeys as A,getChildNestedPropsToIgnore as T,ModelErrorDefinition as w,toConditionalPromise as O,validate as P,ModelBuilder as v}from"@decaf-ts/decorator-validation";import{ObjectAccumulator as R}from"typed-object-accumulator";import{Logging as D}from"@decaf-ts/logging";const b={REFLECT:i.MODEL+".persistence.",REPOSITORY:"repository",CLASS:"_class",ID:"id",INDEX:"index",UNIQUE:"unique",SERIALIZE:"serialize",READONLY:"readonly",TIMESTAMP:"timestamp",TRANSIENT:"transient",HASH:"hash",COMPOSED:"composed",GENERATED:"generated",VERSION:"version",ORIGINAL:"__originalObj"},S="_",L="dd/MM/yyyy HH:mm:ss:S",k={ID:{INVALID:"This Id is invalid",REQUIRED:"The Id is mandatory"},READONLY:{INVALID:"This cannot be updated"},TIMESTAMP:{REQUIRED:"Timestamp is Mandatory",DATE:"The Timestamp must the a valid date",INVALID:"This value must always increase"}},N={REFLECT:"db.update.validation.",TIMESTAMP:b.TIMESTAMP,READONLY:b.READONLY};let I=class extends l{constructor(){super(k.READONLY.INVALID)}hasErrors(e,...t){}updateHasErrors(e,t,r){if(void 0!==e)return u(e,t)?void 0:this.getMessage(r||this.message)}};I=o([c(N.READONLY),a("design:paramtypes",[])],I);let x=class extends l{constructor(){super(k.TIMESTAMP.INVALID)}hasErrors(e,...t){}updateHasErrors(e,t,r){if(void 0!==e){r=r||this.getMessage(r||this.message);try{e=new Date(e),t=new Date(t)}catch(e){return r}return e>t?void 0:r}}};x=o([c(N.TIMESTAMP),a("design:paramtypes",[])],x);class C extends l{constructor(e=d.DEFAULT,...t){super(e,...t)}}var j,M,U,F;f.updateKey=e=>N.REFLECT+e,(e=>{e.REFLECT="decaf.model.db.operations.",e.CREATE="create",e.READ="read",e.UPDATE="update",e.DELETE="delete",e.ON="on.",e.AFTER="after.",e.BLOCK="block"})(j||(j={})),(e=>{e.OPERATIONS="operations",e.RELATIONS="relations"})(M||(M={})),(e=>{e.CREATE_ALL="createAll",e.READ_ALL="readAll",e.UPDATE_ALL="updateAll",e.DELETE_ALL="deleteAll"})(U||(U={})),(e=>{e.ALL="bulkAll"})(F||(F={}));const H={CREATE:[j.CREATE],READ:[j.READ],UPDATE:[j.UPDATE],DELETE:[j.DELETE],CREATE_UPDATE:[j.CREATE,j.UPDATE],READ_CREATE:[j.READ,j.CREATE],ALL:[j.CREATE,j.READ,j.UPDATE,j.DELETE]};class ${constructor(){this.cache={}}get(e,t,r,n){n=n||[];const s=this.resolveOwner(e),o=this.resolveTargetName(e,s);if(o){const e=this.selectHandlers(o,t,r,s);e?.length&&n.unshift(...e)}else if("string"==typeof e||e===Object.prototype||Object.getPrototypeOf(e)===Object.prototype)return n;let a=Object.getPrototypeOf(e);return a?(a.constructor&&a.constructor.name===o&&(a=Object.getPrototypeOf(a)),a?this.get(a,t,r,n):n):n}register(e,t,r,n){const s=r.constructor.name,o=$.getHandlerName(e),a=this.resolveFlavour(r.constructor);this.cache[s]||(this.cache[s]={}),this.cache[s][n]||(this.cache[s][n]={}),this.cache[s][n][t]||(this.cache[s][n][t]={}),this.cache[s][n][t][a]||(this.cache[s][n][t][a]={}),this.cache[s][n][t][a][o]||(this.cache[s][n][t][a][o]=e)}resolveOwner(e){if(e&&"string"!=typeof e)return"function"==typeof e?e:e.constructor}resolveTargetName(e,t){return"string"==typeof e?e:t?.name}resolveFlavour(r){if(!r)return e.defaultFlavour;try{return t.flavourOf(r)}catch{return e.defaultFlavour}}selectHandlers(t,r,n,s){const o=this.cache[t]?.[r]?.[n];if(!o)return;const a=o[this.resolveFlavour(s)]||o[e.defaultFlavour]||this.firstBucket(o);if(!a)return;const i=Object.values(a);return i.length?i:void 0}firstBucket(e){for(const t of Object.values(e))if(t&&Object.keys(t).length)return t}static getHandlerName(e){return e.name?e.name:p.hash(e.toString())}}class V{constructor(){}static getHandlerName(e){return $.getHandlerName(e)}static key(e){return j.REFLECT+e}static get(e,t,r){return V.registry.get(e,t,r)}static getOpRegistry(){return V.registry||(V.registry=new $),V.registry}static register(e,t,r,n){V.getOpRegistry().register(e,t,r,n)}}class _ extends Error{constructor(e,t,r){if(t instanceof _)return t;super(`[${e}][${r}] ${t instanceof Error?t.message:t}`),this.code=r,t instanceof Error&&(this.stack=t.stack)}get message(){return`[${this.name}] ${this.code} | ${super.message.replaceAll(/\[.*?Error\]\[\d+\]\s/g,"")}`}toString(){return this.message}}class z extends _{constructor(e,t=z.name,r=999){super(t,e,r)}}class G extends _{constructor(e,t=G.name,r=400){super(t,e,r)}}class Y extends G{constructor(e){super(e,Y.name,422)}}class K extends _{constructor(e,t=K.name,r=500){super(t,e,r)}}class B extends K{constructor(e){super(e,B.name,500)}}class Q extends G{constructor(e){super(e,Q.name,404)}}class J extends G{constructor(e){super(e,J.name,409)}}const q={priority:50},Z=new Set([j.CREATE,j.READ,j.UPDATE,j.DELETE]),W=new Set(Object.values(U));function X(e){return W.has(e)||e===F.ALL?"bulk":(Z.has(e),"crud")}function ee(e){return"object"==typeof e&&null!==e&&Object.prototype.hasOwnProperty.call(e,"kind")&&"string"==typeof e.kind}function te(e){const t=Array.isArray(e)?e:[e],r=[];for(const e of t)if(Array.isArray(e))r.push(...te(e));else{if("string"==typeof e){const t=X(e),n=("bulk"===t&&F.ALL,e);r.push({kind:t,value:n});continue}ee(e)&&r.push(e)}return r}const re=(e,t,r,n)=>{const s=r.constructor.name;if(!s)throw new K("Could not determine model class");n=n||{},e.props.handlers[s]&&e.props.handlers[s][t]&&(n={...e.props.handlers[s][t],...n});let o=Object.getPrototypeOf(r);return o===Object.prototype?n:(o.constructor.name===s&&(o=Object.getPrototypeOf(o)),re(e,t,o,n))};function ne(e,t,r){const n=[];for(const s in t){const o=t[s];for(const t of o){const{key:o}=t,a=V.get(e,s,r+o);if(!a||!a.length)throw new K(`Could not find registered handler for the operation ${r+o} under property ${s}`);const i=re(t,s,e);if(!i)throw new K("Missing handler arguments for decorators");for(const e of a){const t=V.getHandlerName(e),r=i[t];if(!r)throw new K("Missing handler arguments for handler "+t);const o=r.data;n.push({handler:e,data:[o],prop:[s]})}}}return n}function se(e){const t=e.reduce((e,t)=>{if(!t||!t.data||!t.prop)throw new K("Missing decorator properties or data");if(!t.data[0].group)return e.set(Symbol(),t),e;const r=t.data[0].group;if(e.has(r)){const n=e.get(r);e.set(r,{handler:n.handler,data:[...n.data,...t.data],prop:[...n.prop,...t.prop]})}else e.set(r,{...t});return e},new Map),r=Array.from(t.values());return r.forEach(e=>{const t=e.data.map((t,r)=>({data:t,prop:e.prop[r]}));t.sort((e,t)=>(e.data.groupPriority??50)-(t.data.groupPriority??50)),e.data=t.map(e=>e.data),e.prop=t.map(e=>e.prop)}),r}function oe(e){return e.sort((e,t)=>(e.data[0].priority??50)-(t.data[0].priority??50)),e}function ae(e,t,r){return fe(H.CREATE_UPDATE,e,t,r)}function ie(e,t,r){return fe(H.UPDATE,e,t,r)}function ce(e,t,r){return fe(H.CREATE,e,t,r)}function le(e,t,r){return fe(H.READ,e,t,r)}function ue(e,t,r){return fe(H.DELETE,e,t,r)}function de(e,t,r){return fe(H.ALL,e,t,r)}function fe(e=H.ALL,t,r,n){return Te(j.ON,e,t,r,n)}function pe(e,t,r){return Ae(H.CREATE_UPDATE,e,t,r)}function he(e,t,r){return Ae(H.UPDATE,e,t,r)}function Ee(e,t,r){return Ae(H.CREATE,e,t,r)}function ge(e,t,r){return Ae(H.READ,e,t,r)}function ye(e,t,r){return Ae(H.DELETE,e,t,r)}function me(e,t,r){return Ae(H.ALL,e,t,r)}function Ae(e=H.ALL,t,r,n){return Te(j.AFTER,e,t,r,n)}function Te(e,s=H.ALL,o,a,i=q){return(c,l)=>{const u=c.constructor.name,d=s.reduce((n,s)=>{const d=e+s;let f=t.readOperation(c.constructor,l,d);f||(f={operation:s,handlers:{}});const p=V.getHandlerName(o);let h=i;if(a){if(Object.keys(a).filter(e=>e in i).length>0)throw new K("Unable to merge groupSort into dataToAdd due to overlaping keys");h={...i,...a}}return f.handlers[u]&&f.handlers[u][l]&&p in f.handlers[u][l]||(f.handlers[u]=f.handlers[u]||{},f.handlers[u][l]=f.handlers[u][l]||{},f.handlers[u][l][p]={data:h},n.push(((e,t)=>(r,n)=>{V.register(t,e,r,n)})(d,o),r(t.key(M.OPERATIONS,l,d),f))),n},[]);return n(...d)(c,l)}}function we(e,t){return(...r)=>s(e,{args:r,handler:t})}const Oe=e=>{const t=te(e);return we(j.REFLECT+j.BLOCK,(e,t,r)=>e.some(e=>((e,t,r)=>e.kind===t&&("bulk"===e.kind&&e.value===F.ALL||e.value===r))(e,t,r)))(t)},Pe=e=>we(j.REFLECT+j.BLOCK,(t,r,n)=>((e,t,r,n)=>e.length>2||"crud"!==r?e(t,r,n):e(t.filter(e=>"crud"===e.kind).map(e=>e.value),n))(e,t,r,n))();function ve(e){return(n,s)=>r(t.key(b.GENERATED,s),e||!0)(n,s)}function Re(e,t,r,n,s){if(void 0===n[r])return;const o=p.hash(n[r]);s&&n[r]===o||(n[r]=o)}function De(){return n(ae(Re),r(b.HASH,{}))}function be(e,t){const{args:r,type:n,prefix:s,suffix:o,separator:a,filterEmpty:i,hashResult:c}=t;try{const t=r.map(t=>{if("keys"===n)return t;if(void 0===e[t]){if(i){if(!Array.isArray(i))return;if(i.includes(t))return}throw new K(`Property ${r} does not contain a value to compose from`)}return e[t].toString()}).filter(e=>!i||!!e);s&&t.unshift(s),o&&t.push(o);const l=t.map(e=>"object"==typeof e&&"[object Object]"===e.toString()?JSON.stringify(e):e).join(a);return c?p.hash(l):l}catch(e){throw new K("Failed to compose value: "+e)}}function Se(e,t,r,n){n[r]=be(n,t)}function Le(s,o=!1,a=S,i=!1,c="values",l="",u="",d={priority:55}){return e.for(b.COMPOSED).define({decorator:(e,s,o,a,c,l,u)=>(d,f)=>{const p={args:e,hashResult:s,separator:o,type:a,prefix:c,suffix:l,filterEmpty:i},h=[ve(b.COMPOSED),ae(Se,p,u),r(t.key(b.COMPOSED,f),p)];return s&&h.push(De()),n(...h)(d,f)},args:[s,o,a,c,l,u,d]}).apply()}function ke(e,t=S,r=!1,n=!1,s="",o="",a={priority:55}){return Le(e,n,t,r,"keys",s,o,a)}function Ne(e,t=S,r=!1,n=!1,s="",o="",a={priority:55}){return Le(e,n,t,r,"values",s,o,a)}function Ie(e){return(t,r,n,s,o)=>{if(E.shouldGenerate(s,n,t))try{switch(e){case j.CREATE:s[n]=1;break;case j.UPDATE:if(t.get("applyUpdateValidation")&&o&&s[n]!==o[n])throw new Y(`Version mismatch: ${s[n]} !== ${o[n]}`);s[n]++;break;default:throw new K("Invalid operation: "+e)}}catch(e){throw new K("Failed to update version: "+e)}}}function xe(){const n=b.VERSION;return(s,o)=>e.for(n).define(r(t.key(n,o),!0),ve(b.VERSION),h(Number),ce(Ie(j.CREATE)),ie(Ie(j.UPDATE))).apply()(s,o)}function Ce(){return e.for(b.TRANSIENT).define((e,n)=>{r(t.key(b.TRANSIENT,n),{})(e,n)}).apply()}function je(t=k.READONLY.INVALID){const r=b.READONLY,n={message:t,description:"defines the attribute as readOnly",async:!1};return e.for(r).define({decorator:g,args:[je,r,n]}).apply()}async function Me(e,t,r,n){E.shouldGenerate(n,r,e)&&(n[r]=e.timestamp)}function Ue(t=H.CREATE_UPDATE,s=L){const o=b.TIMESTAMP,a=f.updateKey(b.TIMESTAMP);return e.for(o).define({decorator:(e,t)=>{const s=[ve(b.TIMESTAMP),y(t,k.TIMESTAMP.DATE),m(k.TIMESTAMP.REQUIRED),r(f.key(b.TIMESTAMP),{operation:e,format:t}),fe(e,Me)];return-1!==e.indexOf(j.UPDATE)?s.push(r(a,{message:k.TIMESTAMP.INVALID})):s.push(je()),n(...s)},args:[t,s]}).apply()}async function Fe(e,t,r,n){if(n[r])try{n[r]=t.serializer?(new t.serializer).serialize(n[r]):JSON.stringify(n[r])}catch(e){throw new B(`Failed to serialize ${r.toString()} property of model ${n.constructor.name}: ${e}`)}}async function He(e,t,r,n){if(n[r]&&"string"==typeof n[r])try{n[r]=t.serializer?(new t.serializer).deserialize(n[r]):JSON.parse(n[r])}catch(e){throw new B(`Failed to deserialize ${r.toString()} property of model ${n.constructor.name}: ${e}`)}}function $e(e){return n(ae(Fe,{serializer:e}),Ae(H.ALL,He,{serializer:e}),h([String,Object]),s(b.SERIALIZE,{serializer:e}))}function Ve(){return n(m(),je(),(e,n)=>r(t.key(b.ID,n),{})(e,n))}function _e(e,r){const n=[];for(const s in e){if(!Object.prototype.hasOwnProperty.call(e,s)||r.includes(s))continue;const o=t.validationFor(e.constructor,s)||{};n.push({prop:s,decorators:o})}return n}function ze(e,t,r,n,s){const o=f.get(n.key);if(!o)throw Error("Missing validator for "+n.key);if(!o.updateHasErrors)return O(void 0,s);if(!s&&n.async)return O(void 0,s);const a=Object.values(n)||{},i=o.updateHasErrors(e[r],t[r],...a);return O(i,s)}function Ge(e,t,r,n,s){const o={};for(const a in n){const i={...n[a],key:a};if(!s&&i.async)continue;let c=ze(e,t,r,i,s);if(i.key===A.LIST&&(!c||s)){const n=e[r],o=t[r],a=n instanceof Set?[...n]:n,l=o instanceof Set?[...o]:o;if(a?.length){const e=[i.class||i.clazz||i.customTypes].flat().map(e=>((e=(e="function"!=typeof e||e.name?e:e()).name?e.name:e)+"").toLowerCase()),t=a.map(t=>{if(E.isModel(t)){const e=E.pk(t,!0);if(!e)return"Failed to find model id";const r=l.find(t=>e===E.pk(t,!0));return t.hasErrors(r)}return e.includes(typeof t)?void 0:"Value has no validatable type"});if(s)c=Promise.all(t).then(e=>e.every(e=>!e)?void 0:e);else{const e=t.every(e=>!e);c=t.length>0&&!e?t:void 0}}}c&&(o[i.key]=c)}if(!s)return Object.keys(o).length>0?o:void 0;const a=Object.keys(o),i=Object.values(o);return Promise.all(i).then(e=>{const t={};for(let r=0;r<e.length;r++){const n=e[r];void 0!==n&&(t[a[r]]=n)}return Object.keys(t).length>0?t:void 0})}function Ye(e,r,n,...s){const o=_e(r,s),a={},c={};for(const{prop:l,decorators:u}of o){const o=l+"",d=r[l],{designTypes:f}=t.getPropDesignTypes(r.constructor,l);if(!f)continue;if(f.some(e=>[Array.name,Set.name].includes(e))){if(!u||!Object.keys(u).includes(A.LIST)){a[o]={[A.TYPE]:`Array or Set property '${o}' requires a @list decorator`};continue}if(d&&!(Array.isArray(d)||d instanceof Set)){a[o]={[A.TYPE]:`Property '${l+""}' must be either an Array or a Set`};continue}}const p=Ge(r,e,o,u,n)||{},h=E.isPropertyModel(r,o);if(null!=d&&h){const t=d,r=f.map(e=>E.get(e.name||e)).find(e=>!!e),n=f.map(e=>"function"==typeof e?e.name?e.name.toLowerCase():e()?.name.toLowerCase():e.toLowerCase());if(r&&d instanceof r){const r=T(o,...s);c[o]=t.hasErrors(e[l],...r)}else n.includes(typeof d)||(p[A.TYPE]=r?"Value must be an instance of "+r.name:`Unable to verify type consistency, missing model registry for ${f.toString()} on prop ${o}`,delete p[i.TYPE])}(Object.keys(p).length>0||n)&&(a[o]=p),n||Object.entries(c[o]||{}).forEach(([e,t])=>{void 0!==t&&(a[`${o}.${e}`]=t)})}if(!n)return Object.keys(a).length>0?new w(a):void 0;const l=a,u=Object.keys(l),d=Object.values(l);return Promise.allSettled(d).then(async e=>{const t={};for(const[e,r]of Object.entries(c)){const n=await r;n&&Object.entries(n).forEach(([r,n])=>{void 0!==n&&(t[[e,r].join(".")]=n)})}for(let r=0;r<e.length;r++){const n=u[r],s=e[r];"fulfilled"===s.status&&void 0!==s.value?t[n]=s.value:"rejected"===s.status&&(t[n]=s.reason instanceof Error?s.reason.message:(s.reason||"Validation failed")+"")}return Object.keys(t).length>0?new w(t):void 0})}E.prototype.isTransient=function(){return t.isTransient(this)},E.prototype.hasErrors=function(e,...t){!e||e instanceof E||(t.unshift(e),e=void 0);const r=this.isAsync(),n=P(this,r,...t);return r?Promise.resolve(n).then(n=>n||!e?n:Ye(e,this,r,...t)):n||!e?n:Ye(e,this,r,...t)},E.prototype.segregate=function(){return E.segregate(this)},E.segregate=e=>{if(!t.isTransient(e))return{model:e};const r=t.validatableProperties(e.constructor),n=t.get(e.constructor,b.TRANSIENT),s={model:{},transient:{}};for(const t of r)if(Object.keys(n).includes(t)){s.transient=s.transient||{};try{s.transient[t]=e[t]}catch(e){throw new B(`Failed to serialize transient property ${t}: ${e}`)}}else s.model=s.model||{},s.model[t]=e[t];return s.model=E.build(s.model,e.constructor.name),s},t.pk=((e,r=!1)=>{if(!e)throw Error("No model was provided");const n=e instanceof E?e.constructor:e,s=t.get(n,b.ID);if(!s)throw Error("No Id property defined for model "+(n?.name||"Unknown Model"));const o=Object.keys(s)[0];if(!r)return o;if(e instanceof E)return e[o];throw Error("Cannot get the value of the pk from the constructor")}).bind(t),E.pk=((e,r=!1)=>t.pk(e,r)).bind(E),E.pkProps=(e=>t.get(e,t.key(b.ID,E.pk(e)))).bind(E),E.isTransient=(e=>!!t.get("function"!=typeof e?e.constructor:e,b.TRANSIENT)).bind(E),E.composed=((e,r)=>{const n=e instanceof E?e.constructor:e;return r?t.get(n,t.key(b.COMPOSED,r)):!!t.get(n,b.COMPOSED)}).bind(E),E.merge=((e,t,r)=>{const n=e=>Object.entries(e).reduce((e,[t,r])=>(null!=r&&(e[t]=r),e),{});return new(r=r||e.constructor)(Object.assign({},n(e),n(t)))}).bind(E),t.saveOperation=((e,r,n,s)=>{r&&t.set(e,t.key(M.OPERATIONS,r,n),s)}).bind(t),t.readOperation=((e,r,n)=>{if(r&&n)return t.get(e,t.key(M.OPERATIONS,r,n))}).bind(t),t.isTransient=(e=>!!t.get("function"!=typeof e?e.constructor:e,b.TRANSIENT)).bind(t),E.generated=((e,r)=>!!t.get("function"!=typeof e?e.constructor:e,t.key(b.GENERATED,r))).bind(E),E.shouldGenerate=((e,t,r)=>!r.get("allowGenerationOverride")||void 0===e[t]).bind(E),E.versionProp=(e=>{const r=t.get(e.constructor);if(!r||!r[b.VERSION])throw new K("No version found for "+e.constructor.name);return Object.keys(r)[0]}).bind(E),E.versionOf=(e=>{const t=e[E.versionProp(e)];if("number"!=typeof t||1>t)throw new K("Invalid version number: "+t);return t}).bind(E);const Ke=v.prototype;Ke.decorateClass||(Ke.decorateClass=function(e){return this._classDecorators||(this._classDecorators=[]),this._classDecorators.push(e),this});const Be=(e,t,r)=>(((e,t)=>{const r=e.attributes;return r?.has(t)?r.get(t):e.attribute(t,Object)})(e,t).decorate(r),e);function Qe(e){return e.reduce((e,t,r)=>(t&&(e="string"==typeof e?e+`\n - ${r}: ${t.toString()}`:` - ${r}: ${t.toString()}`),e),void 0)}async function Je(e,t,r,n,s,o){const a=qe(r,n,s);if(!a)return;const i=oe(se(ne(r,a,s)));for(const s of i){const a=[t,s.data.length>1?s.data:s.data[0],s.prop.length>1?s.prop:s.prop[0],r];if([j.UPDATE,U.UPDATE_ALL].includes(n)){if(!o)throw new K("Missing old model for update operation");a.push(o)}try{await s.handler.apply(e,a)}catch(e){if(t.logger.for(Je).error(`Failed to execute handler ${s.handler.name} for ${s.prop} on ${r.constructor.name}`),t.get("breakOnHandlerError"))throw e}}}function qe(e,r,n){const s=n?.replace(/[.]$/,""),o=t.get(e.constructor,M.OPERATIONS);if(o)return Object.keys(o).reduce((e,t)=>{const n=s?o[t][s]||{}:o[t],a=Object.keys(n).filter(e=>e===r),i=[];for(const e of a)i.push({key:e,props:n[e]});return i&&i.length&&(e||(e={}),e[t]=i),e},void 0)}Ke.generated=function(e,t){return Be(this,e,ve(t))},Ke.hash=function(e){return Be(this,e,De())},Ke.composedFromKeys=function(e,t,r,n,s,o,a,i){return Be(this,e,ke(t,r,n,s,o,a,i))},Ke.composed=function(e,t,r,n,s,o,a,i){return Be(this,e,Ne(t,r,n,s,o,a,i))},Ke.version=function(e){return Be(this,e,xe())},Ke.transient=function(e){return Be(this,e,Ce())};const Ze={parentContext:void 0,childContexts:[],ignoredValidationProperties:[],callArgs:[],writeOperation:!1,affectedTables:[],operation:void 0,breakOnHandlerError:!0,rebuildWithTransient:!0,ignoreValidation:!1,ignoreHandlers:!1,ignoreDevSafeGuards:!1,mergeForUpdate:!0,applyUpdateValidation:!0,allowGenerationOverride:!1},We=e=>(new Xe).accumulate(Object.assign({},e,{timestamp:new Date,logger:e.logger||D.get()}));class Xe{constructor(e){this.cache=new R,Object.defineProperty(this,"cache",{value:e?e.cache:new R,writable:!1,enumerable:!1,configurable:!0})}static{this.factory=We}accumulate(e){return Object.defineProperty(this,"cache",{value:this.cache.accumulate(e),writable:!1,enumerable:!1,configurable:!0}),this}get logger(){return this.cache.logger}get timestamp(){return this.cache.timestamp}get(e){try{return this.cache.get(e)}catch(t){const r=this.cache.parentContext;if(r)return r.get(e);throw t}}static childFrom(e,t){return Xe.factory(Object.assign({},e.cache,t||{}))}static async from(e,t,r,...n){return Xe.factory(Object.assign({},Ze,t,{operation:e,model:r,logger:t.logger||D.get()}))}static async args(e,t,r,n,s){const o=r.pop();async function a(){return n?n.context(e,s||{},t,...r):Xe.from(e,s||{},t,...r)}let i;return o?o instanceof Xe?(i=o,r.push(o)):(r.push(o),i=await a(),r.push(i)):(i=await a(),r.push(i)),{context:i,args:r}}}function et(e,t,r,n){const s=n||t.name;e[s]=new Proxy(e[s],{apply:async(e,t,n)=>{let s=r.call(t,...n);return s instanceof Promise&&(s=await s),s=e.call(t,...s),s instanceof Promise&&(s=await s),s}})}function tt(e,t,r,n){const s=n||t.name;e[s]=new Proxy(e[s],{apply:async(e,t,n)=>{let s=e.call(t,...n);return s instanceof Promise&&(s=await s),s=r.call(t,...s),s instanceof Promise&&(s=await s),s}})}function rt(e,t,r,n,s){const o=s||r.name;e[o]=new Proxy(e[o],{apply:async(e,r,s)=>{let o=t.call(r,...s);o instanceof Promise&&(o=await o);const a=o[o.length-1];if(!(a instanceof Xe))throw new K("Missing a context");let i=e.call(r,...o);return i instanceof Promise&&(i=await i),i=n.call(r,i,a),i instanceof Promise&&(i=await i),i}})}function nt(e,t,r,n,s){const o=s||r.name;e[o]=new Proxy(e[o],{apply:async(e,r,s)=>{let o=t.call(r,...s);o instanceof Promise&&(o=await o);const a=o.pop(),i=o[o.length-1];if(!(i instanceof Xe))throw new K("Missing a context");if(i.get("applyUpdateValidation")&&!i.get("ignoreDevSafeGuards")&&!(a instanceof E)&&(!Array.isArray(a)||!a.every(e=>e instanceof E)))throw new K("No previous versions os models found");let c=e.call(r,...o);return c instanceof Promise&&(c=await c),c=n.call(r,c,a,i),c instanceof Promise&&(c=await c),c}})}class st{get class(){if(!this._class)throw new K("No class definition found for this repository");return this._class}get pk(){return E.pk(this.class)}get pkProps(){return E.pkProps(this.class)}constructor(e){e&&(this._class=e);const t=this;[this.create,this.read,this.delete].forEach(e=>{const r=e.name;rt(t,t[r+"Prefix"],e,t[r+"Suffix"])}),nt(t,t[this.update.name+"Prefix"],this.update,t[this.update.name+"Suffix"])}async createAll(e,...t){return Promise.all(e.map(e=>this.create(e,...t)))}async createPrefix(e,...t){const r=await Xe.args(j.CREATE,this.class,t);if(e=new this.class(e),r.context.get("ignoreHandlers")||await Je(this,r.context,e,j.CREATE,j.ON),!r.context.get("ignoreValidation")){const t=await Promise.resolve(e.hasErrors());if(t)throw new Y(t.toString())}return[e,...r.args]}async createSuffix(e,t){return t.get("ignoreHandlers")||await Je(this,t,e,j.CREATE,j.AFTER),e}async createAllPrefix(e,...t){const r=await Xe.args(j.CREATE,this.class,t),n=r.context.get("ignoreHandlers"),s=r.context.get("ignoreValidation");if(e=await Promise.all(e.map(async e=>{const t=new this.class(e);return n||await Je(this,r.context,t,j.CREATE,j.ON),t})),!s){const t=Qe(await Promise.all(e.map(e=>Promise.resolve(e.hasErrors()))));if(t)throw new Y(t)}return[e,...r.args]}async createAllSuffix(e,t){return t.get("ignoreHandlers")||await Promise.all(e.map(e=>Je(this,t,e,j.CREATE,j.AFTER))),e}async readAll(e,...t){return await Promise.all(e.map(e=>this.read(e,...t)))}async readSuffix(e,t){return t.get("ignoreHandlers")||await Je(this,t,e,j.READ,j.AFTER),e}async readPrefix(e,...t){const r=await Xe.args(j.READ,this.class,t),n=new this.class;return n[this.pk]=e,await Je(this,r.context,n,j.READ,j.ON),[e,...r.args]}async readAllPrefix(e,...t){const r=await Xe.args(j.READ,this.class,t);return await Promise.all(e.map(async e=>{const t=new this.class;return t[this.pk]=e,Je(this,r.context,t,j.READ,j.ON)})),[e,...r.args]}async readAllSuffix(e,t){return t.get("ignoreHandlers")||await Promise.all(e.map(e=>Je(this,t,e,j.READ,j.AFTER))),e}async updateAll(e,...t){return Promise.all(e.map(e=>this.update(e,...t)))}async updateSuffix(e,t,r){return r.get("ignoreHandlers")||await Je(this,r,e,j.UPDATE,j.AFTER,t),e}async updatePrefix(e,...t){const r=await Xe.args(j.UPDATE,this.class,t),n=r.context,s=r.context.get("ignoreHandlers"),o=r.context.get("ignoreValidation"),a=e[this.pk];if(!a)throw new K("No value for the Id is defined under the property "+this.pk);let i;if(n.get("applyUpdateValidation")&&(i=await this.read(a),n.get("mergeForUpdate")&&(e=E.merge(i,e,this.class))),s||await Je(this,r.context,e,j.UPDATE,j.ON,i),!o){const t=await Promise.resolve(e.hasErrors(i));if(t)throw new Y(t.toString())}return[e,...r.args,i]}async updateAllPrefix(e,...t){const r=await Xe.args(j.UPDATE,this.class,t),n=r.context,s=n.get("ignoreHandlers"),o=n.get("ignoreValidation"),a=e.map(e=>{const t=e[this.pk];if(void 0===t)throw new K("No value for the Id is defined under the property "+this.pk);return t});let i;if(n.get("applyUpdateValidation")&&(i=await this.readAll(a,n),n.get("mergeForUpdate")&&(e=e.map((e,t)=>E.merge(i[t],e,this.class)))),s||await Promise.all(e.map((e,t)=>Je(this,r.context,e,j.UPDATE,j.ON,i?i[t]:void 0))),!o){let t;t=n.get("applyUpdateValidation")?await Promise.all(e.map((e,t)=>Promise.resolve(e.hasErrors(i[t])))):await Promise.resolve(e.map(e=>e.hasErrors()));const r=Qe(t);if(r)throw new Y(r)}return[e,...r.args,i]}async updateAllSuffix(e,t,r){if(r.get("applyUpdateValidation")&&!r.get("ignoreDevSafeGuards")&&!t)throw new K("No previous versions of models provided");return r.get("ignoreHandlers")||await Promise.all(e.map((e,n)=>Je(this,r,e,j.UPDATE,j.AFTER,t?t[n]:void 0))),e}async deleteAll(e,...t){return Promise.all(e.map(e=>this.delete(e,...t)))}async deleteSuffix(e,t){return t.get("ignoreHandlers")||await Je(this,t,e,j.DELETE,j.AFTER),e}async deletePrefix(e,...t){const r=await Xe.args(j.DELETE,this.class,t),n=await this.read(e,...r.args);return await Je(this,r.context,n,j.DELETE,j.ON),[e,...r.args]}async deleteAllPrefix(e,...t){const r=await Xe.args(j.DELETE,this.class,t),n=await this.readAll(e,...r.args);return await Promise.all(n.map(async e=>Je(this,r.context,e,j.DELETE,j.ON))),[e,...r.args]}async deleteAllSuffix(e,t){return t.get("ignoreHandlers")||await Promise.all(e.map(e=>Je(this,t,e,j.DELETE,j.AFTER))),e}toString(){return this.class.name+" Repository"}}const ot="##VERSION##",at="##PACKAGE##";t.registerLibrary(at,ot);export{G as BadRequestError,_ as BaseError,Pe as BlockOperationIf,Oe as BlockOperations,z as BreakError,U as BulkCrudOperationKeys,F as BulkOperationBlockTarget,J as ConflictError,Xe as Context,b as DBKeys,H as DBOperations,k as DEFAULT_ERROR_MESSAGES,L as DEFAULT_TIMESTAMP_FORMAT,We as DefaultContextFactory,Ze as DefaultRepositoryFlags,S as DefaultSeparator,K as InternalError,M as ModelOperations,Q as NotFoundError,j as OperationKeys,V as Operations,$ as OperationsRegistry,at as PACKAGE_NAME,I as ReadOnlyValidator,st as Repository,B as SerializationError,x as TimestampValidator,N as UpdateValidationKeys,C as UpdateValidator,ot as VERSION,Y as ValidationError,Ae as after,me as afterAny,Ee as afterCreate,pe as afterCreateUpdate,ye as afterDelete,ge as afterRead,he as afterUpdate,be as composeAttributeValue,Ne as composed,Se as composedFromCreateUpdate,ke as composedFromKeys,Je as enforceDBDecorators,ve as generated,qe as getDbDecorators,re as getHandlerArgs,ne as getHandlersDecorators,_e as getValidatableUpdateProps,se as groupDecorators,De as hash,Re as hashOnCreateUpdate,Ve as id,fe as on,de as onAny,ce as onCreate,ae as onCreateUpdate,ue as onDelete,le as onRead,ie as onUpdate,Te as operation,et as prefixMethod,je as readonly,Qe as reduceErrorsToPrint,$e as serialize,He as serializeAfterAll,Fe as serializeOnCreateUpdate,oe as sortDecorators,we as storeHandlerMetadata,tt as suffixMethod,Ue as timestamp,Me as timestampHandler,Ce as transient,Ye as validateCompare,ze as validateDecorator,Ge as validateDecorators,xe as version,Ie as versionCreateUpdate,rt as wrapMethodWithContext,nt as wrapMethodWithContextForUpdate};
//# sourceMappingURL=db-decorators.js.map