@decaf-ts/core 0.8.51 → 0.8.52

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (100) hide show
  1. package/README.md +206 -93
  2. package/dist/core.cjs +1 -1
  3. package/dist/core.cjs.map +1 -1
  4. package/dist/core.js +1 -1
  5. package/dist/core.js.map +1 -1
  6. package/lib/esm/fs/FilesystemAdapter.d.ts +67 -0
  7. package/lib/esm/fs/FilesystemAdapter.js +430 -0
  8. package/lib/esm/fs/FilesystemAdapter.js.map +1 -0
  9. package/lib/esm/fs/FsDispatch.d.ts +7 -0
  10. package/lib/esm/fs/FsDispatch.js +20 -0
  11. package/lib/esm/fs/FsDispatch.js.map +1 -0
  12. package/lib/esm/fs/helpers.d.ts +17 -0
  13. package/lib/esm/fs/helpers.js +64 -0
  14. package/lib/esm/fs/helpers.js.map +1 -0
  15. package/lib/esm/fs/index.d.ts +4 -0
  16. package/lib/esm/fs/index.js +5 -0
  17. package/lib/esm/fs/index.js.map +1 -0
  18. package/lib/esm/fs/indexStore.d.ts +28 -0
  19. package/lib/esm/fs/indexStore.js +173 -0
  20. package/lib/esm/fs/indexStore.js.map +1 -0
  21. package/lib/esm/fs/locks/FilesystemLock.d.ts +13 -0
  22. package/lib/esm/fs/locks/FilesystemLock.js +49 -0
  23. package/lib/esm/fs/locks/FilesystemLock.js.map +1 -0
  24. package/lib/esm/fs/locks/FilesystemMultiLock.d.ts +8 -0
  25. package/lib/esm/fs/locks/FilesystemMultiLock.js +23 -0
  26. package/lib/esm/fs/locks/FilesystemMultiLock.js.map +1 -0
  27. package/lib/esm/fs/types.d.ts +34 -0
  28. package/lib/esm/fs/types.js +2 -0
  29. package/lib/esm/fs/types.js.map +1 -0
  30. package/lib/esm/index.d.ts +1 -1
  31. package/lib/esm/index.js +1 -1
  32. package/lib/esm/ram/RamAdapter.d.ts +1 -1
  33. package/lib/esm/ram/types.d.ts +2 -1
  34. package/lib/esm/tasks/TaskEngine.d.ts +30 -1
  35. package/lib/esm/tasks/TaskEngine.js +361 -16
  36. package/lib/esm/tasks/TaskEngine.js.map +1 -1
  37. package/lib/esm/tasks/TaskService.js +3 -0
  38. package/lib/esm/tasks/TaskService.js.map +1 -1
  39. package/lib/esm/tasks/builder.js +1 -1
  40. package/lib/esm/tasks/builder.js.map +1 -1
  41. package/lib/esm/tasks/constants.js +1 -0
  42. package/lib/esm/tasks/constants.js.map +1 -1
  43. package/lib/esm/tasks/types.d.ts +12 -0
  44. package/lib/esm/tasks/workers/WorkThreadEnvironment.d.ts +32 -0
  45. package/lib/esm/tasks/workers/WorkThreadEnvironment.js +28 -0
  46. package/lib/esm/tasks/workers/WorkThreadEnvironment.js.map +1 -0
  47. package/lib/esm/tasks/workers/messages.d.ts +69 -0
  48. package/lib/esm/tasks/workers/messages.js +2 -0
  49. package/lib/esm/tasks/workers/messages.js.map +1 -0
  50. package/lib/esm/tasks/workers/workerThread.d.ts +1 -0
  51. package/lib/esm/tasks/workers/workerThread.js +185 -0
  52. package/lib/esm/tasks/workers/workerThread.js.map +1 -0
  53. package/lib/fs/FilesystemAdapter.cjs +437 -0
  54. package/lib/fs/FilesystemAdapter.d.ts +67 -0
  55. package/lib/fs/FilesystemAdapter.js.map +1 -0
  56. package/lib/fs/FsDispatch.cjs +24 -0
  57. package/lib/fs/FsDispatch.d.ts +7 -0
  58. package/lib/fs/FsDispatch.js.map +1 -0
  59. package/lib/fs/helpers.cjs +76 -0
  60. package/lib/fs/helpers.d.ts +17 -0
  61. package/lib/fs/helpers.js.map +1 -0
  62. package/lib/fs/index.cjs +21 -0
  63. package/lib/fs/index.d.ts +4 -0
  64. package/lib/fs/index.js.map +1 -0
  65. package/lib/fs/indexStore.cjs +181 -0
  66. package/lib/fs/indexStore.d.ts +28 -0
  67. package/lib/fs/indexStore.js.map +1 -0
  68. package/lib/fs/locks/FilesystemLock.cjs +56 -0
  69. package/lib/fs/locks/FilesystemLock.d.ts +13 -0
  70. package/lib/fs/locks/FilesystemLock.js.map +1 -0
  71. package/lib/fs/locks/FilesystemMultiLock.cjs +30 -0
  72. package/lib/fs/locks/FilesystemMultiLock.d.ts +8 -0
  73. package/lib/fs/locks/FilesystemMultiLock.js.map +1 -0
  74. package/lib/fs/types.cjs +3 -0
  75. package/lib/fs/types.d.ts +34 -0
  76. package/lib/fs/types.js.map +1 -0
  77. package/lib/index.cjs +1 -1
  78. package/lib/index.d.ts +1 -1
  79. package/lib/ram/RamAdapter.d.ts +1 -1
  80. package/lib/ram/types.d.ts +2 -1
  81. package/lib/tasks/TaskEngine.cjs +360 -15
  82. package/lib/tasks/TaskEngine.d.ts +30 -1
  83. package/lib/tasks/TaskEngine.js.map +1 -1
  84. package/lib/tasks/TaskService.cjs +3 -0
  85. package/lib/tasks/TaskService.js.map +1 -1
  86. package/lib/tasks/builder.cjs +1 -1
  87. package/lib/tasks/builder.js.map +1 -1
  88. package/lib/tasks/constants.cjs +1 -0
  89. package/lib/tasks/constants.js.map +1 -1
  90. package/lib/tasks/types.d.ts +12 -0
  91. package/lib/tasks/workers/WorkThreadEnvironment.cjs +31 -0
  92. package/lib/tasks/workers/WorkThreadEnvironment.d.ts +32 -0
  93. package/lib/tasks/workers/WorkThreadEnvironment.js.map +1 -0
  94. package/lib/tasks/workers/messages.cjs +3 -0
  95. package/lib/tasks/workers/messages.d.ts +69 -0
  96. package/lib/tasks/workers/messages.js.map +1 -0
  97. package/lib/tasks/workers/workerThread.cjs +220 -0
  98. package/lib/tasks/workers/workerThread.d.ts +1 -0
  99. package/lib/tasks/workers/workerThread.js.map +1 -0
  100. package/package.json +19 -8
package/dist/core.js CHANGED
@@ -1,2 +1,2 @@
1
- import{InjectableRegistryImp as t,Injectables as e,inject as r,injectable as s}from"@decaf-ts/injectable-decorators";import{__decorate as i,__metadata as n}from"tslib";import{DefaultRepositoryFlags as o,OperationKeys as a,BulkCrudOperationKeys as c,Context as l,InternalError as u,ValidationError as d,Repository as h,wrapMethodWithContext as p,wrapMethodWithContextForUpdate as g,enforceDBDecorators as f,reduceErrorsToPrint as y,NotFoundError as m,DefaultSeparator as w,DBKeys as b,readonly as v,onCreate as A,generated as x,BadRequestError as E,timestamp as O,onUpdate as C,onCreateUpdate as T,ConflictError as N,afterAny as k,onDelete as _,afterUpdate as D,SerializationError as B,prefixMethod as R,composed as I,transient as $,serialize as P,BaseError as L}from"@decaf-ts/db-decorators";import{LoggedClass as F,Logging as j,final as U,toCamelCase as M,LogLevel as Y,style as G}from"@decaf-ts/logging";import{Model as H,hashObj as z,required as q,sf as W,isEqual as Q,model as V,ValidationKeys as J,async as X,list as Z,type as tt,option as et,date as rt,JSONSerializer as st,ModelKeys as it,min as nt,gt as ot}from"@decaf-ts/decorator-validation";import{Lock as at,MultiLock as ct}from"@decaf-ts/transactional-decorators";import{Metadata as lt,Decoration as ut,DefaultFlavour as dt,apply as ht,methodMetadata as pt,propMetadata as gt,DecorationKeys as ft,uses as yt,metadata as mt,prop as wt,description as bt}from"@decaf-ts/decoration";var vt,At,xt,Et,St;(t=>{t.FIND_BY="findBy",t.PAGE_BY="pageBy",t.COUNT_BY="countBy",t.SUM_BY="sumBy",t.AVG_BY="avgBy",t.MIN_BY="minBy",t.MAX_BY="maxBy",t.DISTINCT_BY="distinctBy",t.GROUP_BY_PREFIX="groupBy",t.SELECT="Select",t.AND="And",t.OR="Or",t.GROUP_BY="GroupBy",t.ORDER_BY="OrderBy",t.THEN="Then",t.THEN_BY="ThenBy"})(vt||(vt={})),(t=>{t.EQUAL="EQUAL",t.DIFFERENT="DIFFERENT",t.BIGGER="BIGGER",t.BIGGER_EQ="BIGGER_EQ",t.SMALLER="SMALLER",t.SMALLER_EQ="SMALLER_EQ",t.BETWEEN="BETWEEN",t.NOT="NOT",t.IN="IN",t.REGEXP="REGEXP",t.STARTS_WITH="STARTS_WITH",t.ENDS_WITH="ENDS_WITH",t.GROUP_BY="group-by",t.COUNT="count",t.SUM="sum",t.MAX="v_max",t.MIN="v_min",t.DISTINCT="distinct",t.VIEW="view"})(At||(At={})),(t=>{t.AND="AND",t.OR="OR"})(xt||(xt={})),(t=>{t.LIST_BY="listBy",t.FIND_BY="findBy",t.FIND_ONE_BY="findOneBy",t.PAGE_BY="paginateBy",t.FIND="find",t.PAGE="page",t.COUNT_OF="countOf",t.MAX_OF="maxOf",t.MIN_OF="minOf",t.AVG_OF="avgOf",t.SUM_OF="sumOf",t.DISTINCT_OF="distinctOf",t.GROUP_OF="groupOf"})(Et||(Et={})),(t=>{t.PERSISTENCE="persistence",t.INDEX="index",t.UNIQUE="unique",t.ADAPTER="adapter",t.INJECTABLE="decaf_{0}_adapter_for_{1}",t.SERVICE="service",t.TABLE="table",t.COLUMN="column",t.METADATA="__metadata",t.OWNERSHIP="ownership",t.CREATED_BY="ownership.created-by",t.UPDATED_BY="ownership.updated-by",t.RELATIONS="__relations",t.RELATION="relation",t.ONE_TO_ONE="relation.one-to-one",t.ONE_TO_MANY="relation.one-to-many",t.MANY_TO_ONE="relation.many-to-one",t.MANY_TO_MANY="relation.many-to-many",t.POPULATE="populate",t.NO_VALIDATE="no-validate",t.MIGRATION="migration",t.STATEMENT="statement",t.QUERY="query",t.UUID="uuid",t.TAG_FOR_DELETION="tag_for_deletion",t.INITIALIZATION="initialization",t.SHUTDOWN="shutdown",t.BY_KEY="by-key",t.AUTH="auth",t.AUTH_ROLE="auth-role",t.DECAF_ROUTE="DecafRoute",t.THROTTLE="throttle",t.DEFAULT_QUERY_ATTR="default-query-attr"})(St||(St={}));const Ot=Object.assign({},{ignoreDevSafeGuards:!1}),Ct=Object.assign({},o,{enforceUpdateValidation:!0,allowRawStatements:!0,forcePrepareSimpleQueries:!1,forcePrepareComplexQueries:!1,cacheForPopulate:{},noEmit:!1,noEmitSingle:!1,noEmitBulk:!1,breakOnSingleFailureInBulk:!0,observeFullResult:!0,paginateByBookmark:!1,dryRun:!1}),Tt=[a.CREATE,a.UPDATE,a.DELETE,c.CREATE_ALL,c.UPDATE_ALL,c.DELETE_ALL],Nt=[a.READ,c.READ_ALL],kt=[St.STATEMENT,Et.FIND_ONE_BY],_t=[St.QUERY,Et.PAGE_BY,Et.LIST_BY,Et.FIND_BY,Et.FIND,Et.PAGE],Dt=[Et.PAGE_BY,Et.PAGE];class Bt extends at{constructor(){super()}}class Rt extends l{constructor(t){super(t)}pushPending(t,e){const r=this.pending()||{};if(r[t]=r[t]||[],r[t].includes(e))throw new u(`Trying to push a repeated pending ${t} task: ${e}`);r[t].push(e),this.accumulate({pending:r})}getFromChildren(t,e=new Set){if(e.has(this))return;e.add(this);const r=this.getOrUndefined(t);if(null!=r)return r;let s=this.getOrUndefined("childContexts");if(s&&s.length&&(s=s.filter(t=>!e.has(t)),s.length)){const r=s.map(r=>r.getFromChildren(t,e)).flat().filter(t=>null!=t);if(!r.length)return;return r.some(t=>"object"!=typeof t)?r[0]:r.reduce((t,e)=>Object.assign(t,e),{})}}pending(){return this.getFromChildren("pending")}getOrUndefined(t){try{return this.get(t)}catch(t){return}}override(t){return new Proxy(this,{get:(e,r,s)=>"get"===r?new Proxy(e.get,{apply:(e,r,i)=>{const n=i[0];if(!n)throw new u("Invalid property access to overridden context: "+n);return n in t?t[n]:Reflect.apply(e,s,i)}}):Reflect.get(e,r,s)})}toOverrides(){return this.cache.keys().reduce((t,e)=>(t[e]=this.get(e),t),{})}accumulate(t){return super.accumulate(t)}}class It extends F{logCtx(t,e,r=!1,s){return It.logCtx.call(this,e,s||{},r,...t.filter(t=>void 0!==t))}static logFrom(t,e,r,s){const i=t.context?e.clear().for(t):e.for(t);return s?i.for(s):i}static logCtx(t,e,r=!1,...s){const i=(t,e,r)=>{const s=e.log||j.get();return e.log=t.context?s.clear().for(t):s.for(t),"string"==typeof r?e.for=t=>Object.assign(e,{log:e.log.for(t)}):e.log=e.log.for(r),e};let n=s.pop();const o=n instanceof Rt;if(n&&!o&&(s.push(n),n=void 0),!r&&!o)throw new u("No context provided");if(o&&!r){if(!n)throw new u("Missing context. should be impossible");return i(this,{log:n.logger,ctx:n,ctxArgs:[...s,n]},t)}return async function(...r){if(!this)throw new u("No contextual provided");if(!this.context)throw new u("Invalid contextual provided");return this.context("string"==typeof t?t:t.name,e||{},...r)}.call(this,...[...s,n].filter(Boolean)).then(e=>i(this,{log:e.logger,ctx:e,ctxArgs:[...s,e]},t))}}class $t extends It{constructor(){super(),this._Context=Rt}get Context(){return this._Context}async context(t,e,...r){this.log.for(this.context).debug(`Creating new context for ${"string"==typeof t?t:t.name} operation with flag overrides: ${Object.keys(e)}`);let s=r.pop();return s instanceof Rt||(r.push(s),s=void 0),this.flags,!s||s instanceof this.Context?(new this.Context).accumulate(e):new this.Context(s).accumulate(e)}}class Pt{constructor(){this.observers=[]}count(){return this.observers.length}observe(t,e){if(-1!==this.observers.map(t=>t.observer).indexOf(t))throw new u("Observer already registered");return this.observers.push({observer:t,filter:e}),()=>this.unObserve(t)}unObserve(t){const e=this.observers.map(t=>t.observer).indexOf(t);if(-1===e)throw new u("Failed to find Observer");this.observers.splice(e,1)}async updateObservers(t,e,r,...s){const{log:i,ctxArgs:n}=It.logCtx(this.updateObservers,void 0,!1,...s);(await Promise.allSettled(this.observers.filter(s=>{const{filter:o}=s;if(!o)return!0;try{return o(t,e,r,...n)}catch(t){return i.error(`Failed to filter observer ${s.observer.toString()}: ${t}`),!1}}).map(s=>{s.observer.refresh(t,e,r,...n)}))).forEach((t,e)=>{"rejected"===t.status&&i.error(`Failed to update observable ${this.observers[e].toString()}: ${t.reason}`)})}}class Lt extends u{constructor(t){super(t,Lt.name,500)}}class Ft extends u{constructor(t,e=Ft.name){super(t,e,500)}}class jt extends Ft{constructor(t){super(t,jt.name)}}function Ut(t){if(!t)throw new u("No name provided");return"string"==typeof t?t.replaceAll(".","-"):lt.Symbol(lt.constr(t)).toString().replaceAll(".","-")}async function Mt(t,e=!1){if(!e){const e=[];for(const r of t)e.push(await r());return e}const r=[];for(const e of t)try{r.push({status:"fulfilled",value:await e()})}catch(t){r.push({status:"rejected",reason:t})}return r}function Yt(t,e){const{handler:r,args:s}=lt.get(t,a.REFLECT+a.BLOCK)||{};return!!r&&(r(...s,e)??!1)}async function Gt(t){return t.then(t=>t.default||t)}function Ht(t,e,r,s){const i=async function(...t){let s;try{s=await Promise.resolve(r.call(this,...t))}catch(t){if(t instanceof jt)return;throw t}return Promise.resolve(e.apply(this,s))}.bind(t),n=s||e.name;Object.defineProperty(i,"name",{enumerable:!0,configurable:!0,writable:!1,value:n}),t[n]=i}class zt{generate(t){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,t=>{const e=16*Math.random()|0;return("x"==t?e:3&e|8).toString(16)})}static get instance(){return zt._instance||(zt._instance=new zt),zt._instance}}class qt{constructor(){this.count=14}generate(t){return(""+((t=(t?parseInt(t):0)||0)+1)).padStart(this.count,"0")}static get instance(){return qt._instance||(qt._instance=new qt),qt._instance}}const Wt=ut.flavourResolver.bind(ut);function Qt(t,e,r,s){if(!e)return t;const i=t,n=[],o=[];for(const t of i)"fulfilled"===t.status?n.push(t.value):o.push(t.reason);if(o.length){r.warn(`Bulk ${s} encountered ${o.length} failure(s) while continuing`);const t=new AggregateError(o,`Bulk ${s} failed for ${o.length} item(s)`);throw t.results=i,t}return n}ut.flavourResolver=t=>{try{const e=Wt(t);if(e&&e!==dt)return e;const r="function"==typeof t?t:t?.constructor,s=r&&"function"==typeof lt.registeredFlavour?lt.registeredFlavour(r):void 0;if(s&&s!==dt)return s;const i=Vt._currentFlavour;if(i){const t=Vt._cache?.[i];return t?.flavour?t.flavour:i}}catch(t){return dt}};class Vt extends $t{static{this._cache={}}get config(){return this._config}get alias(){return this._alias||this.flavour}repository(){if(!Vt._baseRepository)throw new u("This should be overridden when necessary. Otherwise it will be replaced lazily");return Vt._baseRepository}async shutdownProxies(t){if(this.proxies){if(t&&!(t in this.proxies))throw new u("No proxy found for "+t);if(t)try{await this.proxies[t].shutdown(),delete this.proxies[t]}catch(e){this.log.error(`Failed to shutdown proxied adapter ${t}: ${e}`)}else for(const t in this.proxies){try{await this.proxies[t].shutdown()}catch(e){this.log.error(`Failed to shutdown proxied adapter ${t}: ${e}`);continue}delete this.proxies[t]}}}async shutdown(...t){const{log:e,ctx:r}=(await this.logCtx(t,St.SHUTDOWN,!0)).for(this.shutdown);await this.shutdownProxies(),this.dispatch&&await this.dispatch.close()}constructor(t,e,r){if(super(),this._config=t,this.flavour=e,this._alias=r,this.alias in Vt._cache)throw new u(`${this.alias} persistence adapter ${this._alias?`(${this.flavour}) `:""} already registered`);Vt._cache[this.alias]=this,this.log.info(`Created ${this.alias} persistence adapter ${this._alias?`(${this.flavour}) `:""} persistence adapter`),Vt._currentFlavour||(this.log.verbose(`Defined ${this.alias} persistence adapter as current`),Vt._currentFlavour=this.alias)}Dispatch(){return new Vt._baseDispatch}ObserverHandler(){return new Pt}isReserved(t){return!t}async initialize(...t){}async Sequence(t,e){return new Vt._baseSequence(t,this,e)}async flags(t,e,r,...s){if("string"==typeof e)throw new u("Model must be a constructor or array of constructors or undefined. this should be impossible");const i=Array.isArray(e)?e.length?e[0]:void 0:e,n=i?H.tableName(i)+" - ":"";r.correlationId=r.correlationId||`${n}${t}-${zt.instance.generate()}`;const o=r.logger||j.for(this);return Object.assign({},Ct,r,{affectedTables:e?[...new Set([...(Array.isArray(e)?e:[e]).filter(Boolean),...r.affectedTables?Array.isArray(r.affectedTables)?r.affectedTables:[r.affectedTables]:[]])]:r.affectedTables,args:s,writeOperation:Tt.includes(t),timestamp:new Date,operation:t,ignoredValidationProperties:e?lt.validationExceptions(Array.isArray(e)&&e[0]?e[0]:e,t):[],logger:o})}get Context(){return Rt}async context(t,e,r,...s){this.log.for(this.context).silly(`creating new context for ${t} operation on ${r?Array.isArray(r)?r.map(t=>H.tableName(t)):H.tableName(r):"no"} table ${e&&Object.keys(e)?Object.keys(e).length:"no"} with flag overrides`);let i=s.pop();void 0===i||i instanceof Rt||(s.push(i),i=void 0),e=i?Object.assign({},i.toOverrides(),e):e;const n=await this.flags("string"==typeof t?t:t.name,r,e,...[...s,i].filter(Boolean));if(i){if(!(i instanceof this.Context)){const t=(new this.Context).accumulate({...i.cache,...n,parentContext:i});return i.accumulate({childContexts:[...i.getOrUndefined("childContexts")||[],t]}),t}const e=i.getOrUndefined("operation"),s=i.getOrUndefined("affectedTables");if(!e||e!==t||r&&r!==s){const t=(new this.Context).accumulate({...i.cache,...n,parentContext:i});return i.accumulate({childContexts:[...i.getOrUndefined("childContexts")||[],t]}),t}return i.accumulate(n)}return(new this.Context).accumulate({...n})}prepare(t,...e){const{log:r}=this.logCtx(e,this.prepare),s=t.segregate(),i=Object.entries(s.model).reduce((e,[r,s])=>{if(void 0===s)return e;const i=H.columnName(t.constructor,r);if(this.isReserved(i))throw new u(`Property name ${i} is reserved`);return e[i]=s,e},{});return t[St.METADATA]&&(r.silly("Passing along persistence metadata for "+t[St.METADATA]),Object.defineProperty(i,St.METADATA,{enumerable:!1,writable:!0,configurable:!0,value:t[St.METADATA]})),{record:i,id:t[H.pk(t.constructor)],transient:s.transient}}revert(t,e,r,s,...i){const{log:n,ctx:o}=this.logCtx(i,this.revert),a=H.pk(e),c=new e;c[a]=r,n.silly(`Rebuilding model ${c.constructor.name} id ${r}`);const l=t[St.METADATA],d=Object.keys(c).filter(t=>t!==a).reduce((r,s)=>(r[s]=t[H.columnName(e,s)],r),c);return o.get("rebuildWithTransient")&&s&&(n.verbose("re-adding transient properties: "+Object.keys(s).join(", ")),Object.entries(s).forEach(([t,e])=>{if(t in d&&void 0!==d[t])throw new u(`Transient property ${t} already exists on model ${c.constructor.name}. should be impossible`);d[t]=e})),l&&(n.silly(`Passing along ${this.flavour} persistence metadata for ${c.constructor.name} id ${r}: ${l}`),Object.defineProperty(d,St.METADATA,{enumerable:!1,configurable:!0,writable:!0,value:l})),d}async createAll(t,e,r,...s){const{log:i,ctx:n}=this.logCtx(s,this.createAll);if(!e||!r)throw new d("Ids and models cannot be null or undefined");if(e.length!==r.length)throw new d("Ids and models must have the same length");const o=H.tableName(t);i.debug(`Creating ${e.length} entries ${o} table`);const a=!(n.get("breakOnSingleFailureInBulk")??1),l=e.map((e,i)=>()=>this.create(t,e,r[i],...s,n.override({noEmitSingle:!0})));return Qt(a?await Mt(l,!0):await Mt(l),a,i,c.CREATE_ALL)}async readAll(t,e,...r){const{log:s,ctx:i}=this.logCtx(r,this.readAll),n=H.tableName(t);s.debug(`Reading ${e.length} entries ${n} table`);const o=!(i.get("breakOnSingleFailureInBulk")??1),a=e.map(e=>()=>this.read(t,e,...r,i.override({noEmitSingle:!0})));return Qt(o?await Mt(a,!0):await Mt(a),o,s,c.READ_ALL)}async updateAll(t,e,r,...s){const{log:i,ctx:n}=this.logCtx(s,this.updateAll);if(e.length!==r.length)throw new u("Ids and models must have the same length");const o=H.tableName(t);i.debug(`Updating ${e.length} entries ${o} table`);const a=!(n.get("breakOnSingleFailureInBulk")??1),l=e.map((e,i)=>()=>this.update(t,e,r[i],...s,n.override({noEmitSingle:!0})));return Qt(a?await Mt(l,!0):await Mt(l),a,i,c.UPDATE_ALL)}async deleteAll(t,e,...r){const{log:s,ctx:i}=this.logCtx(r,this.deleteAll);s.debug(`Deleting ${e.length} entries from ${t} table`);const n=!(i.get("breakOnSingleFailureInBulk")??1),o=e.map(e=>()=>this.delete(t,e,...r,i.override({noEmitSingle:!0})));return Qt(n?await Mt(o,!0):await Mt(o),n,s,c.DELETE_ALL)}observe(t,e){this.observerHandler||Object.defineProperty(this,"observerHandler",{value:this.ObserverHandler(),writable:!1}),this.observerHandler.observe(t,e);const r=this.log.for(this.observe);return r.silly("Registering new observer "+t.toString()),this.dispatch||(r.verbose("Creating dispatch for "+this.alias),this.dispatch=this.Dispatch(),this.dispatch.observe(this)),()=>this.unObserve(t)}unObserve(t){if(!this.observerHandler)throw new u("ObserverHandler not initialized. Did you register any observables?");this.observerHandler.unObserve(t),this.log.for(this.unObserve).debug(`Observer ${t.toString()} removed`)}async updateObservers(t,e,r,...s){if(!this.observerHandler)throw new u("ObserverHandler not initialized. Did you register any observables?");const{ctx:i,ctxArgs:n}=this.logCtx(s,this.updateObservers);if(!i.get("noEmit")){const s=Array.isArray(r),o=!i.get("noEmitSingle"),a=!i.get("noEmitBulk");(s&&a||!s&&o)&&await this.observerHandler.updateObservers(t,e,r,...n)}}async refresh(t,e,r,...s){return this.updateObservers(t,e,r,...s)}toString(){return this.flavour+" adapter"}static flavourOf(t){return lt.flavourOf(t)}static get currentFlavour(){if(!Vt._currentFlavour)throw new u("No persistence flavour set. Please initialize your adapter");return Vt._currentFlavour}static get current(){return Vt.get(this.currentFlavour)}static get(t){if(!t)return Vt.get(this._currentFlavour);if(t in this._cache)return this._cache[t];throw new u(`No Adapter registered under ${t}.`)}static setCurrent(t){this._currentFlavour=t}static models(t){try{return lt.flavouredAs(t).filter(H.isModel)}catch(t){throw new u(t)}}static decoration(){}get client(){return this._client||(this._client=this.getClient()),this._client}for(t,...e){this.proxies||(this.proxies={});const r=`${this.alias} - ${z(t)}`;if(r in this.proxies)return this.proxies[r];let s;const i=new Proxy(this,{get:(e,r,i)=>{if("_config"===r){const s=Reflect.get(e,r,i);return Object.assign({},s,t)}return"_client"===r?s:Reflect.get(e,r,i)},set:(t,e,r,i)=>"_client"===e?(s=r,!0):Reflect.set(t,e,r,i)});return this.proxies[r]=i,i}migrations(){return lt.migrationsFor(this)}async getQueryRunner(){return this}logCtx(t,e,r=!1,s){return super.logCtx(t,e,r,s)}}i([U(),n("design:type",Function),n("design:paramtypes",[String]),n("design:returntype",Promise)],Vt.prototype,"shutdownProxies",null),i([U(),n("design:type",Function),n("design:paramtypes",[Object,Object,Object,Rt]),n("design:returntype",Promise)],Vt.prototype,"context",null),i([U(),n("design:type",Function),n("design:paramtypes",[Object,Function]),n("design:returntype",Function)],Vt.prototype,"observe",null),i([U(),n("design:type",Function),n("design:paramtypes",[Object]),n("design:returntype",void 0)],Vt.prototype,"unObserve",null),i([U(),n("design:type",Object),n("design:paramtypes",[])],Vt.prototype,"client",null);class Jt extends u{constructor(t){super(t,Jt.name,500)}}class Xt extends u{constructor(t){super(t,Xt.name,500)}}class Kt extends H{constructor(t,e,r){super(),this.attr1=void 0,this.operator=void 0,this.comparison=void 0,e||r?(this.attr1=t,this.operator=e,this.comparison=r):H.fromModel(this,t)}and(t){return Kt.and(this,t)}or(t){return Kt.or(this,t)}not(t){return new Kt(this,At.NOT,t)}hasErrors(...t){const e=()=>{const t=`Invalid operator ${this.operator}}`;if("string"==typeof this.attr1){if(this.comparison instanceof Kt)return{comparison:{condition:"Both sides of the comparison must be of the same type"}};if(-1===Object.values(At).indexOf(this.operator))return{operator:{condition:t}};if(this.operator===At.BETWEEN&&(!Array.isArray(this.comparison)||2!==this.comparison.length))return{comparison:{condition:"BETWEEN operator requires an array with exactly 2 values [min, max]"}}}if(this.attr1 instanceof Kt){if(!(this.comparison instanceof Kt)&&this.operator!==At.NOT)return{comparison:{condition:t}};if(-1===Object.values(xt).indexOf(this.operator)&&this.operator!==At.NOT)return{operator:{condition:t}}}},r=super.hasErrors(...t);return this.isAsync()?(async()=>await Promise.resolve(r)??e())():r??e()}static and(t,e){return Kt.group(t,xt.AND,e)}static or(t,e){return Kt.group(t,xt.OR,e)}static group(t,e,r){return new Kt(t,e,r)}static attribute(t){return(new Kt.Builder).attribute(t)}static attr(t){return this.attribute(t)}static{this.Builder=class{constructor(){this.attr1=void 0,this.operator=void 0,this.comparison=void 0}attribute(t){return this.attr1=t,this}attr(t){return this.attribute(t)}eq(t){return this.setOp(At.EQUAL,t)}dif(t){return this.setOp(At.DIFFERENT,t)}gt(t){return this.setOp(At.BIGGER,t)}lt(t){return this.setOp(At.SMALLER,t)}gte(t){return this.setOp(At.BIGGER_EQ,t)}lte(t){return this.setOp(At.SMALLER_EQ,t)}in(t){return this.setOp(At.IN,t)}regexp(t){return this.setOp(At.REGEXP,RegExp(t).source)}startsWith(t){return this.setOp(At.STARTS_WITH,t)}endsWith(t){return this.setOp(At.ENDS_WITH,t)}between(t,e){return this.setOp(At.BETWEEN,[t,e])}setOp(t,e){return this.operator=t,this.comparison=e,this.build()}build(){try{return new Kt(this.attr1,this.operator,this.comparison)}catch(t){throw new Jt(t)}}}}static builder(){return new Kt.Builder}static from(t){return new Kt(t)}}var Zt,te;i([q(),n("design:type",Object)],Kt.prototype,"attr1",void 0),i([q(),n("design:type",String)],Kt.prototype,"operator",void 0),i([q(),n("design:type",Object)],Kt.prototype,"comparison",void 0),(t=>{t.ASC="asc",t.DSC="desc"})(Zt||(Zt={})),(t=>{t.CASCADE="cascade",t.NONE="none"})(te||(te={}));const ee={update:te.CASCADE,delete:te.NONE},re={Equals:(t,e)=>Kt.attribute(t).eq(e),Diff:(t,e)=>Kt.attribute(t).dif(e),LessThan:(t,e)=>Kt.attribute(t).lt(e),LessThanEqual:(t,e)=>Kt.attribute(t).lte(e),GreaterThan:(t,e)=>Kt.attribute(t).gt(e),GreaterThanEqual:(t,e)=>Kt.attribute(t).gte(e),In:(t,e)=>Kt.attribute(t).in(e),Matches:(t,e)=>Kt.attribute(t).regexp(e)},se=t=>t.charAt(0).toLowerCase()+t.slice(1);class ie extends F{static get log(){return this._logger||(this._logger=j.for(ie.name)),this._logger}static{this.prefixMap={[vt.FIND_BY]:"find",[vt.PAGE_BY]:"page",[vt.COUNT_BY]:"count",[vt.SUM_BY]:"sum",[vt.AVG_BY]:"avg",[vt.MIN_BY]:"min",[vt.MAX_BY]:"max",[vt.DISTINCT_BY]:"distinct",[vt.GROUP_BY_PREFIX]:"group"}}static getActionFromMethodName(t){for(const[e,r]of Object.entries(this.prefixMap))if(t.startsWith(e))return{action:r,prefix:e}}static build(t,...e){const r=this.getActionFromMethodName(t);if(!r)throw Error("Unsupported method "+t);const{action:s,prefix:i}=r;let n;["count","sum","avg","min","max","distinct","group"].includes(s)&&(n=this.extractAggregationSelector(t,i));const o=this.extractCore(t,i),a=this.extractSelect(t),c=this.extractGroupBy(t),l=this.buildWhere(o,e),{orderBy:u,limit:d,offset:h}=this.extractOrderLimitOffset(t,e,o);return{action:s,select:a,selector:n,where:l,groupBy:c,orderBy:u,limit:d,offset:h}}static extractAggregationSelector(t,e){const r=t.substring(e.length),s=r.match(/(And|Or|GroupBy|OrderBy|Select|Limit|Offset|ThenBy)/),i=s?r.substring(0,s.index):r;return i?se(i):void 0}static extractCore(t,e=vt.FIND_BY){const r=t.substring(e.length);if(e!==vt.FIND_BY&&e!==vt.PAGE_BY){const t=r.match(/(And|Or|GroupBy|OrderBy|ThenBy|Select|Limit|Offset)/);if(!t)return"";if("And"===t[0]||"Or"===t[0]){const e=r.substring(t.index+t[0].length),s=e.match(/(Then[A-Z]|OrderBy|GroupBy|Limit|Offset|Select|ThenBy)/);return s?e.substring(0,s.index):e}return""}const s=r.match(/(Then[A-Z]|OrderBy|GroupBy|Limit|Offset|Select)/);return s?r.substring(0,s.index):r}static getFieldsFromMethodName(t){const e=this.getActionFromMethodName(t),r=e?.prefix||vt.FIND_BY,s=this.extractCore(t,r);return s?(s.split(/OrderBy|GroupBy/)[0]||"").split(/And|Or/).filter(t=>t.length>0).map(t=>{const{operator:e,field:r}=this.parseFieldAndOperator(t);return r+(e??"")}):[]}static extractSelect(t){const e=t.indexOf(vt.SELECT);if(-1===e)return;const r=t.substring(e+vt.SELECT.length),s=r.match(/(Then[A-Z]|OrderBy|GroupBy|Limit|Offset)/);return(s?r.substring(0,s.index):r).split(vt.AND).map(se).filter(Boolean)}static extractGroupBy(t){const e=t.indexOf(vt.GROUP_BY);if(-1!==e)return t.substring(e+vt.GROUP_BY.length).split(vt.ORDER_BY)[0].split(vt.THEN_BY).map(se).filter(Boolean);const r=this.getActionFromMethodName(t);if("group"===r?.action){const e=t.substring(r.prefix.length),s=e.indexOf(vt.THEN_BY);if(-1===s)return;const i=e.substring(s+vt.THEN_BY.length).split(vt.THEN_BY),n=[];for(const t of i){const e=t.match(/(OrderBy|Limit|Offset|Select)/),r=e?t.substring(0,e.index):t;r&&n.push(se(r))}return n.length>0?n:void 0}}static buildWhere(t,e){if(!t)return;const r=t.split(/OrderBy|GroupBy/)[0]||"";if(!r)return;const s=r.split(/And|Or/).filter(t=>t.length>0);if(0===s.length)return;const i=t.match(/And|Or/g)||[];let n;return s.forEach((t,r)=>{const{field:s,operator:o}=this.parseFieldAndOperator(t),a=o?re[o]:re.Equals;if(!a)throw Error("Unsupported operator "+o);const c=e[r];if(void 0===c)throw Error("Invalid value for field "+s);const l=a(s,c);n=0===r?l:i[r-1]===vt.AND?n.and(l):n.or(l)}),n}static parseFieldAndOperator(t){for(const e of Object.keys(re))if(t.endsWith(e)){const r=t.slice(0,-e.length);return{field:se(r),operator:e}}return{field:se(t)}}static extractOrderByField(t){const e=t.match(/OrderBy(.+)$/);if(!e)return;const r=e[1];return r.charAt(0).toLowerCase()+r.slice(1)}static getProperlyOrderByOrThrow(t,e){const r=ie.log.for(this.getProperlyOrderByOrThrow);if(e||t){if(e&&!t)throw new Jt("Expected OrderBy clause, but no sortable field was found in method name.");if(e||!t){if(!Object.values(Zt).includes(e))throw new Jt(`Invalid OrderBy direction ${e}. Expected one of: ${Object.values(Zt).join(", ")}.`);return[[t,e]]}r.debug("Ignoring OrderBy clause because direction is undefined.")}}static extractOrderLimitOffset(t,e,r){const s=r??this.extractCore(t),i=s?s.split(/And|Or/).filter(t=>t.length>0).length:0,n=e.slice(i)??[];let o,a,c;if(n.at(-1)instanceof l&&n.pop(),n.length>=1){const e=n[0],r=this.extractOrderByField(t);o=this.getProperlyOrderByOrThrow(r,e)}return 2>n.length||"number"!=typeof n[1]||(a=n[1]),3>n.length||"number"!=typeof n[2]||(c=n[2]),{orderBy:o,limit:a,offset:c}}}function ne(){return(t,e)=>{const r=lt.key(St.DEFAULT_QUERY_ATTR);let s=lt.get(t.constructor,r)||[];return s=[...new Set([...s,e])],ht(gt(r,s))(t,e)}}function oe(){return ut.for(St.STATEMENT).define({decorator:()=>(t,e,r)=>ht(pt(lt.key(St.STATEMENT,e),!0))(t,e,r),args:[]}).apply()}function ae(t={}){return ut.for(St.QUERY).define({decorator:t=>(e,r,s)=>{const i=ie.getFieldsFromMethodName(r);return ht(pt(lt.key(St.QUERY,r),{...t,fields:i}),oe(),(t=>(e,r,s)=>{s.value=new Proxy(s.value,{apply(e,r,s){const{action:i,select:n,selector:o,where:a,groupBy:c,orderBy:l,limit:u,offset:d}=ie.build(e.name,...s),h=r;let p;switch(i){case"find":case"page":p=h.select(n);break;case"count":p=h.count(o);break;case"sum":p=h.sum(o);break;case"avg":p=h.avg(o);break;case"min":p=h.min(o);break;case"max":p=h.max(o);break;case"distinct":p=h.distinct(o);break;case"group":p=h.select(),o&&(p=p.groupBy(o));break;default:throw new Jt("Unsupported action: "+i)}if(a&&(p=p.where(a)),c&&c.length>0&&"group"!==i){p=p.groupBy(c[0]);for(let t=1;t<c.length;t++)p=p.thenBy(c[t])}else if(c&&c.length>0&&"group"===i)for(const t of c)p=p.thenBy(t);const{allowLimit:g,allowOffset:f,allowOrderBy:y,throws:m}={allowLimit:!0,allowOrderBy:!0,allowOffset:!0,throws:!0,...t},w=[{key:"orderBy",value:(l||[])[0],allowed:y},{key:"limit",value:u,allowed:g},{key:"offset",value:d,allowed:f}];for(const t of w)if(void 0!==t.value){if(!t.allowed&&m)throw new Jt(t.key[0].toUpperCase()+t.key.slice(1)+" is not allowed for this query");t.allowed&&(p=p[t.key](t.value))}if("page"===i){const t=s[s.length-1],e="number"==typeof t?t:t?.limit??10;return p.paginate(e)}return p.execute()}})})(t))(e,r,s)},args:[t]}).apply()}function ce(t,e,r){return(s,i)=>{const n=r?.name||((t,e,r)=>{const s=(lt.get(t.constructor,e)||{})[r]||{};return Object.keys(s).length+1+""})(s,t,i),o=lt.key(t,i,n),a={...r||{},kind:e,attribute:i};return gt(o,a)(s,i)}}function le(t){return ut.for(At.VIEW).define({decorator:t=>ce(At.VIEW,"view",t),args:[t]}).apply()}function ue(t){return ye(t,[a.CREATE,c.CREATE_ALL])}function de(t){return ye(t,[a.UPDATE,c.UPDATE_ALL])}function he(t){return ye(t,[a.DELETE,c.DELETE_ALL])}function pe(t){return ye(t,Tt)}function ge(t){return ye(t,Object.values(a))}function fe(t){return ye(t,Object.values(c))}function ye(t,e){return(r,s,i,...n)=>{if("string"==typeof t)throw new u("clazz cannot be string. This should be impossible");const{log:o}=It.prototype.logCtx(n,ye);return o.silly(`filtering ${s} event for${r?" "+(H.tableName(r)||r):""} ${i}`),("string"==typeof r?r===H.tableName(t)||r===t.constructor.name:lt.constr(t)===lt.constr(r))&&e.includes(s)}}const me={onlyOnCreate:ue,onlyOnUpdate:de,onlyOnDelete:he,onlyOnTransactional:pe,onlyOnSingle:ge,onlyOnBulk:fe};function we(t){const e=Object.assign({},me);return Object.entries(e).forEach(([r,s])=>{e[r]=s(t.class)}),e}var be,ve,Ae,xe,Ee,Se,Oe,Ce,Te,Ne,ke;class _e extends h{static{this._cache={}}get log(){return this.logger||(this.logger=this.adapter.log.for(this.toString())),this.logger}get adapter(){if(!this._adapter)throw new u("No adapter found for this repository. did you use the @uses decorator or pass it in the constructor?");return this._adapter}get tableName(){return this._tableName||(this._tableName=H.tableName(this.class)),this._tableName}get pkProps(){return super.pkProps}get filters(){return we(this)}constructor(t,e,...r){super(e),this.observers=[],this._overrides={ignoreHandlers:!1,ignoreValidation:!1,allowGenerationOverride:!1,allowRawStatements:!0,forcePrepareSimpleQueries:!1,forcePrepareComplexQueries:!1,ignoreDevSafeGuards:!1,mergeForUpdate:!0,applyUpdateValidation:!0},t&&(this._adapter=t),e&&(_e.register(e,this,this.adapter.alias),t)&&lt.get(e,ft.FLAVOUR)===dt&&yt(t.flavour)(e);const s=this;[this.createAll,this.readAll,this.deleteAll].forEach(t=>{const e=t.name;p(s,s[e+"Prefix"],t,s[e+"Suffix"])}),g(s,s[this.updateAll.name+"Prefix"],this.updateAll,s[this.updateAll.name+"Suffix"])}logCtx(t,e,r=!1,s){const i=this.adapter.logCtx([this.class,...t],e,r,Object.assign({},s||{},this._overrides||{}));function n(t){return t.ctxArgs.shift(),t}return i instanceof Promise?i.then(n):n(i)}override(t){return new Proxy(this,{get:(e,r,s)=>{const i=Reflect.get(e,r,s);return"_overrides"!==r?i:Object.assign({},i,t)}})}for(t,...e){return new Proxy(this,{get:(r,s,i)=>"adapter"===s?this.adapter.for(t,...e):Reflect.get(r,s,i)})}ObserverHandler(){return new Pt}async createPrefix(t,...e){const{ctx:r,ctxArgs:s,log:i}=(await this.logCtx(e,a.CREATE,!0)).for(this.createPrefix),n=r.get("ignoreHandlers"),o=r.get("ignoreValidation");if(i.silly(`handlerSetting: ${n}, validationSetting: ${o}`),t=new this.class(t),n||await f(this,r,t,a.CREATE,a.ON),!o){const e=r.get("ignoredValidationProperties")||[];i.silly("ignored validation properties: "+e);const s=await Promise.resolve(t.hasErrors(...e));if(s)throw new d(s.toString())}return[t,...s]}async create(t,...e){const{ctx:r,log:s,ctxArgs:i}=this.logCtx(e,this.create);s.debug(`Creating new ${this.class.name} in table ${H.tableName(this.class)}`);let{record:n,id:o,transient:a}=this.adapter.prepare(t,r);return n=await this.adapter.create(this.class,o,n,...i),this.adapter.revert(n,this.class,o,a,r)}async createAll(t,...e){if(!t.length)return t;const{ctx:r,log:s,ctxArgs:i}=this.logCtx(e,this.createAll);s.debug(`Creating ${t.length} new ${this.class.name} in table ${H.tableName(this.class)}`);const n=t.map(t=>this.adapter.prepare(t,r)),o=n.map(t=>t.id);let a=n.map(t=>t.record);return a=await this.adapter.createAll(this.class,o,a,...i),a.map((t,e)=>this.adapter.revert(t,this.class,o[e],r.get("rebuildWithTransient")?n[e].transient:void 0,r))}async createAllPrefix(t,...e){const{ctx:r,ctxArgs:s,log:i}=(await this.logCtx(e,c.CREATE_ALL,!0)).for(this.createAllPrefix),n=r.get("ignoreHandlers"),o=r.get("ignoreValidation");if(i.silly(`handlerSetting: ${n}, validationSetting: ${o}`),!t.length)return[t,...s];const l=H.sequenceFor(t[0]);let h=[];if(H.generatedBySequence(this.class)?(l.name||(l.name=H.sequenceName(t[0],"pk")),h=await(await this.adapter.Sequence(l,this._overrides)).range(t.length,...s)):H.generated(this.class,this.pk)||(h=t.map((t,e)=>{if(void 0===t[this.pk])throw new u("Primary key is not defined for model in position "+e);return t[this.pk]})),t=await Promise.all(t.map(async(t,e)=>(t=new this.class(t),l.type&&(t[this.pk]="String"!==l.type||l.generated?h[e]:""+t[this.pk]),n||await f(this,r,t,a.CREATE,a.ON),t))),!o){const e=r.get("ignoredValidationProperties")||[];i.silly("ignored validation properties: "+e);const s=await Promise.all(t.map(t=>Promise.resolve(t.hasErrors(...e)))),n=y(s);if(n)throw new d(n)}return[t,...s]}async readPrefix(t,...e){const{ctx:r,ctxArgs:s,log:i}=(await this.logCtx(e,a.READ,!0)).for(this.readPrefix),n=r.get("ignoreHandlers");i.silly("handlerSetting: "+n);const o=new this.class;return o[this.pk]=t,n||await f(this,r,o,a.READ,a.ON),[t,...s]}async read(t,...e){const{ctx:r,log:s,ctxArgs:i}=this.logCtx(e,this.read);s.debug(`reading ${this.class.name} from table ${H.tableName(this.class)} with pk ${this.pk}`);const n=await this.adapter.read(this.class,t,...i);return this.adapter.revert(n,this.class,t,void 0,r)}async readAllPrefix(t,...e){const{ctx:r,ctxArgs:s,log:i}=(await this.logCtx(e,c.READ_ALL,!0)).for(this.readAllPrefix),n=r.get("ignoreHandlers");return i.silly("handlerSetting: "+n),n||await Promise.all(t.map(async t=>{const e=new this.class;return e[this.pk]=t,f(this,r,e,a.READ,a.ON)})),[t,...s]}async readAll(t,...e){const{ctx:r,log:s,ctxArgs:i}=this.logCtx(e,this.readAll);return s.debug(`reading ${t.length} ${this.class.name} in table ${H.tableName(this.class)}`),(await this.adapter.readAll(this.class,t,...i)).map((e,s)=>this.adapter.revert(e,this.class,t[s],void 0,r))}async update(t,...e){const{ctxArgs:r,log:s,ctx:i}=this.logCtx(e,this.update);let{record:n,id:o,transient:a}=this.adapter.prepare(t,i);return s.debug(`updating ${this.class.name} in table ${H.tableName(this.class)} with id ${o}`),n=await this.adapter.update(this.class,o,n,...r),this.adapter.revert(n,this.class,o,a,i)}async updatePrefix(t,...e){const{ctx:r,ctxArgs:s,log:i}=(await this.logCtx(e,a.UPDATE,!0)).for(this.updatePrefix),n=r.get("ignoreHandlers"),o=r.get("ignoreValidation");i.silly(`handlerSetting: ${n}, validationSetting: ${o}`);const c=t[this.pk];if(!c)throw new u("No value for the Id is defined under the property "+this.pk);let l;if(r.get("applyUpdateValidation")&&(l=await this.read(c,r),r.get("mergeForUpdate")&&(t=H.merge(l,t,this.class))),n||await f(this,r,t,a.UPDATE,a.ON,l),!o){const e=r.get("ignoredValidationProperties")||[];i.silly("ignored validation properties: "+e);const s=await Promise.resolve(t.hasErrors(l,...e));if(s)throw new d(s.toString())}return[t,...s,l]}async updateAll(t,...e){const{ctx:r,log:s,ctxArgs:i}=this.logCtx(e,this.updateAll);s.verbose(`Updating ${t.length} new ${this.class.name} in table ${H.tableName(this.class)}`);const n=t.map(t=>this.adapter.prepare(t,r));return(await this.adapter.updateAll(this.class,n.map(t=>t.id),n.map(t=>t.record),...i)).map((t,e)=>this.adapter.revert(t,this.class,n[e].id,r.get("rebuildWithTransient")?n[e].transient:void 0,r))}async updateAllPrefix(t,...e){const{ctx:r,ctxArgs:s,log:i}=(await this.logCtx(e,c.UPDATE_ALL,!0)).for(this.updateAllPrefix),n=r.get("ignoreHandlers"),o=r.get("ignoreValidation");i.silly(`handlerSetting: ${n}, ignoredValidation: ${o}`);const l=t.map(t=>{const e=t[this.pk];if(!e)throw new u("missing id on update operation");return e});let h;if(r.get("applyUpdateValidation")&&(h=await this.readAll(l,r),r.get("mergeForUpdate")&&(t=t.map((t,e)=>H.merge(h[e],t,this.class)))),n||await Promise.all(t.map((t,e)=>f(this,r,t,a.UPDATE,a.ON,h?h[e]:void 0))),!o){const e=r.get("ignoredValidationProperties")||[];let s;i.silly("ignored validation properties: "+e),s=r.get("applyUpdateValidation")?await Promise.all(t.map((t,r)=>Promise.resolve(t.hasErrors(h[r],...e)))):await Promise.resolve(t.map(t=>t.hasErrors(...e)));const n=y(s);if(n)throw new d(n)}return[t,...s,h]}async deletePrefix(t,...e){const{ctx:r,ctxArgs:s,log:i}=(await this.logCtx(e,a.DELETE,!0)).for(this.deletePrefix),n=r.get("ignoreHandlers");if(i.silly("handlerSetting: "+n),!n){const e=await this.read(t,...s);await f(this,r,e,a.DELETE,a.ON)}return[t,...s]}async delete(t,...e){const{ctx:r,log:s,ctxArgs:i}=this.logCtx(e,this.delete);s.debug(`deleting new ${this.class.name} in table ${H.tableName(this.class)} with pk ${t}`);const n=await this.adapter.delete(this.class,t,...i);return this.adapter.revert(n,this.class,t,void 0,r)}async deleteAllPrefix(t,...e){const{ctx:r,ctxArgs:s,log:i}=(await this.logCtx(e,c.DELETE_ALL,!0)).for(this.deleteAllPrefix),n=r.get("ignoreHandlers");if(i.silly("handlerSetting: "+n),!n){const e=await this.readAll(t,...s);await Promise.all(e.map(async t=>f(this,r,t,a.DELETE,a.ON)))}return[t,...s]}async deleteAll(t,...e){const{ctx:r,log:s,ctxArgs:i}=this.logCtx(e,this.create);return s.debug(`deleting ${t.length} ${this.class.name} in table ${H.tableName(this.class)}`),(await this.adapter.deleteAll(this.class,t,...i)).map((e,s)=>this.adapter.revert(e,this.class,t[s],void 0,r))}select(t){return this.adapter.Statement(this._overrides).select(t).from(this.class)}count(t){return this.adapter.Statement(this._overrides).count(t).from(this.class)}min(t){return this.adapter.Statement(this._overrides).min(t).from(this.class)}max(t){return this.adapter.Statement(this._overrides).max(t).from(this.class)}sum(t){return this.adapter.Statement(this._overrides).sum(t).from(this.class)}avg(t){return this.adapter.Statement(this._overrides).avg(t).from(this.class)}distinct(t){return this.adapter.Statement(this._overrides).distinct(t).from(this.class)}async query(t,e,r=Zt.ASC,s,i,...n){const{ctxArgs:o}=(await this.logCtx(n,St.QUERY,!0)).for(this.query),a=[e,r],c=this.select().where(t).orderBy(a);return s&&c.limit(s),i&&c.offset(i),c.execute(...o)}async listBy(t,e,...r){const{log:s,ctxArgs:i}=(await this.logCtx(r,Et.LIST_BY,!0)).for(this.listBy);return s.verbose(`listing ${H.tableName(this.class)} by ${t} ${e}`),this.select().orderBy([t,e]).execute(...i)}async paginateBy(t,e,r={offset:1,limit:10},...s){const i=r.offset||1,{offset:n,bookmark:o,limit:a}=r;if(!n&&!o)throw new Jt("PaginateBy needs a page or a bookmark");const{log:c,ctx:l,ctxArgs:u}=(await this.logCtx(s,Et.PAGE_BY,!0)).for(this.paginateBy);let d;if(c.verbose(`paginating ${H.tableName(this.class)} with page size ${a}`),o&&l.get("paginateByBookmark"))d=await this.override({forcePrepareComplexQueries:!1,forcePrepareSimpleQueries:!1}).select().where((()=>e===Zt.ASC?this.attr(H.pk(this.class)).gt(o):this.attr(H.pk(this.class)).lt(o))()).orderBy([t,e]).paginate(a,...u);else{if(!n)throw new Jt("PaginateBy needs a page or a bookmark");d=await this.override({forcePrepareComplexQueries:!1,forcePrepareSimpleQueries:!1}).select().orderBy([t,e]).paginate(a,...u)}const h=await d.page(i,o,...u);return d.serialize(h)}async find(t,e=Zt.ASC,...r){if("string"!=typeof t)throw new Jt("Find value must be a string");const s=this.getDefaultQueryAttributes(),i=this.buildDefaultStartsWithCondition(t,s),{log:n,ctxArgs:o}=(await this.logCtx(r,Et.FIND,!0)).for(this.find);return n.verbose(`finding ${H.tableName(this.class)} by default attributes ${s.join(", ")}`),this.select().where(i).orderBy([s[0],e]).execute(...o)}async page(t,e=Zt.ASC,r={offset:1,limit:10},...s){if("string"!=typeof t)throw new Jt("Page value must be a string");const i=r.offset||1,{offset:n,bookmark:o,limit:a}=r;if(!n&&!o)throw new Jt("PaginateBy needs a page or a bookmark");const c=this.getDefaultQueryAttributes(),l=this.buildDefaultStartsWithCondition(t,c),{log:u,ctx:d,ctxArgs:h}=(await this.logCtx(s,Et.PAGE,!0)).for(this.page);u.verbose(`paging ${H.tableName(this.class)} by default attributes ${c.join(", ")}`);const p=a??10,g=c[0],f=this.override({forcePrepareComplexQueries:!1,forcePrepareSimpleQueries:!1});let y;if(o&&d.get("paginateByBookmark")){const t=H.pk(this.class),r=e===Zt.ASC?this.attr(t).gt(o):this.attr(t).lt(o);y=await f.select().where(l.and(r)).orderBy([g,e]).paginate(p,...h)}else{if(!n)throw new Jt("PaginateBy needs a page or a bookmark");y=await f.select().where(l).orderBy([g,e]).paginate(p,...h)}const m=await y.page(i,o,...h);return y.serialize(m)}async findOneBy(t,e,...r){const{log:s,ctxArgs:i}=(await this.logCtx(r,Et.FIND_ONE_BY,!0)).for(this.findOneBy);s.verbose(`finding ${H.tableName(this.class)} with ${t} ${e}`);const n=await this.select().where(this.attr(t).eq(e)).limit(1).execute(...i);if(!n.length)throw new m("No results found");return n[0]}async findBy(t,e,...r){const{log:s,ctxArgs:i}=(await this.logCtx(r,Et.FIND_BY,!0)).for(this.findBy);return s.verbose(`finding ${H.tableName(this.class)} with ${t} ${e}`),this.select().where(this.attr(t).eq(e)).execute(...i)}async countOf(t,...e){const{log:r,ctxArgs:s}=(await this.logCtx(e,Et.COUNT_OF,!0)).for(this.countOf);return r.verbose(`counting ${H.tableName(this.class)}${t?" by "+t:""}`),this.count(t).execute(...s)}async maxOf(t,...e){const{log:r,ctxArgs:s}=(await this.logCtx(e,Et.MAX_OF,!0)).for(this.maxOf);return r.verbose(`finding max of ${t} in ${H.tableName(this.class)}`),this.max(t).execute(...s)}async minOf(t,...e){const{log:r,ctxArgs:s}=(await this.logCtx(e,Et.MIN_OF,!0)).for(this.minOf);return r.verbose(`finding min of ${t} in ${H.tableName(this.class)}`),this.min(t).execute(...s)}async avgOf(t,...e){const{log:r,ctxArgs:s}=(await this.logCtx(e,Et.AVG_OF,!0)).for(this.avgOf);return r.verbose(`calculating average of ${t} in ${H.tableName(this.class)}`),this.avg(t).execute(...s)}async sumOf(t,...e){const{log:r,ctxArgs:s}=(await this.logCtx(e,Et.SUM_OF,!0)).for(this.sumOf);return r.verbose(`calculating sum of ${t} in ${H.tableName(this.class)}`),this.sum(t).execute(...s)}async distinctOf(t,...e){const{log:r,ctxArgs:s}=(await this.logCtx(e,Et.DISTINCT_OF,!0)).for(this.distinctOf);return r.verbose(`finding distinct values of ${t} in ${H.tableName(this.class)}`),this.distinct(t).execute(...s)}async groupOf(t,...e){const{log:r,ctxArgs:s}=(await this.logCtx(e,Et.GROUP_OF,!0)).for(this.groupOf);return r.verbose(`grouping ${H.tableName(this.class)} by ${t}`),this.select().groupBy(t).execute(...s)}async statement(t,...e){if(!_e.statements(this,t))throw new Jt("Invalid prepared statement requested "+t);const{log:r,ctxArgs:s}=(await this.logCtx(e,St.STATEMENT,!0)).for(this.statement);return r.verbose("Executing prepared statement "+t),this[t](...s)}getDefaultQueryAttributes(){const t=H.defaultQueryAttributes(this.class);if(!t||!t.length)throw new Jt("No default query attributes defined for "+H.tableName(this.class));return t}buildDefaultStartsWithCondition(t,e){if("string"!=typeof t)throw new Jt("Default query value must be a string");let r;for(const s of e){const e=this.attr(s).startsWith(t);r=r?r.or(e):e}if(!r)throw new Jt("No default query attributes available for "+H.tableName(this.class));return r}attr(t){return Kt.attr(t)}observe(t,e){this.observerHandler||Object.defineProperty(this,"observerHandler",{value:this.ObserverHandler(),writable:!1});const r=this.log.for(this.observe),s=this.class.name;return this.adapter.observe(this,(t,e,r,...i)=>"string"==typeof t?t===s:lt.constr(t)===lt.constr(this.class)),r.verbose(`now observing ${this.adapter} filtering on table === ${s}`),this.observerHandler.observe(t,e),r.verbose("Registered new observer "+t.toString()),()=>this.unObserve(t)}unObserve(t){if(!this.observerHandler)throw new u("ObserverHandler not initialized. Did you register any observables?");this.observerHandler.unObserve(t),this.log.for(this.unObserve).verbose(`Observer ${t.toString()} removed`),this.observerHandler.count()||(this.log.verbose(`No more observers registered for ${this.adapter}, unsubscribing`),this.adapter.unObserve(this),this.log.verbose("No longer observing adapter "+this.adapter.flavour))}async updateObservers(t,e,r,...s){if(!this.observerHandler)throw new u("ObserverHandler not initialized. Did you register any observables?");const{log:i,ctxArgs:n}=this.logCtx(s,this.updateObservers);i.verbose(`Updating ${this.observerHandler.count()} observers for ${this}`),await this.observerHandler.updateObservers(t,e,Array.isArray(r)?r.map(t=>Vt._baseSequence.parseValue(H.sequenceFor(this.class).type,t)):Vt._baseSequence.parseValue(H.sequenceFor(this.class).type,r),...n)}async refresh(t,e,r,...s){return this.updateObservers(t,e,r,...s)}static forModel(t,e,...r){let s;const i=e||lt.flavourOf(t)||Vt.currentFlavour;try{s=this.get(t,i)}catch(t){s=void 0}if(s instanceof _e)return s;const n=e||lt.flavourOf(t)||s&&lt.get(s,St.ADAPTER)||Vt.currentFlavour,o=n?Vt.get(n):void 0;if(!o)throw new u("No registered persistence adapter found flavour "+n);return s=s||o.repository(),new s(o,t,...r)}static get(t,e){const r=H.tableName(t);let s=r;if(e&&(s=[r,e].join(w)),s in this._cache)return this._cache[s];if(r in this._cache)return this._cache[r];throw new u("Could not find repository registered under "+r)}static register(t,e,r){let s=H.tableName(t);if(r&&(s=[s,r].join(w)),s in this._cache&&this._cache[s]instanceof _e)throw new u(s+" already has a registered instance");this._cache[s]=e}static statements(t,e){const r=t instanceof _e?t.constructor:t,s=lt.get(r,e?lt.key(St.STATEMENT,e):St.STATEMENT);return(e?s:Object.keys(s))||!1}static queries(t,e){const r=t instanceof _e?t.constructor:t;return lt.get(r,e?lt.key(St.QUERY,e):St.QUERY)}}function De(t,e){if(!(e||(e=ut.flavourResolver(t instanceof H?t.constructor:t))&&e!==dt))throw new u("Could not retrieve flavour from model "+(t instanceof H?t.constructor.name:t.name));return W(St.INJECTABLE,e,H.tableName(t))}i([oe(),n("design:type",Function),n("design:paramtypes",[Object,String,void 0]),n("design:returntype",Promise)],_e.prototype,"listBy",null),i([oe(),n("design:type",Function),n("design:paramtypes",[Object,String,Object,void 0]),n("design:returntype",Promise)],_e.prototype,"paginateBy",null),i([oe(),n("design:type",Function),n("design:paramtypes",[String,String,void 0]),n("design:returntype",Promise)],_e.prototype,"find",null),i([oe(),n("design:type",Function),n("design:paramtypes",[String,String,Object,void 0]),n("design:returntype",Promise)],_e.prototype,"page",null),i([oe(),n("design:type",Function),n("design:paramtypes",[Object,Object,void 0]),n("design:returntype",Promise)],_e.prototype,"findOneBy",null),i([oe(),n("design:type",Function),n("design:paramtypes",[Object,Object,void 0]),n("design:returntype",Promise)],_e.prototype,"findBy",null),i([oe(),n("design:type",Function),n("design:paramtypes",[Object,void 0]),n("design:returntype",Promise)],_e.prototype,"countOf",null),i([oe(),n("design:type",Function),n("design:paramtypes",["function"==typeof(be="undefined"!=typeof K&&K)?be:Object,void 0]),n("design:returntype",Promise)],_e.prototype,"maxOf",null),i([oe(),n("design:type",Function),n("design:paramtypes",["function"==typeof(ve="undefined"!=typeof K&&K)?ve:Object,void 0]),n("design:returntype",Promise)],_e.prototype,"minOf",null),i([oe(),n("design:type",Function),n("design:paramtypes",["function"==typeof(Ae="undefined"!=typeof K&&K)?Ae:Object,void 0]),n("design:returntype",Promise)],_e.prototype,"avgOf",null),i([oe(),n("design:type",Function),n("design:paramtypes",["function"==typeof(xe="undefined"!=typeof K&&K)?xe:Object,void 0]),n("design:returntype",Promise)],_e.prototype,"sumOf",null),i([oe(),n("design:type",Function),n("design:paramtypes",["function"==typeof(Ee="undefined"!=typeof K&&K)?Ee:Object,void 0]),n("design:returntype",Promise)],_e.prototype,"distinctOf",null),i([oe(),n("design:type",Function),n("design:paramtypes",["function"==typeof(Se="undefined"!=typeof K&&K)?Se:Object,void 0]),n("design:returntype",Promise)],_e.prototype,"groupOf",null),i([U(),n("design:type",Function),n("design:paramtypes",[Object,Function]),n("design:returntype",Function)],_e.prototype,"observe",null),i([U(),n("design:type",Function),n("design:paramtypes",[Object]),n("design:returntype",void 0)],_e.prototype,"unObserve",null),Vt&&(Vt._baseRepository=_e);class Be extends t{get log(){return this.logger||(this.logger=j.for(this)),this.logger}constructor(){super()}get(t,r){const s=this.log.for(this.get);let i;try{i=super.get(t)}catch{}if(!i){let n;if("function"==typeof t?n=H.get(t.name)||t:"symbol"!=typeof t&&"string"!=typeof t||(n=H.get(t.toString())),!n)return;const o=St.ADAPTER,a=r||lt.get(n,o);try{let t=a;try{a&&Vt.get(a)}catch{const e=Vt.current;e&&e.flavour===a&&(t=e.alias)}if(i=_e.forModel(n,t),i instanceof _e)return i;const r=a||lt.get(i.constructor,o)||lt.get(n,o);e.register(i,De(n,r))}catch(t){s.debug("No registered repository or adapter found. falling back to default adapter. Error: "+(t?.message||JSON.stringify(t)));const e=_e.get(n,a);if("function"==typeof e){const t=a?Vt.get(a):Vt.current;if(!t)return;return new e(t,n)}}}return i}}(t=>{t.PENDING="pending",t.SCHEDULED="scheduled",t.RUNNING="running",t.FAILED="failed",t.SUCCEEDED="succeeded",t.CANCELED="canceled",t.WAITING_RETRY="waiting_retry"})(Oe||(Oe={})),(t=>{t.EXPONENTIAL="exponential",t.FIXED="fixed"})(Ce||(Ce={})),(t=>{t.NONE="none",t.FULL="full"})(Te||(Te={})),(t=>{t.STATUS="status",t.LOG="log",t.PROGRESS="progress",t.ALL="all"})(Ne||(Ne={})),(t=>{t.ATOMIC="atomic",t.COMPOSITE="composite"})(ke||(ke={}));const Re="tasks",Ie={workerId:"default-worker",concurrency:10,leaseMs:6e4,pollMsIdle:1e3,pollMsBusy:500,logTailMax:100,streamBufferSize:5,maxLoggingBuffer:300,loggingBufferTruncation:20,gracefulShutdownMsTimeout:12e4};function $e(t,e){return(i,n)=>n?r(lt.constr(t))(i,n):(lt.set(b.REPOSITORY,lt.key(e||Vt.currentFlavour,H.tableName(t)),i),mt(b.REPOSITORY,i.name)(t),e=e||lt.get(i.constructor,St.ADAPTER),_e.register(t,i,e),s(lt.constr(t),{callback:e=>(Object.defineProperty(e,b.CLASS,{enumerable:!1,configurable:!1,writable:!1,value:t}),e)})(i))}lt.tasks=(()=>lt.innerGet(Symbol.for(Re))).bind(lt),lt.taskFor=(t=>{const e=lt.tasks();return e?e[t]:void 0}).bind(lt),lt.validationExceptions=((t,e)=>{const r=lt.get(t,St.NO_VALIDATE)||[],s=Object.entries(r).filter(([,t])=>t.includes(e)).map(([t])=>t);let i=[];return e!==a.CREATE&&e!==a.UPDATE||(i=H.nestedRelations(t)),[...new Set([...s,...i])]}).bind(lt),lt.migrationsFor=(t=>{if(!(t=t??Vt.current))throw new u("Could not get adapter for migrations");return lt.innerGet(Symbol.for(St.MIGRATION),t.alias).map(t=>t.class)}).bind(lt),lt.migrations=(()=>{const t=lt.innerGet(Symbol.for([St.MIGRATION,St.BY_KEY].join("-")));return Object.values(t).flat().map(t=>[t.class.name,t.class])}).bind(lt),lt.relations=((t,e)=>{const r=lt.get(t,St.RELATIONS);if(r){if(!e)return Object.keys(r);if(!r[e])throw new u("No relations metadata found for property "+e);return r[e]}}).bind(lt),H.relations=(t,e)=>lt.relations(t instanceof H?t.constructor:t,e)||[],H.nestedRelations=((t,e=[])=>{let r=[];const s=lt.get(t,St.RELATIONS);if(!s||!Object.keys(s).length)return[...new Set([...e])];for(const t in s){const i=s[t];if(i?.class&&H.relations(i.class)){const s=H.relations(i.class).map(e=>`${t}.${e}`);e=[...e,...s],r=H.nestedRelations(i.class,e)}}return[...new Set([...e,...r])]}).bind(H),H.generatedBySequence=((t,e)=>{const r="function"!=typeof t?t.constructor:t;return!!H.sequenceFor(r).generated}).bind(H),H.fromTable=(t=>{const e=lt.innerGet(Symbol.for(St.TABLE));if(!e||!e[t]||!H.get(e[t].name))throw new u("No table metadata found for model. did you use @table()?");return H.get(e[t].name)}).bind(H),lt.createdBy=(t=>{const e=lt.get("function"!=typeof t?t.constructor:t,St.CREATED_BY);if(!e)throw new u("No createdBy metadata found for model. did you use @createdBy()?");return e}).bind(lt),lt.updatedBy=(t=>{const e=lt.get("function"!=typeof t?t.constructor:t,St.UPDATED_BY);if(!e)throw new u("No updatedBy metadata found for model. did you use @updatedBy()?");return e}).bind(lt),H.tableName=t=>{if(!(t instanceof H?H.get(t.constructor.name):t))throw new u("Unable to find model "+t);return lt.get(t instanceof H?t.constructor:t,St.TABLE)||(t instanceof H?t.constructor.name:t.name)},H.columnName=(t,e)=>lt.get(t instanceof H?t.constructor:t,lt.key(St.COLUMN,e))||e,H.defaultQueryAttributes=t=>{const e="function"==typeof t?t:t.constructor;return lt.get(e,lt.key(St.DEFAULT_QUERY_ATTR))||[H.pk(t)]},H.sequenceName=(t,...e)=>[H.tableName(t),...e].join("_"),H.sequenceFor=(t,e)=>{if(e)throw new Lt("not currently supported");const r=H.pkProps(t instanceof H?t.constructor:t);if(!r)throw new u("No sequence options defined for model. did you use the @pk decorator?");return r},H.indexes=t=>{const e=lt.get(t instanceof H?t.constructor:t,St.INDEX);return Object.keys(e||{}).reduce((t,r)=>(t[r]={[St.INDEX]:e[r]},t),{})},e.services=()=>lt.innerGet(Symbol.for(St.SERVICE)),e.repositories=()=>lt.innerGet(Symbol.for(b.REPOSITORY));class Pe extends u{constructor(t){super(t,Pe.name,500)}}var Le;function Fe(t,...e){return(r,s,i)=>{i.value=new Proxy(i.value,{async apply(r,s,i){const{ctx:n,ctxArgs:o}=await s.logCtx(i,r.name,!0);let a;try{a=t(...i,...e,n)}catch(t){throw new u("Failed to execute auth validation handler: "+t)}if(a)throw a;return r.call(s,...o)}})}}function je(t,...e){return(r,s,i)=>{i.value=new Proxy(i.value,{async apply(r,s,i){const{ctx:n,ctxArgs:o}=await s.logCtx(i,r.name,!0);let a;try{a=t(...i,...e,n)}catch(t){throw new u("Failed to execute auth validation handler: "+t)}if(a)throw a;return r.call(s,...o)}})}}(t=>{t.AUTH="auth",t.ROLES="roles",t.NAMESPACE="namespace"})(Le||(Le={}));const Ue={type:void 0,generated:!1,startWith:0,incrementBy:1,cycle:!1},Me=Ue,Ye={type:Number,generated:!0,startWith:0,incrementBy:1,cycle:!1},Ge=Object.assign({},Ye,{type:"BigInt"});function He(t,e,r){return ut.for(St.INDEX).define({decorator:(t,e,r)=>(s,i)=>("string"==typeof t&&(r=t,t=void 0,e=void 0),"string"==typeof e&&(r=e,e=void 0),!e&&t&&t.find(t=>![Zt.ASC,Zt.DSC].includes(t))&&(e=t,t=void 0),gt(lt.key(`${St.INDEX}${e&&e?.length?"."+e.join("."):""}`,i),{directions:t,compositions:e,name:r})(s,i)),args:[t,e,r]}).apply()}async function ze(t,e,r,s){if(!e.type||!e.generated||s[r])return;let i;e.name||(e.name=H.sequenceName(s,"pk"));try{i=await this.adapter.Sequence(e,this._overrides)}catch(t){throw new u(`Failed to instantiate Sequence ${e.name}: ${t}`)}var n,o,a;n=s,o=r,a=await i.next(t),Reflect.set(n,o,a)}function qe(t,e){return(r,s)=>{if(wt()(r,s),!t.type){const e=lt.type(r.constructor,s);if(![Number.name,String.name,BigInt.name].includes(e?.name||e))throw Error("Incorrrect option type");t.type=e}switch(t.type){case String.name||String.name.toLowerCase():case String:t.generated=void 0!==t.generated&&t.generated,t.type=String;break;case Number.name||String.name.toLowerCase():case Number:t.generated=void 0===t.generated||t.generated,t.type=Number;break;case BigInt.name||BigInt.name.toLowerCase():case BigInt:t.type=BigInt,t.generated=void 0===t.generated||t.generated;break;case"uuid":case"serial":t.generated=!0;break;default:throw Error("Unsupported type")}void 0===t.generated&&(t.generated=!0);const i=[wt(),He([Zt.ASC,Zt.DSC]),q(),v(),gt(lt.key(b.ID,s),t),A(ze,t,e)];return t.generated&&i.push(x()),ht(...i)(r,s)}}function We(t){const e=Object.assign({},Me);return delete e.generated,t=Object.assign({},e,t),ut.for(b.ID).define({decorator:qe,args:[t,{priority:60}]}).apply()}async function Qe(t,e,r,s,i){const n=e.logger.for(Qe);if(!s){const e=H.get(t.constructor.name);if(!e)throw new u("Could not find model "+t.constructor.name);s=_e.forModel(e,r),n.info("Retrieved "+s.toString())}let o;if(s=i?s.override(i):s,void 0===t[H.pk(s.class)])n.info(`No pk found in ${H.tableName(s.class)} - creating`),o=await s.create(t,e);else{n.info(`pk found in ${H.tableName(s.class)} - attempting update`);try{o=await s.update(t,e),n.info("Updated "+H.tableName(s.class))}catch(r){if(!(r instanceof m))throw r;n.info("update Failed - creating new "+H.tableName(s.class)),o=await s.create(t,e)}n.info("After create update: "+o)}return o}async function Ve(t,e,r,s){const i=s[r];if(!i)return;if(rr(s,e),"object"!=typeof i){const e=yr(s,r,this.adapter.alias),n=await e.override(this._overrides).read(i,t);return await hr(t,s,r,i,n),void(s[r]=i)}const n="function"!=typeof e.class||e.class.name?e.class:e.class();if(!n)throw new u("Could not find model "+e.class);const o=_e.forModel(n,this.adapter.alias),a=await o.override(this._overrides).create(i,t),c=H.pk(a);await hr(t,s,r,a[c],a),s[r]=a[c]}async function Je(t,e,r,s){const i=s[r];if(!i)return;if(e.cascade.update!==te.CASCADE)return;if("object"!=typeof i){const e=yr(s,r,this.adapter.alias),n=await e.override(this._overrides).read(i,t);return await hr(t,s,r,i,n),void(s[r]=i)}const n=await Qe(s[r],t,this.adapter.alias,void 0,this._overrides),o=H.pk(n);await hr(t,s,r,n[o],n),s[r]=n[o]}async function Xe(t,e,r,s){const i=s[r];if(!i)return;if(e.cascade.update!==te.CASCADE)return;const n=yr(s,r,this.adapter.alias);let o;o=i instanceof H?await n.delete(s[r][n.pk],t):await n.delete(s[r],t),await hr(t,s,r,o[n.pk],o)}async function Ke(t,e,r,s,i){const n=s[r];if(!n||!n.length)return;rr(s,e);const o=t.logger.for(Ke),a=yr(s,r,this.adapter.alias),c=H.pk("function"!=typeof e.class||e.class.name?e.class:e.class()),l=new Set;for(const e of n){let i;"object"!=typeof e?(i=await a.override(this._overrides).read(e,t),o.debug("read: "+i[c])):(o.verbose("Creating or updating one-to-many model: "+e[c]),i=await Qe(e,t,this.adapter.alias,void 0,this._overrides)),o.debug(`caching for populate: ${JSON.stringify(i)} under ${i[c]}`),await hr(t,s,r,i[c],i),l.add(i[c])}s[r]=[...l]}async function Ze(t,e,r,s,i){const{cascade:n}=e;if(n.update===te.CASCADE)return Ke.call(this,t,e,r,s,i)}async function tr(t,e,r,s){if(e.cascade.delete!==te.CASCADE)return;const i=s[r];if(!i||!i.length)return;const n=typeof i[0];if(!i.every(t=>typeof t===n))throw new u(`Invalid operation. All elements of property ${r} must match the same type.`);const o="function"!=typeof e.class||e.class.name?e.class:e.class(),a="object"===n,c=a?_e.forModel(o,this.adapter.alias):yr(s,r,this.adapter.alias),l=[...new Set([...a?i.map(t=>t[c.pk]):i]).values()];let d,h;try{d=await c.override(this._overrides).deleteAll(l,t)}catch(e){throw t.logger.error("Failed to delete all records",e),e}for(let e=0;e<d.length;e++){h=d[e];try{await hr(t,s,r,l[e],h)}catch(i){throw t.logger.error(`Failed to cache record ${l[e]} with key ${r} and model ${JSON.stringify(s,void 0,2)} `,i),i}}s[r]=l}async function er(t,e,r,s){const i=s[r];if(!i)return;rr(s,e);const n=t.logger.for(er);if("object"!=typeof i){const e=yr(s,r,this.adapter.alias),n=await e.override(this._overrides).read(i,t);return await hr(t,s,r,i,n),void(s[r]=i)}if(!(e.class instanceof H?e.class.constructor:e.class))throw new u("Could not find model "+e.class);n.info("Creating or updating many-to-one model: "+JSON.stringify(i));const o=await Qe(i,t,this.adapter.alias,void 0,this._overrides),a=H.pk(o);n.info(`caching: ${JSON.stringify(o)} under ${o[a]}`),await hr(t,s,r,o[a],o),s[r]=o[a]}function rr(t,e){let r;const s="function"==typeof e.class&&e.class.name?e.class:e.class(),i=lt.get(s,St.RELATIONS);if(i&&(r=Object.values(i)?.find(e=>{const r="function"==typeof e.class&&e.class.name?e.class:e.class();return t instanceof r})),!0===r?.populate&&!0===e?.populate)throw new u("Bidirectional populate is not allowed. Please set populate to false on one side of the relation.");return!0}async function sr(t,e,r,s){const{cascade:i}=e;if(i.update===te.CASCADE)return er.call(this,t,e,r,s)}async function ir(t,e,r,s){if(e.cascade.delete!==te.CASCADE)return;const i=s[r];if(!i)return;const n="object"==typeof i,o=n?_e.forModel(i,this.adapter.alias):yr(s,r,this.adapter.alias),a=n?i[o.pk]:i,c=await o.override(this._overrides).delete(a);await hr(t,s,r,a,c),s[r]=a}async function nr(t,e,r,s){const i=s[r];if(!i||!i.length)return;rr(s,e);const n=typeof i[0];if(!i.every(t=>typeof t===n))throw new u(`Invalid operation. All elements of property ${r} must match the same type.`);const o=t.logger.for(nr),a=new Set([...i]);if("object"!==n){const n=yr(s,r,this.adapter.alias),c=await n.override(this._overrides).readAll([...a.values()],t);for(let e=0;e<c.length;e++){const s=c[e];o.info("FOUND MANY TO MANY VALUE: "+JSON.stringify(s)),await hr(t,s,r,[...a.values()][e],c)}return await or.call(this,s,[...i],o,t,e),s[r]=[...a],void o.info("SET MANY TO MANY IDS: "+s[r])}const c=H.pk(i[0].constructor),l=new Set;for(const e of i){o.info("Creating or updating many-to-many model: "+JSON.stringify(e));const i=await Qe(e,t,this.adapter.alias,void 0,this._overrides);o.info(`caching: ${JSON.stringify(i)} under ${i[c]}`),await hr(t,s,r,i[c],i),o.info("Creating or updating many-to-many model: "+JSON.stringify(e)),e.id=i.id,l.add(i[c])}const d=H.pk(s.constructor);if(void 0===s[d]){const e=await(async(t,e,r)=>{const s=e[H.pk(e.constructor)];if(void 0!==s)return s;const i=H.sequenceFor(e.constructor);let n;i?.name||(i.name=H.sequenceName(e,"pk"));try{return n=await t.adapter.Sequence(i,t._overrides),await n.next(r)}catch(t){throw new u(`Failed to instantiate Sequence ${i.name}: ${t}`)}})(this,s,t);s[d]=e}const h=await or.call(this,s,i,o,t,e);o.info("Junction model created: "+h.name),s[r]=[...l]}async function or(t,e,r,s,i){const{JunctionModel:n,fkA:o,fkB:a}=ar(t,e[0],i),c=[];for(const i of e){r.info("Creating or updating many-to-many junction model: "+JSON.stringify(i));const e={[o]:t instanceof H?t[H.pk(t.constructor)]:t,[a]:i instanceof H?i[H.pk(i.constructor)]:i},l=await Qe(new n(e),s,this.adapter.alias,void 0,this._overrides);l?.id&&c.push(l.id)}if(c.length===e?.length){const t=_e.forModel(n);await(t?.override(this._overrides).readAll(c))}return n}function ar(t,e,r){const s=H.tableName(t);let i;if(e instanceof H)i=H.tableName(e);else if(H.isModel(e)&&"function"==typeof e)i=e.name?e.name:e()?.name;else if(r?.class){const t="function"!=typeof r.class||r.class.name?r.class:r.class();i=H.tableName(t)}if(!s||!i)throw new u("Missing tablenames to create junction table");const n=r?.joinTable?.name?r?.joinTable?.name:`${s}_${i}`,o=s?.toLowerCase()+"_fk",a=i?.toLowerCase()+"_fk",c=class extends H{constructor(t){super(t)}};Object.defineProperty(c,"name",{value:n,writable:!1}),We({type:Number})(c.prototype,"id"),q()(c.prototype,o),q()(c.prototype,a);const l=V()(c);return lt.set(c,St.TABLE,n),{fkA:o,fkB:a,JunctionModel:l}}async function cr(t,e,r,s){const{cascade:i}=e;if(i.update===te.CASCADE)return nr.call(this,t,e,r,s)}async function lr(t,e,r,s){if(e.cascade.delete!==te.CASCADE)return;const i=s[r];if(!i||!i.length)return;const n=typeof i[0];if(!i.every(t=>typeof t===n))throw new u(`Invalid operation. All elements of property ${r} must match the same type.`);const o="function"!=typeof e.class||e.class.name?e.class:e.class(),a="object"===n,c=a?_e.forModel(o,this.adapter.alias):yr(s,r,this.adapter.alias),l=[...new Set([...a?i.map(t=>t[c.pk]):i]).values()];let d,h;try{d=await c.override(this._overrides).deleteAll(l,t)}catch(e){throw t.logger.error("Failed to delete all records",e),e}for(let e=0;e<d.length;e++){h=d[e];try{await hr(t,s,r,l[e],h)}catch(i){throw t.logger.error(`Failed to cache record ${l[e]} with key ${r} and model ${JSON.stringify(s,void 0,2)} `,i),i}}s[r]=l}function ur(t,e,r){return[St.POPULATE,t,e,r].join(".")}function dr(t,e,r){return[St.TAG_FOR_DELETION,t,r].join(".")}async function hr(t,e,r,s,i){const n=ur(e.constructor.name,r,s),o=t.get("cacheForPopulate")||{};return o[n]=i,t.accumulate({cacheForPopulate:o})}async function pr(t,e,r,s){if(!e.populate)return;const i=s[r],n=Array.isArray(i);if(void 0===i||n&&0===i.length)return;const o=this,l=await(async(e,r,s,i)=>{let n,l;const d=[];let h;try{h=e.get("operation")}catch(t){h=void 0}const p=h===a.READ||h===c.READ_ALL?{}:e.get("cacheForPopulate")||{};for(const e of i){n=ur(r.constructor.name,s,e);try{if(l=p[n],!l)throw Error("Not found in cache")}catch(i){const n=yr(r,s);if(!n)throw new u("Could not find repo");l=await n.override(o._overrides).read(e,t)}d.push(l)}return d})(t,s,r,n?i:[i]);s[r]=n?l:l[0]}async function gr(t,e,r,s,i){if(e.cascade.update!==te.CASCADE)return;const n=s[r];if(void 0===n||Array.isArray(n)&&0===n.length)return;if(!i)throw new u("No way to compare old model. do you have updateValidation and mergeModels enabled?");function o(t){return Array.isArray(t)?t.map(o):"object"!=typeof t?t:t[H.pk(t)]}const a=o(s[r]),c=o(i[r]);if(void 0===c||Q(a,c))return;if(Array.isArray(a)!==Array.isArray(c))throw new u("Cannot cascade update for different array types");const l=(Array.isArray(a)?a:[a]).filter(Boolean),d=(Array.isArray(c)?c:[c]).filter(Boolean).filter(t=>!l.includes(t)),h=yr(s,r);if(!h)throw new u("Could not find repo");try{const e=await h.override(this._overrides).deleteAll(d,t);t.logger.debug(`Deleted ${e.length} entries from table ${H.tableName(h.class)} due to cascade rules with `)}catch(t){throw new u("Error deleting cascade entries: "+t)}}const fr=["array","string","number","boolean","symbol","function","object","undefined","null","bigint"];function yr(t,e,r){if(!t)throw Error("No model was provided to get repository");let s;if(Array.isArray(t[e])||t[e]instanceof Set){const r=lt.get(t instanceof H?t.constructor:t,lt.key(J.REFLECT,e,J.LIST))?.clazz;if(!r)throw new u("Failed to find types decorators for property "+e);s=(Array.isArray(r)?[...r]:[r]).map(t=>"function"!=typeof t||t.name?t:t())}else s=lt.getPropDesignTypes(t instanceof H?t.constructor:t,e)?.designTypes;const i=s?.find(t=>!fr.includes((""+t.name).toLowerCase()));return _e.forModel(i,r)}class mr extends E{constructor(t,e=mr.name,r=401){super(t,e,r)}}class wr extends mr{constructor(t,e=wr.name){super(t,e,403)}}class br extends u{constructor(t){super(t,br.name,503)}}function vr(t){return ut.for(St.TABLE).define({decorator:t=>e=>(lt.set(St.TABLE,t||e.name.toLowerCase(),e),mt(St.TABLE,t||e.name.toLowerCase())(e)),args:[t]}).apply()}function Ar(t){return ut.for(St.COLUMN).define({decorator:t=>(e,r)=>gt(lt.key(St.COLUMN,r),t||r)(e,r),args:[t]}).apply()}async function xr(t,e,r,s){if(s[r]&&(await this.select().where(Kt.attribute(r).eq(s[r])).execute()).length)throw new N(`model already exists with property ${r} equal to ${JSON.stringify(s[r],void 0,2)}`)}function Er(){const t=St.UNIQUE;return ut.for(t).define(X(),T(xr),gt(t,{})).apply()}async function Sr(t,e,r,s){throw new mr("This adapter does not support user identification")}function Or(){return ut.for(St.CREATED_BY).define({decorator:()=>(t,e)=>ht(A(Sr),gt(St.CREATED_BY,e),x(St.CREATED_BY))(t,e),args:[]}).apply()}function Cr(){return ut.for(St.UPDATED_BY).define({decorator:()=>(t,e)=>ht(C(Sr),gt(St.UPDATED_BY,e),x(St.UPDATED_BY))(t,e),args:[]}).apply()}function Tr(){return O([a.CREATE])}function Nr(){return O()}function kr(t){return[()=>{const e="function"==typeof t&&t.name?t:t(),r=H.pk(e);return(lt.allowedTypes(e,r)||[])[0]}]}function _r(t,e=ee,r=!0,s,i){const n=St.ONE_TO_ONE;return ut.for(n).define({decorator:(t,e,r,s,i)=>{const o={class:t,cascade:e,populate:r};s&&(o.joinTable=s),i&&(o.name=i);const a=kr(t),c=[wt(),Fr(n,o),tt([t,...a]),A(Ve,o,{priority:70}),C(Je,o,{priority:70}),_(Xe,o,{priority:70}),D(gr,o,{priority:70}),k(pr,o,{priority:70})];return ht(...c)},args:[t,e,r,s,i]}).apply()}function Dr(t,e=ee,r=!0,s,i){const n=St.ONE_TO_MANY;return ut.for(n).define({decorator:(t,e,r,s,i)=>{const o={class:t,cascade:e,populate:r};s&&(o.joinTable=s),i&&(o.name=i);const a=kr(t),c=[wt(),Fr(n,o),Z([t,...a]),A(Ke,o,{priority:70}),C(Ze,o,{priority:70}),_(tr,o,{priority:70}),D(gr,o,{priority:70}),k(pr,o,{priority:70})];return ht(...c)},args:[t,e,r,s,i]}).apply()}function Br(t,e=ee,r=!0,s,i){const n=St.MANY_TO_ONE;return ut.for(n).define({decorator:(t,e,r,s,i)=>{const o={class:t,cascade:e,populate:r};s&&(o.joinTable=s),i&&(o.name=i);const a=kr(t),c=[wt(),Fr(n,o),tt([t,...a]),A(er,o),C(sr,o),_(ir,o),k(pr,o)];return ht(...c)},args:[t,e,r,s,i]}).apply()}function Rr(t,e=ee,r=!0,s,i){const n=St.MANY_TO_MANY;return ut.for(n).define({decorator:(t,e,r,s,i)=>{const o={class:t,cascade:e,populate:r};s&&(o.joinTable=s),i&&(o.name=i);const a=kr(t),c=[wt(),Fr(n,o),Z([t,...a]),A(nr,o),C(Ze,o),k(pr,o)];return ht(...c)},args:[t,e,r,s,i]}).apply()}function Ir(...t){return(e,r)=>{const s=lt.get(e,lt.key(St.NO_VALIDATE,r))||[],i=[...new Set([...s,...t])];return ht(mt(lt.key(St.NO_VALIDATE,r),i))(e,r)}}function $r(){return Ir(a.CREATE)}function Pr(){return Ir(a.UPDATE)}function Lr(){return Ir(a.UPDATE,a.CREATE)}function Fr(t,e){return ut.for(St.RELATIONS).define({decorator:(t,e)=>(r,s)=>(gt(t,e)(r,s),gt(lt.key(St.RELATIONS,s),Object.assign({},e,{key:t}))(r,s)),args:[t,e]}).apply()}class jr extends H{constructor(t){super(t)}}i([Tr(),n("design:type",Date)],jr.prototype,"createdAt",void 0),i([Nr(),n("design:type",Date)],jr.prototype,"updatedAt",void 0);let Ur=class extends jr{constructor(t){super(t)}};i([We({type:String,generated:!1}),n("design:type",String)],Ur.prototype,"id",void 0),i([q(),He(),n("design:type",Object)],Ur.prototype,"current",void 0),Ur=i([vr("??sequence"),V(),n("design:paramtypes",[Object])],Ur);class Mr extends F{get current(){return this._currentPage}get total(){return this._totalPages}get count(){return this._recordCount}get statement(){return this._statement||(this._statement=this.prepare(this.query)),this._statement}constructor(t,e,r,s){super(),this.adapter=t,this.query=e,this.size=r,this.clazz=s,Ht(this,this.page,this.pagePrefix,this.page.name)}isPreparedStatement(){const t=this.query;return t.method&&t.method.match(RegExp(`${Et.FIND_BY}|${Et.LIST_BY}|${Et.FIND}`,"gi"))}async pagePrefix(t,...e){const{ctxArgs:r}=(await this.adapter.logCtx([this.clazz,...e],Et.PAGE_BY,!0)).for(this.pagePrefix);return r.shift(),[t,...r]}async pagePrepared(t,e,...r){const{log:s,ctxArgs:i}=this.adapter.logCtx(!e||e instanceof Rt?[e,...r]:[...r],this.pagePrepared);s.debug(`Running paged prepared statement ${t} page${e?" - bookmark "+e:""}`),!e||e instanceof Rt||(this._bookmark=e);const n=_e.forModel(this.clazz,this.adapter.alias),o=this.query,{method:a,args:c,params:l}=o;if(a===Et.FIND){const e=[Et.PAGE,...c],r={limit:this.size,offset:t,bookmark:this._bookmark};e.push(r);const s=await n.statement(...e,...i);return this.apply(s)}const u=RegExp(`^${Et.FIND_BY}|${Et.LIST_BY}`,"gi");if(!a.match(u))throw new Lt(`Method ${a} is not supported for pagination`);u.lastIndex=0;const d=a.replace(u,Et.PAGE_BY),h=[d,...c];let p={limit:this.size,offset:t,bookmark:this._bookmark};d!==Et.PAGE_BY||h.length>2?p={direction:l.direction,limit:this.size,offset:t,bookmark:this._bookmark}:h.push(l.direction),h.push(p);const g=await n.statement(...h,...i);return this.apply(g)}async next(...t){return this.page(this.current+1,...t)}async previous(...t){return this.page(this.current-1,...t)}validatePage(t){if(1>t||!Number.isInteger(t))throw new Xt("Page number cannot be under 1 and must be an integer");if(void 0!==this._totalPages&&t>this._totalPages)throw new Xt(`Only ${this._totalPages} are available. Cannot go to page ${t}`);return t}async page(t=1,e,...r){const{ctxArgs:s}=this.adapter.logCtx([e,...r],this.page);if(this.isPreparedStatement())return await this.pagePrepared(t,...s);throw new Lt("Raw support not available without subclassing this")}serialize(t,e=!1){const r={data:t,current:this.current,total:this.total,count:this.count,bookmark:this._bookmark};try{return e?JSON.stringify(r):r}catch(t){throw new B(t)}}apply(t){const e="string"==typeof t?Mr.deserialize(t):t;return this._currentPage=e.current,this._totalPages=e.total||this._totalPages,this._recordCount=e.count||this._recordCount,this._bookmark=e.bookmark,e.data}static deserialize(t){try{return JSON.parse(t)}catch(t){throw new B(t)}}static isSerializedPage(t){return t&&"object"==typeof t&&Array.isArray(t.data)&&"number"==typeof t.total&&"number"==typeof t.current&&"number"==typeof t.count}}var Yr,Gr,Hr,zr,qr,Wr,Qr;class Vr extends It{constructor(t,e){super(),this.adapter=t,this.overrides=e,this._inCountMode=!1,[this.execute,this.paginate].forEach(t=>{R(this,t,(...e)=>this.executionPrefix(t,...e),t.name)})}async executionPrefix(t,...e){const{ctx:r,ctxArgs:s,log:i}=(await this.adapter.logCtx([this.fromSelector,...e],t.name===this.paginate.name?Et.PAGE_BY:St.QUERY,!0,this.overrides||{})).for(t);s.shift();const n=r.get("forcePrepareSimpleQueries"),o=r.get("forcePrepareComplexQueries");i.silly(`statement force simple ${n}, forceComplex: ${o}`);const a=this.hasAggregation()&&!this.whereCondition&&!this.selectSelector?.length&&1>=(this.groupBySelectors?.length||0);return(n&&(this.isSimpleQuery()||a)||o)&&(i.silly(`squashing ${o?"complex":"simple"} query to prepared statement`),await this.prepare(r),i.silly(`squashed ${o?"complex":"simple"} query to ${JSON.stringify(this.prepared,null,2)}`)),s}get log(){return this.adapter.log.for(Vr)}select(t){return Object.defineProperty(this,"selectSelector",{value:t,writable:!1}),this}distinct(t){if(this._inCountMode)return this.countDistinctSelector=this.countSelector,this.countSelector=void 0,this._inCountMode=!1,this;if(!t)throw new Jt("distinct() requires a selector when not chained after count()");return this.distinctSelector=t,this}max(t){return this.maxSelector=t,this}min(t){return this.minSelector=t,this}sum(t){return this.sumSelector=t,this}avg(t){return this.avgSelector=t,this}count(t){return this.countSelector=t??null,this._inCountMode=!0,this}from(t){if(this.fromSelector="string"==typeof t?H.get(t):t,!this.fromSelector)throw new Jt("Could not find selector model: "+t);return this}where(t){return this.whereCondition=t,this}orderBy(t,e){return this.orderBySelectors=[this.normalizeOrderCriterion(t,e)],this}thenBy(t,e){if(Array.isArray(t)||void 0!==e){if(!this.orderBySelectors||!this.orderBySelectors.length)throw new Jt("thenBy requires orderBy to be called first");return this.orderBySelectors.push(this.normalizeOrderCriterion(t,e)),this}if(!this.groupBySelectors||!this.groupBySelectors.length)throw new Jt("groupBy must be called before chaining group selectors");return this.groupBySelectors.push(t),this}normalizeOrderCriterion(t,e){if(Array.isArray(t)){const[e,r]=t;return[e,this.normalizeOrderDirection(r)]}return[t,this.normalizeOrderDirection(e)]}normalizeOrderDirection(t){if(!t)throw new Jt("orderBy direction is required when specifying the attribute separately.");const e=(t+"").toLowerCase();if(e===Zt.ASC)return Zt.ASC;if(e===Zt.DSC)return Zt.DSC;throw new Jt(`Invalid OrderBy direction ${t}. Expected one of: ${Object.values(Zt).join(", ")}.`)}groupBy(t){if(this.orderBySelectors&&this.orderBySelectors.length)throw new Jt("groupBy must be called before orderBy.");return this.groupBySelectors=[t],this}limit(t){return this.limitSelector=t,this}offset(t){return this.offsetSelector=t,this}async execute(...t){const{log:e,ctx:r,ctxArgs:s}=this.logCtx(t,this.execute);try{if(this.prepared)return this.executePrepared(...t);e.silly("Building raw statement...");const i=this.build();e.silly("executing raw statement");const n=await this.raw(i,...s);if(this.hasAggregation())return n;if(!this.selectSelector){const t=H.pk(this.fromSelector),e=function(e){const s=e[t];return this.adapter.revert(e,this.fromSelector,s,void 0,r)}.bind(this);return this.groupBySelectors?.length?this.revertGroupedResults(n,e):Array.isArray(n)?n.map(e):e(n)}return n}catch(t){throw new Jt(t)}}revertGroupedResults(t,e){return Array.isArray(t)?t.map(e):t&&"object"==typeof t?Object.entries(t).reduce((t,[r,s])=>(t[r]=this.revertGroupedResults(s,e),t),{}):t}async executePrepared(...t){const e=_e.forModel(this.fromSelector,this.adapter.alias),{method:r,args:s,params:i}=this.prepared;return e.statement(r,...s,i,...t)}async raw(t,...e){const{ctx:r,ctxArgs:s}=this.logCtx(e,this.raw);if(!r.get("allowRawStatements"))throw new Lt("Raw statements are not allowed in the current configuration");const i=await this.adapter.raw(t,!0,...s);if(this.hasAggregation())return i;if(!this.selectSelector)return i;const n=H.pk(this.fromSelector),o=function(t){const e=t[n];return this.adapter.revert(t,this.fromSelector,e,void 0,r)}.bind(this);return Array.isArray(i)?i.map(o):o(i)}prepareCondition(t,e){let{attr1:r,operator:s,comparison:i}=t;const n={};switch(s){case xt.AND:case xt.OR:{let t=r,o=i;if("string"!=typeof r){const s=this.prepareCondition(r,e);t=s.method,n.args=[...n.args||[],...s.args||[]]}if(i instanceof Kt){const t=this.prepareCondition(i,e);o=t.method,n.args=[...n.args||[],...t.args||[]]}n.method=`${t} ${s.toLowerCase()} ${o}`;break}case At.EQUAL:n.method=r,n.args=[...n.args||[],i];break;case At.DIFFERENT:n.method=r+" diff",n.args=[...n.args||[],i];break;case At.REGEXP:n.method=r+" matches",n.args=[...n.args||[],i];break;case At.BIGGER:n.method=r+" bigger",n.args=[...n.args||[],i];break;case At.BIGGER_EQ:n.method=r+" bigger than equal";break;case At.SMALLER:n.method=r+" less",n.args=[...n.args||[],i];break;case At.SMALLER_EQ:n.method=r+" less than equal",n.args=[...n.args||[],i];break;case At.IN:n.method=r+" in",n.args=[...n.args||[],i];break;default:throw new Jt("Unsupported operator "+s)}return n}squash(t){const e=this.matchDefaultQueryCondition();if(e){const t=this.getOrderDirection();return{class:this.fromSelector,method:Et.FIND,args:[e.value,t],params:{direction:t}}}if(this.whereCondition&&this.whereCondition.comparison instanceof Kt)return;if(!this.whereCondition&&!this.selectSelector?.length){if(void 0!==this.countSelector&&!this.countDistinctSelector)return{class:this.fromSelector,method:Et.COUNT_OF,args:null!==this.countSelector?[this.countSelector]:[],params:{}};if(this.maxSelector)return{class:this.fromSelector,method:Et.MAX_OF,args:[this.maxSelector],params:{}};if(this.minSelector)return{class:this.fromSelector,method:Et.MIN_OF,args:[this.minSelector],params:{}};if(this.avgSelector)return{class:this.fromSelector,method:Et.AVG_OF,args:[this.avgSelector],params:{}};if(this.sumSelector)return{class:this.fromSelector,method:Et.SUM_OF,args:[this.sumSelector],params:{}};if(this.distinctSelector)return{class:this.fromSelector,method:Et.DISTINCT_OF,args:[this.distinctSelector],params:{}};if(1===this.groupBySelectors?.length)return{class:this.fromSelector,method:Et.GROUP_OF,args:[this.groupBySelectors[0]],params:{}}}if(this.selectSelector&&this.selectSelector.length)return;if(this.groupBySelectors&&this.groupBySelectors.length)return;if(void 0!==this.countSelector)return;if(this.countDistinctSelector)return;if(this.maxSelector)return;if(this.minSelector)return;if(this.sumSelector)return;if(this.avgSelector)return;let r;this.whereCondition&&(r=this.whereCondition.attr1);const s=this.orderBySelectors?.[0]?this.orderBySelectors[0]:r?[r,Zt.DSC]:[H.pk(this.fromSelector),Zt.DSC],[i,n]=s,o={direction:n};this.limitSelector&&(o.limit=this.limitSelector),this.offsetSelector&&(o.offset=this.offsetSelector);const a={class:this.fromSelector,method:Et.LIST_BY,args:[i],params:o};return r&&(a.method=Et.FIND_BY,a.args=[r,this.whereCondition.comparison],a.params=o),a}matchDefaultQueryCondition(){if(!this.whereCondition)return;const t=this.extractDefaultStartsWithAttributes(this.whereCondition);if(!t)return;const e=H.defaultQueryAttributes(this.fromSelector);if(!e||!e.length)return;const r=Array.from(new Set(e.map(String))),s=Array.from(new Set(t.attributes.map(String)));return r.length===s.length&&r.every(t=>s.includes(t))?{value:t.value,attributes:r}:void 0}extractDefaultStartsWithAttributes(t){const e=this.collectStartsWithAttributes(t);if(e)return{attributes:Array.from(new Set(e.attributes)),value:e.value}}collectStartsWithAttributes(t){if(!t)return;const{attr1:e,operator:r,comparison:s}=t;if(r===At.STARTS_WITH){if("string"!=typeof e||"string"!=typeof s)return;return{attributes:[e],value:s}}if(r===xt.OR){const t=e instanceof Kt?this.collectStartsWithAttributes(e):void 0,r=s instanceof Kt?this.collectStartsWithAttributes(s):void 0;return t&&r&&t.value===r.value?{attributes:[...t.attributes,...r.attributes],value:t.value}:void 0}return r===xt.AND?(e instanceof Kt?this.collectStartsWithAttributes(e):void 0)||(s instanceof Kt?this.collectStartsWithAttributes(s):void 0):void 0}getOrderDirection(){return this.orderBySelectors?.[0]?.[1]??Zt.ASC}async prepare(t){if(t=t||await this.adapter.context(St.QUERY,this.overrides||{},this.fromSelector),this.isSimpleQuery()&&t.get("forcePrepareSimpleQueries")){const e=this.squash(t);if(e)return this.prepared=e,this}if(t.get("forcePrepareSimpleQueries")||t.get("forcePrepareComplexQueries")){const e=this.squash(t);if(e)return this.prepared=e,this}const e=[],r={},s={class:this.fromSelector,args:e,params:r};let i,n=vt.FIND_BY;void 0!==this.countSelector?(n=vt.COUNT_BY,i=null!==this.countSelector?this.countSelector:void 0):this.sumSelector?(n=vt.SUM_BY,i=this.sumSelector):this.avgSelector?(n=vt.AVG_BY,i=this.avgSelector):this.minSelector?(n=vt.MIN_BY,i=this.minSelector):this.maxSelector?(n=vt.MAX_BY,i=this.maxSelector):this.distinctSelector?(n=vt.DISTINCT_BY,i=this.distinctSelector):!this.groupBySelectors?.length||this.selectSelector?.length||this.whereCondition||(n=vt.GROUP_BY_PREFIX,i=this.groupBySelectors[0]);const o=[n];if(i&&o.push(i),this.whereCondition){const r=this.prepareCondition(this.whereCondition,t);o.push(r.method),r.args&&r.args.length&&e.push(...r.args)}if(this.selectSelector&&o.push(vt.SELECT,this.selectSelector.join(` ${vt.AND.toLowerCase()} `)),this.orderBySelectors?.length){const[t,...e]=this.orderBySelectors;o.push(vt.ORDER_BY,t[0]),r.direction=t[1],e.length&&(r.order=this.orderBySelectors.map(([t,e])=>[t,e]),e.forEach(([t])=>{o.push(vt.THEN_BY,t)}))}if(this.groupBySelectors?.length&&n!==vt.GROUP_BY_PREFIX){const[t,...e]=this.groupBySelectors;o.push(vt.GROUP_BY,t),e.forEach(t=>o.push(vt.THEN_BY,t))}else this.groupBySelectors?.length&&n===vt.GROUP_BY_PREFIX&&this.groupBySelectors.slice(1).forEach(t=>o.push(vt.THEN_BY,t));return this.limitSelector&&(r.limit=this.limitSelector),this.offsetSelector&&(r.skip=this.offsetSelector),s.method=M(o.join(" ")),s.params=r,this.prepared=s,this}isSimpleQuery(){return!(this.selectSelector&&this.selectSelector.length||this.groupBySelectors&&this.groupBySelectors.length||void 0!==this.countSelector||this.countDistinctSelector||this.maxSelector||this.minSelector||this.sumSelector||this.avgSelector||this.distinctSelector)}hasAggregation(){return void 0!==this.countSelector||void 0!==this.countDistinctSelector||void 0!==this.maxSelector||void 0!==this.minSelector||void 0!==this.sumSelector||void 0!==this.avgSelector||void 0!==this.distinctSelector||(this.groupBySelectors?.length||0)>0}async paginate(t,...e){e.pop();try{return this.adapter.Paginator(this.prepared||this.build(),t,this.fromSelector)}catch(t){throw new Jt(t)}}toString(){return this.adapter.flavour+" statement"}}i([U(),n("design:type",Function),n("design:paramtypes",[Array]),n("design:returntype",Object)],Vr.prototype,"select",null),i([U(),n("design:type",Function),n("design:paramtypes",["function"==typeof(Yr="undefined"!=typeof S&&S)?Yr:Object]),n("design:returntype",Object)],Vr.prototype,"distinct",null),i([U(),n("design:type",Function),n("design:paramtypes",["function"==typeof(Gr="undefined"!=typeof S&&S)?Gr:Object]),n("design:returntype",Object)],Vr.prototype,"max",null),i([U(),n("design:type",Function),n("design:paramtypes",["function"==typeof(Hr="undefined"!=typeof S&&S)?Hr:Object]),n("design:returntype",Object)],Vr.prototype,"min",null),i([U(),n("design:type",Function),n("design:paramtypes",["function"==typeof(zr="undefined"!=typeof S&&S)?zr:Object]),n("design:returntype",Object)],Vr.prototype,"sum",null),i([U(),n("design:type",Function),n("design:paramtypes",["function"==typeof(qr="undefined"!=typeof S&&S)?qr:Object]),n("design:returntype",Object)],Vr.prototype,"avg",null),i([U(),n("design:type",Function),n("design:paramtypes",["function"==typeof(Wr="undefined"!=typeof S&&S)?Wr:Object]),n("design:returntype",Object)],Vr.prototype,"count",null),i([U(),n("design:type",Function),n("design:paramtypes",[Object]),n("design:returntype",Object)],Vr.prototype,"from",null),i([U(),n("design:type",Function),n("design:paramtypes",[Kt]),n("design:returntype",Object)],Vr.prototype,"where",null),i([U(),n("design:type",Function),n("design:paramtypes",[Object,String]),n("design:returntype",Object)],Vr.prototype,"orderBy",null),i([U(),n("design:type",Function),n("design:paramtypes",[Object,String]),n("design:returntype",Object)],Vr.prototype,"thenBy",null),i([U(),n("design:type",Function),n("design:paramtypes",["function"==typeof(Qr="undefined"!=typeof Key&&Key)?Qr:Object]),n("design:returntype",Object)],Vr.prototype,"groupBy",null),i([U(),n("design:type",Function),n("design:paramtypes",[Number]),n("design:returntype",Object)],Vr.prototype,"limit",null),i([U(),n("design:type",Function),n("design:paramtypes",[Number]),n("design:returntype",Object)],Vr.prototype,"offset",null),i([U(),n("design:type",Function),n("design:paramtypes",[void 0]),n("design:returntype",Promise)],Vr.prototype,"execute",null);class Jr extends It{constructor(t){super(),this.name=t,this.observers=[],this.Context=Rt}for(t,...e){return new Proxy(this,{get(r,s,i){const n=Reflect.get(r,s,i);return"object"!=typeof n?n:n instanceof Jr?n.for(t,...e):n instanceof _e?n.override(t):n}})}observe(t,e){this.observerHandler||Object.defineProperty(this,"observerHandler",{value:new Pt,writable:!1});const r=this.log.for(this.observe);return this.observerHandler.observe(t,e),r.verbose("Registered new observer "+(t.constructor.name||t.toString())),()=>this.unObserve(t)}unObserve(t){if(!this.observerHandler)throw new u("ObserverHandler not initialized. Did you register any observables? or are you unregistering whe you shouldn't");this.observerHandler.unObserve(t);const e=this.log.for(this.unObserve);e.verbose(`Observer ${t.toString()} removed`),this.observerHandler.count()||(delete this.observerHandler,e.verbose("No longer being observed"))}async updateObservers(t,e,r,...s){if(!this.observerHandler)throw new u("ObserverHandler not initialized. Did you register any observables?");const{log:i,ctxArgs:n}=this.logCtx(s,this.updateObservers);i.verbose(`Updating ${this.observerHandler.count()} observers for ${this}`),await this.observerHandler.updateObservers(t,e,r,...n)}async flags(t,e,...r){e.correlationId=e.correlationId||`${t}-${zt.instance.generate()}`;const s=e.logger||j.for(this);return s.setConfig({correlationId:e.correlationId}),Object.assign({},Ot,e,{args:r,timestamp:new Date,operation:t,logger:s})}async refresh(t,e,r,...s){return this.updateObservers(t,e,r,...s)}async context(t,e,...r){this.log.for(this.context).silly(`creating new context for ${t} operation with flag overrides: ${JSON.stringify(e)}`);let s=r.pop();void 0===s||s instanceof Rt||(r.push(s),s=void 0),e=s?Object.assign({},s.toOverrides(),e):e;const i=await this.flags("string"==typeof t?t:t.name,e,...[...r,s].filter(Boolean));if(s){if(!(s instanceof this.Context)){const t=(new this.Context).accumulate({...s.cache,...i,parentContext:s});return s.accumulate({childContexts:[...s.getOrUndefined("childContexts")||[],t]}),t}if(s.get("operation")!==t){const t=(new this.Context).accumulate({...s.cache,...i,parentContext:s});return s.accumulate({childContexts:[...s.getOrUndefined("childContexts")||[],t]}),t}return s.accumulate(i)}return(new this.Context).accumulate({...i})}logCtx(t,e,r=!1,s){return It.logCtx.call(this,e,s||{},r,...t.filter(t=>void 0!==t))}static get(t){if(!t)throw new u("No name provided");const r=Ut(t),s=e.get(r);if(s)return s;throw new u("No Service found for "+("string"==typeof t?t:"symbol"==typeof t?t.toString():t.name))}static async boot(...t){let r=t.pop();void 0===r||r instanceof Rt||(t.push(r),r=void 0);const s=await Jr.prototype.flags(St.INITIALIZATION,{},...t);r=r?new Rt(r).accumulate({...s,parentContext:r}):(new Rt).accumulate(s),t=[...t,r];const{log:i,ctxArgs:n}=Jr.prototype.logCtx(t,this.boot),o=e.services();for(const[t,r]of Object.entries(o))try{i.verbose(`Booting ${r.name} service...`);const s=e.get(r);if(!s)throw new u("Failed to resolve injectable for "+t);s instanceof Xr&&(i.verbose(`Initializing ${r.name} service...`),await s.boot(...n))}catch(t){throw new u(`Failed to boot ${r.name} service:${t}`)}}static async shutdown(...t){let r=t.pop();void 0===r||r instanceof Rt||(t.push(r),r=void 0);const s=await Jr.prototype.flags(St.SHUTDOWN,{},...t);r=r?new Rt(r).accumulate({...s,parentContext:r}):(new Rt).accumulate(s),t=[...t,r];const{log:i,ctxArgs:n}=Jr.prototype.logCtx(t,this.shutdown),o=e.services();for(const[t,r]of Object.entries(o).reverse())try{i.verbose(`Shutting down ${r.name} service...`);const s=e.get(r);if(!s)throw new u("Failed to resolve injectable for "+t);if(s instanceof Xr){i.verbose(`Gracefully shutting down ${r.name} service...`);try{await s.shutdown(...n)}catch(t){i.error(`Failed to gracefully shutdown ${r.name} service`,t)}}}catch(e){throw new u(`Failed to Shutdown services ${t}: ${e}`)}}}i([U(),n("design:type",Function),n("design:paramtypes",[Object,Function]),n("design:returntype",Function)],Jr.prototype,"observe",null),i([U(),n("design:type",Function),n("design:paramtypes",[Object]),n("design:returntype",void 0)],Jr.prototype,"unObserve",null);class Xr extends Jr{constructor(){super()}async boot(...t){const{log:e,ctxArgs:r}=(await this.logCtx(t,St.INITIALIZATION,!0)).for(this.boot);e.verbose(`Initializing ${this.toString()}...`);const{config:s,client:i}=await this.initialize(...r);this._config=s,this._client=i}get config(){if(!this._config)throw new u("Config not initialized");return this._config}get client(){if(!this._client)throw new u("Client not initialized");return this._client}async shutdown(...t){const{log:e}=await this.logCtx(t,this.shutdown,!0);e.info("Shutting down...")}}function Kr(t){return function(e,r,s){const i=s.value;return s.value=function(...e){const r=this.class;if(r&&Yt(r,t))throw Error(`Operation "${t}" is blocked by @BlockOperations for ${r?.name??"Model"}.`);return i.apply(this,e)},s}}i([U(),n("design:type",Function),n("design:paramtypes",[Object]),n("design:returntype",Promise)],Xr.prototype,"boot",null),i([U(),n("design:type",Object),n("design:paramtypes",[])],Xr.prototype,"config",null),i([U(),n("design:type",Object),n("design:paramtypes",[])],Xr.prototype,"client",null);const Zr=()=>Kr(a.CREATE),ts=()=>Kr(a.READ),es=()=>Kr(a.UPDATE),rs=()=>Kr(a.DELETE);function ss(t){return(e,i,n)=>{n||i?(wt()(e,i),t=t||lt.type(e.constructor,i)):t=t||e,t=Ut(t);const o=[];if(n&&"number"==typeof n.value)o.push(r(t));else if(n||i){if(n)throw Error("Invalid decorator usage. Should be impossible");o.push(r(t))}else lt.set(St.SERVICE,t,e),o.push(s(t,{singleton:!0,callback:e=>Object.defineProperty(e,"name",{enumerable:!0,configurable:!1,writable:!1,value:t})}));return ht(...o)(e,i,n)}}function is(t){const e=St.AUTH;return ut.for(e).define({decorator:t=>mt(e,t),args:[t]}).apply()}const ns=t=>mt(St.AUTH_ROLE,t);function os(t,e){const r=St.DECAF_ROUTE;return ut.for(r).define({decorator:()=>(s,i,n)=>{const o={path:e,httpMethod:t,handler:n};return ht(pt(lt.key(r,i),o))(s,i,n)},args:[]}).apply()}const as=t=>"string"==typeof t?t.endsWith("Service")?t:t+"Service":"symbol"==typeof t?t.toString():t.name+"Service";class cs extends Jr{get class(){if(!this.clazz)throw new u("Class not initialized");return this.clazz}get repo(){return this._repository||(this._repository=_e.forModel(this.clazz)),this._repository}constructor(t,e){super(e??t.name+"Service"),this.clazz=t}static getService(t){if(!t)throw new u("No name provided");const e=as(t);try{const t=Jr.get(e);if(t)return t}catch(t){}throw new u("No ModelService found for alias "+e)}async create(t,...e){const{ctxArgs:r}=(await this.logCtx(e,a.CREATE,!0)).for(this.create);return this.repo.create(t,...r)}async createAll(t,...e){const{ctxArgs:r}=(await this.logCtx(e,c.CREATE_ALL,!0)).for(this.createAll);return this.repo.createAll(t,...r)}async delete(t,...e){const{ctxArgs:r}=(await this.logCtx(e,a.DELETE,!0)).for(this.delete);return this.repo.delete(t,...r)}async deleteAll(t,...e){const{ctxArgs:r}=(await this.logCtx(e,c.DELETE_ALL,!0)).for(this.deleteAll);return this.repo.deleteAll(t,...r)}async read(t,...e){const{ctxArgs:r}=(await this.logCtx(e,a.READ,!0)).for(this.read);return this.repo.read(t,...r)}async readAll(t,...e){const{ctxArgs:r}=(await this.logCtx(e,c.READ_ALL,!0)).for(this.readAll);return this.repo.readAll(t,...r)}async query(t,...e){const{ctxArgs:r}=(await this.logCtx(e,St.QUERY,!0)).for(this.query),s=this.repo?.[t];if("function"!=typeof s)throw new u(`Method "${t}" is not implemented`);return s.apply(this.repo,r)}async update(t,...e){const{ctxArgs:r}=(await this.logCtx(e,a.UPDATE,!0)).for(this.update);return this.repo.update(t,...r)}async updateAll(t,...e){const{ctxArgs:r}=(await this.logCtx(e,c.UPDATE_ALL,!0)).for(this.updateAll);return this.repo.updateAll(t,...r)}async listBy(t,e,...r){const{ctxArgs:s}=(await this.logCtx(r,Et.LIST_BY,!0)).for(this.listBy);return this.repo.listBy(t,e,...s)}async paginateBy(t,e,r,...s){const{ctxArgs:i}=(await this.logCtx(s,Et.PAGE_BY,!0)).for(this.paginateBy);return this.repo.paginateBy(t,e,r,...i)}async findOneBy(t,e,...r){const{ctxArgs:s}=(await this.logCtx(r,Et.FIND_ONE_BY,!0)).for(this.findOneBy);return this.repo.findOneBy(t,e,...s)}async findBy(t,e,...r){const{ctxArgs:s}=(await this.logCtx(r,Et.FIND_BY,!0)).for(this.findBy);return this.repo.findBy(t,e,...s)}async statement(t,...e){const{ctxArgs:r}=(await this.logCtx(e,St.STATEMENT,!0)).for(this.statement);return this.repo.statement(t,...r)}static forModel(t,e){let r;e=as(e||t);try{r=cs.get(e)}catch(t){r=void 0}if(r instanceof cs)return r;const s=this;let o=class extends s{constructor(){super(t)}};return o=i([ss(e),n("design:paramtypes",[])],o),new o}refresh(t,e,r,...s){return this.repo.refresh(t,e,r,...s)}observe(t,e){return this.repo.observe(t,e)}unObserve(t){return this.repo.unObserve(t)}updateObservers(t,e,r,...s){return this.repo.updateObservers(t,e,r,...s)}logCtx(t,e,r=!1){const s=this.repo.adapter.logCtx([this.repo.class,...t],e,r,this.repo._overrides||{});function i(t){return t.ctxArgs.shift(),t}return s instanceof Promise?s.then(i):i(s)}}i([Zr(),n("design:type",Function),n("design:paramtypes",[Object,void 0]),n("design:returntype",Promise)],cs.prototype,"create",null),i([Zr(),n("design:type",Function),n("design:paramtypes",[Array,void 0]),n("design:returntype",Promise)],cs.prototype,"createAll",null),i([rs(),n("design:type",Function),n("design:paramtypes",[Object,void 0]),n("design:returntype",Promise)],cs.prototype,"delete",null),i([rs(),n("design:type",Function),n("design:paramtypes",[Array,void 0]),n("design:returntype",Promise)],cs.prototype,"deleteAll",null),i([ts(),n("design:type",Function),n("design:paramtypes",[Object,void 0]),n("design:returntype",Promise)],cs.prototype,"read",null),i([ts(),n("design:type",Function),n("design:paramtypes",[Array,void 0]),n("design:returntype",Promise)],cs.prototype,"readAll",null),i([ts(),n("design:type",Function),n("design:paramtypes",[String,Object]),n("design:returntype",Promise)],cs.prototype,"query",null),i([es(),n("design:type",Function),n("design:paramtypes",[Object,void 0]),n("design:returntype",Promise)],cs.prototype,"update",null),i([es(),n("design:type",Function),n("design:paramtypes",[Array,Object]),n("design:returntype",Promise)],cs.prototype,"updateAll",null);class ls extends It{constructor(){super()}logCtx(t,e,r=!1){if(!this.adapter)throw new u("Adapter not set yet");return this.adapter.logCtx(t,e,r)}async initialize(...t){if(!this.adapter)return void this.log.for(this.initialize).verbose("No adapter observed for dispatch; skipping initialization");const{log:e}=(await this.logCtx(t,St.INITIALIZATION,!0)).for(this.initialize);e.verbose(`Initializing ${this.adapter}'s event Dispatch`);const r=this.adapter;[a.CREATE,a.UPDATE,a.DELETE,c.CREATE_ALL,c.UPDATE_ALL,c.DELETE_ALL].forEach(t=>{if(!r[t])throw new u(`Method ${t} not found in ${r.alias} adapter to bind Observables Dispatch`);let e=Object.getOwnPropertyDescriptor(r,t),s=r;for(;!e&&s!==Object.prototype;)s=Object.getPrototypeOf(s),e=Object.getOwnPropertyDescriptor(s,t);function i(t){switch(t){case c.CREATE_ALL:return a.CREATE;case c.UPDATE_ALL:return a.UPDATE;case c.DELETE_ALL:return a.DELETE;default:return t}}e&&e.writable?r[t]=new Proxy(r[t],{apply:async(e,r,s)=>{const{log:n,ctxArgs:o,ctx:a}=r.logCtx(s.slice(3-(4-s.length),s.length),e),[c,l,u]=s,d=await e.call(r,c,l,u,...o),h=[c,i(t),l];return a.get("observeFullResult")&&h.push(Array.isArray(d)?d.map(t=>c(t)):c(d)),this.updateObservers(...h,...o).catch(e=>n.error(`Failed to dispatch observer refresh for ${t} on ${c.name||c} for ${l}: ${e}`)),d}}):this.log.error(`Could not find method ${t} to bind Observables Dispatch`)})}async close(){}observe(t){if(!(t instanceof Vt))throw new Lt("Only Adapters can be observed by dispatch");return this.adapter=t,this.models=Vt.models(this.adapter.alias),this.initialize().then(()=>this.log.verbose(`Dispatch initialized for ${this.adapter.alias} adapter`)),()=>this.unObserve(t)}unObserve(t){if(this.adapter!==t)throw new Lt("Only the adapter that was used to observe can be unobserved");this.adapter=void 0}async updateObservers(t,e,r,...s){if(!t)throw new u("Model must be provided for observer update");const i=t&&"string"==typeof t?t:H.tableName(t),{log:n,ctxArgs:o,ctx:a}=this.logCtx(s,this.updateObservers);if(this.adapter)try{n.debug(`dispatching observer refresh for ${e}:${i}: ${r}${a.get("observeFullResult")?" - including result":""}`),await this.adapter.refresh(t,e,r,...o)}catch(t){throw new u("Failed to refresh dispatch: "+t)}else n.verbose(`No adapter observed for dispatch; skipping observer update for ${i}:${e}`)}toString(){return(this.adapter?this.adapter.toString():"uninitialized")+" event dispatch"}}async function us(t,e,r,s){if(t.get("allowGenerationOverride")&&void 0!==s[r])return;let{seed:i,args:n}=e;i&&"function"==typeof i&&(i=i(s,...n||[],t)),s[r]=await zt.instance.generate(i)}function ds(t=!1,e,...r){"function"==typeof t&&(e=t,t=!1);const s=St.UUID;return ut.for(s).define({decorator:(t,e,...r)=>{const s={update:t,seed:e,args:r},i=[q(),x(St.UUID),A(us,s,{priority:54})];return t&&i.push(C(us,s,{priority:54})),t||i.push(v()),ht(...i)},args:[t,e,...r]}).apply()}Vt&&(Vt._baseDispatch=ls);class hs extends It{static{this.lock=new ct}constructor(t,e,r={}){super(),this.options=t,this.adapter=e,this.repo=_e.forModel(Ur,e.alias).override(r)}async current(...t){const{log:e,ctx:r}=await this.logCtx(t,a.READ,!0),{name:s,startWith:i}=this.options;try{const t=await this.repo.read(s,r);return this.parse(t.current)}catch(t){if(t instanceof m){if(e.debug(`Sequence.current missing ${s}, returning startWith=${i}`),void 0===i)throw new u("Starting value is not defined for a non existing sequence");try{return this.parse(i)}catch(t){throw new u(`Failed to parse initial value for sequence ${i}: ${t}`)}}throw new u(`Failed to retrieve current value for sequence ${s}: ${t}`)}}async increment(t,e){const{log:r,ctx:s}=this.adapter.logCtx([e],this.increment),{type:i,incrementBy:n,name:o}=this.options;if(!o)throw new u("Sequence name is required");return hs.lock.execute(async()=>{const e=t||n;if(e%n!==0)throw new u("Value to increment does not consider the incrementBy setting: "+n);const a="function"==typeof i&&i?.name?i.name:i,c=await this.current(s),l=async t=>{try{return await this.repo.update(new Ur({id:o,current:t}),s)}catch(e){if(e instanceof m)return r.debug(`Sequence create ${o} current=${c} next=${t}`),this.repo.create(new Ur({id:o,current:t}),s);throw e}};if("uuid"===a)for(;;){const t=await Promise.resolve(zt.instance.generate(c));try{const e=await l(t);return r.debug(`Sequence uuid increment ${o} current=${c} next=${t}`),e.current}catch(t){if(t instanceof N)continue;throw t}}const d=await(async t=>{switch(a){case Number.name:return this.parse(t)+e;case BigInt.name:return this.parse(t)+BigInt(e);case String.name:return this.parse(t);case"serial":return await Promise.resolve(qt.instance.generate(t));default:throw new u("Should never happen")}})(c),h=await l(d);return r.debug(`Sequence.increment ${o} current=${c} next=${d}`),h.current},o)}async next(...t){const{ctx:e}=(await this.logCtx(t,a.UPDATE,!0)).for(this.next);return this.increment(void 0,e)}async range(t,...e){const{ctx:r,log:s}=(await this.logCtx(e,a.UPDATE,!0)).for(this.range);if("uuid"===this.options.type||"serial"===this.options.type)throw new Lt(`type ${this.options.type} is currently not suppported for this adapter`);const i="function"==typeof this.options.type&&this.options.type?.name?this.options.type.name:this.options.type,n=this.parse(this.options.incrementBy),o=await this.increment(this.parse(t)*n,r);let c=[];for(let e=0;t-1>=e;e++)c.push(o-n*this.parse(e));if(c=c.reverse(),c[c.length-1]!==o&&"String"!==i)throw new u("Miscalculation of range");return s.debug("Calculated range: "+c.join(", ")),c}parse(t){return hs.parseValue(this.options.type,t)}logCtx(t,e,r=!1){const s=this.adapter.logCtx([Ur,...t],e,r);function i(t){return t.ctxArgs.shift(),t}return s instanceof Promise?s.then(i):i(s)}static pk(t){return H.sequenceName(t,"pk")}static parseValue(t,e){switch("function"==typeof t&&t?.name?t.name:t){case Number.name||Number.name.toLowerCase():return"string"==typeof e?parseInt(e):"number"==typeof e?e:BigInt(e);case BigInt.name||BigInt.name.toLowerCase():return BigInt(e);case String.name||String.name.toLowerCase():return e.toString();case void 0:case"uuid":case"serial":return e;default:throw new Lt(`Unsupported sequence type: ${t} for adapter ${this}`)}}}Vt._baseSequence=hs;class ps extends Xr{constructor(){super()}for(t,...e){throw new Lt("Persistence service cannot be overridden")}async initialize(...t){const e=t.shift();if(!e||!Array.isArray(e)||e instanceof Rt||!e.every(t=>Array.isArray(t)))throw new u("Missing/invalid configuration");const{log:r,ctxArgs:s}=(await this.logCtx(t,St.INITIALIZATION,!0)).for(this.initialize),i=e.map(([t,e,...s])=>{try{r.silly(`Initializing ${t.name} with config: ${JSON.stringify(e)}`);const i=new t(e,...s);return r.debug(`Initialized ${i.toString()}...`),i}catch(e){throw new u(`Failed to initialize ${t.name}: ${e}`)}});for(const t of i)try{await t.initialize(...s)}catch(e){throw new u(`Failed to initialize ${t.toString()}: ${e}`)}return{client:i,config:e}}}let gs=class extends H{constructor(t){super(t),this.strategy=Ce.EXPONENTIAL,this.baseMs=1e3,this.maxMs=6e4,this.jitter=Te.FULL}};i([q(),tt(String),et(Ce),bt("the backoff strategy"),n("design:type",String)],gs.prototype,"strategy",void 0),i([q(),bt("base interval between attempts"),n("design:type",Number)],gs.prototype,"baseMs",void 0),i([q(),bt("max interval"),n("design:type",Number)],gs.prototype,"maxMs",void 0),i([tt(String),et(Te),bt("optional jitter strategy"),n("design:type",String)],gs.prototype,"jitter",void 0),gs=i([V(),n("design:paramtypes",[Object])],gs);let fs=class extends H{constructor(t){super(t)}};i([q(),bt("The error message"),n("design:type",String)],fs.prototype,"message",void 0),i([wt(),bt("The error stack"),n("design:type",String)],fs.prototype,"stack",void 0),i([wt(),bt("The error code"),n("design:type",String)],fs.prototype,"code",void 0),i([wt(),bt("The error details"),n("design:type",Object)],fs.prototype,"details",void 0),fs=i([V(),n("design:paramtypes",[Object])],fs);let ys=class extends H{constructor(t){super(t),this.ts=new Date}};i([I(["taskId","classification","uuid"],":"),We(),n("design:type",String)],ys.prototype,"id",void 0),i([v(),q(),$(),ds(!1),n("design:type",String)],ys.prototype,"uuid",void 0),i([v(),q(),n("design:type",String)],ys.prototype,"taskId",void 0),i([rt(),q(),n("design:type",Date)],ys.prototype,"ts",void 0),i([v(),q(),et(Ne),n("design:type",String)],ys.prototype,"classification",void 0),i([wt(),v(),n("design:type",Object)],ys.prototype,"payload",void 0),ys=i([vr("task_event"),V(),n("design:paramtypes",[Object])],ys);class ms extends st{constructor(){super()}preSerialize(t,...e){return this.serializeValue(t,...e)}deserialize(t,...e){const r=JSON.parse(t);return this.rebuildValue(r)}serializeValue(t,...e){if(null==t)return t;if("object"!=typeof t)return t;if(t instanceof Date)return t.toISOString();if(Array.isArray(t))return t.map(t=>this.serializeValue(t,...e));if(t instanceof Kt){const r=this.serializePlain(t,...e);return r[it.ANCHOR]="??condition",r}return H.isModel(t)?this.serializeModel(t,...e):this.serializePlain(t,...e)}serializeModel(t,...e){const r=this.serializePlain(t,...e),s=this.getMetadata(t.constructor)??t.constructor?.name;return s&&(r[it.ANCHOR]=s),r}serializePlain(t,...e){const r={};for(const[s,i]of Object.entries(t))r[s]=this.serializeValue(i,...e);return r}getMetadata(t){try{return lt.modelName(t)}catch{return}}rebuildValue(t){if(null===t||"object"!=typeof t)return t;if(Array.isArray(t))return t.map(t=>this.rebuildValue(t));const e=t[it.ANCHOR],r=this.rebuildObject(t);return e?"??condition"===e?Kt.from(r):H.build(r,e):r}rebuildObject(t){const e={};for(const[r,s]of Object.entries(t))r!==it.ANCHOR&&(e[r]=this.rebuildValue(s));return e}serialize(t,...e){return JSON.stringify(this.preSerialize(t))}}let ws=class extends H{constructor(t){super(t),this.ts=new Date}};i([rt(),q(),n("design:type",Date)],ws.prototype,"ts",void 0),i([q(),et(Y),n("design:type",String)],ws.prototype,"level",void 0),i([q(),wt(),n("design:type",String)],ws.prototype,"msg",void 0),i([wt(),n("design:type",Object)],ws.prototype,"meta",void 0),ws=i([V(),n("design:paramtypes",[Object])],ws);let bs=class extends H{constructor(t){super(t),this.atomicity=ke.ATOMIC,this.status=Oe.PENDING,this.attempt=0,this.logTail=[]}};i([We({type:"uuid"}),bt("the task id"),n("design:type",String)],bs.prototype,"id",void 0),i([q(),tt(String),et(ke),bt("defines a single or composite task"),n("design:type",String)],bs.prototype,"atomicity",void 0),i([q(),bt("Holds task classification - must match @task()"),n("design:type",String)],bs.prototype,"classification",void 0),i([wt(),bt("optional task name for ambiguity"),n("design:type",String)],bs.prototype,"name",void 0),i([q(),tt(String),et(Oe),bt("Holds the task current status"),n("design:type",String)],bs.prototype,"status",void 0),i([wt(),P(ms),bt("Holds task input"),n("design:type",Object)],bs.prototype,"input",void 0),i([wt(),P(ms),bt("Holds the task output when successfully completed"),n("design:type",Object)],bs.prototype,"output",void 0),i([wt(),P(),bt("Holds the error for failed tasks"),n("design:type",fs)],bs.prototype,"error",void 0),i([q(),nt(0),bt("Holds the current attempt"),n("design:type",Number)],bs.prototype,"attempt",void 0),i([nt(1),q(),bt("max attempts for the task"),n("design:type",Number)],bs.prototype,"maxAttempts",void 0),i([q(),P(),bt("backoff configuration"),n("design:type",gs)],bs.prototype,"backoff",void 0),i([rt(),bt("Next execution timestamp"),n("design:type",Date)],bs.prototype,"nextRunAt",void 0),i([rt(),bt("Task scheduled timestamp"),n("design:type",Date)],bs.prototype,"scheduledTo",void 0),i([wt(),bt("Task lease owner identifier"),n("design:type",String)],bs.prototype,"leaseOwner",void 0),i([rt(),bt("Task lease expiration timestamp"),n("design:type",Date)],bs.prototype,"leaseExpiry",void 0),i([wt(),P(),bt("Holds the various steps definition and inputs - only for type === 'composite'"),n("design:type",Array)],bs.prototype,"steps",void 0),i([nt(0),wt(),bt("Holds the current step - only for type === 'composite'"),n("design:type",Number)],bs.prototype,"currentStep",void 0),i([wt(),P(),bt("Holds the step results - only for type === 'composite'"),n("design:type",Array)],bs.prototype,"stepResults",void 0),i([wt(),P(),bt("Holds the task log entries"),n("design:type",Array)],bs.prototype,"logTail",void 0),i([Ar(),Tr(),bt("timestamp of creation"),n("design:type",Date)],bs.prototype,"createdAt",void 0),i([Ar(),Nr(),bt("timestamp of last update"),n("design:type",Date)],bs.prototype,"updatedAt",void 0),i([Ar(),Or(),bt("Holds the creator of the task"),n("design:type",String)],bs.prototype,"createdBy",void 0),i([Ar(),Cr(),bt("Holds the creator of the task"),n("design:type",String)],bs.prototype,"updatedBy",void 0),bs=i([bt("Holds the current step when applicable"),vr("tasks"),V(),n("design:paramtypes",[Object])],bs);let vs=class extends H{constructor(t){super(t)}};i([q(),bt("The status of a step"),n("design:type",String)],vs.prototype,"status",void 0),i([wt(),bt("The result of a successful step"),n("design:type",Object)],vs.prototype,"output",void 0),i([wt(),bt("the error of a failed step"),n("design:type",fs)],vs.prototype,"error",void 0),vs=i([V(),n("design:paramtypes",[Object])],vs);let As=class extends H{constructor(t){super(t)}};i([q(),wt(),bt("task handler type"),n("design:type",String)],As.prototype,"classification",void 0),i([bt("optional task step input"),wt(),n("design:type",Object)],As.prototype,"input",void 0),As=i([V(),n("design:paramtypes",[Object])],As);class xs extends H{constructor(t){super(t),this.baseMs=1e3,this.jitter=Te.FULL,this.maxMs=6e4,this.strategy=Ce.EXPONENTIAL,H.fromModel(this,t)}setBaseMs(t){return this.baseMs=t,this}setJitter(t){return this.jitter=t,this}setMaxMs(t){return this.maxMs=t,this}setStrategy(t){return this.strategy=t,this}build(){const t=this.hasErrors();if(t)throw new d(t);return new gs(this)}}i([q(),nt(1e3),n("design:type",Number)],xs.prototype,"baseMs",void 0),i([q(),et(Te),n("design:type",String)],xs.prototype,"jitter",void 0),i([ot("baseMs"),nt(1e3),q(),n("design:type",Number)],xs.prototype,"maxMs",void 0),i([q(),et(Ce),n("design:type",String)],xs.prototype,"strategy",void 0);class Es extends H{setClassification(t){return this.classification=t,this}setName(t){return this.name=t,this}setAtomicity(t){return this.atomicity=t,this}setBackoff(t){if(t)return this.backoff=t,this;const e=new xs,r=this;return e.build=new Proxy(e.build,{apply:(t,e,s)=>(r.backoff=Reflect.apply(t,e,s),r)}),e}setInput(t){return this.input=t,this}setMaxAttempts(t){return this.maxAttempts=t,this}constructor(t){super(t),this.status=Oe.PENDING,this.atomicity=ke.ATOMIC,this.backoff=new gs,this.maxAttempts=1,H.fromModel(this,t)}build(){const t=this.hasErrors();if(t)throw new d(t);return new bs(this)}}i([q(),n("design:type",String)],Es.prototype,"classification",void 0),i([wt(),n("design:type",String)],Es.prototype,"name",void 0),i([q(),n("design:type",String)],Es.prototype,"status",void 0),i([q(),n("design:type",String)],Es.prototype,"atomicity",void 0),i([q(),n("design:type",gs)],Es.prototype,"backoff",void 0),i([wt(),n("design:type",Object)],Es.prototype,"input",void 0),i([nt(1),q(),n("design:type",Number)],Es.prototype,"maxAttempts",void 0);class Ss extends Es{constructor(t){super(t),this.stepResults=[],H.fromModel(this,t),this.atomicity=ke.COMPOSITE}setAtomicity(t){throw new u("Atomicity locked to "+ke.COMPOSITE)}setSteps(t){return this.steps=t,this}addStep(t,e){this.steps=this.steps||[];const r=new Date;return this.steps.push(new As({classification:t,input:e,createdAt:r,updatedAt:r})),this}}i([Z(()=>As),n("design:type",Array)],Ss.prototype,"steps",void 0);class Os extends $t{get type(){if(!this._type){const t=lt.get(this.constructor,Re);"string"==typeof t?this._type=t:t&&"string"==typeof t.type&&(this._type=t.type)}if(!this._type)throw new u("No type annotation for this handler found. did you use @task()?");return this._type}constructor(){super(),p(this,this.runPrefix.bind(this),this.run.bind(this),this.runSuffix.bind(this),this.run.name)}async runPrefix(t,...e){const{log:r,ctx:s,ctxArgs:i}=this.logCtx(e,this.runPrefix);return r.info(`Running task ${s.taskId} attempt ${s.attempt}`),[t,...i]}runSuffix(t,e){const{log:r}=this.logCtx([e],this.runPrefix);return r.info(`Concluded task ${e.taskId} attempt ${e.attempt}`),t}}function Cs(t){return ut.for(Re).define({decorator:t=>e=>{const r={type:t};return lt.set(Re,t,e),mt(Re,r)(e)},args:[t]}).apply()}let Ts=class extends Os{constructor(){super()}async run(t,e){const r=e.logger;try{let s;if(t instanceof Kt)s=t,r.info("Starting task cleanup with custom condition");else{r.info("Starting task cleanup with expiry dates");const e=Kt.attr("status").eq(Oe.SUCCEEDED).and(Kt.attr("updatedAt").lte(t.successfulExpiry)),i=Kt.attr("status").eq(Oe.FAILED).and(Kt.attr("updatedAt").lte(t.failedExpiry)),n=Kt.attr("status").eq(Oe.CANCELED).and(Kt.attr("updatedAt").lte(t.cancelledExpiry));s=e.or(i).or(n)}r.info("Querying tasks for cleanup");const i=await this.tasks.select(["id"]).where(s).execute(e);if(0===i.length)return r.info("No tasks found for cleanup"),[];r.info(`Found ${i.length} tasks to delete`);const n=await this.tasks.deleteAll(i.map(t=>t.id),e);return r.info(`Successfully deleted ${n.length} tasks`),r.debug("deleted tasks:",n),n}catch(t){throw r.error("Error during task cleanup",t),t}}};i([$e(bs),n("design:type",Object)],Ts.prototype,"tasks",void 0),Ts=i([Cs("cleanup-task"),n("design:paramtypes",[])],Ts);class Ns{constructor(t,e=150,r=300,s){this.logger=t,this.bufferSize=e,this.maxBufferSize=r,this.pipe=s,this.history=[],this.root=this.logger.root,Object.values(Y).forEach(t=>{this[t]=new Proxy(this[t],{apply:(e,r,s)=>{e.apply(r,s),r.push(t,...s)}})})}push(t,e,r){this.history.length<this.maxBufferSize||this.history.splice(0,this.history.length-this.bufferSize),this.history.push([t,e,r])}flush(t){const e=this.history;return this.history=[],t&&e.length?t(e).catch(t=>this.logger.error("Failed to pipe logs",t)).finally(()=>this.history=[]):(this.history=[],e)}benchmark(t){return this.logger.benchmark(t)}clear(){return this.logger=this.logger.clear(),this}debug(t,e){this.logger.debug(t,e)}error(t,e,r){this.logger.error(t,e,r)}for(t,...e){return new Proxy(this,{get:(r,s)=>"logger"===s?Reflect.get(r,s).for(t,...e):Reflect.get(r,s)})}info(t,e){this.logger.info(t,e)}setConfig(t){this.logger.setConfig(t)}silly(t,e){this.logger.silly(t,e)}trace(t,e){this.logger.trace(t,e)}verbose(t,e,r){this.logger.verbose(t,e,r)}warn(t,e){this.logger.warn(t,e)}}function ks(t,e={logProgress:!0,logStatus:!0,style:!0}){return async r=>{switch(t=t.for(r.taskId,{style:!1,timestamp:!1,logLevel:!1}),r.classification){case Ne.LOG:{const s=r.payload;for(let[r,i,n]of s){e.style||(i=G(i),i=i.clear().toString());const s=[i];r===Y.verbose&&s.push(1),s.push(n);try{t[r](...s)}catch(e){t.error("Failed to pipe task logs",e)}}break}case Ne.PROGRESS:if(e.logProgress){const{currentStep:e,totalSteps:s}=r.payload;t.info(`### STEP ${e}/${s}`)}break;case Ne.STATUS:if(e.logStatus){const e=r.payload?.status??r.payload;let s=G(e);switch(e){case Oe.SUCCEEDED:s=s.green.bold;break;case Oe.RUNNING:s=s.blue.bold;break;case Oe.PENDING:s=s.yellow;break;case Oe.WAITING_RETRY:s=s.yellow.bold;break;case Oe.FAILED:s=s.red.bold;break;case Oe.CANCELED:s=s.magenta.bold;break;case Oe.SCHEDULED:s=s.cyan;break;default:throw new u("Received unknown task status: "+r.payload)}t.info("### STATUS "+s)}break;default:throw new u("Unknown task event classification: "+r.classification)}}}function _s(t,e){const r=e.strategy===Ce.FIXED?e.baseMs:e.baseMs*Math.pow(2,Math.max(0,t-1)),s=Math.min(r,e.maxMs);return e.jitter===Te.FULL?Math.floor(Math.random()*s):s}function Ds(t){return new fs({message:t?.message??t+"",stack:t?.stack,code:t?.code,details:t?.details})}function Bs(t){return new Promise(e=>setTimeout(e,t))}class Rs extends Error{constructor(t){super("Task requested state change: "+t.status),this.request=t,this.name=Rs.name,Object.setPrototypeOf(this,Rs.prototype)}}class Is extends Rt{get taskId(){return this.get("taskId")}get logger(){return super.logger}get pipe(){return this.get("pipe")}flush(){return this.get("flush")()}get attempt(){return this.get("attempt")}get progress(){return this.get("progress")}get heartbeat(){return this.get("heartbeat")}cacheResult(t,e){const r=this.cache.has("resultCache")&&this.cache.get("resultCache")||{};r[t]=e,this.cache.put("resultCache",r)}changeState(t,e){throw new Rs({status:t,...e})}cancel(t,e){this.changeState(Oe.CANCELED,{error:this.toTaskError(t,e)})}retry(t){this.changeState(Oe.WAITING_RETRY,{error:this.toTaskError(t)})}reschedule(t,e){const r=t instanceof Date?t:t.build();this.changeState(Oe.SCHEDULED,{error:this.toTaskError(e),scheduledTo:r})}toTaskError(t,e){if(t||e)return t instanceof fs?t:t instanceof Error?Ds(t):new fs({message:(t??"Task requested state change")+"",details:e})}get resultCache(){return this.get("resultCache")}constructor(t){super(t)}}class $s{constructor(){this.handlers=new Map,this.initialize()}initialize(){const t=lt.tasks();t&&Object.entries(t).forEach(([t,e])=>{let r;try{r=new e}catch(e){throw new u(`Failed to initialize handler with key ${t}: ${e}`)}this.register(r)})}register(t){if(this.handlers.has(t.type))throw new u("Duplicate task handler: "+t.type);this.handlers.set(t.type,t)}get(t){return this.handlers.get(t)}}class Ps extends Pt{constructor(){super(...arguments),this.listeners=new Set}observe(t,e){return super.observe(t,e)}unObserve(t){super.unObserve(t)}emit(t,e){this.updateObservers(ys,t.classification,t.id,t,e)}async updateObservers(t,e,r,s,...i){const{log:n,ctxArgs:o}=Vt.logCtx(this.updateObservers,void 0,!1,...i);(await Promise.allSettled(this.observers.filter(s=>{const{filter:i}=s;if(!i)return!0;try{return i(t,e,r,...o)}catch(t){return n.error(`Failed to filter observer ${s.observer.toString()}: ${t}`),!1}}).map(t=>{t.observer.refresh(s,...o)}))).forEach((t,e)=>{"rejected"===t.status&&n.error(`Failed to update observable ${this.observers[e].toString()}: ${t.reason}`)})}}function Ls(t,e){return t instanceof Error&&"nextAction"in t&&"string"==typeof t.nextAction&&(!e||t instanceof e)}class Fs extends L{constructor(t,e,r,s,i,n=500){super(t,r,n),this.taskId=e,this.details=s,this.meta=i}}class js extends Fs{constructor(t,e,r){super(js.name,t,e?.message??`Task ${t} failed`,e,r,500)}}class Us extends Fs{constructor(t,e,r){const s=r?.nextRunAt instanceof Date?r.nextRunAt.toISOString():r?.nextRunAt;super(Us.name,t,e?.message??`Task ${t} scheduled for retry${s?" at "+s:""}`,e,r,409)}}class Ms extends Fs{constructor(t,e,r){super(Ms.name,t,e?.message??`Task ${t} canceled`,e,r,400)}}class Ys extends Fs{constructor(t,e,r){const s=r?.scheduledTo instanceof Date?r.scheduledTo.toISOString():r?.scheduledTo;super(Ys.name,t,e?.message??`Task ${t} rescheduled${s?" to "+s:""}`,e,r,202)}}class Gs{constructor(t,e){this.bus=t,this.task=e,this.resolved=!1,this.unregistration=t.observe(this,(t,e,r,...s)=>r.startsWith(this.task.id)&&(t===ys||t===H.tableName(ys))),this.pipe(this.track.bind(this)),this.resolveTerminalState()}resolve(){return this.awaitStatusTerminal([Oe.SUCCEEDED,Oe.FAILED,Oe.CANCELED,Oe.SCHEDULED])}wait(){return this.awaitStatusTerminal([Oe.SUCCEEDED,Oe.FAILED,Oe.CANCELED])}attach(t,e={logProgress:!0,logStatus:!0,style:!0}){this.pipe(ks(t,e))}logs(t){this.pipe(async e=>{if(e.classification!==Ne.LOG)return;const r=e.payload;await t(r)},Ne.LOG)}pipe(t,e=Ne.ALL){this.pipes=this.pipes||{},this.pipes[e]=this.pipes[e]||new Set,this.pipes[e].add(t)}succeed(t){this.complete()}fail(t){this.complete()}cancel(t){t.payload&&this.fail()}retry(){}reschedule(){}onSucceed(t){return this.registerStatusHandler(Oe.SUCCEEDED,t)}onFailure(t){return this.registerStatusHandler(Oe.FAILED,t)}onCancel(t){return this.registerStatusHandler(Oe.CANCELED,t)}awaitStatusTerminal(t){return new Promise((e,r)=>{const s=[];let i=!1;const n=async t=>{if(!i){(()=>{if(!i){i=!0;for(const t of s)t()}})();try{t.payload?.status===Oe.SUCCEEDED?e(this.extractOutput(t)):r(this.extractError(t))}catch(t){r(t)}}};t.forEach(t=>{const e=this.registerStatusHandler(t,n);s.push(e)})})}extractOutput(t){return void 0!==t.payload?.output?t.payload.output:this.task.output}extractError(t){const e=t.payload?.status??this.task.status,r=this.getNextAction(e),s=t.payload?.originalError;if(s instanceof Error)return this.assignNextAction(s,r);const i=this.buildMeta(e,t.payload),n=this.createTaskControlError(e,t.payload?.error??this.task.error,i);return this.assignNextAction(n,r)}complete(){this.resolved||(this.resolved=!0,this.unregistration(),this.pipes=void 0)}isTerminalStatus(t){return[Oe.SUCCEEDED,Oe.CANCELED,Oe.FAILED].includes(t)}async track(t,e){if(!t.payload)return;const r=t.payload.status;this.task.status=r,void 0!==t.payload.output&&(this.task.output=t.payload.output),t.payload.error&&(this.task.error=t.payload.error),void 0!==t.payload.nextRunAt&&(this.task.nextRunAt=t.payload.nextRunAt),void 0!==t.payload.scheduledTo&&(this.task.scheduledTo=t.payload.scheduledTo),r!==Oe.SUCCEEDED?(r===Oe.FAILED&&this.fail(),r===Oe.CANCELED&&this.cancel(t),r===Oe.WAITING_RETRY&&this.retry(),r===Oe.SCHEDULED&&this.reschedule()):this.succeed()}registerStatusHandler(t,e){const r=async(r,s)=>{r.payload?.status===t&&await e(r,s)};if(this.pipe(r,Ne.STATUS),this.task.status===t){const e=this.buildTerminalEvent(t);r(e,this.getTerminalContext())}return()=>{this.pipes?.[Ne.STATUS]?.delete(r)}}getTerminalContext(){return this.terminalContext||(this.terminalContext=new Rt),this.terminalContext}buildTerminalEvent(t){const e={status:t};return t===Oe.SUCCEEDED&&(e.output=this.task.output),t!==Oe.FAILED&&t!==Oe.CANCELED||!this.task.error||(e.error=this.task.error),this.task.nextRunAt&&(e.nextRunAt=this.task.nextRunAt),this.task.scheduledTo&&(e.scheduledTo=this.task.scheduledTo),new ys({classification:Ne.STATUS,taskId:this.task.id,payload:e})}createTaskControlError(t,e,r){switch(t){case Oe.FAILED:return new js(this.task.id,e,r);case Oe.CANCELED:return new Ms(this.task.id,e,r);case Oe.WAITING_RETRY:return new Us(this.task.id,e,r);case Oe.SCHEDULED:return new Ys(this.task.id,e,r);default:return new js(this.task.id,e,r)}}assignNextAction(t,e){return e&&(t.nextAction=e),t}getNextAction(t){switch(t){case Oe.CANCELED:return Oe.CANCELED;case Oe.WAITING_RETRY:return Oe.WAITING_RETRY;case Oe.SCHEDULED:return Oe.SCHEDULED;case Oe.FAILED:return Oe.FAILED;default:return}}buildMeta(t,e){const r={};if(e?.nextRunAt&&(r.nextRunAt=e.nextRunAt),e?.scheduledTo&&(r.scheduledTo=e.scheduledTo),Object.keys(r).length)return r}resolveTerminalState(){if(!this.isTerminalStatus(this.task.status))return;if(this.task.status===Oe.SUCCEEDED)return void this.succeed(this.task.output);const t={status:this.task.status,nextRunAt:this.task.nextRunAt,scheduledTo:this.task.scheduledTo};this.fail(this.createTaskControlError(this.task.status,this.task.error,this.buildMeta(this.task.status,t)))}async refresh(t,e){if(!this.pipes)return;const r=this.pipes[Ne.ALL]?[...this.pipes[Ne.ALL].values()]:[];r.push(...this.pipes[t.classification]?.values()||[]);for(const s of r)try{await s(t,e)}catch(r){e.logger.error(`Failed to trigger pipe ${s.name} for event ${t.classification}. discarding event`,r)}}}class Hs extends $t{get Context(){return Is}get adapter(){return this.config.adapter}get registry(){return this.config.registry}get bus(){return this.config.bus}get tasks(){return this._tasks||(this._tasks=_e.forModel(bs,this.adapter.alias),this.config.overrides&&(this._tasks=this._tasks.override(this.config.overrides))),this._tasks}get events(){return this._events||(this._events=_e.forModel(ys,this.config.adapter.alias),this.config.overrides&&(this._events=this._events.override(this.config.overrides))),this._events}constructor(t){super(),this.config=t,this.lock=new at,this.running=!1,this.config=Object.assign({},Ie,t,{bus:t.bus||new Ps,registry:t.registry||new $s})}async push(t,e=!1,...r){const{ctx:s,log:i}=(await this.logCtx(r,a.CREATE,!0)).for(this.push);i.verbose("pushing task "+t.classification);const n=await this.tasks.create(t,s);return i.info(`${t.classification} task registered under ${n.id}`),e?{task:n,tracker:new Gs(this.bus,n)}:n}schedule(t,e=!1,...r){return{for:async s=>{const i=s instanceof Date?s:s.build();return t.status=Oe.SCHEDULED,t.scheduledTo=i,t.nextRunAt=void 0,t.leaseOwner=void 0,t.leaseExpiry=void 0,await this.push(t,e,...r)}}}async track(t,...e){const{ctx:r,log:s}=(await this.logCtx(e,a.READ,!0)).for(this.track);s.verbose("tracking task "+t);let i=await this.tasks.read(t,r);return i=await this.ensureTaskError(i,r),s.info(`${i.classification} task found with id ${t}`),{task:i,tracker:new Gs(this.bus,i)}}async ensureTaskError(t,e){if(![Oe.FAILED,Oe.CANCELED].includes(t.status)||t.error)return t;let r=t;for(let t=0;6>t;t+=1){await Bs(20);try{const t=await this.tasks.read(r.id,e);if(t.error)return t;r=t}catch{break}}return r}async cancel(t,...e){const{ctx:r}=(await this.logCtx(e,"cancel",!0)).for(this.cancel),s=await this.tasks.read(t,r);if(s.status===Oe.SUCCEEDED||s.status===Oe.FAILED)return s;s.status=Oe.CANCELED;const i=new fs({message:`Task ${s.id} canceled`,code:400});s.error=i,s.leaseOwner=void 0,s.leaseExpiry=void 0,s.nextRunAt=void 0,s.scheduledTo=void 0;const n=await this.tasks.update(s,r);return await this.emitStatus(r,n,Oe.CANCELED,i),n}async isRunning(){await this.lock.acquire();const t=this.running;return this.lock.release(),t}async start(...t){const{ctx:e}=(await this.logCtx(t,"run",!0)).for(this.start);await this.lock.acquire(),this.running||(this.running=!0,this.lock.release(),this.loop(e))}async stop(...t){const{ctx:e,log:r}=(await this.logCtx(t,St.SHUTDOWN,!0)).for(this.stop);await this.lock.acquire(),this.running||r.warn("stop method called when task engine was not running"),this.running=!1,this.lock.release();const s=await this.tasks.select(["id"]).where(Kt.attr("status").eq(Oe.RUNNING)).execute(e),i=e.getOrUndefined?.("gracefulShutdownMsTimeout")??this.config.gracefulShutdownMsTimeout;return new Promise((t,n)=>{const o=setTimeout(()=>{r.error(`Graceful shutdown interrupted after ${i} ms...`),t()},i);Promise.allSettled(s.map(({id:t})=>new Promise((r,s)=>{this.track(t,e).then(({tracker:t})=>{t.resolve().then(r)}).catch(s)}))).then(e=>{clearTimeout(o),r.info(`Graceful shutdown completed before expiry. concluded ${e.length} tasks`),t()}).catch(t=>{clearTimeout(o),n(t)})})}async loop(...t){const{ctx:e}=this.logCtx(t,this.loop);for(;await this.isRunning();){const t=await this.claimBatch(e);await Promise.allSettled(t.map(t=>this.executeClaimed(t))),await Bs(t.length?this.config.pollMsBusy:this.config.pollMsIdle)}}async claimBatch(t){const e=t.logger.for(this.claimBatch),r=new Date,s=Kt.attribute("status").eq(Oe.PENDING),i=Kt.attribute("status").eq(Oe.WAITING_RETRY).and(Kt.attribute("nextRunAt").lte(r)),n=Kt.attribute("status").eq(Oe.RUNNING).and(Kt.attribute("leaseExpiry").lte(r)),o=Kt.attribute("status").eq(Oe.SCHEDULED).and(Kt.attribute("scheduledTo").lte(r)),a=s.or(i).or(n).or(o),c=await this.tasks.select().where(a).limit(Math.max(4*this.config.concurrency,20)).execute();e.verbose("claimBatch candidates:"+c.length);const l=[];for(const e of c){const r=await this.tryClaim(e,t);if(r&&l.push(r),l.length>=this.config.concurrency)break}return e.verbose("claimBatch claimed:"+l.length),l}async tryClaim(t,e){const r=e.logger.for(this.claimBatch),s=(new Date).getTime();let i=t;try{i=await this.tasks.read(t.id,e)}catch{}const n=new bs({...i,status:Oe.RUNNING,leaseOwner:this.config.workerId.toString(),leaseExpiry:new Date(s+(parseInt(this.config.leaseMs.toString())||6e4)),scheduledTo:void 0,nextRunAt:void 0});r.info(`running handler for ${t.id} (${t.classification}) atomicity ${t.atomicity}`);try{return await this.tasks.update(n,e)}catch{return null}}async executeClaimed(t){const{ctx:e,log:r}=(await this.logCtx([],t.classification,!0)).for(this.executeClaimed),s=new Is(e).accumulate({taskId:t.id,logger:new Ns(r,this.config.streamBufferSize,this.config.maxLoggingBuffer),attempt:t.attempt,resultCache:{},pipe:async e=>{const[,r]=await this.appendLog(s,t,e);await this.emitLog(s,t.id,r)},flush:async()=>s.logger.flush(s.pipe),progress:async e=>{await this.emitProgress(s,t.id,e)},heartbeat:async()=>{if(t.leaseOwner===this.config.workerId){t.leaseExpiry=new Date(Date.now()+this.config.leaseMs);try{t=await this.tasks.update(t)}catch{}}}});await this.emitStatus(s,t,Oe.RUNNING);try{let e;if(t.atomicity===ke.COMPOSITE){e=await this.runComposite(t,s);try{t=await this.tasks.read(t.id,s)}catch{}e?.stepResults&&(t.stepResults=e.stepResults,t.currentStep=e.stepResults.length)}else{const i=this.registry.get(t.classification);if(r.debug(`handler type for ${t.id} is ${i?.constructor?.name??"none"}`),!i)throw new u("No task handler registered for type: "+t.classification);e=await i.run(t.input,s),r.verbose("handler finished for "+t.id)}t.status=Oe.SUCCEEDED,t.output=e,t.error=void 0,t.leaseOwner=void 0,t.leaseExpiry=void 0,t=await this.tasks.update(t,s),s.logger.info(`task ${t.id} success state ${t.status}`),r.info(`task ${t.id} success state ${t.status} attempt ${t.attempt}`),await this.emitStatus(s,t,Oe.SUCCEEDED,e)}catch(e){try{t=await this.tasks.read(t.id,s)}catch{}if(e instanceof Rs)return void await this.handleTaskStateChange(e.request,t,s);if(r.error("task execution error",e),t.atomicity===ke.COMPOSITE){const e=this.normalizeStepResults(t.stepResults);if(t.stepResults=e,null==t.currentStep){const r=e.findIndex(t=>t.status===Oe.FAILED);0>r||(t.currentStep=r)}}const i=(t.attempt??0)+1,n=Ds(e);if(i<t.maxAttempts){const o=_s(i,this.normalizeBackoff(t.backoff)),a=new Date(Date.now()+o);t.attempt=i,t.status=Oe.WAITING_RETRY,t.nextRunAt=a,t.error=n,t.leaseOwner=void 0,t.leaseExpiry=void 0,t=await this.tasks.update(t,s),r.warn(`task ${t.id} waiting retry state ${t.status} attempt ${t.attempt}`),await s.pipe(Y.warn,"Retry scheduled",{nextRunAt:a,delayMs:o,attempt:i}),await this.emitStatus(s,t,Oe.WAITING_RETRY,n,e)}else t.attempt=i,t.status=Oe.FAILED,t.error=n,t.leaseOwner=void 0,t.leaseExpiry=void 0,t=await this.tasks.update(t,s),r.error(`task ${t.id} failed state ${t.status} attempt ${t.attempt}`),await s.pipe(Y.error,"Task failed (max attempts reached)",{maxAttempts:t.maxAttempts}),await this.emitStatus(s,t,Oe.FAILED,n,e)}}async handleTaskStateChange(t,e,r){switch(e.leaseOwner=void 0,e.leaseExpiry=void 0,t.status){case Oe.CANCELED:{const s=t.error??new fs({message:`Task ${e.id} canceled`});return e.status=Oe.CANCELED,e.error=s,e.nextRunAt=void 0,e.scheduledTo=void 0,e=await this.tasks.update(e,r),await this.emitStatus(r,e,Oe.CANCELED,s),void await r.pipe(Y.warn,"Task canceled via context")}case Oe.WAITING_RETRY:{const s=(e.attempt??0)+1,i=_s(s,this.normalizeBackoff(e.backoff)),n=t.scheduledTo instanceof Date?t.scheduledTo:new Date(Date.now()+i),o=t.error??new fs({message:`Task ${e.id} requested retry`});return e.status=Oe.WAITING_RETRY,e.attempt=s,e.error=o,e.nextRunAt=n,e.scheduledTo=void 0,e=await this.tasks.update(e,r),await this.emitStatus(r,e,Oe.WAITING_RETRY,o),void await r.pipe(Y.warn,"Retry requested",{nextRunAt:n,delayMs:i,attempt:s})}case Oe.SCHEDULED:{if(!t.scheduledTo)throw new u("Scheduled state requires a target date");const s=t.error??new fs({message:`Task ${e.id} rescheduled`});return e.status=Oe.SCHEDULED,e.scheduledTo=t.scheduledTo,e.error=s,e.nextRunAt=void 0,e=await this.tasks.update(e,r),await this.emitStatus(r,e,Oe.SCHEDULED,s),void await r.pipe(Y.info,"Task rescheduled",{scheduledTo:t.scheduledTo.toISOString()})}default:throw new u("Unsupported task state change requested: "+t.status)}}async runComposite(t,e){const{ctx:r}=(await this.logCtx([e],t.classification,!0)).for(this.runComposite),s=this.normalizeSteps(t.steps);let i=t.currentStep??0;const n=this.normalizeStepResults(t.stepResults),o=(t,s)=>{e.cacheResult(t,s),r instanceof Is&&r!==e&&r.cacheResult(t,s)};for(let e=0;e<n.length;e+=1){const r=n[e];if(r?.status===Oe.SUCCEEDED){const i=s[e];if(!i)continue;const n=`${t.id}:step:${e}`;o(i.classification,r.output),o(n,r.output)}}for(;i<s.length;){const r=s[i],a=this.registry.get(r.classification);if(!a)throw Error("No task handler registered for composite step: "+r.classification);await e.pipe([Y.info,`Composite step ${i+1}/${s.length}: ${r.classification}`]);try{const c=await a.run(r.input,e),l=i,u=new Date;n[l]=new vs({status:Oe.SUCCEEDED,output:c,createdAt:u,updatedAt:u});const d=`${t.id}:step:${l}`;o(r.classification,c),o(d,c),i=l+1,t.stepResults=n,t.currentStep=i,t=await this.tasks.update(t),await this.emitProgress(e,t.id,{currentStep:i,totalSteps:s.length,output:c})}catch(e){const r=new Date;throw n[i]=new vs({status:Oe.FAILED,error:Ds(e),createdAt:r,updatedAt:r}),t.stepResults=n,t.currentStep=i,t.error=Ds(e),t=await this.tasks.update(t),e}}return{stepResults:n}}normalizeBackoff(t){if(t instanceof gs)return t;let e=t??{};if("string"==typeof e)try{e=JSON.parse(e)}catch{e={}}return new gs(e)}normalizeSteps(t){if(!t)return[];let e=t;if("string"==typeof e)try{e=JSON.parse(e)}catch{return[]}return e instanceof Set&&(e=Array.from(e)),Array.isArray(e)?e.map(t=>{if(t instanceof As)return t;let e=t;if("string"==typeof e)try{e=JSON.parse(e)}catch{e={}}return new As(e)}):[]}normalizeStepResults(t){if(!t)return[];let e=t;if("string"==typeof e)try{e=JSON.parse(e)}catch{return[]}return e instanceof Set&&(e=Array.from(e)),Array.isArray(e)?e.map(t=>{if(t instanceof vs)return t;let e=t;if("string"==typeof e)try{e=JSON.parse(e)}catch{e={}}return new vs(e)}):[]}async appendLog(t,e,r){const s=(Array.isArray(r)&&Array.isArray(r[0])?r:[r]).map(([t,e,r])=>new ws({level:t,msg:e,meta:r})),i=[...e.logTail??[],...s].slice(-this.config.logTailMax);e.logTail=i;try{return[await this.tasks.update(e,t),s]}catch{return[e,[]]}}async emitStatus(t,e,r,s,i){t instanceof Is&&await t.flush();const n={status:r};s&&s instanceof fs?n.error=s:s&&(n.output=s),e.nextRunAt&&(n.nextRunAt=e.nextRunAt),e.scheduledTo&&(n.scheduledTo=e.scheduledTo);const o=await this.persistEvent(t,e.id,Ne.STATUS,n),a=void 0!==i?Object.assign({},n,{originalError:i}):n,c=new ys({...o,payload:a});this.bus.emit(c,t)}async emitLog(t,e,r){const s=await this.persistEvent(t,e,Ne.LOG,r.map(t=>({ts:t.ts,level:t.level,msg:t.msg,meta:t.meta})));this.bus.emit(s,t)}async emitProgress(t,e,r){const s=await this.persistEvent(t,e,Ne.PROGRESS,r);this.bus.emit(s,t)}async persistEvent(t,e,r,s){const i=new ys({taskId:e,classification:r,payload:s});return await this.events.create(i,t)}toString(){return`TaskEngine<${this.config.adapter.alias}>`}async context(t,e,...r){return this.adapter.context(t,e,bs,...r)}}class zs extends Xr{constructor(){super()}async initialize(...t){const e=t.shift();if(!e||e instanceof Rt)throw new u("No/invalid config provided");const{log:r}=(await this.logCtx(t,St.INITIALIZATION,!0)).for(this.initialize);if(!e.adapter)throw new u("No adapter provided");r.info("Initializing Task Engine...");const s=new Hs(e);return r.verbose(s+" initialized"),{client:s,config:e}}async push(t,e=!1,...r){const{ctxArgs:s}=(await this.logCtx(r,a.CREATE,!0)).for(this.push),i=await this.client.push(t,e,...s);return await this.client.isRunning()||this.client.start(),i}async track(t,...e){const{ctxArgs:r}=(await this.logCtx(e,a.CREATE,!0)).for(this.push);return this.client.track(t,...r)}async create(t,...e){const{ctxArgs:r}=(await this.logCtx(e,a.CREATE,!0)).for(this.create),s=await this.repo.create(t,...r);return await this.client.isRunning()||this.client.start(),s}async createAll(t,...e){const{ctxArgs:r}=(await this.logCtx(e,c.CREATE_ALL,!0)).for(this.createAll),s=await this.repo.createAll(t,...r);return await this.client.isRunning()||this.client.start(),s}async delete(t,...e){const{ctxArgs:r}=(await this.logCtx(e,a.DELETE,!0)).for(this.delete);return this.repo.delete(t,...r)}async deleteAll(t,...e){const{ctxArgs:r}=(await this.logCtx(e,c.DELETE_ALL,!0)).for(this.deleteAll);return this.repo.deleteAll(t,...r)}async read(t,...e){const{ctxArgs:r}=(await this.logCtx(e,a.READ,!0)).for(this.read);return this.repo.read(t,...r)}async readAll(t,...e){const{ctxArgs:r}=(await this.logCtx(e,c.READ_ALL,!0)).for(this.readAll);return this.repo.readAll(t,...r)}async query(t,...e){const{ctxArgs:r}=(await this.logCtx(e,St.QUERY,!0)).for(this.query),s=this.repo?.[t];if("function"!=typeof s)throw new u(`Method "${t}" is not implemented`);return s.apply(this.repo,r)}async update(t,...e){throw new Lt("Updates to tasks are not available")}async updateAll(t,...e){throw new Lt("Updates to tasks are not available")}async listBy(t,e,...r){const{ctxArgs:s}=(await this.logCtx(r,Et.LIST_BY,!0)).for(this.listBy);return this.repo.listBy(t,e,...s)}async paginateBy(t,e,r,...s){const{ctxArgs:i}=(await this.logCtx(s,Et.PAGE_BY,!0)).for(this.paginateBy);return this.repo.paginateBy(t,e,r,...i)}async findOneBy(t,e,...r){const{ctxArgs:s}=(await this.logCtx(r,Et.FIND_ONE_BY,!0)).for(this.findOneBy);return this.repo.findOneBy(t,e,...s)}async findBy(t,e,...r){const{ctxArgs:s}=(await this.logCtx(r,Et.FIND_BY,!0)).for(this.findBy);return this.repo.findBy(t,e,...s)}async statement(t,...e){const{ctxArgs:r}=(await this.logCtx(e,St.STATEMENT,!0)).for(this.statement);return this.repo.statement(t,...r)}refresh(t,e,r,...s){return this.repo.refresh(t,e,r,...s)}observe(t,e){return this.repo.observe(t,e)}unObserve(t){return this.repo.unObserve(t)}updateObservers(t,e,r,...s){return this.repo.updateObservers(t,e,r,...s)}logCtx(t,e,r=!1){const s=this.repo.adapter.logCtx([this.repo.class,...t],e,r,this.repo._overrides||{});function i(t){return t.ctxArgs.shift(),t}return s instanceof Promise?s.then(i):i(s)}async shutdown(...t){const{ctxArgs:e,ctx:r,log:s}=(await this.logCtx(t,St.SHUTDOWN,!0)).for(this.shutdown);await super.shutdown(...e),s.info("attempting to gracefully shutdown task runner"),await this.client.stop(r),s.verbose("gracefully shutdown task runner")}}function qs(t={count:1},e=0){return function r(s,i,n){return ht(pt(lt.key(St.THROTTLE,i),t),(s,i,n)=>{n.value=new Proxy(n.value,{async apply(s,n,o){const a=o,c=(()=>{try{return"function"==typeof t?t(...a):t}catch(t){throw new u("Failed to obtain throttling configuration from handler: "+t)}})(),{log:l,ctx:d}=(await n.logCtx(o,St.THROTTLE,!0)).for(r),h=(t=>{const e=(Array.isArray(t)?t:[t]).map(t=>{if(!Number.isFinite(t)||0>t)throw new u("@throttling() argument indexes must be non-negative integers");return t});return Array.from(new Set(e)).sort((t,e)=>t-e)})(e);if(!h.length)throw new u("@throttling() expects at least one argument index to throttle");h.forEach(t=>{if(t>=a.length)throw new u(`@throttling() requires argument index ${t} but only ${a.length} provided`);if(!Array.isArray(a[t]))throw new u(`@throttling() expects argument at index ${t} to be an array`)});const p=h.map(t=>a[t]),g=p[0].length;if(!p.every(t=>t.length===g))throw new u("@throttling() requires all targeted arguments to have the same length");if(0===g)return s.apply(n,a);const f=((t,e,r)=>{if("count"in r){if(0>=r.count)throw new u("@throttling() configuration 'count' must be greater than zero");const e=[];for(let s=0;t>s;s+=r.count)e.push({start:s,end:Math.min(t,s+r.count)});return e}if("bufferSize"in r){if(0>=r.bufferSize)throw new u("@throttling() configuration 'bufferSize' must be greater than zero");const s=[];let i=0,n=0;for(let o=0;t>o;o++){const t=Ws(e,o);n>0&&n+t>r.bufferSize?(s.push({start:i,end:o}),i=o,n=t):n+=t}return i>=t&&s.length||s.push({start:i,end:t}),s}return[{start:0,end:t}]})(g,p,c),y=f.map(({start:t,end:e})=>a.map((r,s)=>{const i=h.indexOf(s);return-1===i?r:p[i].slice(t,e)})),m=d.get("breakOnSingleFailureInBulk")??!0,w=[],b=[];for(const t of y){try{Qs(await s.apply(n,t),w)}catch(t){if(m)throw t;b.push(t)}c.delayMs&&await new Promise(t=>setTimeout(t,c.delayMs))}if(b.length){l.warn(`${i+""} throttled execution continued with ${b.length} failure(s)`);const t=new AggregateError(b,`Throttled ${i+""} failed for ${b.length} chunk(s)`);throw t.results=w,t}return w}})})(s,i,n)}}function Ws(t,e){return t.reduce((t,r)=>t+(t=>{if(null==t)return 0;try{return Buffer.byteLength(JSON.stringify(t))}catch{return 0}})(r[e]),0)}function Qs(t,e){Array.isArray(t)?e.push(...t):void 0!==t&&e.push(t)}i([$e(bs),n("design:type",Object)],zs.prototype,"repo",void 0),i([Zr(),n("design:type",Function),n("design:paramtypes",[bs,void 0]),n("design:returntype",Promise)],zs.prototype,"create",null),i([Zr(),n("design:type",Function),n("design:paramtypes",[Array,void 0]),n("design:returntype",Promise)],zs.prototype,"createAll",null),i([rs(),n("design:type",Function),n("design:paramtypes",[Object,void 0]),n("design:returntype",Promise)],zs.prototype,"delete",null),i([rs(),n("design:type",Function),n("design:paramtypes",[Array,void 0]),n("design:returntype",Promise)],zs.prototype,"deleteAll",null),i([ts(),n("design:type",Function),n("design:paramtypes",[Object,void 0]),n("design:returntype",Promise)],zs.prototype,"read",null),i([ts(),n("design:type",Function),n("design:paramtypes",[Array,void 0]),n("design:returntype",Promise)],zs.prototype,"readAll",null),i([ts(),n("design:type",Function),n("design:paramtypes",[String,void 0]),n("design:returntype",Promise)],zs.prototype,"query",null),i([es(),n("design:type",Function),n("design:paramtypes",[bs,void 0]),n("design:returntype",Promise)],zs.prototype,"update",null),i([es(),n("design:type",Function),n("design:paramtypes",[Array,void 0]),n("design:returntype",Promise)],zs.prototype,"updateAll",null),e.setRegistry(new Be);const Vs="##VERSION##",Js="##PACKAGE##";lt.registerLibrary(Js,Vs);export{$t as AbsContextual,Vt as Adapter,Le as AuthKeys,mr as AuthorizationError,Ce as BackoffStrategy,jr as BaseModel,Ge as BigIntSequence,te as Cascade,Ts as CleanUpTask,Xr as ClientBasedService,Ss as CompositeTaskBuilder,Kt as Condition,br as ConnectionError,Rt as Context,Bt as ContextLock,It as ContextualLoggedClass,Ct as DefaultAdapterFlags,ee as DefaultCascade,Ot as DefaultContextFlags,me as DefaultRepositoryFilters,Me as DefaultSequenceOptions,Ie as DefaultTaskEngineConfig,ls as Dispatch,wr as ForbiddenError,xt as GroupOperator,Be as InjectablesRegistry,Te as JitterStrategy,ie as MethodQueryBuilder,Ft as MigrationError,jt as MigrationRuleError,cs as ModelService,_t as MultipleSelectOperationKeys,Nt as NonTransactionOperationKeys,Ue as NoneSequenceOptions,Ye as NumericSequence,Pe as ObserverError,Pt as ObserverHandler,At as Operator,re as OperatorsMap,Zt as OrderDirection,Js as PACKAGE_NAME,Dt as PaginationOperationKeys,Mr as Paginator,Xt as PagingError,St as PersistenceKeys,ps as PersistenceService,Et as PreparedStatementKeys,vt as QueryClause,Jt as QueryError,_e as Repository,kt as SelectOperationKeys,hs as Sequence,Ur as SequenceModel,qt as Serial,Jr as Service,Vr as Statement,xs as TaskBackoffBuilder,gs as TaskBackoffModel,Es as TaskBuilder,Ms as TaskCancelError,Is as TaskContext,Fs as TaskControlError,Hs as TaskEngine,fs as TaskErrorModel,Ps as TaskEventBus,ys as TaskEventModel,Ne as TaskEventType,js as TaskFailError,Os as TaskHandler,$s as TaskHandlerRegistry,ms as TaskIOSerializer,ws as TaskLogEntryModel,Ns as TaskLogger,bs as TaskModel,Ys as TaskRescheduleError,Us as TaskRetryError,zs as TaskService,Oe as TaskStatus,vs as TaskStepResultModel,As as TaskStepSpecModel,Gs as TaskTracker,ke as TaskType,Re as TasksKey,Tt as TransactionOperationKeys,zt as UUID,Lt as UnsupportedError,Vs as VERSION,Fe as allowIf,ce as applyViewDecorator,is as auth,je as blockIf,hr as cacheModelForPopulate,gr as cascadeDelete,Ar as column,_s as computeBackoffMs,Zr as create,Qe as createOrUpdate,Tr as createdAt,Or as createdBy,Sr as createdByOnCreateUpdate,ne as defaultQueryAttr,rs as del,De as generateInjectableNameForRepository,ar as getAndConstructJunctionTable,we as getFilters,ks as getLogPipe,kr as getPkTypes,ur as getPopulateKey,dr as getTagForDeleteKey,He as index,Ut as injectableServiceKey,Yt as isOperationBlocked,Ls as isTaskError,Rr as manyToMany,nr as manyToManyOnCreate,lr as manyToManyOnDelete,cr as manyToManyOnUpdate,Br as manyToOne,er as manyToOneOnCreate,ir as manyToOneOnDelete,sr as manyToOneOnUpdate,Ir as noValidateOn,$r as noValidateOnCreate,Lr as noValidateOnCreateUpdate,Pr as noValidateOnUpdate,Gt as normalizeImport,Dr as oneToMany,Ke as oneToManyOnCreateUpdate,tr as oneToManyOnDelete,Ze as oneToManyOnUpdate,_r as oneToOne,Ve as oneToOneOnCreate,Xe as oneToOneOnDelete,Je as oneToOneOnUpdate,fe as onlyOnBulk,ue as onlyOnCreate,he as onlyOnDelete,ye as onlyOnFilter,ge as onlyOnSingle,pe as onlyOnTransactional,de as onlyOnUpdate,We as pk,qe as pkDec,ze as pkOnCreate,pr as populate,Ht as prefixMethod,oe as prepared,Mt as promiseSequence,ae as query,ts as read,Fr as relation,$e as repository,yr as repositoryFromTypeMetadata,ns as roles,os as route,Ds as serializeError,ss as service,Bs as sleep,vr as table,Cs as task,qs as throttle,Er as unique,xr as uniqueOnCreateUpdate,es as update,Nr as updatedAt,Cr as updatedBy,ds as uuid,us as uuidCreateUpdateHandler,rr as validBidirectionalRelation,le as view};
1
+ import{InjectableRegistryImp as t,Injectables as e,inject as r,injectable as s}from"@decaf-ts/injectable-decorators";import{__decorate as i,__metadata as n}from"tslib";import{DefaultRepositoryFlags as o,OperationKeys as a,BulkCrudOperationKeys as c,Context as l,InternalError as u,ValidationError as d,Repository as h,wrapMethodWithContext as p,wrapMethodWithContextForUpdate as g,enforceDBDecorators as f,reduceErrorsToPrint as y,NotFoundError as m,DefaultSeparator as w,DBKeys as b,readonly as v,onCreate as A,generated as x,BadRequestError as E,timestamp as O,onUpdate as k,onCreateUpdate as C,ConflictError as T,afterAny as N,onDelete as _,afterUpdate as B,SerializationError as D,prefixMethod as R,composed as P,transient as I,serialize as $,BaseError as L}from"@decaf-ts/db-decorators";import{LoggedClass as F,Logging as j,final as M,toCamelCase as U,LogLevel as Y,style as G,isBrowser as z,LoggedEnvironment as H}from"@decaf-ts/logging";import{Model as W,hashObj as q,required as Q,sf as J,isEqual as V,model as X,ValidationKeys as Z,async as tt,list as et,type as rt,option as st,date as it,JSONSerializer as nt,ModelKeys as ot,min as at,gt as ct}from"@decaf-ts/decorator-validation";import{Lock as lt,MultiLock as ut}from"@decaf-ts/transactional-decorators";import{Metadata as dt,Decoration as ht,DefaultFlavour as pt,apply as gt,methodMetadata as ft,propMetadata as yt,DecorationKeys as mt,uses as wt,metadata as bt,prop as vt,description as At}from"@decaf-ts/decoration";import{Worker as xt}from"node:worker_threads";var Et,St,Ot,kt,Ct;(t=>{t.FIND_BY="findBy",t.PAGE_BY="pageBy",t.COUNT_BY="countBy",t.SUM_BY="sumBy",t.AVG_BY="avgBy",t.MIN_BY="minBy",t.MAX_BY="maxBy",t.DISTINCT_BY="distinctBy",t.GROUP_BY_PREFIX="groupBy",t.SELECT="Select",t.AND="And",t.OR="Or",t.GROUP_BY="GroupBy",t.ORDER_BY="OrderBy",t.THEN="Then",t.THEN_BY="ThenBy"})(Et||(Et={})),(t=>{t.EQUAL="EQUAL",t.DIFFERENT="DIFFERENT",t.BIGGER="BIGGER",t.BIGGER_EQ="BIGGER_EQ",t.SMALLER="SMALLER",t.SMALLER_EQ="SMALLER_EQ",t.BETWEEN="BETWEEN",t.NOT="NOT",t.IN="IN",t.REGEXP="REGEXP",t.STARTS_WITH="STARTS_WITH",t.ENDS_WITH="ENDS_WITH",t.GROUP_BY="group-by",t.COUNT="count",t.SUM="sum",t.MAX="v_max",t.MIN="v_min",t.DISTINCT="distinct",t.VIEW="view"})(St||(St={})),(t=>{t.AND="AND",t.OR="OR"})(Ot||(Ot={})),(t=>{t.LIST_BY="listBy",t.FIND_BY="findBy",t.FIND_ONE_BY="findOneBy",t.PAGE_BY="paginateBy",t.FIND="find",t.PAGE="page",t.COUNT_OF="countOf",t.MAX_OF="maxOf",t.MIN_OF="minOf",t.AVG_OF="avgOf",t.SUM_OF="sumOf",t.DISTINCT_OF="distinctOf",t.GROUP_OF="groupOf"})(kt||(kt={})),(t=>{t.PERSISTENCE="persistence",t.INDEX="index",t.UNIQUE="unique",t.ADAPTER="adapter",t.INJECTABLE="decaf_{0}_adapter_for_{1}",t.SERVICE="service",t.TABLE="table",t.COLUMN="column",t.METADATA="__metadata",t.OWNERSHIP="ownership",t.CREATED_BY="ownership.created-by",t.UPDATED_BY="ownership.updated-by",t.RELATIONS="__relations",t.RELATION="relation",t.ONE_TO_ONE="relation.one-to-one",t.ONE_TO_MANY="relation.one-to-many",t.MANY_TO_ONE="relation.many-to-one",t.MANY_TO_MANY="relation.many-to-many",t.POPULATE="populate",t.NO_VALIDATE="no-validate",t.MIGRATION="migration",t.STATEMENT="statement",t.QUERY="query",t.UUID="uuid",t.TAG_FOR_DELETION="tag_for_deletion",t.INITIALIZATION="initialization",t.SHUTDOWN="shutdown",t.BY_KEY="by-key",t.AUTH="auth",t.AUTH_ROLE="auth-role",t.DECAF_ROUTE="DecafRoute",t.THROTTLE="throttle",t.DEFAULT_QUERY_ATTR="default-query-attr"})(Ct||(Ct={}));const Tt=Object.assign({},{ignoreDevSafeGuards:!1}),Nt=Object.assign({},o,{enforceUpdateValidation:!0,allowRawStatements:!0,forcePrepareSimpleQueries:!1,forcePrepareComplexQueries:!1,cacheForPopulate:{},noEmit:!1,noEmitSingle:!1,noEmitBulk:!1,breakOnSingleFailureInBulk:!0,observeFullResult:!0,paginateByBookmark:!1,dryRun:!1}),_t=[a.CREATE,a.UPDATE,a.DELETE,c.CREATE_ALL,c.UPDATE_ALL,c.DELETE_ALL],Bt=[a.READ,c.READ_ALL],Dt=[Ct.STATEMENT,kt.FIND_ONE_BY],Rt=[Ct.QUERY,kt.PAGE_BY,kt.LIST_BY,kt.FIND_BY,kt.FIND,kt.PAGE],Pt=[kt.PAGE_BY,kt.PAGE];class It extends lt{constructor(){super()}}class $t extends l{constructor(t){super(t)}pushPending(t,e){const r=this.pending()||{};if(r[t]=r[t]||[],r[t].includes(e))throw new u(`Trying to push a repeated pending ${t} task: ${e}`);r[t].push(e),this.accumulate({pending:r})}getFromChildren(t,e=new Set){if(e.has(this))return;e.add(this);const r=this.getOrUndefined(t);if(null!=r)return r;let s=this.getOrUndefined("childContexts");if(s&&s.length&&(s=s.filter(t=>!e.has(t)),s.length)){const r=s.map(r=>r.getFromChildren(t,e)).flat().filter(t=>null!=t);if(!r.length)return;return r.some(t=>"object"!=typeof t)?r[0]:r.reduce((t,e)=>Object.assign(t,e),{})}}pending(){return this.getFromChildren("pending")}getOrUndefined(t){try{return this.get(t)}catch(t){return}}override(t){return new Proxy(this,{get:(e,r,s)=>"get"===r?new Proxy(e.get,{apply:(e,r,i)=>{const n=i[0];if(!n)throw new u("Invalid property access to overridden context: "+n);return n in t?t[n]:Reflect.apply(e,s,i)}}):Reflect.get(e,r,s)})}toOverrides(){return this.cache.keys().reduce((t,e)=>(t[e]=this.get(e),t),{})}accumulate(t){return super.accumulate(t)}}class Lt extends F{logCtx(t,e,r=!1,s){return Lt.logCtx.call(this,e,s||{},r,...t.filter(t=>void 0!==t))}static logFrom(t,e,r,s){const i=t.context?e.clear().for(t):e.for(t);return s?i.for(s):i}static logCtx(t,e,r=!1,...s){const i=(t,e,r)=>{const s=e.log||j.get();return e.log=t.context?s.clear().for(t):s.for(t),"string"==typeof r?e.for=t=>Object.assign(e,{log:e.log.for(t)}):e.log=e.log.for(r),e};let n=s.pop();const o=n instanceof $t;if(n&&!o&&(s.push(n),n=void 0),!r&&!o)throw new u("No context provided");if(o&&!r){if(!n)throw new u("Missing context. should be impossible");return i(this,{log:n.logger,ctx:n,ctxArgs:[...s,n]},t)}return async function(...r){if(!this)throw new u("No contextual provided");if(!this.context)throw new u("Invalid contextual provided");return this.context("string"==typeof t?t:t.name,e||{},...r)}.call(this,...[...s,n].filter(Boolean)).then(e=>i(this,{log:e.logger,ctx:e,ctxArgs:[...s,e]},t))}}class Ft extends Lt{constructor(){super(),this._Context=$t}get Context(){return this._Context}async context(t,e,...r){this.log.for(this.context).debug(`Creating new context for ${"string"==typeof t?t:t.name} operation with flag overrides: ${Object.keys(e)}`);let s=r.pop();return s instanceof $t||(r.push(s),s=void 0),this.flags,!s||s instanceof this.Context?(new this.Context).accumulate(e):new this.Context(s).accumulate(e)}}class jt{constructor(){this.observers=[]}count(){return this.observers.length}observe(t,e){if(-1!==this.observers.map(t=>t.observer).indexOf(t))throw new u("Observer already registered");return this.observers.push({observer:t,filter:e}),()=>this.unObserve(t)}unObserve(t){const e=this.observers.map(t=>t.observer).indexOf(t);if(-1===e)throw new u("Failed to find Observer");this.observers.splice(e,1)}async updateObservers(t,e,r,...s){const{log:i,ctxArgs:n}=Lt.logCtx(this.updateObservers,void 0,!1,...s);(await Promise.allSettled(this.observers.filter(s=>{const{filter:o}=s;if(!o)return!0;try{return o(t,e,r,...n)}catch(t){return i.error(`Failed to filter observer ${s.observer.toString()}: ${t}`),!1}}).map(s=>{s.observer.refresh(t,e,r,...n)}))).forEach((t,e)=>{"rejected"===t.status&&i.error(`Failed to update observable ${this.observers[e].toString()}: ${t.reason}`)})}}class Mt extends u{constructor(t){super(t,Mt.name,500)}}class Ut extends u{constructor(t,e=Ut.name){super(t,e,500)}}class Yt extends Ut{constructor(t){super(t,Yt.name)}}function Gt(t){if(!t)throw new u("No name provided");return"string"==typeof t?t.replaceAll(".","-"):dt.Symbol(dt.constr(t)).toString().replaceAll(".","-")}async function zt(t,e=!1){if(!e){const e=[];for(const r of t)e.push(await r());return e}const r=[];for(const e of t)try{r.push({status:"fulfilled",value:await e()})}catch(t){r.push({status:"rejected",reason:t})}return r}function Ht(t,e){const{handler:r,args:s}=dt.get(t,a.REFLECT+a.BLOCK)||{};return!!r&&(r(...s,e)??!1)}async function Wt(t){return t.then(t=>t.default||t)}function qt(t,e,r,s){const i=async function(...t){let s;try{s=await Promise.resolve(r.call(this,...t))}catch(t){if(t instanceof Yt)return;throw t}return Promise.resolve(e.apply(this,s))}.bind(t),n=s||e.name;Object.defineProperty(i,"name",{enumerable:!0,configurable:!0,writable:!1,value:n}),t[n]=i}class Qt{generate(t){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,t=>{const e=16*Math.random()|0;return("x"==t?e:3&e|8).toString(16)})}static get instance(){return Qt._instance||(Qt._instance=new Qt),Qt._instance}}class Jt{constructor(){this.count=14}generate(t){return(""+((t=(t?parseInt(t):0)||0)+1)).padStart(this.count,"0")}static get instance(){return Jt._instance||(Jt._instance=new Jt),Jt._instance}}const Vt=ht.flavourResolver.bind(ht);function Xt(t,e,r,s){if(!e)return t;const i=t,n=[],o=[];for(const t of i)"fulfilled"===t.status?n.push(t.value):o.push(t.reason);if(o.length){r.warn(`Bulk ${s} encountered ${o.length} failure(s) while continuing`);const t=new AggregateError(o,`Bulk ${s} failed for ${o.length} item(s)`);throw t.results=i,t}return n}ht.flavourResolver=t=>{try{const e=Vt(t);if(e&&e!==pt)return e;const r="function"==typeof t?t:t?.constructor,s=r&&"function"==typeof dt.registeredFlavour?dt.registeredFlavour(r):void 0;if(s&&s!==pt)return s;const i=Kt._currentFlavour;if(i){const t=Kt._cache?.[i];return t?.flavour?t.flavour:i}}catch(t){return pt}};class Kt extends Ft{static{this._cache={}}get config(){return this._config}get alias(){return this._alias||this.flavour}repository(){if(!Kt._baseRepository)throw new u("This should be overridden when necessary. Otherwise it will be replaced lazily");return Kt._baseRepository}async shutdownProxies(t){if(this.proxies){if(t&&!(t in this.proxies))throw new u("No proxy found for "+t);if(t)try{await this.proxies[t].shutdown(),delete this.proxies[t]}catch(e){this.log.error(`Failed to shutdown proxied adapter ${t}: ${e}`)}else for(const t in this.proxies){try{await this.proxies[t].shutdown()}catch(e){this.log.error(`Failed to shutdown proxied adapter ${t}: ${e}`);continue}delete this.proxies[t]}}}async shutdown(...t){const{log:e,ctx:r}=(await this.logCtx(t,Ct.SHUTDOWN,!0)).for(this.shutdown);await this.shutdownProxies(),this.dispatch&&await this.dispatch.close()}constructor(t,e,r){if(super(),this._config=t,this.flavour=e,this._alias=r,this.alias in Kt._cache)throw new u(`${this.alias} persistence adapter ${this._alias?`(${this.flavour}) `:""} already registered`);Kt._cache[this.alias]=this,this.log.info(`Created ${this.alias} persistence adapter ${this._alias?`(${this.flavour}) `:""} persistence adapter`),Kt._currentFlavour||(this.log.verbose(`Defined ${this.alias} persistence adapter as current`),Kt._currentFlavour=this.alias)}Dispatch(){return new Kt._baseDispatch}ObserverHandler(){return new jt}isReserved(t){return!t}async initialize(...t){}async Sequence(t,e){return new Kt._baseSequence(t,this,e)}async flags(t,e,r,...s){if("string"==typeof e)throw new u("Model must be a constructor or array of constructors or undefined. this should be impossible");const i=Array.isArray(e)?e.length?e[0]:void 0:e,n=i?W.tableName(i)+" - ":"";r.correlationId=r.correlationId||`${n}${t}-${Qt.instance.generate()}`;const o=r.logger||j.for(this);return Object.assign({},Nt,r,{affectedTables:e?[...new Set([...(Array.isArray(e)?e:[e]).filter(Boolean),...r.affectedTables?Array.isArray(r.affectedTables)?r.affectedTables:[r.affectedTables]:[]])]:r.affectedTables,args:s,writeOperation:_t.includes(t),timestamp:new Date,operation:t,ignoredValidationProperties:e?dt.validationExceptions(Array.isArray(e)&&e[0]?e[0]:e,t):[],logger:o})}get Context(){return $t}async context(t,e,r,...s){this.log.for(this.context).silly(`creating new context for ${t} operation on ${r?Array.isArray(r)?r.map(t=>W.tableName(t)):W.tableName(r):"no"} table ${e&&Object.keys(e)?Object.keys(e).length:"no"} with flag overrides`);let i=s.pop();void 0===i||i instanceof $t||(s.push(i),i=void 0),e=i?Object.assign({},i.toOverrides(),e):e;const n=await this.flags("string"==typeof t?t:t.name,r,e,...[...s,i].filter(Boolean));if(i){if(!(i instanceof this.Context)){const t=(new this.Context).accumulate({...i.cache,...n,parentContext:i});return i.accumulate({childContexts:[...i.getOrUndefined("childContexts")||[],t]}),t}const e=i.getOrUndefined("operation"),s=i.getOrUndefined("affectedTables");if(!e||e!==t||r&&r!==s){const t=(new this.Context).accumulate({...i.cache,...n,parentContext:i});return i.accumulate({childContexts:[...i.getOrUndefined("childContexts")||[],t]}),t}return i.accumulate(n)}return(new this.Context).accumulate({...n})}prepare(t,...e){const{log:r}=this.logCtx(e,this.prepare),s=t.segregate(),i=Object.entries(s.model).reduce((e,[r,s])=>{if(void 0===s)return e;const i=W.columnName(t.constructor,r);if(this.isReserved(i))throw new u(`Property name ${i} is reserved`);return e[i]=s,e},{});return t[Ct.METADATA]&&(r.silly("Passing along persistence metadata for "+t[Ct.METADATA]),Object.defineProperty(i,Ct.METADATA,{enumerable:!1,writable:!0,configurable:!0,value:t[Ct.METADATA]})),{record:i,id:t[W.pk(t.constructor)],transient:s.transient}}revert(t,e,r,s,...i){const{log:n,ctx:o}=this.logCtx(i,this.revert),a=W.pk(e),c=new e;c[a]=r,n.silly(`Rebuilding model ${c.constructor.name} id ${r}`);const l=t[Ct.METADATA],d=Object.keys(c).filter(t=>t!==a).reduce((r,s)=>(r[s]=t[W.columnName(e,s)],r),c);return o.get("rebuildWithTransient")&&s&&(n.verbose("re-adding transient properties: "+Object.keys(s).join(", ")),Object.entries(s).forEach(([t,e])=>{if(t in d&&void 0!==d[t])throw new u(`Transient property ${t} already exists on model ${c.constructor.name}. should be impossible`);d[t]=e})),l&&(n.silly(`Passing along ${this.flavour} persistence metadata for ${c.constructor.name} id ${r}: ${l}`),Object.defineProperty(d,Ct.METADATA,{enumerable:!1,configurable:!0,writable:!0,value:l})),d}async createAll(t,e,r,...s){const{log:i,ctx:n}=this.logCtx(s,this.createAll);if(!e||!r)throw new d("Ids and models cannot be null or undefined");if(e.length!==r.length)throw new d("Ids and models must have the same length");const o=W.tableName(t);i.debug(`Creating ${e.length} entries ${o} table`);const a=!(n.get("breakOnSingleFailureInBulk")??1),l=e.map((e,i)=>()=>this.create(t,e,r[i],...s,n.override({noEmitSingle:!0})));return Xt(a?await zt(l,!0):await zt(l),a,i,c.CREATE_ALL)}async readAll(t,e,...r){const{log:s,ctx:i}=this.logCtx(r,this.readAll),n=W.tableName(t);s.debug(`Reading ${e.length} entries ${n} table`);const o=!(i.get("breakOnSingleFailureInBulk")??1),a=e.map(e=>()=>this.read(t,e,...r,i.override({noEmitSingle:!0})));return Xt(o?await zt(a,!0):await zt(a),o,s,c.READ_ALL)}async updateAll(t,e,r,...s){const{log:i,ctx:n}=this.logCtx(s,this.updateAll);if(e.length!==r.length)throw new u("Ids and models must have the same length");const o=W.tableName(t);i.debug(`Updating ${e.length} entries ${o} table`);const a=!(n.get("breakOnSingleFailureInBulk")??1),l=e.map((e,i)=>()=>this.update(t,e,r[i],...s,n.override({noEmitSingle:!0})));return Xt(a?await zt(l,!0):await zt(l),a,i,c.UPDATE_ALL)}async deleteAll(t,e,...r){const{log:s,ctx:i}=this.logCtx(r,this.deleteAll);s.debug(`Deleting ${e.length} entries from ${t} table`);const n=!(i.get("breakOnSingleFailureInBulk")??1),o=e.map(e=>()=>this.delete(t,e,...r,i.override({noEmitSingle:!0})));return Xt(n?await zt(o,!0):await zt(o),n,s,c.DELETE_ALL)}observe(t,e){this.observerHandler||Object.defineProperty(this,"observerHandler",{value:this.ObserverHandler(),writable:!1}),this.observerHandler.observe(t,e);const r=this.log.for(this.observe);return r.silly("Registering new observer "+t.toString()),this.dispatch||(r.verbose("Creating dispatch for "+this.alias),this.dispatch=this.Dispatch(),this.dispatch.observe(this)),()=>this.unObserve(t)}unObserve(t){if(!this.observerHandler)throw new u("ObserverHandler not initialized. Did you register any observables?");this.observerHandler.unObserve(t),this.log.for(this.unObserve).debug(`Observer ${t.toString()} removed`)}async updateObservers(t,e,r,...s){if(!this.observerHandler)throw new u("ObserverHandler not initialized. Did you register any observables?");const{ctx:i,ctxArgs:n}=this.logCtx(s,this.updateObservers);if(!i.get("noEmit")){const s=Array.isArray(r),o=!i.get("noEmitSingle"),a=!i.get("noEmitBulk");(s&&a||!s&&o)&&await this.observerHandler.updateObservers(t,e,r,...n)}}async refresh(t,e,r,...s){return this.updateObservers(t,e,r,...s)}toString(){return this.flavour+" adapter"}static flavourOf(t){return dt.flavourOf(t)}static get currentFlavour(){if(!Kt._currentFlavour)throw new u("No persistence flavour set. Please initialize your adapter");return Kt._currentFlavour}static get current(){return Kt.get(this.currentFlavour)}static get(t){if(!t)return Kt.get(this._currentFlavour);if(t in this._cache)return this._cache[t];throw new u(`No Adapter registered under ${t}.`)}static setCurrent(t){this._currentFlavour=t}static models(t){try{return dt.flavouredAs(t).filter(W.isModel)}catch(t){throw new u(t)}}static decoration(){}get client(){return this._client||(this._client=this.getClient()),this._client}for(t,...e){this.proxies||(this.proxies={});const r=`${this.alias} - ${q(t)}`;if(r in this.proxies)return this.proxies[r];let s;const i=new Proxy(this,{get:(e,r,i)=>{if("_config"===r){const s=Reflect.get(e,r,i);return Object.assign({},s,t)}return"_client"===r?s:Reflect.get(e,r,i)},set:(t,e,r,i)=>"_client"===e?(s=r,!0):Reflect.set(t,e,r,i)});return this.proxies[r]=i,i}migrations(){return dt.migrationsFor(this)}async getQueryRunner(){return this}logCtx(t,e,r=!1,s){return super.logCtx(t,e,r,s)}}i([M(),n("design:type",Function),n("design:paramtypes",[String]),n("design:returntype",Promise)],Kt.prototype,"shutdownProxies",null),i([M(),n("design:type",Function),n("design:paramtypes",[Object,Object,Object,$t]),n("design:returntype",Promise)],Kt.prototype,"context",null),i([M(),n("design:type",Function),n("design:paramtypes",[Object,Function]),n("design:returntype",Function)],Kt.prototype,"observe",null),i([M(),n("design:type",Function),n("design:paramtypes",[Object]),n("design:returntype",void 0)],Kt.prototype,"unObserve",null),i([M(),n("design:type",Object),n("design:paramtypes",[])],Kt.prototype,"client",null);class Zt extends u{constructor(t){super(t,Zt.name,500)}}class te extends u{constructor(t){super(t,te.name,500)}}class ee extends W{constructor(t,e,r){super(),this.attr1=void 0,this.operator=void 0,this.comparison=void 0,e||r?(this.attr1=t,this.operator=e,this.comparison=r):W.fromModel(this,t)}and(t){return ee.and(this,t)}or(t){return ee.or(this,t)}not(t){return new ee(this,St.NOT,t)}hasErrors(...t){const e=()=>{const t=`Invalid operator ${this.operator}}`;if("string"==typeof this.attr1){if(this.comparison instanceof ee)return{comparison:{condition:"Both sides of the comparison must be of the same type"}};if(-1===Object.values(St).indexOf(this.operator))return{operator:{condition:t}};if(this.operator===St.BETWEEN&&(!Array.isArray(this.comparison)||2!==this.comparison.length))return{comparison:{condition:"BETWEEN operator requires an array with exactly 2 values [min, max]"}}}if(this.attr1 instanceof ee){if(!(this.comparison instanceof ee)&&this.operator!==St.NOT)return{comparison:{condition:t}};if(-1===Object.values(Ot).indexOf(this.operator)&&this.operator!==St.NOT)return{operator:{condition:t}}}},r=super.hasErrors(...t);return this.isAsync()?(async()=>await Promise.resolve(r)??e())():r??e()}static and(t,e){return ee.group(t,Ot.AND,e)}static or(t,e){return ee.group(t,Ot.OR,e)}static group(t,e,r){return new ee(t,e,r)}static attribute(t){return(new ee.Builder).attribute(t)}static attr(t){return this.attribute(t)}static{this.Builder=class{constructor(){this.attr1=void 0,this.operator=void 0,this.comparison=void 0}attribute(t){return this.attr1=t,this}attr(t){return this.attribute(t)}eq(t){return this.setOp(St.EQUAL,t)}dif(t){return this.setOp(St.DIFFERENT,t)}gt(t){return this.setOp(St.BIGGER,t)}lt(t){return this.setOp(St.SMALLER,t)}gte(t){return this.setOp(St.BIGGER_EQ,t)}lte(t){return this.setOp(St.SMALLER_EQ,t)}in(t){return this.setOp(St.IN,t)}regexp(t){return this.setOp(St.REGEXP,RegExp(t).source)}startsWith(t){return this.setOp(St.STARTS_WITH,t)}endsWith(t){return this.setOp(St.ENDS_WITH,t)}between(t,e){return this.setOp(St.BETWEEN,[t,e])}setOp(t,e){return this.operator=t,this.comparison=e,this.build()}build(){try{return new ee(this.attr1,this.operator,this.comparison)}catch(t){throw new Zt(t)}}}}static builder(){return new ee.Builder}static from(t){return new ee(t)}}var re,se;i([Q(),n("design:type",Object)],ee.prototype,"attr1",void 0),i([Q(),n("design:type",String)],ee.prototype,"operator",void 0),i([Q(),n("design:type",Object)],ee.prototype,"comparison",void 0),(t=>{t.ASC="asc",t.DSC="desc"})(re||(re={})),(t=>{t.CASCADE="cascade",t.NONE="none"})(se||(se={}));const ie={update:se.CASCADE,delete:se.NONE},ne={Equals:(t,e)=>ee.attribute(t).eq(e),Diff:(t,e)=>ee.attribute(t).dif(e),LessThan:(t,e)=>ee.attribute(t).lt(e),LessThanEqual:(t,e)=>ee.attribute(t).lte(e),GreaterThan:(t,e)=>ee.attribute(t).gt(e),GreaterThanEqual:(t,e)=>ee.attribute(t).gte(e),In:(t,e)=>ee.attribute(t).in(e),Matches:(t,e)=>ee.attribute(t).regexp(e)},oe=t=>t.charAt(0).toLowerCase()+t.slice(1);class ae extends F{static get log(){return this._logger||(this._logger=j.for(ae.name)),this._logger}static{this.prefixMap={[Et.FIND_BY]:"find",[Et.PAGE_BY]:"page",[Et.COUNT_BY]:"count",[Et.SUM_BY]:"sum",[Et.AVG_BY]:"avg",[Et.MIN_BY]:"min",[Et.MAX_BY]:"max",[Et.DISTINCT_BY]:"distinct",[Et.GROUP_BY_PREFIX]:"group"}}static getActionFromMethodName(t){for(const[e,r]of Object.entries(this.prefixMap))if(t.startsWith(e))return{action:r,prefix:e}}static build(t,...e){const r=this.getActionFromMethodName(t);if(!r)throw Error("Unsupported method "+t);const{action:s,prefix:i}=r;let n;["count","sum","avg","min","max","distinct","group"].includes(s)&&(n=this.extractAggregationSelector(t,i));const o=this.extractCore(t,i),a=this.extractSelect(t),c=this.extractGroupBy(t),l=this.buildWhere(o,e),{orderBy:u,limit:d,offset:h}=this.extractOrderLimitOffset(t,e,o);return{action:s,select:a,selector:n,where:l,groupBy:c,orderBy:u,limit:d,offset:h}}static extractAggregationSelector(t,e){const r=t.substring(e.length),s=r.match(/(And|Or|GroupBy|OrderBy|Select|Limit|Offset|ThenBy)/),i=s?r.substring(0,s.index):r;return i?oe(i):void 0}static extractCore(t,e=Et.FIND_BY){const r=t.substring(e.length);if(e!==Et.FIND_BY&&e!==Et.PAGE_BY){const t=r.match(/(And|Or|GroupBy|OrderBy|ThenBy|Select|Limit|Offset)/);if(!t)return"";if("And"===t[0]||"Or"===t[0]){const e=r.substring(t.index+t[0].length),s=e.match(/(Then[A-Z]|OrderBy|GroupBy|Limit|Offset|Select|ThenBy)/);return s?e.substring(0,s.index):e}return""}const s=r.match(/(Then[A-Z]|OrderBy|GroupBy|Limit|Offset|Select)/);return s?r.substring(0,s.index):r}static getFieldsFromMethodName(t){const e=this.getActionFromMethodName(t),r=e?.prefix||Et.FIND_BY,s=this.extractCore(t,r);return s?(s.split(/OrderBy|GroupBy/)[0]||"").split(/And|Or/).filter(t=>t.length>0).map(t=>{const{operator:e,field:r}=this.parseFieldAndOperator(t);return r+(e??"")}):[]}static extractSelect(t){const e=t.indexOf(Et.SELECT);if(-1===e)return;const r=t.substring(e+Et.SELECT.length),s=r.match(/(Then[A-Z]|OrderBy|GroupBy|Limit|Offset)/);return(s?r.substring(0,s.index):r).split(Et.AND).map(oe).filter(Boolean)}static extractGroupBy(t){const e=t.indexOf(Et.GROUP_BY);if(-1!==e)return t.substring(e+Et.GROUP_BY.length).split(Et.ORDER_BY)[0].split(Et.THEN_BY).map(oe).filter(Boolean);const r=this.getActionFromMethodName(t);if("group"===r?.action){const e=t.substring(r.prefix.length),s=e.indexOf(Et.THEN_BY);if(-1===s)return;const i=e.substring(s+Et.THEN_BY.length).split(Et.THEN_BY),n=[];for(const t of i){const e=t.match(/(OrderBy|Limit|Offset|Select)/),r=e?t.substring(0,e.index):t;r&&n.push(oe(r))}return n.length>0?n:void 0}}static buildWhere(t,e){if(!t)return;const r=t.split(/OrderBy|GroupBy/)[0]||"";if(!r)return;const s=r.split(/And|Or/).filter(t=>t.length>0);if(0===s.length)return;const i=t.match(/And|Or/g)||[];let n;return s.forEach((t,r)=>{const{field:s,operator:o}=this.parseFieldAndOperator(t),a=o?ne[o]:ne.Equals;if(!a)throw Error("Unsupported operator "+o);const c=e[r];if(void 0===c)throw Error("Invalid value for field "+s);const l=a(s,c);n=0===r?l:i[r-1]===Et.AND?n.and(l):n.or(l)}),n}static parseFieldAndOperator(t){for(const e of Object.keys(ne))if(t.endsWith(e)){const r=t.slice(0,-e.length);return{field:oe(r),operator:e}}return{field:oe(t)}}static extractOrderByField(t){const e=t.match(/OrderBy(.+)$/);if(!e)return;const r=e[1];return r.charAt(0).toLowerCase()+r.slice(1)}static getProperlyOrderByOrThrow(t,e){const r=ae.log.for(this.getProperlyOrderByOrThrow);if(e||t){if(e&&!t)throw new Zt("Expected OrderBy clause, but no sortable field was found in method name.");if(e||!t){if(!Object.values(re).includes(e))throw new Zt(`Invalid OrderBy direction ${e}. Expected one of: ${Object.values(re).join(", ")}.`);return[[t,e]]}r.debug("Ignoring OrderBy clause because direction is undefined.")}}static extractOrderLimitOffset(t,e,r){const s=r??this.extractCore(t),i=s?s.split(/And|Or/).filter(t=>t.length>0).length:0,n=e.slice(i)??[];let o,a,c;if(n.at(-1)instanceof l&&n.pop(),n.length>=1){const e=n[0],r=this.extractOrderByField(t);o=this.getProperlyOrderByOrThrow(r,e)}return 2>n.length||"number"!=typeof n[1]||(a=n[1]),3>n.length||"number"!=typeof n[2]||(c=n[2]),{orderBy:o,limit:a,offset:c}}}function ce(){return(t,e)=>{const r=dt.key(Ct.DEFAULT_QUERY_ATTR);let s=dt.get(t.constructor,r)||[];return s=[...new Set([...s,e])],gt(yt(r,s))(t,e)}}function le(){return ht.for(Ct.STATEMENT).define({decorator:()=>(t,e,r)=>gt(ft(dt.key(Ct.STATEMENT,e),!0))(t,e,r),args:[]}).apply()}function ue(t={}){return ht.for(Ct.QUERY).define({decorator:t=>(e,r,s)=>{const i=ae.getFieldsFromMethodName(r);return gt(ft(dt.key(Ct.QUERY,r),{...t,fields:i}),le(),(t=>(e,r,s)=>{s.value=new Proxy(s.value,{apply(e,r,s){const{action:i,select:n,selector:o,where:a,groupBy:c,orderBy:l,limit:u,offset:d}=ae.build(e.name,...s),h=r;let p;switch(i){case"find":case"page":p=h.select(n);break;case"count":p=h.count(o);break;case"sum":p=h.sum(o);break;case"avg":p=h.avg(o);break;case"min":p=h.min(o);break;case"max":p=h.max(o);break;case"distinct":p=h.distinct(o);break;case"group":p=h.select(),o&&(p=p.groupBy(o));break;default:throw new Zt("Unsupported action: "+i)}if(a&&(p=p.where(a)),c&&c.length>0&&"group"!==i){p=p.groupBy(c[0]);for(let t=1;t<c.length;t++)p=p.thenBy(c[t])}else if(c&&c.length>0&&"group"===i)for(const t of c)p=p.thenBy(t);const{allowLimit:g,allowOffset:f,allowOrderBy:y,throws:m}={allowLimit:!0,allowOrderBy:!0,allowOffset:!0,throws:!0,...t},w=[{key:"orderBy",value:(l||[])[0],allowed:y},{key:"limit",value:u,allowed:g},{key:"offset",value:d,allowed:f}];for(const t of w)if(void 0!==t.value){if(!t.allowed&&m)throw new Zt(t.key[0].toUpperCase()+t.key.slice(1)+" is not allowed for this query");t.allowed&&(p=p[t.key](t.value))}if("page"===i){const t=s[s.length-1],e="number"==typeof t?t:t?.limit??10;return p.paginate(e)}return p.execute()}})})(t))(e,r,s)},args:[t]}).apply()}function de(t,e,r){return(s,i)=>{const n=r?.name||((t,e,r)=>{const s=(dt.get(t.constructor,e)||{})[r]||{};return Object.keys(s).length+1+""})(s,t,i),o=dt.key(t,i,n),a={...r||{},kind:e,attribute:i};return yt(o,a)(s,i)}}function he(t){return ht.for(St.VIEW).define({decorator:t=>de(St.VIEW,"view",t),args:[t]}).apply()}function pe(t){return be(t,[a.CREATE,c.CREATE_ALL])}function ge(t){return be(t,[a.UPDATE,c.UPDATE_ALL])}function fe(t){return be(t,[a.DELETE,c.DELETE_ALL])}function ye(t){return be(t,_t)}function me(t){return be(t,Object.values(a))}function we(t){return be(t,Object.values(c))}function be(t,e){return(r,s,i,...n)=>{if("string"==typeof t)throw new u("clazz cannot be string. This should be impossible");const{log:o}=Lt.prototype.logCtx(n,be);return o.silly(`filtering ${s} event for${r?" "+(W.tableName(r)||r):""} ${i}`),("string"==typeof r?r===W.tableName(t)||r===t.constructor.name:dt.constr(t)===dt.constr(r))&&e.includes(s)}}const ve={onlyOnCreate:pe,onlyOnUpdate:ge,onlyOnDelete:fe,onlyOnTransactional:ye,onlyOnSingle:me,onlyOnBulk:we};function Ae(t){const e=Object.assign({},ve);return Object.entries(e).forEach(([r,s])=>{e[r]=s(t.class)}),e}var xe,Ee,Se,Oe,ke,Ce,Te,Ne,_e,Be,De;class Re extends h{static{this._cache={}}get log(){return this.logger||(this.logger=this.adapter.log.for(this.toString())),this.logger}get adapter(){if(!this._adapter)throw new u("No adapter found for this repository. did you use the @uses decorator or pass it in the constructor?");return this._adapter}get tableName(){return this._tableName||(this._tableName=W.tableName(this.class)),this._tableName}get pkProps(){return super.pkProps}get filters(){return Ae(this)}constructor(t,e,...r){super(e),this.observers=[],this._overrides={ignoreHandlers:!1,ignoreValidation:!1,allowGenerationOverride:!1,allowRawStatements:!0,forcePrepareSimpleQueries:!1,forcePrepareComplexQueries:!1,ignoreDevSafeGuards:!1,mergeForUpdate:!0,applyUpdateValidation:!0},t&&(this._adapter=t),e&&(Re.register(e,this,this.adapter.alias),t)&&dt.get(e,mt.FLAVOUR)===pt&&wt(t.flavour)(e);const s=this;[this.createAll,this.readAll,this.deleteAll].forEach(t=>{const e=t.name;p(s,s[e+"Prefix"],t,s[e+"Suffix"])}),g(s,s[this.updateAll.name+"Prefix"],this.updateAll,s[this.updateAll.name+"Suffix"])}logCtx(t,e,r=!1,s){const i=this.adapter.logCtx([this.class,...t],e,r,Object.assign({},s||{},this._overrides||{}));function n(t){return t.ctxArgs.shift(),t}return i instanceof Promise?i.then(n):n(i)}override(t){return new Proxy(this,{get:(e,r,s)=>{const i=Reflect.get(e,r,s);return"_overrides"!==r?i:Object.assign({},i,t)}})}for(t,...e){return new Proxy(this,{get:(r,s,i)=>"adapter"===s?this.adapter.for(t,...e):Reflect.get(r,s,i)})}ObserverHandler(){return new jt}async createPrefix(t,...e){const{ctx:r,ctxArgs:s,log:i}=(await this.logCtx(e,a.CREATE,!0)).for(this.createPrefix),n=r.get("ignoreHandlers"),o=r.get("ignoreValidation");if(i.silly(`handlerSetting: ${n}, validationSetting: ${o}`),t=new this.class(t),n||await f(this,r,t,a.CREATE,a.ON),!o){const e=r.get("ignoredValidationProperties")||[];i.silly("ignored validation properties: "+e);const s=await Promise.resolve(t.hasErrors(...e));if(s)throw new d(s.toString())}return[t,...s]}async create(t,...e){const{ctx:r,log:s,ctxArgs:i}=this.logCtx(e,this.create);s.debug(`Creating new ${this.class.name} in table ${W.tableName(this.class)}`);let{record:n,id:o,transient:a}=this.adapter.prepare(t,r);return n=await this.adapter.create(this.class,o,n,...i),this.adapter.revert(n,this.class,o,a,r)}async createAll(t,...e){if(!t.length)return t;const{ctx:r,log:s,ctxArgs:i}=this.logCtx(e,this.createAll);s.debug(`Creating ${t.length} new ${this.class.name} in table ${W.tableName(this.class)}`);const n=t.map(t=>this.adapter.prepare(t,r)),o=n.map(t=>t.id);let a=n.map(t=>t.record);return a=await this.adapter.createAll(this.class,o,a,...i),a.map((t,e)=>this.adapter.revert(t,this.class,o[e],r.get("rebuildWithTransient")?n[e].transient:void 0,r))}async createAllPrefix(t,...e){const{ctx:r,ctxArgs:s,log:i}=(await this.logCtx(e,c.CREATE_ALL,!0)).for(this.createAllPrefix),n=r.get("ignoreHandlers"),o=r.get("ignoreValidation");if(i.silly(`handlerSetting: ${n}, validationSetting: ${o}`),!t.length)return[t,...s];const l=W.sequenceFor(t[0]);let h=[];if(W.generatedBySequence(this.class)?(l.name||(l.name=W.sequenceName(t[0],"pk")),h=await(await this.adapter.Sequence(l,this._overrides)).range(t.length,...s)):W.generated(this.class,this.pk)||(h=t.map((t,e)=>{if(void 0===t[this.pk])throw new u("Primary key is not defined for model in position "+e);return t[this.pk]})),t=await Promise.all(t.map(async(t,e)=>(t=new this.class(t),l.type&&(t[this.pk]="String"!==l.type||l.generated?h[e]:""+t[this.pk]),n||await f(this,r,t,a.CREATE,a.ON),t))),!o){const e=r.get("ignoredValidationProperties")||[];i.silly("ignored validation properties: "+e);const s=await Promise.all(t.map(t=>Promise.resolve(t.hasErrors(...e)))),n=y(s);if(n)throw new d(n)}return[t,...s]}async readPrefix(t,...e){const{ctx:r,ctxArgs:s,log:i}=(await this.logCtx(e,a.READ,!0)).for(this.readPrefix),n=r.get("ignoreHandlers");i.silly("handlerSetting: "+n);const o=new this.class;return o[this.pk]=t,n||await f(this,r,o,a.READ,a.ON),[t,...s]}async read(t,...e){const{ctx:r,log:s,ctxArgs:i}=this.logCtx(e,this.read);s.debug(`reading ${this.class.name} from table ${W.tableName(this.class)} with pk ${this.pk}`);const n=await this.adapter.read(this.class,t,...i);return this.adapter.revert(n,this.class,t,void 0,r)}async readAllPrefix(t,...e){const{ctx:r,ctxArgs:s,log:i}=(await this.logCtx(e,c.READ_ALL,!0)).for(this.readAllPrefix),n=r.get("ignoreHandlers");return i.silly("handlerSetting: "+n),n||await Promise.all(t.map(async t=>{const e=new this.class;return e[this.pk]=t,f(this,r,e,a.READ,a.ON)})),[t,...s]}async readAll(t,...e){const{ctx:r,log:s,ctxArgs:i}=this.logCtx(e,this.readAll);return s.debug(`reading ${t.length} ${this.class.name} in table ${W.tableName(this.class)}`),(await this.adapter.readAll(this.class,t,...i)).map((e,s)=>this.adapter.revert(e,this.class,t[s],void 0,r))}async update(t,...e){const{ctxArgs:r,log:s,ctx:i}=this.logCtx(e,this.update);let{record:n,id:o,transient:a}=this.adapter.prepare(t,i);return s.debug(`updating ${this.class.name} in table ${W.tableName(this.class)} with id ${o}`),n=await this.adapter.update(this.class,o,n,...r),this.adapter.revert(n,this.class,o,a,i)}async updatePrefix(t,...e){const{ctx:r,ctxArgs:s,log:i}=(await this.logCtx(e,a.UPDATE,!0)).for(this.updatePrefix),n=r.get("ignoreHandlers"),o=r.get("ignoreValidation");i.silly(`handlerSetting: ${n}, validationSetting: ${o}`);const c=t[this.pk];if(!c)throw new u("No value for the Id is defined under the property "+this.pk);let l;if(r.get("applyUpdateValidation")&&(l=await this.read(c,r),r.get("mergeForUpdate")&&(t=W.merge(l,t,this.class))),n||await f(this,r,t,a.UPDATE,a.ON,l),!o){const e=r.get("ignoredValidationProperties")||[];i.silly("ignored validation properties: "+e);const s=await Promise.resolve(t.hasErrors(l,...e));if(s)throw new d(s.toString())}return[t,...s,l]}async updateAll(t,...e){const{ctx:r,log:s,ctxArgs:i}=this.logCtx(e,this.updateAll);s.verbose(`Updating ${t.length} new ${this.class.name} in table ${W.tableName(this.class)}`);const n=t.map(t=>this.adapter.prepare(t,r));return(await this.adapter.updateAll(this.class,n.map(t=>t.id),n.map(t=>t.record),...i)).map((t,e)=>this.adapter.revert(t,this.class,n[e].id,r.get("rebuildWithTransient")?n[e].transient:void 0,r))}async updateAllPrefix(t,...e){const{ctx:r,ctxArgs:s,log:i}=(await this.logCtx(e,c.UPDATE_ALL,!0)).for(this.updateAllPrefix),n=r.get("ignoreHandlers"),o=r.get("ignoreValidation");i.silly(`handlerSetting: ${n}, ignoredValidation: ${o}`);const l=t.map(t=>{const e=t[this.pk];if(!e)throw new u("missing id on update operation");return e});let h;if(r.get("applyUpdateValidation")&&(h=await this.readAll(l,r),r.get("mergeForUpdate")&&(t=t.map((t,e)=>W.merge(h[e],t,this.class)))),n||await Promise.all(t.map((t,e)=>f(this,r,t,a.UPDATE,a.ON,h?h[e]:void 0))),!o){const e=r.get("ignoredValidationProperties")||[];let s;i.silly("ignored validation properties: "+e),s=r.get("applyUpdateValidation")?await Promise.all(t.map((t,r)=>Promise.resolve(t.hasErrors(h[r],...e)))):await Promise.resolve(t.map(t=>t.hasErrors(...e)));const n=y(s);if(n)throw new d(n)}return[t,...s,h]}async deletePrefix(t,...e){const{ctx:r,ctxArgs:s,log:i}=(await this.logCtx(e,a.DELETE,!0)).for(this.deletePrefix),n=r.get("ignoreHandlers");if(i.silly("handlerSetting: "+n),!n){const e=await this.read(t,...s);await f(this,r,e,a.DELETE,a.ON)}return[t,...s]}async delete(t,...e){const{ctx:r,log:s,ctxArgs:i}=this.logCtx(e,this.delete);s.debug(`deleting new ${this.class.name} in table ${W.tableName(this.class)} with pk ${t}`);const n=await this.adapter.delete(this.class,t,...i);return this.adapter.revert(n,this.class,t,void 0,r)}async deleteAllPrefix(t,...e){const{ctx:r,ctxArgs:s,log:i}=(await this.logCtx(e,c.DELETE_ALL,!0)).for(this.deleteAllPrefix),n=r.get("ignoreHandlers");if(i.silly("handlerSetting: "+n),!n){const e=await this.readAll(t,...s);await Promise.all(e.map(async t=>f(this,r,t,a.DELETE,a.ON)))}return[t,...s]}async deleteAll(t,...e){const{ctx:r,log:s,ctxArgs:i}=this.logCtx(e,this.create);return s.debug(`deleting ${t.length} ${this.class.name} in table ${W.tableName(this.class)}`),(await this.adapter.deleteAll(this.class,t,...i)).map((e,s)=>this.adapter.revert(e,this.class,t[s],void 0,r))}select(t){return this.adapter.Statement(this._overrides).select(t).from(this.class)}count(t){return this.adapter.Statement(this._overrides).count(t).from(this.class)}min(t){return this.adapter.Statement(this._overrides).min(t).from(this.class)}max(t){return this.adapter.Statement(this._overrides).max(t).from(this.class)}sum(t){return this.adapter.Statement(this._overrides).sum(t).from(this.class)}avg(t){return this.adapter.Statement(this._overrides).avg(t).from(this.class)}distinct(t){return this.adapter.Statement(this._overrides).distinct(t).from(this.class)}async query(t,e,r=re.ASC,s,i,...n){const{ctxArgs:o}=(await this.logCtx(n,Ct.QUERY,!0)).for(this.query),a=[e,r],c=this.select().where(t).orderBy(a);return s&&c.limit(s),i&&c.offset(i),c.execute(...o)}async listBy(t,e,...r){const{log:s,ctxArgs:i}=(await this.logCtx(r,kt.LIST_BY,!0)).for(this.listBy);return s.verbose(`listing ${W.tableName(this.class)} by ${t} ${e}`),this.select().orderBy([t,e]).execute(...i)}async paginateBy(t,e,r={offset:1,limit:10},...s){const i=r.offset||1,{offset:n,bookmark:o,limit:a}=r;if(!n&&!o)throw new Zt("PaginateBy needs a page or a bookmark");const{log:c,ctx:l,ctxArgs:u}=(await this.logCtx(s,kt.PAGE_BY,!0)).for(this.paginateBy);let d;if(c.verbose(`paginating ${W.tableName(this.class)} with page size ${a}`),o&&l.get("paginateByBookmark"))d=await this.override({forcePrepareComplexQueries:!1,forcePrepareSimpleQueries:!1}).select().where((()=>e===re.ASC?this.attr(W.pk(this.class)).gt(o):this.attr(W.pk(this.class)).lt(o))()).orderBy([t,e]).paginate(a,...u);else{if(!n)throw new Zt("PaginateBy needs a page or a bookmark");d=await this.override({forcePrepareComplexQueries:!1,forcePrepareSimpleQueries:!1}).select().orderBy([t,e]).paginate(a,...u)}const h=await d.page(i,o,...u);return d.serialize(h)}async find(t,e=re.ASC,...r){if("string"!=typeof t)throw new Zt("Find value must be a string");const s=this.getDefaultQueryAttributes(),i=this.buildDefaultStartsWithCondition(t,s),{log:n,ctxArgs:o}=(await this.logCtx(r,kt.FIND,!0)).for(this.find);return n.verbose(`finding ${W.tableName(this.class)} by default attributes ${s.join(", ")}`),this.select().where(i).orderBy([s[0],e]).execute(...o)}async page(t,e=re.ASC,r={offset:1,limit:10},...s){if("string"!=typeof t)throw new Zt("Page value must be a string");const i=r.offset||1,{offset:n,bookmark:o,limit:a}=r;if(!n&&!o)throw new Zt("PaginateBy needs a page or a bookmark");const c=this.getDefaultQueryAttributes(),l=this.buildDefaultStartsWithCondition(t,c),{log:u,ctx:d,ctxArgs:h}=(await this.logCtx(s,kt.PAGE,!0)).for(this.page);u.verbose(`paging ${W.tableName(this.class)} by default attributes ${c.join(", ")}`);const p=a??10,g=c[0],f=this.override({forcePrepareComplexQueries:!1,forcePrepareSimpleQueries:!1});let y;if(o&&d.get("paginateByBookmark")){const t=W.pk(this.class),r=e===re.ASC?this.attr(t).gt(o):this.attr(t).lt(o);y=await f.select().where(l.and(r)).orderBy([g,e]).paginate(p,...h)}else{if(!n)throw new Zt("PaginateBy needs a page or a bookmark");y=await f.select().where(l).orderBy([g,e]).paginate(p,...h)}const m=await y.page(i,o,...h);return y.serialize(m)}async findOneBy(t,e,...r){const{log:s,ctxArgs:i}=(await this.logCtx(r,kt.FIND_ONE_BY,!0)).for(this.findOneBy);s.verbose(`finding ${W.tableName(this.class)} with ${t} ${e}`);const n=await this.select().where(this.attr(t).eq(e)).limit(1).execute(...i);if(!n.length)throw new m("No results found");return n[0]}async findBy(t,e,...r){const{log:s,ctxArgs:i}=(await this.logCtx(r,kt.FIND_BY,!0)).for(this.findBy);return s.verbose(`finding ${W.tableName(this.class)} with ${t} ${e}`),this.select().where(this.attr(t).eq(e)).execute(...i)}async countOf(t,...e){const{log:r,ctxArgs:s}=(await this.logCtx(e,kt.COUNT_OF,!0)).for(this.countOf);return r.verbose(`counting ${W.tableName(this.class)}${t?" by "+t:""}`),this.count(t).execute(...s)}async maxOf(t,...e){const{log:r,ctxArgs:s}=(await this.logCtx(e,kt.MAX_OF,!0)).for(this.maxOf);return r.verbose(`finding max of ${t} in ${W.tableName(this.class)}`),this.max(t).execute(...s)}async minOf(t,...e){const{log:r,ctxArgs:s}=(await this.logCtx(e,kt.MIN_OF,!0)).for(this.minOf);return r.verbose(`finding min of ${t} in ${W.tableName(this.class)}`),this.min(t).execute(...s)}async avgOf(t,...e){const{log:r,ctxArgs:s}=(await this.logCtx(e,kt.AVG_OF,!0)).for(this.avgOf);return r.verbose(`calculating average of ${t} in ${W.tableName(this.class)}`),this.avg(t).execute(...s)}async sumOf(t,...e){const{log:r,ctxArgs:s}=(await this.logCtx(e,kt.SUM_OF,!0)).for(this.sumOf);return r.verbose(`calculating sum of ${t} in ${W.tableName(this.class)}`),this.sum(t).execute(...s)}async distinctOf(t,...e){const{log:r,ctxArgs:s}=(await this.logCtx(e,kt.DISTINCT_OF,!0)).for(this.distinctOf);return r.verbose(`finding distinct values of ${t} in ${W.tableName(this.class)}`),this.distinct(t).execute(...s)}async groupOf(t,...e){const{log:r,ctxArgs:s}=(await this.logCtx(e,kt.GROUP_OF,!0)).for(this.groupOf);return r.verbose(`grouping ${W.tableName(this.class)} by ${t}`),this.select().groupBy(t).execute(...s)}async statement(t,...e){if(!Re.statements(this,t))throw new Zt("Invalid prepared statement requested "+t);const{log:r,ctxArgs:s}=(await this.logCtx(e,Ct.STATEMENT,!0)).for(this.statement);return r.verbose("Executing prepared statement "+t),this[t](...s)}getDefaultQueryAttributes(){const t=W.defaultQueryAttributes(this.class);if(!t||!t.length)throw new Zt("No default query attributes defined for "+W.tableName(this.class));return t}buildDefaultStartsWithCondition(t,e){if("string"!=typeof t)throw new Zt("Default query value must be a string");let r;for(const s of e){const e=this.attr(s).startsWith(t);r=r?r.or(e):e}if(!r)throw new Zt("No default query attributes available for "+W.tableName(this.class));return r}attr(t){return ee.attr(t)}observe(t,e){this.observerHandler||Object.defineProperty(this,"observerHandler",{value:this.ObserverHandler(),writable:!1});const r=this.log.for(this.observe),s=this.class.name;return this.adapter.observe(this,(t,e,r,...i)=>"string"==typeof t?t===s:dt.constr(t)===dt.constr(this.class)),r.verbose(`now observing ${this.adapter} filtering on table === ${s}`),this.observerHandler.observe(t,e),r.verbose("Registered new observer "+t.toString()),()=>this.unObserve(t)}unObserve(t){if(!this.observerHandler)throw new u("ObserverHandler not initialized. Did you register any observables?");this.observerHandler.unObserve(t),this.log.for(this.unObserve).verbose(`Observer ${t.toString()} removed`),this.observerHandler.count()||(this.log.verbose(`No more observers registered for ${this.adapter}, unsubscribing`),this.adapter.unObserve(this),this.log.verbose("No longer observing adapter "+this.adapter.flavour))}async updateObservers(t,e,r,...s){if(!this.observerHandler)throw new u("ObserverHandler not initialized. Did you register any observables?");const{log:i,ctxArgs:n}=this.logCtx(s,this.updateObservers);i.verbose(`Updating ${this.observerHandler.count()} observers for ${this}`),await this.observerHandler.updateObservers(t,e,Array.isArray(r)?r.map(t=>Kt._baseSequence.parseValue(W.sequenceFor(this.class).type,t)):Kt._baseSequence.parseValue(W.sequenceFor(this.class).type,r),...n)}async refresh(t,e,r,...s){return this.updateObservers(t,e,r,...s)}static forModel(t,e,...r){let s;const i=e||dt.flavourOf(t)||Kt.currentFlavour;try{s=this.get(t,i)}catch(t){s=void 0}if(s instanceof Re)return s;const n=e||dt.flavourOf(t)||s&&dt.get(s,Ct.ADAPTER)||Kt.currentFlavour,o=n?Kt.get(n):void 0;if(!o)throw new u("No registered persistence adapter found flavour "+n);return s=s||o.repository(),new s(o,t,...r)}static get(t,e){const r=W.tableName(t);let s=r;if(e&&(s=[r,e].join(w)),s in this._cache)return this._cache[s];if(r in this._cache)return this._cache[r];throw new u("Could not find repository registered under "+r)}static register(t,e,r){let s=W.tableName(t);if(r&&(s=[s,r].join(w)),s in this._cache&&this._cache[s]instanceof Re)throw new u(s+" already has a registered instance");this._cache[s]=e}static statements(t,e){const r=t instanceof Re?t.constructor:t,s=dt.get(r,e?dt.key(Ct.STATEMENT,e):Ct.STATEMENT);return(e?s:Object.keys(s))||!1}static queries(t,e){const r=t instanceof Re?t.constructor:t;return dt.get(r,e?dt.key(Ct.QUERY,e):Ct.QUERY)}}function Pe(t,e){if(!(e||(e=ht.flavourResolver(t instanceof W?t.constructor:t))&&e!==pt))throw new u("Could not retrieve flavour from model "+(t instanceof W?t.constructor.name:t.name));return J(Ct.INJECTABLE,e,W.tableName(t))}i([le(),n("design:type",Function),n("design:paramtypes",[Object,String,void 0]),n("design:returntype",Promise)],Re.prototype,"listBy",null),i([le(),n("design:type",Function),n("design:paramtypes",[Object,String,Object,void 0]),n("design:returntype",Promise)],Re.prototype,"paginateBy",null),i([le(),n("design:type",Function),n("design:paramtypes",[String,String,void 0]),n("design:returntype",Promise)],Re.prototype,"find",null),i([le(),n("design:type",Function),n("design:paramtypes",[String,String,Object,void 0]),n("design:returntype",Promise)],Re.prototype,"page",null),i([le(),n("design:type",Function),n("design:paramtypes",[Object,Object,void 0]),n("design:returntype",Promise)],Re.prototype,"findOneBy",null),i([le(),n("design:type",Function),n("design:paramtypes",[Object,Object,void 0]),n("design:returntype",Promise)],Re.prototype,"findBy",null),i([le(),n("design:type",Function),n("design:paramtypes",[Object,void 0]),n("design:returntype",Promise)],Re.prototype,"countOf",null),i([le(),n("design:type",Function),n("design:paramtypes",["function"==typeof(xe="undefined"!=typeof K&&K)?xe:Object,void 0]),n("design:returntype",Promise)],Re.prototype,"maxOf",null),i([le(),n("design:type",Function),n("design:paramtypes",["function"==typeof(Ee="undefined"!=typeof K&&K)?Ee:Object,void 0]),n("design:returntype",Promise)],Re.prototype,"minOf",null),i([le(),n("design:type",Function),n("design:paramtypes",["function"==typeof(Se="undefined"!=typeof K&&K)?Se:Object,void 0]),n("design:returntype",Promise)],Re.prototype,"avgOf",null),i([le(),n("design:type",Function),n("design:paramtypes",["function"==typeof(Oe="undefined"!=typeof K&&K)?Oe:Object,void 0]),n("design:returntype",Promise)],Re.prototype,"sumOf",null),i([le(),n("design:type",Function),n("design:paramtypes",["function"==typeof(ke="undefined"!=typeof K&&K)?ke:Object,void 0]),n("design:returntype",Promise)],Re.prototype,"distinctOf",null),i([le(),n("design:type",Function),n("design:paramtypes",["function"==typeof(Ce="undefined"!=typeof K&&K)?Ce:Object,void 0]),n("design:returntype",Promise)],Re.prototype,"groupOf",null),i([M(),n("design:type",Function),n("design:paramtypes",[Object,Function]),n("design:returntype",Function)],Re.prototype,"observe",null),i([M(),n("design:type",Function),n("design:paramtypes",[Object]),n("design:returntype",void 0)],Re.prototype,"unObserve",null),Kt&&(Kt._baseRepository=Re);class Ie extends t{get log(){return this.logger||(this.logger=j.for(this)),this.logger}constructor(){super()}get(t,r){const s=this.log.for(this.get);let i;try{i=super.get(t)}catch{}if(!i){let n;if("function"==typeof t?n=W.get(t.name)||t:"symbol"!=typeof t&&"string"!=typeof t||(n=W.get(t.toString())),!n)return;const o=Ct.ADAPTER,a=r||dt.get(n,o);try{let t=a;try{a&&Kt.get(a)}catch{const e=Kt.current;e&&e.flavour===a&&(t=e.alias)}if(i=Re.forModel(n,t),i instanceof Re)return i;const r=a||dt.get(i.constructor,o)||dt.get(n,o);e.register(i,Pe(n,r))}catch(t){s.debug("No registered repository or adapter found. falling back to default adapter. Error: "+(t?.message||JSON.stringify(t)));const e=Re.get(n,a);if("function"==typeof e){const t=a?Kt.get(a):Kt.current;if(!t)return;return new e(t,n)}}}return i}}(t=>{t.PENDING="pending",t.SCHEDULED="scheduled",t.RUNNING="running",t.FAILED="failed",t.SUCCEEDED="succeeded",t.CANCELED="canceled",t.WAITING_RETRY="waiting_retry"})(Te||(Te={})),(t=>{t.EXPONENTIAL="exponential",t.FIXED="fixed"})(Ne||(Ne={})),(t=>{t.NONE="none",t.FULL="full"})(_e||(_e={})),(t=>{t.STATUS="status",t.LOG="log",t.PROGRESS="progress",t.ALL="all"})(Be||(Be={})),(t=>{t.ATOMIC="atomic",t.COMPOSITE="composite"})(De||(De={}));const $e="tasks",Le={workerId:"default-worker",concurrency:10,leaseMs:6e4,pollMsIdle:1e3,pollMsBusy:500,logTailMax:100,streamBufferSize:5,maxLoggingBuffer:300,loggingBufferTruncation:20,gracefulShutdownMsTimeout:12e4,workerConcurrency:1};function Fe(t,e){return(i,n)=>n?r(dt.constr(t))(i,n):(dt.set(b.REPOSITORY,dt.key(e||Kt.currentFlavour,W.tableName(t)),i),bt(b.REPOSITORY,i.name)(t),e=e||dt.get(i.constructor,Ct.ADAPTER),Re.register(t,i,e),s(dt.constr(t),{callback:e=>(Object.defineProperty(e,b.CLASS,{enumerable:!1,configurable:!1,writable:!1,value:t}),e)})(i))}dt.tasks=(()=>dt.innerGet(Symbol.for($e))).bind(dt),dt.taskFor=(t=>{const e=dt.tasks();return e?e[t]:void 0}).bind(dt),dt.validationExceptions=((t,e)=>{const r=dt.get(t,Ct.NO_VALIDATE)||[],s=Object.entries(r).filter(([,t])=>t.includes(e)).map(([t])=>t);let i=[];return e!==a.CREATE&&e!==a.UPDATE||(i=W.nestedRelations(t)),[...new Set([...s,...i])]}).bind(dt),dt.migrationsFor=(t=>{if(!(t=t??Kt.current))throw new u("Could not get adapter for migrations");return dt.innerGet(Symbol.for(Ct.MIGRATION),t.alias).map(t=>t.class)}).bind(dt),dt.migrations=(()=>{const t=dt.innerGet(Symbol.for([Ct.MIGRATION,Ct.BY_KEY].join("-")));return Object.values(t).flat().map(t=>[t.class.name,t.class])}).bind(dt),dt.relations=((t,e)=>{const r=dt.get(t,Ct.RELATIONS);if(r){if(!e)return Object.keys(r);if(!r[e])throw new u("No relations metadata found for property "+e);return r[e]}}).bind(dt),W.relations=(t,e)=>dt.relations(t instanceof W?t.constructor:t,e)||[],W.nestedRelations=((t,e=[])=>{let r=[];const s=dt.get(t,Ct.RELATIONS);if(!s||!Object.keys(s).length)return[...new Set([...e])];for(const t in s){const i=s[t];if(i?.class&&W.relations(i.class)){const s=W.relations(i.class).map(e=>`${t}.${e}`);e=[...e,...s],r=W.nestedRelations(i.class,e)}}return[...new Set([...e,...r])]}).bind(W),W.generatedBySequence=((t,e)=>{const r="function"!=typeof t?t.constructor:t;return!!W.sequenceFor(r).generated}).bind(W),W.fromTable=(t=>{const e=dt.innerGet(Symbol.for(Ct.TABLE));if(!e||!e[t]||!W.get(e[t].name))throw new u("No table metadata found for model. did you use @table()?");return W.get(e[t].name)}).bind(W),dt.createdBy=(t=>{const e=dt.get("function"!=typeof t?t.constructor:t,Ct.CREATED_BY);if(!e)throw new u("No createdBy metadata found for model. did you use @createdBy()?");return e}).bind(dt),dt.updatedBy=(t=>{const e=dt.get("function"!=typeof t?t.constructor:t,Ct.UPDATED_BY);if(!e)throw new u("No updatedBy metadata found for model. did you use @updatedBy()?");return e}).bind(dt),W.tableName=t=>{if(!(t instanceof W?W.get(t.constructor.name):t))throw new u("Unable to find model "+t);return dt.get(t instanceof W?t.constructor:t,Ct.TABLE)||(t instanceof W?t.constructor.name:t.name)},W.columnName=(t,e)=>dt.get(t instanceof W?t.constructor:t,dt.key(Ct.COLUMN,e))||e,W.defaultQueryAttributes=t=>{const e="function"==typeof t?t:t.constructor;return dt.get(e,dt.key(Ct.DEFAULT_QUERY_ATTR))||[W.pk(t)]},W.sequenceName=(t,...e)=>[W.tableName(t),...e].join("_"),W.sequenceFor=(t,e)=>{if(e)throw new Mt("not currently supported");const r=W.pkProps(t instanceof W?t.constructor:t);if(!r)throw new u("No sequence options defined for model. did you use the @pk decorator?");return r},W.indexes=t=>{const e=dt.get(t instanceof W?t.constructor:t,Ct.INDEX);return Object.keys(e||{}).reduce((t,r)=>(t[r]={[Ct.INDEX]:e[r]},t),{})},e.services=()=>dt.innerGet(Symbol.for(Ct.SERVICE)),e.repositories=()=>dt.innerGet(Symbol.for(b.REPOSITORY));class je extends u{constructor(t){super(t,je.name,500)}}var Me;function Ue(t,...e){return(r,s,i)=>{i.value=new Proxy(i.value,{async apply(r,s,i){const{ctx:n,ctxArgs:o}=await s.logCtx(i,r.name,!0);let a;try{a=t(...i,...e,n)}catch(t){throw new u("Failed to execute auth validation handler: "+t)}if(a)throw a;return r.call(s,...o)}})}}function Ye(t,...e){return(r,s,i)=>{i.value=new Proxy(i.value,{async apply(r,s,i){const{ctx:n,ctxArgs:o}=await s.logCtx(i,r.name,!0);let a;try{a=t(...i,...e,n)}catch(t){throw new u("Failed to execute auth validation handler: "+t)}if(a)throw a;return r.call(s,...o)}})}}(t=>{t.AUTH="auth",t.ROLES="roles",t.NAMESPACE="namespace"})(Me||(Me={}));const Ge={type:void 0,generated:!1,startWith:0,incrementBy:1,cycle:!1},ze=Ge,He={type:Number,generated:!0,startWith:0,incrementBy:1,cycle:!1},We=Object.assign({},He,{type:"BigInt"});function qe(t,e,r){return ht.for(Ct.INDEX).define({decorator:(t,e,r)=>(s,i)=>("string"==typeof t&&(r=t,t=void 0,e=void 0),"string"==typeof e&&(r=e,e=void 0),!e&&t&&t.find(t=>![re.ASC,re.DSC].includes(t))&&(e=t,t=void 0),yt(dt.key(`${Ct.INDEX}${e&&e?.length?"."+e.join("."):""}`,i),{directions:t,compositions:e,name:r})(s,i)),args:[t,e,r]}).apply()}async function Qe(t,e,r,s){if(!e.type||!e.generated||s[r])return;let i;e.name||(e.name=W.sequenceName(s,"pk"));try{i=await this.adapter.Sequence(e,this._overrides)}catch(t){throw new u(`Failed to instantiate Sequence ${e.name}: ${t}`)}var n,o,a;n=s,o=r,a=await i.next(t),Reflect.set(n,o,a)}function Je(t,e){return(r,s)=>{if(vt()(r,s),!t.type){const e=dt.type(r.constructor,s);if(![Number.name,String.name,BigInt.name].includes(e?.name||e))throw Error("Incorrrect option type");t.type=e}switch(t.type){case String.name||String.name.toLowerCase():case String:t.generated=void 0!==t.generated&&t.generated,t.type=String;break;case Number.name||String.name.toLowerCase():case Number:t.generated=void 0===t.generated||t.generated,t.type=Number;break;case BigInt.name||BigInt.name.toLowerCase():case BigInt:t.type=BigInt,t.generated=void 0===t.generated||t.generated;break;case"uuid":case"serial":t.generated=!0;break;default:throw Error("Unsupported type")}void 0===t.generated&&(t.generated=!0);const i=[vt(),qe([re.ASC,re.DSC]),Q(),v(),yt(dt.key(b.ID,s),t),A(Qe,t,e)];return t.generated&&i.push(x()),gt(...i)(r,s)}}function Ve(t){const e=Object.assign({},ze);return delete e.generated,t=Object.assign({},e,t),ht.for(b.ID).define({decorator:Je,args:[t,{priority:60}]}).apply()}async function Xe(t,e,r,s,i){const n=e.logger.for(Xe);if(!s){const e=W.get(t.constructor.name);if(!e)throw new u("Could not find model "+t.constructor.name);s=Re.forModel(e,r),n.info("Retrieved "+s.toString())}let o;if(s=i?s.override(i):s,void 0===t[W.pk(s.class)])n.info(`No pk found in ${W.tableName(s.class)} - creating`),o=await s.create(t,e);else{n.info(`pk found in ${W.tableName(s.class)} - attempting update`);try{o=await s.update(t,e),n.info("Updated "+W.tableName(s.class))}catch(r){if(!(r instanceof m))throw r;n.info("update Failed - creating new "+W.tableName(s.class)),o=await s.create(t,e)}n.info("After create update: "+o)}return o}async function Ke(t,e,r,s){const i=s[r];if(!i)return;if(nr(s,e),"object"!=typeof i){const e=br(s,r,this.adapter.alias),n=await e.override(this._overrides).read(i,t);return await fr(t,s,r,i,n),void(s[r]=i)}const n="function"!=typeof e.class||e.class.name?e.class:e.class();if(!n)throw new u("Could not find model "+e.class);const o=Re.forModel(n,this.adapter.alias),a=await o.override(this._overrides).create(i,t),c=W.pk(a);await fr(t,s,r,a[c],a),s[r]=a[c]}async function Ze(t,e,r,s){const i=s[r];if(!i)return;if(e.cascade.update!==se.CASCADE)return;if("object"!=typeof i){const e=br(s,r,this.adapter.alias),n=await e.override(this._overrides).read(i,t);return await fr(t,s,r,i,n),void(s[r]=i)}const n=await Xe(s[r],t,this.adapter.alias,void 0,this._overrides),o=W.pk(n);await fr(t,s,r,n[o],n),s[r]=n[o]}async function tr(t,e,r,s){const i=s[r];if(!i)return;if(e.cascade.update!==se.CASCADE)return;const n=br(s,r,this.adapter.alias);let o;o=i instanceof W?await n.delete(s[r][n.pk],t):await n.delete(s[r],t),await fr(t,s,r,o[n.pk],o)}async function er(t,e,r,s,i){const n=s[r];if(!n||!n.length)return;nr(s,e);const o=t.logger.for(er),a=br(s,r,this.adapter.alias),c=W.pk("function"!=typeof e.class||e.class.name?e.class:e.class()),l=new Set;for(const e of n){let i;"object"!=typeof e?(i=await a.override(this._overrides).read(e,t),o.debug("read: "+i[c])):(o.verbose("Creating or updating one-to-many model: "+e[c]),i=await Xe(e,t,this.adapter.alias,void 0,this._overrides)),o.debug(`caching for populate: ${JSON.stringify(i)} under ${i[c]}`),await fr(t,s,r,i[c],i),l.add(i[c])}s[r]=[...l]}async function rr(t,e,r,s,i){const{cascade:n}=e;if(n.update===se.CASCADE)return er.call(this,t,e,r,s,i)}async function sr(t,e,r,s){if(e.cascade.delete!==se.CASCADE)return;const i=s[r];if(!i||!i.length)return;const n=typeof i[0];if(!i.every(t=>typeof t===n))throw new u(`Invalid operation. All elements of property ${r} must match the same type.`);const o="function"!=typeof e.class||e.class.name?e.class:e.class(),a="object"===n,c=a?Re.forModel(o,this.adapter.alias):br(s,r,this.adapter.alias),l=[...new Set([...a?i.map(t=>t[c.pk]):i]).values()];let d,h;try{d=await c.override(this._overrides).deleteAll(l,t)}catch(e){throw t.logger.error("Failed to delete all records",e),e}for(let e=0;e<d.length;e++){h=d[e];try{await fr(t,s,r,l[e],h)}catch(i){throw t.logger.error(`Failed to cache record ${l[e]} with key ${r} and model ${JSON.stringify(s,void 0,2)} `,i),i}}s[r]=l}async function ir(t,e,r,s){const i=s[r];if(!i)return;nr(s,e);const n=t.logger.for(ir);if("object"!=typeof i){const e=br(s,r,this.adapter.alias),n=await e.override(this._overrides).read(i,t);return await fr(t,s,r,i,n),void(s[r]=i)}if(!(e.class instanceof W?e.class.constructor:e.class))throw new u("Could not find model "+e.class);n.info("Creating or updating many-to-one model: "+JSON.stringify(i));const o=await Xe(i,t,this.adapter.alias,void 0,this._overrides),a=W.pk(o);n.info(`caching: ${JSON.stringify(o)} under ${o[a]}`),await fr(t,s,r,o[a],o),s[r]=o[a]}function nr(t,e){let r;const s="function"==typeof e.class&&e.class.name?e.class:e.class(),i=dt.get(s,Ct.RELATIONS);if(i&&(r=Object.values(i)?.find(e=>{const r="function"==typeof e.class&&e.class.name?e.class:e.class();return t instanceof r})),!0===r?.populate&&!0===e?.populate)throw new u("Bidirectional populate is not allowed. Please set populate to false on one side of the relation.");return!0}async function or(t,e,r,s){const{cascade:i}=e;if(i.update===se.CASCADE)return ir.call(this,t,e,r,s)}async function ar(t,e,r,s){if(e.cascade.delete!==se.CASCADE)return;const i=s[r];if(!i)return;const n="object"==typeof i,o=n?Re.forModel(i,this.adapter.alias):br(s,r,this.adapter.alias),a=n?i[o.pk]:i,c=await o.override(this._overrides).delete(a);await fr(t,s,r,a,c),s[r]=a}async function cr(t,e,r,s){const i=s[r];if(!i||!i.length)return;nr(s,e);const n=typeof i[0];if(!i.every(t=>typeof t===n))throw new u(`Invalid operation. All elements of property ${r} must match the same type.`);const o=t.logger.for(cr),a=new Set([...i]);if("object"!==n){const n=br(s,r,this.adapter.alias),c=await n.override(this._overrides).readAll([...a.values()],t);for(let e=0;e<c.length;e++){const s=c[e];o.info("FOUND MANY TO MANY VALUE: "+JSON.stringify(s)),await fr(t,s,r,[...a.values()][e],c)}return await lr.call(this,s,[...i],o,t,e),s[r]=[...a],void o.info("SET MANY TO MANY IDS: "+s[r])}const c=W.pk(i[0].constructor),l=new Set;for(const e of i){o.info("Creating or updating many-to-many model: "+JSON.stringify(e));const i=await Xe(e,t,this.adapter.alias,void 0,this._overrides);o.info(`caching: ${JSON.stringify(i)} under ${i[c]}`),await fr(t,s,r,i[c],i),o.info("Creating or updating many-to-many model: "+JSON.stringify(e)),e.id=i.id,l.add(i[c])}const d=W.pk(s.constructor);if(void 0===s[d]){const e=await(async(t,e,r)=>{const s=e[W.pk(e.constructor)];if(void 0!==s)return s;const i=W.sequenceFor(e.constructor);let n;i?.name||(i.name=W.sequenceName(e,"pk"));try{return n=await t.adapter.Sequence(i,t._overrides),await n.next(r)}catch(t){throw new u(`Failed to instantiate Sequence ${i.name}: ${t}`)}})(this,s,t);s[d]=e}const h=await lr.call(this,s,i,o,t,e);o.info("Junction model created: "+h.name),s[r]=[...l]}async function lr(t,e,r,s,i){const{JunctionModel:n,fkA:o,fkB:a}=ur(t,e[0],i),c=[];for(const i of e){r.info("Creating or updating many-to-many junction model: "+JSON.stringify(i));const e={[o]:t instanceof W?t[W.pk(t.constructor)]:t,[a]:i instanceof W?i[W.pk(i.constructor)]:i},l=await Xe(new n(e),s,this.adapter.alias,void 0,this._overrides);l?.id&&c.push(l.id)}if(c.length===e?.length){const t=Re.forModel(n);await(t?.override(this._overrides).readAll(c))}return n}function ur(t,e,r){const s=W.tableName(t);let i;if(e instanceof W)i=W.tableName(e);else if(W.isModel(e)&&"function"==typeof e)i=e.name?e.name:e()?.name;else if(r?.class){const t="function"!=typeof r.class||r.class.name?r.class:r.class();i=W.tableName(t)}if(!s||!i)throw new u("Missing tablenames to create junction table");const n=r?.joinTable?.name?r?.joinTable?.name:`${s}_${i}`,o=s?.toLowerCase()+"_fk",a=i?.toLowerCase()+"_fk",c=class extends W{constructor(t){super(t)}};Object.defineProperty(c,"name",{value:n,writable:!1}),Ve({type:Number})(c.prototype,"id"),Q()(c.prototype,o),Q()(c.prototype,a);const l=X()(c);return dt.set(c,Ct.TABLE,n),{fkA:o,fkB:a,JunctionModel:l}}async function dr(t,e,r,s){const{cascade:i}=e;if(i.update===se.CASCADE)return cr.call(this,t,e,r,s)}async function hr(t,e,r,s){if(e.cascade.delete!==se.CASCADE)return;const i=s[r];if(!i||!i.length)return;const n=typeof i[0];if(!i.every(t=>typeof t===n))throw new u(`Invalid operation. All elements of property ${r} must match the same type.`);const o="function"!=typeof e.class||e.class.name?e.class:e.class(),a="object"===n,c=a?Re.forModel(o,this.adapter.alias):br(s,r,this.adapter.alias),l=[...new Set([...a?i.map(t=>t[c.pk]):i]).values()];let d,h;try{d=await c.override(this._overrides).deleteAll(l,t)}catch(e){throw t.logger.error("Failed to delete all records",e),e}for(let e=0;e<d.length;e++){h=d[e];try{await fr(t,s,r,l[e],h)}catch(i){throw t.logger.error(`Failed to cache record ${l[e]} with key ${r} and model ${JSON.stringify(s,void 0,2)} `,i),i}}s[r]=l}function pr(t,e,r){return[Ct.POPULATE,t,e,r].join(".")}function gr(t,e,r){return[Ct.TAG_FOR_DELETION,t,r].join(".")}async function fr(t,e,r,s,i){const n=pr(e.constructor.name,r,s),o=t.get("cacheForPopulate")||{};return o[n]=i,t.accumulate({cacheForPopulate:o})}async function yr(t,e,r,s){if(!e.populate)return;const i=s[r],n=Array.isArray(i);if(void 0===i||n&&0===i.length)return;const o=this,l=await(async(e,r,s,i)=>{let n,l;const d=[];let h;try{h=e.get("operation")}catch(t){h=void 0}const p=h===a.READ||h===c.READ_ALL?{}:e.get("cacheForPopulate")||{};for(const e of i){n=pr(r.constructor.name,s,e);try{if(l=p[n],!l)throw Error("Not found in cache")}catch(i){const n=br(r,s);if(!n)throw new u("Could not find repo");l=await n.override(o._overrides).read(e,t)}d.push(l)}return d})(t,s,r,n?i:[i]);s[r]=n?l:l[0]}async function mr(t,e,r,s,i){if(e.cascade.update!==se.CASCADE)return;const n=s[r];if(void 0===n||Array.isArray(n)&&0===n.length)return;if(!i)throw new u("No way to compare old model. do you have updateValidation and mergeModels enabled?");function o(t){return Array.isArray(t)?t.map(o):"object"!=typeof t?t:t[W.pk(t)]}const a=o(s[r]),c=o(i[r]);if(void 0===c||V(a,c))return;if(Array.isArray(a)!==Array.isArray(c))throw new u("Cannot cascade update for different array types");const l=(Array.isArray(a)?a:[a]).filter(Boolean),d=(Array.isArray(c)?c:[c]).filter(Boolean).filter(t=>!l.includes(t)),h=br(s,r);if(!h)throw new u("Could not find repo");try{const e=await h.override(this._overrides).deleteAll(d,t);t.logger.debug(`Deleted ${e.length} entries from table ${W.tableName(h.class)} due to cascade rules with `)}catch(t){throw new u("Error deleting cascade entries: "+t)}}const wr=["array","string","number","boolean","symbol","function","object","undefined","null","bigint"];function br(t,e,r){if(!t)throw Error("No model was provided to get repository");let s;if(Array.isArray(t[e])||t[e]instanceof Set){const r=dt.get(t instanceof W?t.constructor:t,dt.key(Z.REFLECT,e,Z.LIST))?.clazz;if(!r)throw new u("Failed to find types decorators for property "+e);s=(Array.isArray(r)?[...r]:[r]).map(t=>"function"!=typeof t||t.name?t:t())}else s=dt.getPropDesignTypes(t instanceof W?t.constructor:t,e)?.designTypes;const i=s?.find(t=>!wr.includes((""+t.name).toLowerCase()));return Re.forModel(i,r)}class vr extends E{constructor(t,e=vr.name,r=401){super(t,e,r)}}class Ar extends vr{constructor(t,e=Ar.name){super(t,e,403)}}class xr extends u{constructor(t){super(t,xr.name,503)}}function Er(t){return ht.for(Ct.TABLE).define({decorator:t=>e=>(dt.set(Ct.TABLE,t||e.name.toLowerCase(),e),bt(Ct.TABLE,t||e.name.toLowerCase())(e)),args:[t]}).apply()}function Sr(t){return ht.for(Ct.COLUMN).define({decorator:t=>(e,r)=>yt(dt.key(Ct.COLUMN,r),t||r)(e,r),args:[t]}).apply()}async function Or(t,e,r,s){if(s[r]&&(await this.select().where(ee.attribute(r).eq(s[r])).execute()).length)throw new T(`model already exists with property ${r} equal to ${JSON.stringify(s[r],void 0,2)}`)}function kr(){const t=Ct.UNIQUE;return ht.for(t).define(tt(),C(Or),yt(t,{})).apply()}async function Cr(t,e,r,s){throw new vr("This adapter does not support user identification")}function Tr(){return ht.for(Ct.CREATED_BY).define({decorator:()=>(t,e)=>gt(A(Cr),yt(Ct.CREATED_BY,e),x(Ct.CREATED_BY))(t,e),args:[]}).apply()}function Nr(){return ht.for(Ct.UPDATED_BY).define({decorator:()=>(t,e)=>gt(k(Cr),yt(Ct.UPDATED_BY,e),x(Ct.UPDATED_BY))(t,e),args:[]}).apply()}function _r(){return O([a.CREATE])}function Br(){return O()}function Dr(t){return[()=>{const e="function"==typeof t&&t.name?t:t(),r=W.pk(e);return(dt.allowedTypes(e,r)||[])[0]}]}function Rr(t,e=ie,r=!0,s,i){const n=Ct.ONE_TO_ONE;return ht.for(n).define({decorator:(t,e,r,s,i)=>{const o={class:t,cascade:e,populate:r};s&&(o.joinTable=s),i&&(o.name=i);const a=Dr(t),c=[vt(),Ur(n,o),rt([t,...a]),A(Ke,o,{priority:70}),k(Ze,o,{priority:70}),_(tr,o,{priority:70}),B(mr,o,{priority:70}),N(yr,o,{priority:70})];return gt(...c)},args:[t,e,r,s,i]}).apply()}function Pr(t,e=ie,r=!0,s,i){const n=Ct.ONE_TO_MANY;return ht.for(n).define({decorator:(t,e,r,s,i)=>{const o={class:t,cascade:e,populate:r};s&&(o.joinTable=s),i&&(o.name=i);const a=Dr(t),c=[vt(),Ur(n,o),et([t,...a]),A(er,o,{priority:70}),k(rr,o,{priority:70}),_(sr,o,{priority:70}),B(mr,o,{priority:70}),N(yr,o,{priority:70})];return gt(...c)},args:[t,e,r,s,i]}).apply()}function Ir(t,e=ie,r=!0,s,i){const n=Ct.MANY_TO_ONE;return ht.for(n).define({decorator:(t,e,r,s,i)=>{const o={class:t,cascade:e,populate:r};s&&(o.joinTable=s),i&&(o.name=i);const a=Dr(t),c=[vt(),Ur(n,o),rt([t,...a]),A(ir,o),k(or,o),_(ar,o),N(yr,o)];return gt(...c)},args:[t,e,r,s,i]}).apply()}function $r(t,e=ie,r=!0,s,i){const n=Ct.MANY_TO_MANY;return ht.for(n).define({decorator:(t,e,r,s,i)=>{const o={class:t,cascade:e,populate:r};s&&(o.joinTable=s),i&&(o.name=i);const a=Dr(t),c=[vt(),Ur(n,o),et([t,...a]),A(cr,o),k(rr,o),N(yr,o)];return gt(...c)},args:[t,e,r,s,i]}).apply()}function Lr(...t){return(e,r)=>{const s=dt.get(e,dt.key(Ct.NO_VALIDATE,r))||[],i=[...new Set([...s,...t])];return gt(bt(dt.key(Ct.NO_VALIDATE,r),i))(e,r)}}function Fr(){return Lr(a.CREATE)}function jr(){return Lr(a.UPDATE)}function Mr(){return Lr(a.UPDATE,a.CREATE)}function Ur(t,e){return ht.for(Ct.RELATIONS).define({decorator:(t,e)=>(r,s)=>(yt(t,e)(r,s),yt(dt.key(Ct.RELATIONS,s),Object.assign({},e,{key:t}))(r,s)),args:[t,e]}).apply()}class Yr extends W{constructor(t){super(t)}}i([_r(),n("design:type",Date)],Yr.prototype,"createdAt",void 0),i([Br(),n("design:type",Date)],Yr.prototype,"updatedAt",void 0);let Gr=class extends Yr{constructor(t){super(t)}};i([Ve({type:String,generated:!1}),n("design:type",String)],Gr.prototype,"id",void 0),i([Q(),qe(),n("design:type",Object)],Gr.prototype,"current",void 0),Gr=i([Er("??sequence"),X(),n("design:paramtypes",[Object])],Gr);class zr extends F{get current(){return this._currentPage}get total(){return this._totalPages}get count(){return this._recordCount}get statement(){return this._statement||(this._statement=this.prepare(this.query)),this._statement}constructor(t,e,r,s){super(),this.adapter=t,this.query=e,this.size=r,this.clazz=s,qt(this,this.page,this.pagePrefix,this.page.name)}isPreparedStatement(){const t=this.query;return t.method&&t.method.match(RegExp(`${kt.FIND_BY}|${kt.LIST_BY}|${kt.FIND}`,"gi"))}async pagePrefix(t,...e){const{ctxArgs:r}=(await this.adapter.logCtx([this.clazz,...e],kt.PAGE_BY,!0)).for(this.pagePrefix);return r.shift(),[t,...r]}async pagePrepared(t,e,...r){const{log:s,ctxArgs:i}=this.adapter.logCtx(!e||e instanceof $t?[e,...r]:[...r],this.pagePrepared);s.debug(`Running paged prepared statement ${t} page${e?" - bookmark "+e:""}`),!e||e instanceof $t||(this._bookmark=e);const n=Re.forModel(this.clazz,this.adapter.alias),o=this.query,{method:a,args:c,params:l}=o;if(a===kt.FIND){const e=[kt.PAGE,...c],r={limit:this.size,offset:t,bookmark:this._bookmark};e.push(r);const s=await n.statement(...e,...i);return this.apply(s)}const u=RegExp(`^${kt.FIND_BY}|${kt.LIST_BY}`,"gi");if(!a.match(u))throw new Mt(`Method ${a} is not supported for pagination`);u.lastIndex=0;const d=a.replace(u,kt.PAGE_BY),h=[d,...c];let p={limit:this.size,offset:t,bookmark:this._bookmark};d!==kt.PAGE_BY||h.length>2?p={direction:l.direction,limit:this.size,offset:t,bookmark:this._bookmark}:h.push(l.direction),h.push(p);const g=await n.statement(...h,...i);return this.apply(g)}async next(...t){return this.page(this.current+1,...t)}async previous(...t){return this.page(this.current-1,...t)}validatePage(t){if(1>t||!Number.isInteger(t))throw new te("Page number cannot be under 1 and must be an integer");if(void 0!==this._totalPages&&t>this._totalPages)throw new te(`Only ${this._totalPages} are available. Cannot go to page ${t}`);return t}async page(t=1,e,...r){const{ctxArgs:s}=this.adapter.logCtx([e,...r],this.page);if(this.isPreparedStatement())return await this.pagePrepared(t,...s);throw new Mt("Raw support not available without subclassing this")}serialize(t,e=!1){const r={data:t,current:this.current,total:this.total,count:this.count,bookmark:this._bookmark};try{return e?JSON.stringify(r):r}catch(t){throw new D(t)}}apply(t){const e="string"==typeof t?zr.deserialize(t):t;return this._currentPage=e.current,this._totalPages=e.total||this._totalPages,this._recordCount=e.count||this._recordCount,this._bookmark=e.bookmark,e.data}static deserialize(t){try{return JSON.parse(t)}catch(t){throw new D(t)}}static isSerializedPage(t){return t&&"object"==typeof t&&Array.isArray(t.data)&&"number"==typeof t.total&&"number"==typeof t.current&&"number"==typeof t.count}}var Hr,Wr,qr,Qr,Jr,Vr,Xr;class Kr extends Lt{constructor(t,e){super(),this.adapter=t,this.overrides=e,this._inCountMode=!1,[this.execute,this.paginate].forEach(t=>{R(this,t,(...e)=>this.executionPrefix(t,...e),t.name)})}async executionPrefix(t,...e){const{ctx:r,ctxArgs:s,log:i}=(await this.adapter.logCtx([this.fromSelector,...e],t.name===this.paginate.name?kt.PAGE_BY:Ct.QUERY,!0,this.overrides||{})).for(t);s.shift();const n=r.get("forcePrepareSimpleQueries"),o=r.get("forcePrepareComplexQueries");i.silly(`statement force simple ${n}, forceComplex: ${o}`);const a=this.hasAggregation()&&!this.whereCondition&&!this.selectSelector?.length&&1>=(this.groupBySelectors?.length||0);return(n&&(this.isSimpleQuery()||a)||o)&&(i.silly(`squashing ${o?"complex":"simple"} query to prepared statement`),await this.prepare(r),i.silly(`squashed ${o?"complex":"simple"} query to ${JSON.stringify(this.prepared,null,2)}`)),s}get log(){return this.adapter.log.for(Kr)}select(t){return Object.defineProperty(this,"selectSelector",{value:t,writable:!1}),this}distinct(t){if(this._inCountMode)return this.countDistinctSelector=this.countSelector,this.countSelector=void 0,this._inCountMode=!1,this;if(!t)throw new Zt("distinct() requires a selector when not chained after count()");return this.distinctSelector=t,this}max(t){return this.maxSelector=t,this}min(t){return this.minSelector=t,this}sum(t){return this.sumSelector=t,this}avg(t){return this.avgSelector=t,this}count(t){return this.countSelector=t??null,this._inCountMode=!0,this}from(t){if(this.fromSelector="string"==typeof t?W.get(t):t,!this.fromSelector)throw new Zt("Could not find selector model: "+t);return this}where(t){return this.whereCondition=t,this}orderBy(t,e){return this.orderBySelectors=[this.normalizeOrderCriterion(t,e)],this}thenBy(t,e){if(Array.isArray(t)||void 0!==e){if(!this.orderBySelectors||!this.orderBySelectors.length)throw new Zt("thenBy requires orderBy to be called first");return this.orderBySelectors.push(this.normalizeOrderCriterion(t,e)),this}if(!this.groupBySelectors||!this.groupBySelectors.length)throw new Zt("groupBy must be called before chaining group selectors");return this.groupBySelectors.push(t),this}normalizeOrderCriterion(t,e){if(Array.isArray(t)){const[e,r]=t;return[e,this.normalizeOrderDirection(r)]}return[t,this.normalizeOrderDirection(e)]}normalizeOrderDirection(t){if(!t)throw new Zt("orderBy direction is required when specifying the attribute separately.");const e=(t+"").toLowerCase();if(e===re.ASC)return re.ASC;if(e===re.DSC)return re.DSC;throw new Zt(`Invalid OrderBy direction ${t}. Expected one of: ${Object.values(re).join(", ")}.`)}groupBy(t){if(this.orderBySelectors&&this.orderBySelectors.length)throw new Zt("groupBy must be called before orderBy.");return this.groupBySelectors=[t],this}limit(t){return this.limitSelector=t,this}offset(t){return this.offsetSelector=t,this}async execute(...t){const{log:e,ctx:r,ctxArgs:s}=this.logCtx(t,this.execute);try{if(this.prepared)return this.executePrepared(...t);e.silly("Building raw statement...");const i=this.build();e.silly("executing raw statement");const n=await this.raw(i,...s);if(this.hasAggregation())return n;if(!this.selectSelector){const t=W.pk(this.fromSelector),e=function(e){const s=e[t];return this.adapter.revert(e,this.fromSelector,s,void 0,r)}.bind(this);return this.groupBySelectors?.length?this.revertGroupedResults(n,e):Array.isArray(n)?n.map(e):e(n)}return n}catch(t){throw new Zt(t)}}revertGroupedResults(t,e){return Array.isArray(t)?t.map(e):t&&"object"==typeof t?Object.entries(t).reduce((t,[r,s])=>(t[r]=this.revertGroupedResults(s,e),t),{}):t}async executePrepared(...t){const e=Re.forModel(this.fromSelector,this.adapter.alias),{method:r,args:s,params:i}=this.prepared;return e.statement(r,...s,i,...t)}async raw(t,...e){const{ctx:r,ctxArgs:s}=this.logCtx(e,this.raw);if(!r.get("allowRawStatements"))throw new Mt("Raw statements are not allowed in the current configuration");const i=await this.adapter.raw(t,!0,...s);if(this.hasAggregation())return i;if(!this.selectSelector)return i;const n=W.pk(this.fromSelector),o=function(t){const e=t[n];return this.adapter.revert(t,this.fromSelector,e,void 0,r)}.bind(this);return Array.isArray(i)?i.map(o):o(i)}prepareCondition(t,e){let{attr1:r,operator:s,comparison:i}=t;const n={};switch(s){case Ot.AND:case Ot.OR:{let t=r,o=i;if("string"!=typeof r){const s=this.prepareCondition(r,e);t=s.method,n.args=[...n.args||[],...s.args||[]]}if(i instanceof ee){const t=this.prepareCondition(i,e);o=t.method,n.args=[...n.args||[],...t.args||[]]}n.method=`${t} ${s.toLowerCase()} ${o}`;break}case St.EQUAL:n.method=r,n.args=[...n.args||[],i];break;case St.DIFFERENT:n.method=r+" diff",n.args=[...n.args||[],i];break;case St.REGEXP:n.method=r+" matches",n.args=[...n.args||[],i];break;case St.BIGGER:n.method=r+" bigger",n.args=[...n.args||[],i];break;case St.BIGGER_EQ:n.method=r+" bigger than equal";break;case St.SMALLER:n.method=r+" less",n.args=[...n.args||[],i];break;case St.SMALLER_EQ:n.method=r+" less than equal",n.args=[...n.args||[],i];break;case St.IN:n.method=r+" in",n.args=[...n.args||[],i];break;default:throw new Zt("Unsupported operator "+s)}return n}squash(t){const e=this.matchDefaultQueryCondition();if(e){const t=this.getOrderDirection();return{class:this.fromSelector,method:kt.FIND,args:[e.value,t],params:{direction:t}}}if(this.whereCondition&&this.whereCondition.comparison instanceof ee)return;if(!this.whereCondition&&!this.selectSelector?.length){if(void 0!==this.countSelector&&!this.countDistinctSelector)return{class:this.fromSelector,method:kt.COUNT_OF,args:null!==this.countSelector?[this.countSelector]:[],params:{}};if(this.maxSelector)return{class:this.fromSelector,method:kt.MAX_OF,args:[this.maxSelector],params:{}};if(this.minSelector)return{class:this.fromSelector,method:kt.MIN_OF,args:[this.minSelector],params:{}};if(this.avgSelector)return{class:this.fromSelector,method:kt.AVG_OF,args:[this.avgSelector],params:{}};if(this.sumSelector)return{class:this.fromSelector,method:kt.SUM_OF,args:[this.sumSelector],params:{}};if(this.distinctSelector)return{class:this.fromSelector,method:kt.DISTINCT_OF,args:[this.distinctSelector],params:{}};if(1===this.groupBySelectors?.length)return{class:this.fromSelector,method:kt.GROUP_OF,args:[this.groupBySelectors[0]],params:{}}}if(this.selectSelector&&this.selectSelector.length)return;if(this.groupBySelectors&&this.groupBySelectors.length)return;if(void 0!==this.countSelector)return;if(this.countDistinctSelector)return;if(this.maxSelector)return;if(this.minSelector)return;if(this.sumSelector)return;if(this.avgSelector)return;let r;this.whereCondition&&(r=this.whereCondition.attr1);const s=this.orderBySelectors?.[0]?this.orderBySelectors[0]:r?[r,re.DSC]:[W.pk(this.fromSelector),re.DSC],[i,n]=s,o={direction:n};this.limitSelector&&(o.limit=this.limitSelector),this.offsetSelector&&(o.offset=this.offsetSelector);const a={class:this.fromSelector,method:kt.LIST_BY,args:[i],params:o};return r&&(a.method=kt.FIND_BY,a.args=[r,this.whereCondition.comparison],a.params=o),a}matchDefaultQueryCondition(){if(!this.whereCondition)return;const t=this.extractDefaultStartsWithAttributes(this.whereCondition);if(!t)return;const e=W.defaultQueryAttributes(this.fromSelector);if(!e||!e.length)return;const r=Array.from(new Set(e.map(String))),s=Array.from(new Set(t.attributes.map(String)));return r.length===s.length&&r.every(t=>s.includes(t))?{value:t.value,attributes:r}:void 0}extractDefaultStartsWithAttributes(t){const e=this.collectStartsWithAttributes(t);if(e)return{attributes:Array.from(new Set(e.attributes)),value:e.value}}collectStartsWithAttributes(t){if(!t)return;const{attr1:e,operator:r,comparison:s}=t;if(r===St.STARTS_WITH){if("string"!=typeof e||"string"!=typeof s)return;return{attributes:[e],value:s}}if(r===Ot.OR){const t=e instanceof ee?this.collectStartsWithAttributes(e):void 0,r=s instanceof ee?this.collectStartsWithAttributes(s):void 0;return t&&r&&t.value===r.value?{attributes:[...t.attributes,...r.attributes],value:t.value}:void 0}return r===Ot.AND?(e instanceof ee?this.collectStartsWithAttributes(e):void 0)||(s instanceof ee?this.collectStartsWithAttributes(s):void 0):void 0}getOrderDirection(){return this.orderBySelectors?.[0]?.[1]??re.ASC}async prepare(t){if(t=t||await this.adapter.context(Ct.QUERY,this.overrides||{},this.fromSelector),this.isSimpleQuery()&&t.get("forcePrepareSimpleQueries")){const e=this.squash(t);if(e)return this.prepared=e,this}if(t.get("forcePrepareSimpleQueries")||t.get("forcePrepareComplexQueries")){const e=this.squash(t);if(e)return this.prepared=e,this}const e=[],r={},s={class:this.fromSelector,args:e,params:r};let i,n=Et.FIND_BY;void 0!==this.countSelector?(n=Et.COUNT_BY,i=null!==this.countSelector?this.countSelector:void 0):this.sumSelector?(n=Et.SUM_BY,i=this.sumSelector):this.avgSelector?(n=Et.AVG_BY,i=this.avgSelector):this.minSelector?(n=Et.MIN_BY,i=this.minSelector):this.maxSelector?(n=Et.MAX_BY,i=this.maxSelector):this.distinctSelector?(n=Et.DISTINCT_BY,i=this.distinctSelector):!this.groupBySelectors?.length||this.selectSelector?.length||this.whereCondition||(n=Et.GROUP_BY_PREFIX,i=this.groupBySelectors[0]);const o=[n];if(i&&o.push(i),this.whereCondition){const r=this.prepareCondition(this.whereCondition,t);o.push(r.method),r.args&&r.args.length&&e.push(...r.args)}if(this.selectSelector&&o.push(Et.SELECT,this.selectSelector.join(` ${Et.AND.toLowerCase()} `)),this.orderBySelectors?.length){const[t,...e]=this.orderBySelectors;o.push(Et.ORDER_BY,t[0]),r.direction=t[1],e.length&&(r.order=this.orderBySelectors.map(([t,e])=>[t,e]),e.forEach(([t])=>{o.push(Et.THEN_BY,t)}))}if(this.groupBySelectors?.length&&n!==Et.GROUP_BY_PREFIX){const[t,...e]=this.groupBySelectors;o.push(Et.GROUP_BY,t),e.forEach(t=>o.push(Et.THEN_BY,t))}else this.groupBySelectors?.length&&n===Et.GROUP_BY_PREFIX&&this.groupBySelectors.slice(1).forEach(t=>o.push(Et.THEN_BY,t));return this.limitSelector&&(r.limit=this.limitSelector),this.offsetSelector&&(r.skip=this.offsetSelector),s.method=U(o.join(" ")),s.params=r,this.prepared=s,this}isSimpleQuery(){return!(this.selectSelector&&this.selectSelector.length||this.groupBySelectors&&this.groupBySelectors.length||void 0!==this.countSelector||this.countDistinctSelector||this.maxSelector||this.minSelector||this.sumSelector||this.avgSelector||this.distinctSelector)}hasAggregation(){return void 0!==this.countSelector||void 0!==this.countDistinctSelector||void 0!==this.maxSelector||void 0!==this.minSelector||void 0!==this.sumSelector||void 0!==this.avgSelector||void 0!==this.distinctSelector||(this.groupBySelectors?.length||0)>0}async paginate(t,...e){e.pop();try{return this.adapter.Paginator(this.prepared||this.build(),t,this.fromSelector)}catch(t){throw new Zt(t)}}toString(){return this.adapter.flavour+" statement"}}i([M(),n("design:type",Function),n("design:paramtypes",[Array]),n("design:returntype",Object)],Kr.prototype,"select",null),i([M(),n("design:type",Function),n("design:paramtypes",["function"==typeof(Hr="undefined"!=typeof S&&S)?Hr:Object]),n("design:returntype",Object)],Kr.prototype,"distinct",null),i([M(),n("design:type",Function),n("design:paramtypes",["function"==typeof(Wr="undefined"!=typeof S&&S)?Wr:Object]),n("design:returntype",Object)],Kr.prototype,"max",null),i([M(),n("design:type",Function),n("design:paramtypes",["function"==typeof(qr="undefined"!=typeof S&&S)?qr:Object]),n("design:returntype",Object)],Kr.prototype,"min",null),i([M(),n("design:type",Function),n("design:paramtypes",["function"==typeof(Qr="undefined"!=typeof S&&S)?Qr:Object]),n("design:returntype",Object)],Kr.prototype,"sum",null),i([M(),n("design:type",Function),n("design:paramtypes",["function"==typeof(Jr="undefined"!=typeof S&&S)?Jr:Object]),n("design:returntype",Object)],Kr.prototype,"avg",null),i([M(),n("design:type",Function),n("design:paramtypes",["function"==typeof(Vr="undefined"!=typeof S&&S)?Vr:Object]),n("design:returntype",Object)],Kr.prototype,"count",null),i([M(),n("design:type",Function),n("design:paramtypes",[Object]),n("design:returntype",Object)],Kr.prototype,"from",null),i([M(),n("design:type",Function),n("design:paramtypes",[ee]),n("design:returntype",Object)],Kr.prototype,"where",null),i([M(),n("design:type",Function),n("design:paramtypes",[Object,String]),n("design:returntype",Object)],Kr.prototype,"orderBy",null),i([M(),n("design:type",Function),n("design:paramtypes",[Object,String]),n("design:returntype",Object)],Kr.prototype,"thenBy",null),i([M(),n("design:type",Function),n("design:paramtypes",["function"==typeof(Xr="undefined"!=typeof Key&&Key)?Xr:Object]),n("design:returntype",Object)],Kr.prototype,"groupBy",null),i([M(),n("design:type",Function),n("design:paramtypes",[Number]),n("design:returntype",Object)],Kr.prototype,"limit",null),i([M(),n("design:type",Function),n("design:paramtypes",[Number]),n("design:returntype",Object)],Kr.prototype,"offset",null),i([M(),n("design:type",Function),n("design:paramtypes",[void 0]),n("design:returntype",Promise)],Kr.prototype,"execute",null);class Zr extends Lt{constructor(t){super(),this.name=t,this.observers=[],this.Context=$t}for(t,...e){return new Proxy(this,{get(r,s,i){const n=Reflect.get(r,s,i);return"object"!=typeof n?n:n instanceof Zr?n.for(t,...e):n instanceof Re?n.override(t):n}})}observe(t,e){this.observerHandler||Object.defineProperty(this,"observerHandler",{value:new jt,writable:!1});const r=this.log.for(this.observe);return this.observerHandler.observe(t,e),r.verbose("Registered new observer "+(t.constructor.name||t.toString())),()=>this.unObserve(t)}unObserve(t){if(!this.observerHandler)throw new u("ObserverHandler not initialized. Did you register any observables? or are you unregistering whe you shouldn't");this.observerHandler.unObserve(t);const e=this.log.for(this.unObserve);e.verbose(`Observer ${t.toString()} removed`),this.observerHandler.count()||(delete this.observerHandler,e.verbose("No longer being observed"))}async updateObservers(t,e,r,...s){if(!this.observerHandler)throw new u("ObserverHandler not initialized. Did you register any observables?");const{log:i,ctxArgs:n}=this.logCtx(s,this.updateObservers);i.verbose(`Updating ${this.observerHandler.count()} observers for ${this}`),await this.observerHandler.updateObservers(t,e,r,...n)}async flags(t,e,...r){e.correlationId=e.correlationId||`${t}-${Qt.instance.generate()}`;const s=e.logger||j.for(this);return s.setConfig({correlationId:e.correlationId}),Object.assign({},Tt,e,{args:r,timestamp:new Date,operation:t,logger:s})}async refresh(t,e,r,...s){return this.updateObservers(t,e,r,...s)}async context(t,e,...r){this.log.for(this.context).silly(`creating new context for ${t} operation with flag overrides: ${JSON.stringify(e)}`);let s=r.pop();void 0===s||s instanceof $t||(r.push(s),s=void 0),e=s?Object.assign({},s.toOverrides(),e):e;const i=await this.flags("string"==typeof t?t:t.name,e,...[...r,s].filter(Boolean));if(s){if(!(s instanceof this.Context)){const t=(new this.Context).accumulate({...s.cache,...i,parentContext:s});return s.accumulate({childContexts:[...s.getOrUndefined("childContexts")||[],t]}),t}if(s.get("operation")!==t){const t=(new this.Context).accumulate({...s.cache,...i,parentContext:s});return s.accumulate({childContexts:[...s.getOrUndefined("childContexts")||[],t]}),t}return s.accumulate(i)}return(new this.Context).accumulate({...i})}logCtx(t,e,r=!1,s){return Lt.logCtx.call(this,e,s||{},r,...t.filter(t=>void 0!==t))}static get(t){if(!t)throw new u("No name provided");const r=Gt(t),s=e.get(r);if(s)return s;throw new u("No Service found for "+("string"==typeof t?t:"symbol"==typeof t?t.toString():t.name))}static async boot(...t){let r=t.pop();void 0===r||r instanceof $t||(t.push(r),r=void 0);const s=await Zr.prototype.flags(Ct.INITIALIZATION,{},...t);r=r?new $t(r).accumulate({...s,parentContext:r}):(new $t).accumulate(s),t=[...t,r];const{log:i,ctxArgs:n}=Zr.prototype.logCtx(t,this.boot),o=e.services();for(const[t,r]of Object.entries(o))try{i.verbose(`Booting ${r.name} service...`);const s=e.get(r);if(!s)throw new u("Failed to resolve injectable for "+t);s instanceof ts&&(i.verbose(`Initializing ${r.name} service...`),await s.boot(...n))}catch(t){throw new u(`Failed to boot ${r.name} service:${t}`)}}static async shutdown(...t){let r=t.pop();void 0===r||r instanceof $t||(t.push(r),r=void 0);const s=await Zr.prototype.flags(Ct.SHUTDOWN,{},...t);r=r?new $t(r).accumulate({...s,parentContext:r}):(new $t).accumulate(s),t=[...t,r];const{log:i,ctxArgs:n}=Zr.prototype.logCtx(t,this.shutdown),o=e.services();for(const[t,r]of Object.entries(o).reverse())try{i.verbose(`Shutting down ${r.name} service...`);const s=e.get(r);if(!s)throw new u("Failed to resolve injectable for "+t);if(s instanceof ts){i.verbose(`Gracefully shutting down ${r.name} service...`);try{await s.shutdown(...n)}catch(t){i.error(`Failed to gracefully shutdown ${r.name} service`,t)}}}catch(e){throw new u(`Failed to Shutdown services ${t}: ${e}`)}}}i([M(),n("design:type",Function),n("design:paramtypes",[Object,Function]),n("design:returntype",Function)],Zr.prototype,"observe",null),i([M(),n("design:type",Function),n("design:paramtypes",[Object]),n("design:returntype",void 0)],Zr.prototype,"unObserve",null);class ts extends Zr{constructor(){super()}async boot(...t){const{log:e,ctxArgs:r}=(await this.logCtx(t,Ct.INITIALIZATION,!0)).for(this.boot);e.verbose(`Initializing ${this.toString()}...`);const{config:s,client:i}=await this.initialize(...r);this._config=s,this._client=i}get config(){if(!this._config)throw new u("Config not initialized");return this._config}get client(){if(!this._client)throw new u("Client not initialized");return this._client}async shutdown(...t){const{log:e}=await this.logCtx(t,this.shutdown,!0);e.info("Shutting down...")}}function es(t){return function(e,r,s){const i=s.value;return s.value=function(...e){const r=this.class;if(r&&Ht(r,t))throw Error(`Operation "${t}" is blocked by @BlockOperations for ${r?.name??"Model"}.`);return i.apply(this,e)},s}}i([M(),n("design:type",Function),n("design:paramtypes",[Object]),n("design:returntype",Promise)],ts.prototype,"boot",null),i([M(),n("design:type",Object),n("design:paramtypes",[])],ts.prototype,"config",null),i([M(),n("design:type",Object),n("design:paramtypes",[])],ts.prototype,"client",null);const rs=()=>es(a.CREATE),ss=()=>es(a.READ),is=()=>es(a.UPDATE),ns=()=>es(a.DELETE);function os(t){return(e,i,n)=>{n||i?(vt()(e,i),t=t||dt.type(e.constructor,i)):t=t||e,t=Gt(t);const o=[];if(n&&"number"==typeof n.value)o.push(r(t));else if(n||i){if(n)throw Error("Invalid decorator usage. Should be impossible");o.push(r(t))}else dt.set(Ct.SERVICE,t,e),o.push(s(t,{singleton:!0,callback:e=>Object.defineProperty(e,"name",{enumerable:!0,configurable:!1,writable:!1,value:t})}));return gt(...o)(e,i,n)}}function as(t){const e=Ct.AUTH;return ht.for(e).define({decorator:t=>bt(e,t),args:[t]}).apply()}const cs=t=>bt(Ct.AUTH_ROLE,t);function ls(t,e){const r=Ct.DECAF_ROUTE;return ht.for(r).define({decorator:()=>(s,i,n)=>{const o={path:e,httpMethod:t,handler:n};return gt(ft(dt.key(r,i),o))(s,i,n)},args:[]}).apply()}const us=t=>"string"==typeof t?t.endsWith("Service")?t:t+"Service":"symbol"==typeof t?t.toString():t.name+"Service";class ds extends Zr{get class(){if(!this.clazz)throw new u("Class not initialized");return this.clazz}get repo(){return this._repository||(this._repository=Re.forModel(this.clazz)),this._repository}constructor(t,e){super(e??t.name+"Service"),this.clazz=t}static getService(t){if(!t)throw new u("No name provided");const e=us(t);try{const t=Zr.get(e);if(t)return t}catch(t){}throw new u("No ModelService found for alias "+e)}async create(t,...e){const{ctxArgs:r}=(await this.logCtx(e,a.CREATE,!0)).for(this.create);return this.repo.create(t,...r)}async createAll(t,...e){const{ctxArgs:r}=(await this.logCtx(e,c.CREATE_ALL,!0)).for(this.createAll);return this.repo.createAll(t,...r)}async delete(t,...e){const{ctxArgs:r}=(await this.logCtx(e,a.DELETE,!0)).for(this.delete);return this.repo.delete(t,...r)}async deleteAll(t,...e){const{ctxArgs:r}=(await this.logCtx(e,c.DELETE_ALL,!0)).for(this.deleteAll);return this.repo.deleteAll(t,...r)}async read(t,...e){const{ctxArgs:r}=(await this.logCtx(e,a.READ,!0)).for(this.read);return this.repo.read(t,...r)}async readAll(t,...e){const{ctxArgs:r}=(await this.logCtx(e,c.READ_ALL,!0)).for(this.readAll);return this.repo.readAll(t,...r)}async query(t,...e){const{ctxArgs:r}=(await this.logCtx(e,Ct.QUERY,!0)).for(this.query),s=this.repo?.[t];if("function"!=typeof s)throw new u(`Method "${t}" is not implemented`);return s.apply(this.repo,r)}async update(t,...e){const{ctxArgs:r}=(await this.logCtx(e,a.UPDATE,!0)).for(this.update);return this.repo.update(t,...r)}async updateAll(t,...e){const{ctxArgs:r}=(await this.logCtx(e,c.UPDATE_ALL,!0)).for(this.updateAll);return this.repo.updateAll(t,...r)}async listBy(t,e,...r){const{ctxArgs:s}=(await this.logCtx(r,kt.LIST_BY,!0)).for(this.listBy);return this.repo.listBy(t,e,...s)}async paginateBy(t,e,r,...s){const{ctxArgs:i}=(await this.logCtx(s,kt.PAGE_BY,!0)).for(this.paginateBy);return this.repo.paginateBy(t,e,r,...i)}async findOneBy(t,e,...r){const{ctxArgs:s}=(await this.logCtx(r,kt.FIND_ONE_BY,!0)).for(this.findOneBy);return this.repo.findOneBy(t,e,...s)}async findBy(t,e,...r){const{ctxArgs:s}=(await this.logCtx(r,kt.FIND_BY,!0)).for(this.findBy);return this.repo.findBy(t,e,...s)}async statement(t,...e){const{ctxArgs:r}=(await this.logCtx(e,Ct.STATEMENT,!0)).for(this.statement);return this.repo.statement(t,...r)}static forModel(t,e){let r;e=us(e||t);try{r=ds.get(e)}catch(t){r=void 0}if(r instanceof ds)return r;const s=this;let o=class extends s{constructor(){super(t)}};return o=i([os(e),n("design:paramtypes",[])],o),new o}refresh(t,e,r,...s){return this.repo.refresh(t,e,r,...s)}observe(t,e){return this.repo.observe(t,e)}unObserve(t){return this.repo.unObserve(t)}updateObservers(t,e,r,...s){return this.repo.updateObservers(t,e,r,...s)}logCtx(t,e,r=!1){const s=this.repo.adapter.logCtx([this.repo.class,...t],e,r,this.repo._overrides||{});function i(t){return t.ctxArgs.shift(),t}return s instanceof Promise?s.then(i):i(s)}}i([rs(),n("design:type",Function),n("design:paramtypes",[Object,void 0]),n("design:returntype",Promise)],ds.prototype,"create",null),i([rs(),n("design:type",Function),n("design:paramtypes",[Array,void 0]),n("design:returntype",Promise)],ds.prototype,"createAll",null),i([ns(),n("design:type",Function),n("design:paramtypes",[Object,void 0]),n("design:returntype",Promise)],ds.prototype,"delete",null),i([ns(),n("design:type",Function),n("design:paramtypes",[Array,void 0]),n("design:returntype",Promise)],ds.prototype,"deleteAll",null),i([ss(),n("design:type",Function),n("design:paramtypes",[Object,void 0]),n("design:returntype",Promise)],ds.prototype,"read",null),i([ss(),n("design:type",Function),n("design:paramtypes",[Array,void 0]),n("design:returntype",Promise)],ds.prototype,"readAll",null),i([ss(),n("design:type",Function),n("design:paramtypes",[String,Object]),n("design:returntype",Promise)],ds.prototype,"query",null),i([is(),n("design:type",Function),n("design:paramtypes",[Object,void 0]),n("design:returntype",Promise)],ds.prototype,"update",null),i([is(),n("design:type",Function),n("design:paramtypes",[Array,Object]),n("design:returntype",Promise)],ds.prototype,"updateAll",null);class hs extends Lt{constructor(){super()}logCtx(t,e,r=!1){if(!this.adapter)throw new u("Adapter not set yet");return this.adapter.logCtx(t,e,r)}async initialize(...t){if(!this.adapter)return void this.log.for(this.initialize).verbose("No adapter observed for dispatch; skipping initialization");const{log:e}=(await this.logCtx(t,Ct.INITIALIZATION,!0)).for(this.initialize);e.verbose(`Initializing ${this.adapter}'s event Dispatch`);const r=this.adapter;[a.CREATE,a.UPDATE,a.DELETE,c.CREATE_ALL,c.UPDATE_ALL,c.DELETE_ALL].forEach(t=>{if(!r[t])throw new u(`Method ${t} not found in ${r.alias} adapter to bind Observables Dispatch`);let e=Object.getOwnPropertyDescriptor(r,t),s=r;for(;!e&&s!==Object.prototype;)s=Object.getPrototypeOf(s),e=Object.getOwnPropertyDescriptor(s,t);function i(t){switch(t){case c.CREATE_ALL:return a.CREATE;case c.UPDATE_ALL:return a.UPDATE;case c.DELETE_ALL:return a.DELETE;default:return t}}e&&e.writable?r[t]=new Proxy(r[t],{apply:async(e,r,s)=>{const{log:n,ctxArgs:o,ctx:a}=r.logCtx(s.slice(3-(4-s.length),s.length),e),[c,l,u]=s,d=await e.call(r,c,l,u,...o),h=[c,i(t),l];return a.get("observeFullResult")&&h.push(Array.isArray(d)?d.map(t=>c(t)):c(d)),this.updateObservers(...h,...o).catch(e=>n.error(`Failed to dispatch observer refresh for ${t} on ${c.name||c} for ${l}: ${e}`)),d}}):this.log.error(`Could not find method ${t} to bind Observables Dispatch`)})}async close(){}observe(t){if(!(t instanceof Kt))throw new Mt("Only Adapters can be observed by dispatch");return this.adapter=t,this.models=Kt.models(this.adapter.alias),this.initialize().then(()=>this.log.verbose(`Dispatch initialized for ${this.adapter.alias} adapter`)),()=>this.unObserve(t)}unObserve(t){if(this.adapter!==t)throw new Mt("Only the adapter that was used to observe can be unobserved");this.adapter=void 0}async updateObservers(t,e,r,...s){if(!t)throw new u("Model must be provided for observer update");const i=t&&"string"==typeof t?t:W.tableName(t),{log:n,ctxArgs:o,ctx:a}=this.logCtx(s,this.updateObservers);if(this.adapter)try{n.debug(`dispatching observer refresh for ${e}:${i}: ${r}${a.get("observeFullResult")?" - including result":""}`),await this.adapter.refresh(t,e,r,...o)}catch(t){throw new u("Failed to refresh dispatch: "+t)}else n.verbose(`No adapter observed for dispatch; skipping observer update for ${i}:${e}`)}toString(){return(this.adapter?this.adapter.toString():"uninitialized")+" event dispatch"}}async function ps(t,e,r,s){if(t.get("allowGenerationOverride")&&void 0!==s[r])return;let{seed:i,args:n}=e;i&&"function"==typeof i&&(i=i(s,...n||[],t)),s[r]=await Qt.instance.generate(i)}function gs(t=!1,e,...r){"function"==typeof t&&(e=t,t=!1);const s=Ct.UUID;return ht.for(s).define({decorator:(t,e,...r)=>{const s={update:t,seed:e,args:r},i=[Q(),x(Ct.UUID),A(ps,s,{priority:54})];return t&&i.push(k(ps,s,{priority:54})),t||i.push(v()),gt(...i)},args:[t,e,...r]}).apply()}Kt&&(Kt._baseDispatch=hs);class fs extends Lt{static{this.lock=new ut}constructor(t,e,r={}){super(),this.options=t,this.adapter=e,this.repo=Re.forModel(Gr,e.alias).override(r)}async current(...t){const{log:e,ctx:r}=await this.logCtx(t,a.READ,!0),{name:s,startWith:i}=this.options;try{const t=await this.repo.read(s,r);return this.parse(t.current)}catch(t){if(t instanceof m){if(e.debug(`Sequence.current missing ${s}, returning startWith=${i}`),void 0===i)throw new u("Starting value is not defined for a non existing sequence");try{return this.parse(i)}catch(t){throw new u(`Failed to parse initial value for sequence ${i}: ${t}`)}}throw new u(`Failed to retrieve current value for sequence ${s}: ${t}`)}}async increment(t,e){const{log:r,ctx:s}=this.adapter.logCtx([e],this.increment),{type:i,incrementBy:n,name:o}=this.options;if(!o)throw new u("Sequence name is required");return fs.lock.execute(async()=>{const e=t||n;if(e%n!==0)throw new u("Value to increment does not consider the incrementBy setting: "+n);const a="function"==typeof i&&i?.name?i.name:i,c=await this.current(s),l=async t=>{try{return await this.repo.update(new Gr({id:o,current:t}),s)}catch(e){if(e instanceof m)return r.debug(`Sequence create ${o} current=${c} next=${t}`),this.repo.create(new Gr({id:o,current:t}),s);throw e}};if("uuid"===a)for(;;){const t=await Promise.resolve(Qt.instance.generate(c));try{const e=await l(t);return r.debug(`Sequence uuid increment ${o} current=${c} next=${t}`),e.current}catch(t){if(t instanceof T)continue;throw t}}const d=await(async t=>{switch(a){case Number.name:return this.parse(t)+e;case BigInt.name:return this.parse(t)+BigInt(e);case String.name:return this.parse(t);case"serial":return await Promise.resolve(Jt.instance.generate(t));default:throw new u("Should never happen")}})(c),h=await l(d);return r.debug(`Sequence.increment ${o} current=${c} next=${d}`),h.current},o)}async next(...t){const{ctx:e}=(await this.logCtx(t,a.UPDATE,!0)).for(this.next);return this.increment(void 0,e)}async range(t,...e){const{ctx:r,log:s}=(await this.logCtx(e,a.UPDATE,!0)).for(this.range);if("uuid"===this.options.type||"serial"===this.options.type)throw new Mt(`type ${this.options.type} is currently not suppported for this adapter`);const i="function"==typeof this.options.type&&this.options.type?.name?this.options.type.name:this.options.type,n=this.parse(this.options.incrementBy),o=await this.increment(this.parse(t)*n,r);let c=[];for(let e=0;t-1>=e;e++)c.push(o-n*this.parse(e));if(c=c.reverse(),c[c.length-1]!==o&&"String"!==i)throw new u("Miscalculation of range");return s.debug("Calculated range: "+c.join(", ")),c}parse(t){return fs.parseValue(this.options.type,t)}logCtx(t,e,r=!1){const s=this.adapter.logCtx([Gr,...t],e,r);function i(t){return t.ctxArgs.shift(),t}return s instanceof Promise?s.then(i):i(s)}static pk(t){return W.sequenceName(t,"pk")}static parseValue(t,e){switch("function"==typeof t&&t?.name?t.name:t){case Number.name||Number.name.toLowerCase():return"string"==typeof e?parseInt(e):"number"==typeof e?e:BigInt(e);case BigInt.name||BigInt.name.toLowerCase():return BigInt(e);case String.name||String.name.toLowerCase():return e.toString();case void 0:case"uuid":case"serial":return e;default:throw new Mt(`Unsupported sequence type: ${t} for adapter ${this}`)}}}Kt._baseSequence=fs;class ys extends ts{constructor(){super()}for(t,...e){throw new Mt("Persistence service cannot be overridden")}async initialize(...t){const e=t.shift();if(!e||!Array.isArray(e)||e instanceof $t||!e.every(t=>Array.isArray(t)))throw new u("Missing/invalid configuration");const{log:r,ctxArgs:s}=(await this.logCtx(t,Ct.INITIALIZATION,!0)).for(this.initialize),i=e.map(([t,e,...s])=>{try{r.silly(`Initializing ${t.name} with config: ${JSON.stringify(e)}`);const i=new t(e,...s);return r.debug(`Initialized ${i.toString()}...`),i}catch(e){throw new u(`Failed to initialize ${t.name}: ${e}`)}});for(const t of i)try{await t.initialize(...s)}catch(e){throw new u(`Failed to initialize ${t.toString()}: ${e}`)}return{client:i,config:e}}}let ms=class extends W{constructor(t){super(t),this.strategy=Ne.EXPONENTIAL,this.baseMs=1e3,this.maxMs=6e4,this.jitter=_e.FULL}};i([Q(),rt(String),st(Ne),At("the backoff strategy"),n("design:type",String)],ms.prototype,"strategy",void 0),i([Q(),At("base interval between attempts"),n("design:type",Number)],ms.prototype,"baseMs",void 0),i([Q(),At("max interval"),n("design:type",Number)],ms.prototype,"maxMs",void 0),i([rt(String),st(_e),At("optional jitter strategy"),n("design:type",String)],ms.prototype,"jitter",void 0),ms=i([X(),n("design:paramtypes",[Object])],ms);let ws=class extends W{constructor(t){super(t)}};i([Q(),At("The error message"),n("design:type",String)],ws.prototype,"message",void 0),i([vt(),At("The error stack"),n("design:type",String)],ws.prototype,"stack",void 0),i([vt(),At("The error code"),n("design:type",String)],ws.prototype,"code",void 0),i([vt(),At("The error details"),n("design:type",Object)],ws.prototype,"details",void 0),ws=i([X(),n("design:paramtypes",[Object])],ws);let bs=class extends W{constructor(t){super(t),this.ts=new Date}};i([P(["taskId","classification","uuid"],":"),Ve(),n("design:type",String)],bs.prototype,"id",void 0),i([v(),Q(),I(),gs(!1),n("design:type",String)],bs.prototype,"uuid",void 0),i([v(),Q(),n("design:type",String)],bs.prototype,"taskId",void 0),i([it(),Q(),n("design:type",Date)],bs.prototype,"ts",void 0),i([v(),Q(),st(Be),n("design:type",String)],bs.prototype,"classification",void 0),i([vt(),v(),n("design:type",Object)],bs.prototype,"payload",void 0),bs=i([Er("task_event"),X(),n("design:paramtypes",[Object])],bs);class vs extends nt{constructor(){super()}preSerialize(t,...e){return this.serializeValue(t,...e)}deserialize(t,...e){const r=JSON.parse(t);return this.rebuildValue(r)}serializeValue(t,...e){if(null==t)return t;if("object"!=typeof t)return t;if(t instanceof Date)return t.toISOString();if(Array.isArray(t))return t.map(t=>this.serializeValue(t,...e));if(t instanceof ee){const r=this.serializePlain(t,...e);return r[ot.ANCHOR]="??condition",r}return W.isModel(t)?this.serializeModel(t,...e):this.serializePlain(t,...e)}serializeModel(t,...e){const r=this.serializePlain(t,...e),s=this.getMetadata(t.constructor)??t.constructor?.name;return s&&(r[ot.ANCHOR]=s),r}serializePlain(t,...e){const r={};for(const[s,i]of Object.entries(t))r[s]=this.serializeValue(i,...e);return r}getMetadata(t){try{return dt.modelName(t)}catch{return}}rebuildValue(t){if(null===t||"object"!=typeof t)return t;if(Array.isArray(t))return t.map(t=>this.rebuildValue(t));const e=t[ot.ANCHOR],r=this.rebuildObject(t);return e?"??condition"===e?ee.from(r):W.build(r,e):r}rebuildObject(t){const e={};for(const[r,s]of Object.entries(t))r!==ot.ANCHOR&&(e[r]=this.rebuildValue(s));return e}serialize(t,...e){return JSON.stringify(this.preSerialize(t))}}let As=class extends W{constructor(t){super(t),this.ts=new Date}};i([it(),Q(),n("design:type",Date)],As.prototype,"ts",void 0),i([Q(),st(Y),n("design:type",String)],As.prototype,"level",void 0),i([Q(),vt(),n("design:type",String)],As.prototype,"msg",void 0),i([vt(),n("design:type",Object)],As.prototype,"meta",void 0),As=i([X(),n("design:paramtypes",[Object])],As);let xs=class extends W{constructor(t){super(t),this.atomicity=De.ATOMIC,this.status=Te.PENDING,this.attempt=0,this.logTail=[]}};i([Ve({type:"uuid"}),At("the task id"),n("design:type",String)],xs.prototype,"id",void 0),i([Q(),rt(String),st(De),At("defines a single or composite task"),n("design:type",String)],xs.prototype,"atomicity",void 0),i([Q(),At("Holds task classification - must match @task()"),n("design:type",String)],xs.prototype,"classification",void 0),i([vt(),At("optional task name for ambiguity"),n("design:type",String)],xs.prototype,"name",void 0),i([Q(),rt(String),st(Te),At("Holds the task current status"),n("design:type",String)],xs.prototype,"status",void 0),i([vt(),$(vs),At("Holds task input"),n("design:type",Object)],xs.prototype,"input",void 0),i([vt(),$(vs),At("Holds the task output when successfully completed"),n("design:type",Object)],xs.prototype,"output",void 0),i([vt(),$(),At("Holds the error for failed tasks"),n("design:type",ws)],xs.prototype,"error",void 0),i([Q(),at(0),At("Holds the current attempt"),n("design:type",Number)],xs.prototype,"attempt",void 0),i([at(1),Q(),At("max attempts for the task"),n("design:type",Number)],xs.prototype,"maxAttempts",void 0),i([Q(),$(),At("backoff configuration"),n("design:type",ms)],xs.prototype,"backoff",void 0),i([it(),At("Next execution timestamp"),n("design:type",Date)],xs.prototype,"nextRunAt",void 0),i([it(),At("Task scheduled timestamp"),n("design:type",Date)],xs.prototype,"scheduledTo",void 0),i([vt(),At("Task lease owner identifier"),n("design:type",String)],xs.prototype,"leaseOwner",void 0),i([it(),At("Task lease expiration timestamp"),n("design:type",Date)],xs.prototype,"leaseExpiry",void 0),i([vt(),$(),At("Holds the various steps definition and inputs - only for type === 'composite'"),n("design:type",Array)],xs.prototype,"steps",void 0),i([at(0),vt(),At("Holds the current step - only for type === 'composite'"),n("design:type",Number)],xs.prototype,"currentStep",void 0),i([vt(),$(),At("Holds the step results - only for type === 'composite'"),n("design:type",Array)],xs.prototype,"stepResults",void 0),i([vt(),$(),At("Holds the task log entries"),n("design:type",Array)],xs.prototype,"logTail",void 0),i([Sr(),_r(),At("timestamp of creation"),n("design:type",Date)],xs.prototype,"createdAt",void 0),i([Sr(),Br(),At("timestamp of last update"),n("design:type",Date)],xs.prototype,"updatedAt",void 0),i([Sr(),Tr(),At("Holds the creator of the task"),n("design:type",String)],xs.prototype,"createdBy",void 0),i([Sr(),Nr(),At("Holds the creator of the task"),n("design:type",String)],xs.prototype,"updatedBy",void 0),xs=i([At("Holds the current step when applicable"),Er("tasks"),X(),n("design:paramtypes",[Object])],xs);let Es=class extends W{constructor(t){super(t)}};i([Q(),At("The status of a step"),n("design:type",String)],Es.prototype,"status",void 0),i([vt(),At("The result of a successful step"),n("design:type",Object)],Es.prototype,"output",void 0),i([vt(),At("the error of a failed step"),n("design:type",ws)],Es.prototype,"error",void 0),Es=i([X(),n("design:paramtypes",[Object])],Es);let Ss=class extends W{constructor(t){super(t)}};i([Q(),vt(),At("task handler type"),n("design:type",String)],Ss.prototype,"classification",void 0),i([At("optional task step input"),vt(),n("design:type",Object)],Ss.prototype,"input",void 0),Ss=i([X(),n("design:paramtypes",[Object])],Ss);class Os extends W{constructor(t){super(t),this.baseMs=1e3,this.jitter=_e.FULL,this.maxMs=6e4,this.strategy=Ne.EXPONENTIAL,W.fromModel(this,t)}setBaseMs(t){return this.baseMs=t,this}setJitter(t){return this.jitter=t,this}setMaxMs(t){return this.maxMs=t,this}setStrategy(t){return this.strategy=t,this}build(){const t=this.hasErrors();if(t)throw new d(t);return new ms(this)}}i([Q(),at(1e3),n("design:type",Number)],Os.prototype,"baseMs",void 0),i([Q(),st(_e),n("design:type",String)],Os.prototype,"jitter",void 0),i([ct("baseMs"),at(1e3),Q(),n("design:type",Number)],Os.prototype,"maxMs",void 0),i([Q(),st(Ne),n("design:type",String)],Os.prototype,"strategy",void 0);class ks extends W{setClassification(t){return this.classification=t,this}setName(t){return this.name=t,this}setAtomicity(t){return this.atomicity=t,this}setBackoff(t){if(t)return this.backoff=t,this;const e=new Os,r=this;return e.build=new Proxy(e.build,{apply:(t,e,s)=>(r.backoff=Reflect.apply(t,e,s),r)}),e}setInput(t){return this.input=t,this}setMaxAttempts(t){return this.maxAttempts=t,this}constructor(t){super(t),this.status=Te.PENDING,this.atomicity=De.ATOMIC,this.backoff=new ms,this.maxAttempts=1,W.fromModel(this,t)}build(){const t=this.hasErrors();if(t)throw new d(t);return new xs(this)}}i([Q(),n("design:type",String)],ks.prototype,"classification",void 0),i([vt(),n("design:type",String)],ks.prototype,"name",void 0),i([Q(),n("design:type",String)],ks.prototype,"status",void 0),i([Q(),n("design:type",String)],ks.prototype,"atomicity",void 0),i([Q(),n("design:type",ms)],ks.prototype,"backoff",void 0),i([vt(),n("design:type",Object)],ks.prototype,"input",void 0),i([at(1),Q(),n("design:type",Number)],ks.prototype,"maxAttempts",void 0);class Cs extends ks{constructor(t){super(t),this.stepResults=[],W.fromModel(this,t),this.atomicity=De.COMPOSITE}setAtomicity(t){throw new u("Atomicity locked to "+De.COMPOSITE)}setSteps(t){return this.steps=(t??[]).map(t=>t instanceof Ss?t:new Ss(t)),this}addStep(t,e){this.steps=this.steps||[];const r=new Date;return this.steps.push(new Ss({classification:t,input:e,createdAt:r,updatedAt:r})),this}}i([et(()=>Ss),n("design:type",Array)],Cs.prototype,"steps",void 0);class Ts extends Ft{get type(){if(!this._type){const t=dt.get(this.constructor,$e);"string"==typeof t?this._type=t:t&&"string"==typeof t.type&&(this._type=t.type)}if(!this._type)throw new u("No type annotation for this handler found. did you use @task()?");return this._type}constructor(){super(),p(this,this.runPrefix.bind(this),this.run.bind(this),this.runSuffix.bind(this),this.run.name)}async runPrefix(t,...e){const{log:r,ctx:s,ctxArgs:i}=this.logCtx(e,this.runPrefix);return r.info(`Running task ${s.taskId} attempt ${s.attempt}`),[t,...i]}runSuffix(t,e){const{log:r}=this.logCtx([e],this.runPrefix);return r.info(`Concluded task ${e.taskId} attempt ${e.attempt}`),t}}function Ns(t){return ht.for($e).define({decorator:t=>e=>{const r={type:t};return dt.set($e,t,e),bt($e,r)(e)},args:[t]}).apply()}let _s=class extends Ts{constructor(){super()}async run(t,e){const r=e.logger;try{let s;if(t instanceof ee)s=t,r.info("Starting task cleanup with custom condition");else{r.info("Starting task cleanup with expiry dates");const e=ee.attr("status").eq(Te.SUCCEEDED).and(ee.attr("updatedAt").lte(t.successfulExpiry)),i=ee.attr("status").eq(Te.FAILED).and(ee.attr("updatedAt").lte(t.failedExpiry)),n=ee.attr("status").eq(Te.CANCELED).and(ee.attr("updatedAt").lte(t.cancelledExpiry));s=e.or(i).or(n)}r.info("Querying tasks for cleanup");const i=await this.tasks.select(["id"]).where(s).execute(e);if(0===i.length)return r.info("No tasks found for cleanup"),[];r.info(`Found ${i.length} tasks to delete`);const n=await this.tasks.deleteAll(i.map(t=>t.id),e);return r.info(`Successfully deleted ${n.length} tasks`),r.debug("deleted tasks:",n),n}catch(t){throw r.error("Error during task cleanup",t),t}}};i([Fe(xs),n("design:type",Object)],_s.prototype,"tasks",void 0),_s=i([Ns("cleanup-task"),n("design:paramtypes",[])],_s);class Bs{constructor(t,e=150,r=300,s){this.logger=t,this.bufferSize=e,this.maxBufferSize=r,this.pipe=s,this.history=[],this.root=this.logger.root,Object.values(Y).forEach(t=>{this[t]=new Proxy(this[t],{apply:(e,r,s)=>{e.apply(r,s),r.push(t,...s)}})})}push(t,e,r){this.history.length<this.maxBufferSize||this.history.splice(0,this.history.length-this.bufferSize),this.history.push([t,e,r])}flush(t){const e=this.history;return this.history=[],t&&e.length?t(e).catch(t=>this.logger.error("Failed to pipe logs",t)).finally(()=>this.history=[]):(this.history=[],e)}benchmark(t){return this.logger.benchmark(t)}clear(){return this.logger=this.logger.clear(),this}debug(t,e){this.logger.debug(t,e)}error(t,e,r){this.logger.error(t,e,r)}for(t,...e){return new Proxy(this,{get:(r,s)=>"logger"===s?Reflect.get(r,s).for(t,...e):Reflect.get(r,s)})}info(t,e){this.logger.info(t,e)}setConfig(t){this.logger.setConfig(t)}silly(t,e){this.logger.silly(t,e)}trace(t,e){this.logger.trace(t,e)}verbose(t,e,r){this.logger.verbose(t,e,r)}warn(t,e){this.logger.warn(t,e)}}function Ds(t,e={logProgress:!0,logStatus:!0,style:!0}){return async r=>{switch(t=t.for(r.taskId,{style:!1,timestamp:!1,logLevel:!1}),r.classification){case Be.LOG:{const s=r.payload;for(let[r,i,n]of s){e.style||(i=G(i),i=i.clear().toString());const s=[i];r===Y.verbose&&s.push(1),s.push(n);try{t[r](...s)}catch(e){t.error("Failed to pipe task logs",e)}}break}case Be.PROGRESS:if(e.logProgress){const{currentStep:e,totalSteps:s}=r.payload;t.info(`### STEP ${e}/${s}`)}break;case Be.STATUS:if(e.logStatus){const e=r.payload?.status??r.payload;let s=G(e);switch(e){case Te.SUCCEEDED:s=s.green.bold;break;case Te.RUNNING:s=s.blue.bold;break;case Te.PENDING:s=s.yellow;break;case Te.WAITING_RETRY:s=s.yellow.bold;break;case Te.FAILED:s=s.red.bold;break;case Te.CANCELED:s=s.magenta.bold;break;case Te.SCHEDULED:s=s.cyan;break;default:throw new u("Received unknown task status: "+r.payload)}t.info("### STATUS "+s)}break;default:throw new u("Unknown task event classification: "+r.classification)}}}function Rs(t,e){const r=e.strategy===Ne.FIXED?e.baseMs:e.baseMs*Math.pow(2,Math.max(0,t-1)),s=Math.min(r,e.maxMs);return e.jitter===_e.FULL?Math.floor(Math.random()*s):s}function Ps(t){return new ws({message:t?.message??t+"",stack:t?.stack,code:t?.code,details:t?.details})}function Is(t){return new Promise(e=>setTimeout(e,t))}class $s extends Error{constructor(t){super("Task requested state change: "+t.status),this.request=t,this.name=$s.name,Object.setPrototypeOf(this,$s.prototype)}}class Ls extends $t{get taskId(){return this.get("taskId")}get logger(){return super.logger}get pipe(){return this.get("pipe")}flush(){return this.get("flush")()}get attempt(){return this.get("attempt")}get progress(){return this.get("progress")}get heartbeat(){return this.get("heartbeat")}cacheResult(t,e){const r=this.cache.has("resultCache")&&this.cache.get("resultCache")||{};r[t]=e,this.cache.put("resultCache",r)}changeState(t,e){throw new $s({status:t,...e})}cancel(t,e){this.changeState(Te.CANCELED,{error:this.toTaskError(t,e)})}retry(t){this.changeState(Te.WAITING_RETRY,{error:this.toTaskError(t)})}reschedule(t,e){const r=t instanceof Date?t:t.build();this.changeState(Te.SCHEDULED,{error:this.toTaskError(e),scheduledTo:r})}toTaskError(t,e){if(t||e)return t instanceof ws?t:t instanceof Error?Ps(t):new ws({message:(t??"Task requested state change")+"",details:e})}get resultCache(){return this.get("resultCache")}constructor(t){super(t)}}class Fs{constructor(){this.handlers=new Map,this.initialize()}initialize(){const t=dt.tasks();t&&Object.entries(t).forEach(([t,e])=>{let r;try{r=new e}catch(e){throw new u(`Failed to initialize handler with key ${t}: ${e}`)}this.register(r)})}register(t){if(this.handlers.has(t.type))throw new u("Duplicate task handler: "+t.type);this.handlers.set(t.type,t)}get(t){return this.handlers.get(t)}}class js extends jt{constructor(){super(...arguments),this.listeners=new Set}observe(t,e){return super.observe(t,e)}unObserve(t){super.unObserve(t)}emit(t,e){this.updateObservers(bs,t.classification,t.id,t,e)}async updateObservers(t,e,r,s,...i){const{log:n,ctxArgs:o}=Kt.logCtx(this.updateObservers,void 0,!1,...i);(await Promise.allSettled(this.observers.filter(s=>{const{filter:i}=s;if(!i)return!0;try{return i(t,e,r,...o)}catch(t){return n.error(`Failed to filter observer ${s.observer.toString()}: ${t}`),!1}}).map(t=>{t.observer.refresh(s,...o)}))).forEach((t,e)=>{"rejected"===t.status&&n.error(`Failed to update observable ${this.observers[e].toString()}: ${t.reason}`)})}}function Ms(t,e){return t instanceof Error&&"nextAction"in t&&"string"==typeof t.nextAction&&(!e||t instanceof e)}class Us extends L{constructor(t,e,r,s,i,n=500){super(t,r,n),this.taskId=e,this.details=s,this.meta=i}}class Ys extends Us{constructor(t,e,r){super(Ys.name,t,e?.message??`Task ${t} failed`,e,r,500)}}class Gs extends Us{constructor(t,e,r){const s=r?.nextRunAt instanceof Date?r.nextRunAt.toISOString():r?.nextRunAt;super(Gs.name,t,e?.message??`Task ${t} scheduled for retry${s?" at "+s:""}`,e,r,409)}}class zs extends Us{constructor(t,e,r){super(zs.name,t,e?.message??`Task ${t} canceled`,e,r,400)}}class Hs extends Us{constructor(t,e,r){const s=r?.scheduledTo instanceof Date?r.scheduledTo.toISOString():r?.scheduledTo;super(Hs.name,t,e?.message??`Task ${t} rescheduled${s?" to "+s:""}`,e,r,202)}}class Ws{constructor(t,e){this.bus=t,this.task=e,this.resolved=!1,this.unregistration=t.observe(this,(t,e,r,...s)=>r.startsWith(this.task.id)&&(t===bs||t===W.tableName(bs))),this.pipe(this.track.bind(this)),this.resolveTerminalState()}resolve(){return this.awaitStatusTerminal([Te.SUCCEEDED,Te.FAILED,Te.CANCELED,Te.SCHEDULED])}wait(){return this.awaitStatusTerminal([Te.SUCCEEDED,Te.FAILED,Te.CANCELED])}attach(t,e={logProgress:!0,logStatus:!0,style:!0}){this.pipe(Ds(t,e))}logs(t){this.pipe(async e=>{if(e.classification!==Be.LOG)return;const r=e.payload;await t(r)},Be.LOG)}pipe(t,e=Be.ALL){this.pipes=this.pipes||{},this.pipes[e]=this.pipes[e]||new Set,this.pipes[e].add(t)}succeed(t){this.complete()}fail(t){this.complete()}cancel(t){t.payload&&this.fail()}retry(){}reschedule(){}onSucceed(t){return this.registerStatusHandler(Te.SUCCEEDED,t)}onFailure(t){return this.registerStatusHandler(Te.FAILED,t)}onCancel(t){return this.registerStatusHandler(Te.CANCELED,t)}awaitStatusTerminal(t){return new Promise((e,r)=>{const s=[];let i=!1;const n=async t=>{if(!i){(()=>{if(!i){i=!0;for(const t of s)t()}})();try{t.payload?.status===Te.SUCCEEDED?e(this.extractOutput(t)):r(this.extractError(t))}catch(t){r(t)}}};t.forEach(t=>{const e=this.registerStatusHandler(t,n);s.push(e)})})}extractOutput(t){return void 0!==t.payload?.output?t.payload.output:this.task.output}extractError(t){const e=t.payload?.status??this.task.status,r=this.getNextAction(e),s=t.payload?.originalError;if(s instanceof Error)return this.assignNextAction(s,r);const i=this.buildMeta(e,t.payload),n=this.createTaskControlError(e,t.payload?.error??this.task.error,i);return this.assignNextAction(n,r)}complete(){this.resolved||(this.resolved=!0,this.unregistration(),this.pipes=void 0)}isTerminalStatus(t){return[Te.SUCCEEDED,Te.CANCELED,Te.FAILED].includes(t)}async track(t,e){if(!t.payload)return;const r=t.payload.status;this.task.status=r,void 0!==t.payload.output&&(this.task.output=t.payload.output),t.payload.error&&(this.task.error=t.payload.error),void 0!==t.payload.nextRunAt&&(this.task.nextRunAt=t.payload.nextRunAt),void 0!==t.payload.scheduledTo&&(this.task.scheduledTo=t.payload.scheduledTo),r!==Te.SUCCEEDED?(r===Te.FAILED&&this.fail(),r===Te.CANCELED&&this.cancel(t),r===Te.WAITING_RETRY&&this.retry(),r===Te.SCHEDULED&&this.reschedule()):this.succeed()}registerStatusHandler(t,e){const r=async(r,s)=>{r.payload?.status===t&&await e(r,s)};if(this.pipe(r,Be.STATUS),this.task.status===t){const e=this.buildTerminalEvent(t);r(e,this.getTerminalContext())}return()=>{this.pipes?.[Be.STATUS]?.delete(r)}}getTerminalContext(){return this.terminalContext||(this.terminalContext=new $t),this.terminalContext}buildTerminalEvent(t){const e={status:t};return t===Te.SUCCEEDED&&(e.output=this.task.output),t!==Te.FAILED&&t!==Te.CANCELED||!this.task.error||(e.error=this.task.error),this.task.nextRunAt&&(e.nextRunAt=this.task.nextRunAt),this.task.scheduledTo&&(e.scheduledTo=this.task.scheduledTo),new bs({classification:Be.STATUS,taskId:this.task.id,payload:e})}createTaskControlError(t,e,r){switch(t){case Te.FAILED:return new Ys(this.task.id,e,r);case Te.CANCELED:return new zs(this.task.id,e,r);case Te.WAITING_RETRY:return new Gs(this.task.id,e,r);case Te.SCHEDULED:return new Hs(this.task.id,e,r);default:return new Ys(this.task.id,e,r)}}assignNextAction(t,e){return e&&(t.nextAction=e),t}getNextAction(t){switch(t){case Te.CANCELED:return Te.CANCELED;case Te.WAITING_RETRY:return Te.WAITING_RETRY;case Te.SCHEDULED:return Te.SCHEDULED;case Te.FAILED:return Te.FAILED;default:return}}buildMeta(t,e){const r={};if(e?.nextRunAt&&(r.nextRunAt=e.nextRunAt),e?.scheduledTo&&(r.scheduledTo=e.scheduledTo),Object.keys(r).length)return r}resolveTerminalState(){if(!this.isTerminalStatus(this.task.status))return;if(this.task.status===Te.SUCCEEDED)return void this.succeed(this.task.output);const t={status:this.task.status,nextRunAt:this.task.nextRunAt,scheduledTo:this.task.scheduledTo};this.fail(this.createTaskControlError(this.task.status,this.task.error,this.buildMeta(this.task.status,t)))}async refresh(t,e){if(!this.pipes)return;const r=this.pipes[Be.ALL]?[...this.pipes[Be.ALL].values()]:[];r.push(...this.pipes[t.classification]?.values()||[]);for(const s of r)try{await s(t,e)}catch(r){e.logger.error(`Failed to trigger pipe ${s.name} for event ${t.classification}. discarding event`,r)}}}const qs={workerId:"worker",mode:z()?"browser":"node",persistence:{adapterModule:"@decaf-ts/core/fs",adapterClass:"FsAdapter",adapterArgs:[]},taskEngine:{concurrency:1,leaseMs:6e4,pollMsIdle:5e3,pollMsBusy:1e3,logTailMax:256,streamBufferSize:512,maxLoggingBuffer:1024,loggingBufferTruncation:8,gracefulShutdownMsTimeout:1e4},modules:{imports:["@decaf-ts/core","@decaf-ts/logging"]}};H.accumulate(qs);class Qs extends Ft{get Context(){return Ls}get adapter(){return this.config.adapter}get registry(){return this.config.registry}get bus(){return this.config.bus}get tasks(){return this._tasks||(this._tasks=Re.forModel(xs,this.adapter.alias),this.config.overrides&&(this._tasks=this._tasks.override(this.config.overrides))),this._tasks}get events(){return this._events||(this._events=Re.forModel(bs,this.config.adapter.alias),this.config.overrides&&(this._events=this._events.override(this.config.overrides))),this._events}static createTaskContext(t,e){const r=new Ls(t);return e&&Object.keys(e).length?r.accumulate(e):r}constructor(t){if(super(),this.config=t,this.workerThreads=[],this.workerJobQueue=[],this.workerJobs=new Map,this.workerCounter=0,this.workerThreadCapacity=1,this.lock=new lt,this.running=!1,t.workerPool&&!t.workerAdapter)throw new u("Worker pool requires workerAdapter descriptor in TaskEngineConfig");this.config=Object.assign({},Le,t,{bus:t.bus||new js,registry:t.registry||new Fs}),this.workerThreadCapacity=Math.max(1,this.config.workerConcurrency??1),this.workerPoolConfig=this.normalizeWorkerPoolConfig(this.config.workerPool)}normalizeWorkerPoolConfig(t){if(t){if(!t.entry)throw new u("Worker pool configuration requires an explicit entry file path");if(null!=t.size&&t.size!==this.config.concurrency)throw new u("TaskEngine concurrency must match workerPool.size when worker pool is enabled");return Object.assign({},t,{size:this.config.concurrency})}}hasWorkerPool(){return!!this.workerPoolConfig&&(this.workerPoolConfig.size??0)>0}getWorkerCount(){return this.workerPoolConfig?this.workerPoolConfig.size??0:0}getWorkerExecutionSlots(){return this.getWorkerCount()*this.workerThreadCapacity}canDispatchToWorkers(){return this.hasWorkerPool()}getExecutionConcurrency(){return this.hasWorkerPool()?Math.max(1,this.getWorkerExecutionSlots()):this.config.concurrency}computeWorkerModules(){const t=this.config.workerAdapter??qs.persistence;if(!t?.adapterModule)throw new u("Worker adapter descriptor must include adapterModule");const e=this.workerPoolConfig?.modules?.imports??qs.modules.imports,r=[],s=t=>{t&&(r.includes(t)||r.push(t))};s(t.adapterModule);for(const r of e)r!==t.adapterModule&&s(r);return{imports:r}}async push(t,e=!1,...r){const{ctx:s,log:i}=(await this.logCtx(r,a.CREATE,!0)).for(this.push);i.verbose("pushing task "+t.classification);const n=await this.tasks.create(t,s);return i.info(`${t.classification} task registered under ${n.id}`),e?{task:n,tracker:new Ws(this.bus,n)}:n}schedule(t,e=!1,...r){return{for:async s=>{const i=s instanceof Date?s:s.build();return t.status=Te.SCHEDULED,t.scheduledTo=i,t.nextRunAt=void 0,t.leaseOwner=void 0,t.leaseExpiry=void 0,await this.push(t,e,...r)}}}async track(t,...e){const{ctx:r,log:s}=(await this.logCtx(e,a.READ,!0)).for(this.track);s.verbose("tracking task "+t);let i=await this.tasks.read(t,r);return i=await this.ensureTaskError(i,r),s.info(`${i.classification} task found with id ${t}`),{task:i,tracker:new Ws(this.bus,i)}}async ensureTaskError(t,e){if(![Te.FAILED,Te.CANCELED].includes(t.status)||t.error)return t;let r=t;for(let t=0;6>t;t+=1){await Is(20);try{const t=await this.tasks.read(r.id,e);if(t.error)return t;r=t}catch{break}}return r}async cancel(t,...e){const{ctx:r}=(await this.logCtx(e,"cancel",!0)).for(this.cancel),s=await this.tasks.read(t,r);if(s.status===Te.SUCCEEDED||s.status===Te.FAILED)return s;s.status=Te.CANCELED;const i=new ws({message:`Task ${s.id} canceled`,code:400});s.error=i,s.leaseOwner=void 0,s.leaseExpiry=void 0,s.nextRunAt=void 0,s.scheduledTo=void 0;const n=await this.tasks.update(s,r);return await this.emitStatus(r,n,Te.CANCELED,i),n}async isRunning(){await this.lock.acquire();const t=this.running;return this.lock.release(),t}async start(...t){const{ctx:e}=(await this.logCtx(t,"run",!0)).for(this.start);await this.lock.acquire(),this.running?this.lock.release():(this.running=!0,this.lock.release(),await this.spawnWorkers(),this.loop(e))}async stop(...t){const{ctx:e,log:r}=(await this.logCtx(t,Ct.SHUTDOWN,!0)).for(this.stop);await this.lock.acquire(),this.running||r.warn("stop method called when task engine was not running"),this.running=!1,this.lock.release();const s=await this.tasks.select(["id"]).where(ee.attr("status").eq(Te.RUNNING)).execute(e),i=e.getOrUndefined?.("gracefulShutdownMsTimeout")??this.config.gracefulShutdownMsTimeout;await new Promise((t,n)=>{const o=setTimeout(()=>{r.error(`Graceful shutdown interrupted after ${i} ms...`),t()},i);Promise.allSettled(s.map(({id:t})=>new Promise((r,s)=>{this.track(t,e).then(({tracker:t})=>{t.resolve().then(r)}).catch(s)}))).then(e=>{clearTimeout(o),r.info(`Graceful shutdown completed before expiry. concluded ${e.length} tasks`),t()}).catch(t=>{clearTimeout(o),n(t)})}),await this.shutdownWorkers()}async spawnWorkers(){if(!this.hasWorkerPool())return;const t=this.getWorkerCount(),e=[];for(;this.workerThreads.length<t;){const t=this.createWorker();t&&e.push(t)}e.length&&await Promise.all(e)}createWorker(){if(!this.workerPoolConfig)return;let t,e;const r=new Promise((r,s)=>{t=r,e=s}),s=this.workerPoolConfig.entry,i=`${this.config.workerId}-${this.workerCounter++}`,n={workerId:i,mode:this.workerPoolConfig.mode??"node",persistence:Object.assign({},this.config.workerAdapter??qs.persistence,{alias:this.adapter.alias,flavour:this.adapter.flavour}),taskEngine:{concurrency:this.workerThreadCapacity,leaseMs:this.config.leaseMs,pollMsBusy:this.config.pollMsBusy,pollMsIdle:this.config.pollMsIdle,logTailMax:this.config.logTailMax,streamBufferSize:this.config.streamBufferSize,maxLoggingBuffer:this.config.maxLoggingBuffer,loggingBufferTruncation:this.config.loggingBufferTruncation,gracefulShutdownMsTimeout:this.config.gracefulShutdownMsTimeout},modules:this.computeWorkerModules()},o=new xt(s,{workerData:{environment:n}}),a={id:i,worker:o,ready:!1,activeJobs:0,capacity:this.workerThreadCapacity,readyPromise:r,resolveReady:t,rejectReady:e};return this.workerThreads.push(a),o.on("message",t=>this.handleWorkerMessage(a,t)),o.on("error",t=>this.handleWorkerError(a,t)),o.on("exit",t=>this.handleWorkerExit(a,t)),r}async shutdownWorkers(){for(const t of this.workerThreads.splice(0)){const e={type:"control",command:"shutdown"};try{t.worker.postMessage(e)}catch{}await t.worker.terminate()}for(const t of this.workerJobQueue.splice(0))t.reject(new u(`Worker pool shutting down before job ${t.id} could start`));for(const t of this.workerJobs.values())t.reject(new u("Worker terminated before finishing job "+t.id));this.workerJobs.clear()}handleWorkerError(t,e){this.log.error(`worker ${t.id} error: ${e.message}`,e),t.rejectReady&&(t.rejectReady(e),t.resolveReady=void 0,t.rejectReady=void 0)}handleWorkerExit(t,e){this.log.info(`worker ${t.id} exited with code ${e}`),t.rejectReady&&(t.rejectReady(Error(`worker ${t.id} exited before reporting ready`)),t.resolveReady=void 0,t.rejectReady=void 0);const r=this.workerThreads.indexOf(t);0>r||this.workerThreads.splice(r,1);for(const[e,r]of this.workerJobs.entries())r.worker===t&&(r.worker=void 0,this.workerJobs.delete(e),this.workerJobQueue.unshift(r));this.running&&(this.spawnWorkers().catch(t=>this.log.error("failed to respawn worker",t)),this.processWorkerQueue())}handleWorkerMessage(t,e){if("ready"===e.type)return t.ready=!0,t.resolveReady&&(t.resolveReady(),t.resolveReady=void 0,t.rejectReady=void 0),this.log.info(`worker ${t.id} ready`),void this.processWorkerQueue();if("error"!==e.type){if("log"===e.type){const t=this.workerJobs.get(e.jobId);if(!t)return;return void this.appendLog(t.ctx,t.task,e.entries).then(([e,r])=>(t.task=e,this.emitLog(t.ctx,t.task.id,r))).catch(t=>this.log.error("Failed to append worker log",t))}if("progress"===e.type){const t=this.workerJobs.get(e.jobId);if(!t)return;return void this.emitProgress(t.ctx,t.task.id,e.payload)}if("heartbeat"===e.type){const t=this.workerJobs.get(e.jobId);if(!t)return;return t.task.leaseExpiry=new Date(Date.now()+this.config.leaseMs),void this.tasks.update(t.task).catch(()=>null)}if("result"===e.type){const r=this.workerJobs.get(e.jobId);if(!r)return;switch(this.workerJobs.delete(r.id),t.activeJobs=Math.max(0,t.activeJobs-1),this.applyWorkerCache(r.ctx,e.cache),e.status){case"success":r.resolve(e.output);break;case"error":{const t=Error(e.error.message);e.error.name&&(t.name=e.error.name),e.error.stack&&(t.stack=e.error.stack),r.reject(t);break}case"state-change":r.reject(new $s(e.request))}return void this.processWorkerQueue()}}else this.log.error(`worker ${t.id} reported error: ${e.error}`)}applyWorkerCache(t,e){e&&Object.entries(e).forEach(([e,r])=>{t.cacheResult(e,r)})}processWorkerQueue(){if(!this.hasWorkerPool())return;const t=this.workerThreads.filter(t=>t.ready&&t.activeJobs<t.capacity).sort((t,e)=>t.activeJobs-e.activeJobs);for(const e of t){for(;e.activeJobs<e.capacity&&this.workerJobQueue.length>0;){const t=this.workerJobQueue.shift();if(!t)break;this.assignWorker(e,t)}if(!this.workerJobQueue.length)break}}assignWorker(t,e){if(!this.workerPoolConfig)return;const r={jobId:e.id,taskId:e.task.id,classification:e.classification,input:e.input,attempt:e.task.attempt??0,resultCache:e.ctx.resultCache??{},streamBufferSize:this.config.streamBufferSize,maxLoggingBuffer:this.config.maxLoggingBuffer,loggingBufferTruncation:this.config.loggingBufferTruncation};e.worker=t,this.workerJobs.set(e.id,e),t.activeJobs+=1;const s={type:"execute",job:r};t.worker.postMessage(s)}enqueueWorkerJob(t){this.workerJobQueue.push(t),this.processWorkerQueue()}async loop(...t){const{ctx:e}=this.logCtx(t,this.loop);for(;await this.isRunning();){const t=await this.claimBatch(e);await Promise.allSettled(t.map(t=>this.executeClaimed(t))),await Is(t.length?this.config.pollMsBusy:this.config.pollMsIdle)}}async claimBatch(t){const e=t.logger.for(this.claimBatch),r=new Date,s=ee.attribute("status").eq(Te.PENDING),i=ee.attribute("status").eq(Te.WAITING_RETRY).and(ee.attribute("nextRunAt").lte(r)),n=ee.attribute("status").eq(Te.RUNNING).and(ee.attribute("leaseExpiry").lte(r)),o=ee.attribute("status").eq(Te.SCHEDULED).and(ee.attribute("scheduledTo").lte(r)),a=s.or(i).or(n).or(o),c=this.getExecutionConcurrency(),l=await this.tasks.select().where(a).limit(Math.max(4*c,20)).execute();e.verbose("claimBatch candidates:"+l.length);const u=[];for(const e of l){const r=await this.tryClaim(e,t);if(r&&u.push(r),u.length>=c)break}return e.verbose("claimBatch claimed:"+u.length),u}async tryClaim(t,e){const r=e.logger.for(this.claimBatch),s=(new Date).getTime();let i=t;try{i=await this.tasks.read(t.id,e)}catch{}const n=new xs({...i,status:Te.RUNNING,leaseOwner:this.config.workerId.toString(),leaseExpiry:new Date(s+(parseInt(this.config.leaseMs.toString())||6e4)),scheduledTo:void 0,nextRunAt:void 0});r.info(`running handler for ${t.id} (${t.classification}) atomicity ${t.atomicity}`);try{return await this.tasks.update(n,e)}catch{return null}}async runHandlerInline(t,e,r){const s=this.registry.get(t);if(!s)throw new u("No task handler registered for type: "+t);return s.run(e,r)}async dispatchToWorker(t,e,r,s){if(!this.canDispatchToWorkers())return this.runHandlerInline(t,e,s);const i=await Qt.instance.generate();return new Promise((n,o)=>{const a={id:i,classification:t,input:e,task:r,ctx:s,resolve:n,reject:o};this.enqueueWorkerJob(a)})}async invokeHandler(t,e,r,s){return this.hasWorkerPool()?this.dispatchToWorker(t,e,r,s):this.runHandlerInline(t,e,s)}async executeClaimed(t){const{ctx:e,log:r}=(await this.logCtx([],t.classification,!0)).for(this.executeClaimed),s=Qs.createTaskContext(e,{taskId:t.id,logger:new Bs(r,this.config.streamBufferSize,this.config.maxLoggingBuffer),attempt:t.attempt,resultCache:{},pipe:async e=>{const[,r]=await this.appendLog(s,t,e);await this.emitLog(s,t.id,r)},flush:async()=>{await s.logger.flush(s.pipe)},progress:async e=>{await this.emitProgress(s,t.id,e)},heartbeat:async()=>{if(t.leaseOwner===this.config.workerId){t.leaseExpiry=new Date(Date.now()+this.config.leaseMs);try{t=await this.tasks.update(t)}catch{}}}});await this.emitStatus(s,t,Te.RUNNING);try{let e;if(t.atomicity===De.COMPOSITE){e=await this.runComposite(t,s);try{t=await this.tasks.read(t.id,s)}catch{}e?.stepResults&&(t.stepResults=e.stepResults,t.currentStep=e.stepResults.length)}else r.debug("dispatching handler for "+t.id),e=await this.invokeHandler(t.classification,t.input,t,s),r.verbose("handler finished for "+t.id);t.status=Te.SUCCEEDED,t.output=e,t.error=void 0,t.leaseOwner=void 0,t.leaseExpiry=void 0,t=await this.tasks.update(t,s),s.logger.info(`task ${t.id} success state ${t.status}`),r.info(`task ${t.id} success state ${t.status} attempt ${t.attempt}`),await this.emitStatus(s,t,Te.SUCCEEDED,e)}catch(e){try{t=await this.tasks.read(t.id,s)}catch{}if(e instanceof $s)return void await this.handleTaskStateChange(e.request,t,s);if(r.error("task execution error",e),t.atomicity===De.COMPOSITE){const e=this.normalizeStepResults(t.stepResults);if(t.stepResults=e,null==t.currentStep){const r=e.findIndex(t=>t.status===Te.FAILED);0>r||(t.currentStep=r)}}const i=(t.attempt??0)+1,n=Ps(e);if(i<t.maxAttempts){const o=Rs(i,this.normalizeBackoff(t.backoff)),a=new Date(Date.now()+o);t.attempt=i,t.status=Te.WAITING_RETRY,t.nextRunAt=a,t.error=n,t.leaseOwner=void 0,t.leaseExpiry=void 0,t=await this.tasks.update(t,s),r.warn(`task ${t.id} waiting retry state ${t.status} attempt ${t.attempt}`),await s.pipe(Y.warn,"Retry scheduled",{nextRunAt:a,delayMs:o,attempt:i}),await this.emitStatus(s,t,Te.WAITING_RETRY,n,e)}else t.attempt=i,t.status=Te.FAILED,t.error=n,t.leaseOwner=void 0,t.leaseExpiry=void 0,t=await this.tasks.update(t,s),r.error(`task ${t.id} failed state ${t.status} attempt ${t.attempt}`),await s.pipe(Y.error,"Task failed (max attempts reached)",{maxAttempts:t.maxAttempts}),await this.emitStatus(s,t,Te.FAILED,n,e)}}async handleTaskStateChange(t,e,r){switch(e.leaseOwner=void 0,e.leaseExpiry=void 0,t.status){case Te.CANCELED:{const s=t.error??new ws({message:`Task ${e.id} canceled`});return e.status=Te.CANCELED,e.error=s,e.nextRunAt=void 0,e.scheduledTo=void 0,e=await this.tasks.update(e,r),await this.emitStatus(r,e,Te.CANCELED,s),void await r.pipe(Y.warn,"Task canceled via context")}case Te.WAITING_RETRY:{const s=(e.attempt??0)+1,i=Rs(s,this.normalizeBackoff(e.backoff)),n=t.scheduledTo instanceof Date?t.scheduledTo:new Date(Date.now()+i),o=t.error??new ws({message:`Task ${e.id} requested retry`});return e.status=Te.WAITING_RETRY,e.attempt=s,e.error=o,e.nextRunAt=n,e.scheduledTo=void 0,e=await this.tasks.update(e,r),await this.emitStatus(r,e,Te.WAITING_RETRY,o),void await r.pipe(Y.warn,"Retry requested",{nextRunAt:n,delayMs:i,attempt:s})}case Te.SCHEDULED:{if(!t.scheduledTo)throw new u("Scheduled state requires a target date");const s=t.error??new ws({message:`Task ${e.id} rescheduled`});return e.status=Te.SCHEDULED,e.scheduledTo=t.scheduledTo,e.error=s,e.nextRunAt=void 0,e=await this.tasks.update(e,r),await this.emitStatus(r,e,Te.SCHEDULED,s),void await r.pipe(Y.info,"Task rescheduled",{scheduledTo:t.scheduledTo.toISOString()})}default:throw new u("Unsupported task state change requested: "+t.status)}}async runComposite(t,e){const{ctx:r}=(await this.logCtx([e],t.classification,!0)).for(this.runComposite),s=this.normalizeSteps(t.steps);let i=t.currentStep??0;const n=this.normalizeStepResults(t.stepResults),o=(t,s)=>{e.cacheResult(t,s),r instanceof Ls&&r!==e&&r.cacheResult(t,s)};for(let e=0;e<n.length;e+=1){const r=n[e];if(r?.status===Te.SUCCEEDED){const i=s[e];if(!i)continue;const n=`${t.id}:step:${e}`;o(i.classification,r.output),o(n,r.output)}}for(;i<s.length;){const r=s[i];await e.pipe([Y.info,`Composite step ${i+1}/${s.length}: ${r.classification}`]);try{const a=await this.invokeHandler(r.classification,r.input,t,e),c=i,l=new Date;n[c]=new Es({status:Te.SUCCEEDED,output:a,createdAt:l,updatedAt:l});const u=`${t.id}:step:${c}`;o(r.classification,a),o(u,a),i=c+1,t.stepResults=n,t.currentStep=i,t=await this.tasks.update(t),await this.emitProgress(e,t.id,{currentStep:i,totalSteps:s.length,output:a})}catch(e){const r=new Date;throw n[i]=new Es({status:Te.FAILED,error:Ps(e),createdAt:r,updatedAt:r}),t.stepResults=n,t.currentStep=i,t.error=Ps(e),t=await this.tasks.update(t),e}}return{stepResults:n}}normalizeBackoff(t){if(t instanceof ms)return t;let e=t??{};if("string"==typeof e)try{e=JSON.parse(e)}catch{e={}}return new ms(e)}normalizeSteps(t){if(!t)return[];let e=t;if("string"==typeof e)try{e=JSON.parse(e)}catch{return[]}return e instanceof Set&&(e=Array.from(e)),Array.isArray(e)?e.map(t=>{if(t instanceof Ss)return t;let e=t;if("string"==typeof e)try{e=JSON.parse(e)}catch{e={}}return new Ss(e)}):[]}normalizeStepResults(t){if(!t)return[];let e=t;if("string"==typeof e)try{e=JSON.parse(e)}catch{return[]}return e instanceof Set&&(e=Array.from(e)),Array.isArray(e)?e.map(t=>{if(t instanceof Es)return t;let e=t;if("string"==typeof e)try{e=JSON.parse(e)}catch{e={}}return new Es(e)}):[]}async appendLog(t,e,r){const s=(Array.isArray(r)&&Array.isArray(r[0])?r:[r]).map(([t,e,r])=>new As({level:t,msg:e,meta:r})),i=[...e.logTail??[],...s].slice(-this.config.logTailMax);e.logTail=i;try{return[await this.tasks.update(e,t),s]}catch{return[e,[]]}}async emitStatus(t,e,r,s,i){t instanceof Ls&&await t.flush();const n={status:r};s&&s instanceof ws?n.error=s:s&&(n.output=s),e.nextRunAt&&(n.nextRunAt=e.nextRunAt),e.scheduledTo&&(n.scheduledTo=e.scheduledTo);const o=await this.persistEvent(t,e.id,Be.STATUS,n),a=void 0!==i?Object.assign({},n,{originalError:i}):n,c=new bs({...o,payload:a});this.bus.emit(c,t)}async emitLog(t,e,r){const s=await this.persistEvent(t,e,Be.LOG,r.map(t=>({ts:t.ts,level:t.level,msg:t.msg,meta:t.meta})));this.bus.emit(s,t)}async emitProgress(t,e,r){const s=await this.persistEvent(t,e,Be.PROGRESS,r);this.bus.emit(s,t)}async persistEvent(t,e,r,s){const i=new bs({taskId:e,classification:r,payload:s});return await this.events.create(i,t)}toString(){return`TaskEngine<${this.config.adapter.alias}>`}async context(t,e,...r){return this.adapter.context(t,e,xs,...r)}}class Js extends ts{constructor(){super()}async initialize(...t){const e=t.shift();if(!e||e instanceof $t)throw new u("No/invalid config provided");const{log:r}=(await this.logCtx(t,Ct.INITIALIZATION,!0)).for(this.initialize);if(!e.adapter)throw new u("No adapter provided");if(e.workerPool&&!e.workerAdapter)throw new u("Worker pool requires workerAdapter descriptor in TaskEngineConfig");r.info("Initializing Task Engine...");const s=new Qs(e);return r.verbose(s+" initialized"),{client:s,config:e}}async push(t,e=!1,...r){const{ctxArgs:s}=(await this.logCtx(r,a.CREATE,!0)).for(this.push),i=await this.client.push(t,e,...s);return await this.client.isRunning()||this.client.start(),i}async track(t,...e){const{ctxArgs:r}=(await this.logCtx(e,a.CREATE,!0)).for(this.push);return this.client.track(t,...r)}async create(t,...e){const{ctxArgs:r}=(await this.logCtx(e,a.CREATE,!0)).for(this.create),s=await this.repo.create(t,...r);return await this.client.isRunning()||this.client.start(),s}async createAll(t,...e){const{ctxArgs:r}=(await this.logCtx(e,c.CREATE_ALL,!0)).for(this.createAll),s=await this.repo.createAll(t,...r);return await this.client.isRunning()||this.client.start(),s}async delete(t,...e){const{ctxArgs:r}=(await this.logCtx(e,a.DELETE,!0)).for(this.delete);return this.repo.delete(t,...r)}async deleteAll(t,...e){const{ctxArgs:r}=(await this.logCtx(e,c.DELETE_ALL,!0)).for(this.deleteAll);return this.repo.deleteAll(t,...r)}async read(t,...e){const{ctxArgs:r}=(await this.logCtx(e,a.READ,!0)).for(this.read);return this.repo.read(t,...r)}async readAll(t,...e){const{ctxArgs:r}=(await this.logCtx(e,c.READ_ALL,!0)).for(this.readAll);return this.repo.readAll(t,...r)}async query(t,...e){const{ctxArgs:r}=(await this.logCtx(e,Ct.QUERY,!0)).for(this.query),s=this.repo?.[t];if("function"!=typeof s)throw new u(`Method "${t}" is not implemented`);return s.apply(this.repo,r)}async update(t,...e){throw new Mt("Updates to tasks are not available")}async updateAll(t,...e){throw new Mt("Updates to tasks are not available")}async listBy(t,e,...r){const{ctxArgs:s}=(await this.logCtx(r,kt.LIST_BY,!0)).for(this.listBy);return this.repo.listBy(t,e,...s)}async paginateBy(t,e,r,...s){const{ctxArgs:i}=(await this.logCtx(s,kt.PAGE_BY,!0)).for(this.paginateBy);return this.repo.paginateBy(t,e,r,...i)}async findOneBy(t,e,...r){const{ctxArgs:s}=(await this.logCtx(r,kt.FIND_ONE_BY,!0)).for(this.findOneBy);return this.repo.findOneBy(t,e,...s)}async findBy(t,e,...r){const{ctxArgs:s}=(await this.logCtx(r,kt.FIND_BY,!0)).for(this.findBy);return this.repo.findBy(t,e,...s)}async statement(t,...e){const{ctxArgs:r}=(await this.logCtx(e,Ct.STATEMENT,!0)).for(this.statement);return this.repo.statement(t,...r)}refresh(t,e,r,...s){return this.repo.refresh(t,e,r,...s)}observe(t,e){return this.repo.observe(t,e)}unObserve(t){return this.repo.unObserve(t)}updateObservers(t,e,r,...s){return this.repo.updateObservers(t,e,r,...s)}logCtx(t,e,r=!1){const s=this.repo.adapter.logCtx([this.repo.class,...t],e,r,this.repo._overrides||{});function i(t){return t.ctxArgs.shift(),t}return s instanceof Promise?s.then(i):i(s)}async shutdown(...t){const{ctxArgs:e,ctx:r,log:s}=(await this.logCtx(t,Ct.SHUTDOWN,!0)).for(this.shutdown);await super.shutdown(...e),s.info("attempting to gracefully shutdown task runner"),await this.client.stop(r),s.verbose("gracefully shutdown task runner")}}function Vs(t={count:1},e=0){return function r(s,i,n){return gt(ft(dt.key(Ct.THROTTLE,i),t),(s,i,n)=>{n.value=new Proxy(n.value,{async apply(s,n,o){const a=o,c=(()=>{try{return"function"==typeof t?t(...a):t}catch(t){throw new u("Failed to obtain throttling configuration from handler: "+t)}})(),{log:l,ctx:d}=(await n.logCtx(o,Ct.THROTTLE,!0)).for(r),h=(t=>{const e=(Array.isArray(t)?t:[t]).map(t=>{if(!Number.isFinite(t)||0>t)throw new u("@throttling() argument indexes must be non-negative integers");return t});return Array.from(new Set(e)).sort((t,e)=>t-e)})(e);if(!h.length)throw new u("@throttling() expects at least one argument index to throttle");h.forEach(t=>{if(t>=a.length)throw new u(`@throttling() requires argument index ${t} but only ${a.length} provided`);if(!Array.isArray(a[t]))throw new u(`@throttling() expects argument at index ${t} to be an array`)});const p=h.map(t=>a[t]),g=p[0].length;if(!p.every(t=>t.length===g))throw new u("@throttling() requires all targeted arguments to have the same length");if(0===g)return s.apply(n,a);const f=((t,e,r)=>{if("count"in r){if(0>=r.count)throw new u("@throttling() configuration 'count' must be greater than zero");const e=[];for(let s=0;t>s;s+=r.count)e.push({start:s,end:Math.min(t,s+r.count)});return e}if("bufferSize"in r){if(0>=r.bufferSize)throw new u("@throttling() configuration 'bufferSize' must be greater than zero");const s=[];let i=0,n=0;for(let o=0;t>o;o++){const t=Xs(e,o);n>0&&n+t>r.bufferSize?(s.push({start:i,end:o}),i=o,n=t):n+=t}return i>=t&&s.length||s.push({start:i,end:t}),s}return[{start:0,end:t}]})(g,p,c),y=f.map(({start:t,end:e})=>a.map((r,s)=>{const i=h.indexOf(s);return-1===i?r:p[i].slice(t,e)})),m=d.get("breakOnSingleFailureInBulk")??!0,w=[],b=[];for(const t of y){try{Ks(await s.apply(n,t),w)}catch(t){if(m)throw t;b.push(t)}c.delayMs&&await new Promise(t=>setTimeout(t,c.delayMs))}if(b.length){l.warn(`${i+""} throttled execution continued with ${b.length} failure(s)`);const t=new AggregateError(b,`Throttled ${i+""} failed for ${b.length} chunk(s)`);throw t.results=w,t}return w}})})(s,i,n)}}function Xs(t,e){return t.reduce((t,r)=>t+(t=>{if(null==t)return 0;try{return Buffer.byteLength(JSON.stringify(t))}catch{return 0}})(r[e]),0)}function Ks(t,e){Array.isArray(t)?e.push(...t):void 0!==t&&e.push(t)}i([Fe(xs),n("design:type",Object)],Js.prototype,"repo",void 0),i([rs(),n("design:type",Function),n("design:paramtypes",[xs,void 0]),n("design:returntype",Promise)],Js.prototype,"create",null),i([rs(),n("design:type",Function),n("design:paramtypes",[Array,void 0]),n("design:returntype",Promise)],Js.prototype,"createAll",null),i([ns(),n("design:type",Function),n("design:paramtypes",[Object,void 0]),n("design:returntype",Promise)],Js.prototype,"delete",null),i([ns(),n("design:type",Function),n("design:paramtypes",[Array,void 0]),n("design:returntype",Promise)],Js.prototype,"deleteAll",null),i([ss(),n("design:type",Function),n("design:paramtypes",[Object,void 0]),n("design:returntype",Promise)],Js.prototype,"read",null),i([ss(),n("design:type",Function),n("design:paramtypes",[Array,void 0]),n("design:returntype",Promise)],Js.prototype,"readAll",null),i([ss(),n("design:type",Function),n("design:paramtypes",[String,void 0]),n("design:returntype",Promise)],Js.prototype,"query",null),i([is(),n("design:type",Function),n("design:paramtypes",[xs,void 0]),n("design:returntype",Promise)],Js.prototype,"update",null),i([is(),n("design:type",Function),n("design:paramtypes",[Array,void 0]),n("design:returntype",Promise)],Js.prototype,"updateAll",null),e.setRegistry(new Ie);const Zs="##VERSION##",ti="##PACKAGE##";dt.registerLibrary(ti,Zs);export{Ft as AbsContextual,Kt as Adapter,Me as AuthKeys,vr as AuthorizationError,Ne as BackoffStrategy,Yr as BaseModel,We as BigIntSequence,se as Cascade,_s as CleanUpTask,ts as ClientBasedService,Cs as CompositeTaskBuilder,ee as Condition,xr as ConnectionError,$t as Context,It as ContextLock,Lt as ContextualLoggedClass,Nt as DefaultAdapterFlags,ie as DefaultCascade,Tt as DefaultContextFlags,ve as DefaultRepositoryFilters,ze as DefaultSequenceOptions,Le as DefaultTaskEngineConfig,hs as Dispatch,Ar as ForbiddenError,Ot as GroupOperator,Ie as InjectablesRegistry,_e as JitterStrategy,ae as MethodQueryBuilder,Ut as MigrationError,Yt as MigrationRuleError,ds as ModelService,Rt as MultipleSelectOperationKeys,Bt as NonTransactionOperationKeys,Ge as NoneSequenceOptions,He as NumericSequence,je as ObserverError,jt as ObserverHandler,St as Operator,ne as OperatorsMap,re as OrderDirection,ti as PACKAGE_NAME,Pt as PaginationOperationKeys,zr as Paginator,te as PagingError,Ct as PersistenceKeys,ys as PersistenceService,kt as PreparedStatementKeys,Et as QueryClause,Zt as QueryError,Re as Repository,Dt as SelectOperationKeys,fs as Sequence,Gr as SequenceModel,Jt as Serial,Zr as Service,Kr as Statement,Os as TaskBackoffBuilder,ms as TaskBackoffModel,ks as TaskBuilder,zs as TaskCancelError,Ls as TaskContext,Us as TaskControlError,Qs as TaskEngine,ws as TaskErrorModel,js as TaskEventBus,bs as TaskEventModel,Be as TaskEventType,Ys as TaskFailError,Ts as TaskHandler,Fs as TaskHandlerRegistry,vs as TaskIOSerializer,As as TaskLogEntryModel,Bs as TaskLogger,xs as TaskModel,Hs as TaskRescheduleError,Gs as TaskRetryError,Js as TaskService,Te as TaskStatus,Es as TaskStepResultModel,Ss as TaskStepSpecModel,Ws as TaskTracker,De as TaskType,$e as TasksKey,_t as TransactionOperationKeys,Qt as UUID,Mt as UnsupportedError,Zs as VERSION,Ue as allowIf,de as applyViewDecorator,as as auth,Ye as blockIf,fr as cacheModelForPopulate,mr as cascadeDelete,Sr as column,Rs as computeBackoffMs,rs as create,Xe as createOrUpdate,_r as createdAt,Tr as createdBy,Cr as createdByOnCreateUpdate,ce as defaultQueryAttr,ns as del,Pe as generateInjectableNameForRepository,ur as getAndConstructJunctionTable,Ae as getFilters,Ds as getLogPipe,Dr as getPkTypes,pr as getPopulateKey,gr as getTagForDeleteKey,qe as index,Gt as injectableServiceKey,Ht as isOperationBlocked,Ms as isTaskError,$r as manyToMany,cr as manyToManyOnCreate,hr as manyToManyOnDelete,dr as manyToManyOnUpdate,Ir as manyToOne,ir as manyToOneOnCreate,ar as manyToOneOnDelete,or as manyToOneOnUpdate,Lr as noValidateOn,Fr as noValidateOnCreate,Mr as noValidateOnCreateUpdate,jr as noValidateOnUpdate,Wt as normalizeImport,Pr as oneToMany,er as oneToManyOnCreateUpdate,sr as oneToManyOnDelete,rr as oneToManyOnUpdate,Rr as oneToOne,Ke as oneToOneOnCreate,tr as oneToOneOnDelete,Ze as oneToOneOnUpdate,we as onlyOnBulk,pe as onlyOnCreate,fe as onlyOnDelete,be as onlyOnFilter,me as onlyOnSingle,ye as onlyOnTransactional,ge as onlyOnUpdate,Ve as pk,Je as pkDec,Qe as pkOnCreate,yr as populate,qt as prefixMethod,le as prepared,zt as promiseSequence,ue as query,ss as read,Ur as relation,Fe as repository,br as repositoryFromTypeMetadata,cs as roles,ls as route,Ps as serializeError,os as service,Is as sleep,Er as table,Ns as task,Vs as throttle,kr as unique,Or as uniqueOnCreateUpdate,is as update,Br as updatedAt,Nr as updatedBy,gs as uuid,ps as uuidCreateUpdateHandler,nr as validBidirectionalRelation,he as view};
2
2
  //# sourceMappingURL=core.js.map