equipped 5.3.1 → 5.3.3
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.
- package/CHANGELOG.md +9 -0
- package/dist/cjs/cache/adapters/in-memory/index.cjs +155 -155
- package/dist/cjs/cache/adapters/in-memory/index.cjs.map +1 -1
- package/dist/cjs/cache/adapters/in-memory/index.min.cjs +3 -3
- package/dist/cjs/cache/adapters/in-memory/index.min.cjs.map +1 -1
- package/dist/cjs/dbs/adapters/mongodb/index.cjs.map +1 -1
- package/dist/cjs/dbs/adapters/mongodb/index.min.cjs +2 -2
- package/dist/cjs/dbs/adapters/mongodb/index.min.cjs.map +1 -1
- package/dist/cjs/dbs/index.cjs +181 -179
- package/dist/cjs/dbs/index.cjs.map +1 -1
- package/dist/cjs/dbs/index.min.cjs +3 -3
- package/dist/cjs/dbs/index.min.cjs.map +1 -1
- package/dist/cjs/errors/index.cjs +11 -0
- package/dist/cjs/errors/index.cjs.map +1 -1
- package/dist/cjs/errors/index.min.cjs +1 -1
- package/dist/cjs/errors/index.min.cjs.map +1 -1
- package/dist/cjs/events/adapters/kafka/index.cjs.map +1 -1
- package/dist/cjs/events/adapters/kafka/index.min.cjs +2 -2
- package/dist/cjs/events/adapters/kafka/index.min.cjs.map +1 -1
- package/dist/cjs/events/adapters/rabbitmq/index.cjs +179 -179
- package/dist/cjs/events/adapters/rabbitmq/index.cjs.map +1 -1
- package/dist/cjs/events/adapters/rabbitmq/index.min.cjs +3 -3
- package/dist/cjs/events/adapters/rabbitmq/index.min.cjs.map +1 -1
- package/dist/cjs/orm/adapters/mongodb/index.cjs +144 -144
- package/dist/cjs/orm/adapters/mongodb/index.cjs.map +1 -1
- package/dist/cjs/orm/adapters/mongodb/index.min.cjs +1 -1
- package/dist/cjs/orm/adapters/mongodb/index.min.cjs.map +1 -1
- package/dist/cjs/orm/adapters/postgresql/index.cjs +152 -215
- package/dist/cjs/orm/adapters/postgresql/index.cjs.map +1 -1
- package/dist/cjs/orm/adapters/postgresql/index.min.cjs +11 -11
- package/dist/cjs/orm/adapters/postgresql/index.min.cjs.map +1 -1
- package/dist/cjs/server/adapters/express/index.cjs +292 -225
- package/dist/cjs/server/adapters/express/index.cjs.map +1 -1
- package/dist/cjs/server/adapters/express/index.min.cjs +7 -7
- package/dist/cjs/server/adapters/express/index.min.cjs.map +1 -1
- package/dist/cjs/server/adapters/fastify/index.cjs +277 -210
- package/dist/cjs/server/adapters/fastify/index.cjs.map +1 -1
- package/dist/cjs/server/adapters/fastify/index.min.cjs +7 -7
- package/dist/cjs/server/adapters/fastify/index.min.cjs.map +1 -1
- package/dist/cjs/server/index.cjs +82 -15
- package/dist/cjs/server/index.cjs.map +1 -1
- package/dist/cjs/server/index.min.cjs +7 -7
- package/dist/cjs/server/index.min.cjs.map +1 -1
- package/dist/cjs/utilities/index.cjs +0 -5
- package/dist/cjs/utilities/index.cjs.map +1 -1
- package/dist/cjs/utilities/index.min.cjs +2 -2
- package/dist/cjs/utilities/index.min.cjs.map +1 -1
- package/dist/cjs/validations/index.cjs +1 -0
- package/dist/cjs/validations/index.cjs.map +1 -1
- package/dist/cjs/validations/index.min.cjs +1 -1
- package/dist/cjs/validations/index.min.cjs.map +1 -1
- package/dist/esm/cache/adapters/in-memory/index.min.mjs +1 -1
- package/dist/esm/cache/adapters/in-memory/index.min.mjs.map +1 -1
- package/dist/esm/cache/adapters/in-memory/index.mjs +6 -3
- package/dist/esm/cache/adapters/in-memory/index.mjs.map +1 -1
- package/dist/esm/cache/adapters/redis/index.min.mjs +1 -1
- package/dist/esm/cache/adapters/redis/index.mjs +5 -3
- package/dist/esm/cache/index.min.mjs +1 -1
- package/dist/esm/cache/index.mjs +2 -2
- package/dist/esm/{chunk-2GGMLKRP.min.mjs → chunk-4GZ43EQ2.min.mjs} +2 -2
- package/dist/esm/{chunk-IRYCN6PI.min.mjs → chunk-5FEVQT6K.min.mjs} +2 -2
- package/dist/esm/{chunk-LKS5ZE45.mjs → chunk-74GY55PM.mjs} +2 -2
- package/dist/esm/{chunk-A4P7P6BU.mjs → chunk-7N4WUZ7P.mjs} +167 -347
- package/dist/esm/chunk-7N4WUZ7P.mjs.map +1 -0
- package/dist/esm/chunk-A332TTED.mjs +135 -0
- package/dist/esm/chunk-A332TTED.mjs.map +1 -0
- package/dist/esm/{chunk-7CP7ZE2O.mjs → chunk-BONYW6LU.mjs} +9 -5
- package/dist/esm/{chunk-7CP7ZE2O.mjs.map → chunk-BONYW6LU.mjs.map} +1 -1
- package/dist/esm/{chunk-HXFNN6RI.mjs → chunk-C3G4W4ZV.mjs} +3 -3
- package/dist/esm/chunk-CU2HU5UE.min.mjs +2 -0
- package/dist/esm/chunk-CU2HU5UE.min.mjs.map +1 -0
- package/dist/esm/{chunk-676VIABN.min.mjs → chunk-LJZOS62I.min.mjs} +2 -2
- package/dist/esm/{chunk-7SQ5JQYR.min.mjs → chunk-MCX2O5IT.min.mjs} +2 -2
- package/dist/esm/{chunk-BWUFPMVG.mjs → chunk-MNKDFIVK.mjs} +2 -2
- package/dist/esm/chunk-N3OD4QL2.min.mjs +32 -0
- package/dist/esm/chunk-N3OD4QL2.min.mjs.map +1 -0
- package/dist/esm/chunk-NEF3UYFA.mjs +144 -0
- package/dist/esm/chunk-NEF3UYFA.mjs.map +1 -0
- package/dist/esm/{chunk-TSVHZZE4.mjs → chunk-RFJ5URMP.mjs} +5 -5
- package/dist/esm/chunk-RX4XPABH.min.mjs +2 -0
- package/dist/esm/{chunk-MQXTTWPS.min.mjs.map → chunk-RX4XPABH.min.mjs.map} +1 -1
- package/dist/esm/chunk-SPOVKWV3.min.mjs +2 -0
- package/dist/esm/chunk-SPOVKWV3.min.mjs.map +1 -0
- package/dist/esm/{chunk-3TP7NINX.mjs → chunk-XESM7IWM.mjs} +2 -2
- package/dist/esm/{chunk-5PZACGPI.mjs → chunk-XJKBHQWO.mjs} +7 -5
- package/dist/esm/{chunk-5PZACGPI.mjs.map → chunk-XJKBHQWO.mjs.map} +1 -1
- package/dist/esm/chunk-YC6V4HLT.min.mjs +2 -0
- package/dist/esm/{chunk-7NF7PV6S.min.mjs.map → chunk-YC6V4HLT.min.mjs.map} +1 -1
- package/dist/esm/{chunk-P4PRHHIY.min.mjs → chunk-YWQTFKNY.min.mjs} +2 -2
- package/dist/esm/dbs/adapters/mongodb/index.min.mjs +1 -1
- package/dist/esm/dbs/adapters/mongodb/index.min.mjs.map +1 -1
- package/dist/esm/dbs/adapters/mongodb/index.mjs +8 -5
- package/dist/esm/dbs/adapters/mongodb/index.mjs.map +1 -1
- package/dist/esm/dbs/index.min.mjs +1 -1
- package/dist/esm/dbs/index.mjs +5 -3
- package/dist/esm/errors/index.min.mjs +1 -1
- package/dist/esm/errors/index.mjs +3 -1
- package/dist/esm/events/adapters/kafka/index.min.mjs +1 -1
- package/dist/esm/events/adapters/kafka/index.mjs +4 -2
- package/dist/esm/events/adapters/rabbitmq/index.min.mjs +1 -1
- package/dist/esm/events/adapters/rabbitmq/index.min.mjs.map +1 -1
- package/dist/esm/events/adapters/rabbitmq/index.mjs +7 -3
- package/dist/esm/events/adapters/rabbitmq/index.mjs.map +1 -1
- package/dist/esm/index.min.mjs +1 -1
- package/dist/esm/index.mjs +1 -1
- package/dist/esm/instance/index.min.mjs +1 -1
- package/dist/esm/instance/index.mjs +1 -1
- package/dist/esm/introspection-TO27QT2X.min.mjs +2 -0
- package/dist/esm/{introspection-YJF3QAUK.mjs → introspection-ZUQYVEFC.mjs} +3 -3
- package/dist/esm/jobs/adapters/redis/index.min.mjs +1 -1
- package/dist/esm/jobs/adapters/redis/index.min.mjs.map +1 -1
- package/dist/esm/jobs/adapters/redis/index.mjs +10 -6
- package/dist/esm/jobs/adapters/redis/index.mjs.map +1 -1
- package/dist/esm/orm/adapters/in-memory/index.min.mjs +1 -1
- package/dist/esm/orm/adapters/in-memory/index.mjs +4 -3
- package/dist/esm/orm/adapters/json/index.min.mjs +1 -1
- package/dist/esm/orm/adapters/json/index.min.mjs.map +1 -1
- package/dist/esm/orm/adapters/json/index.mjs +6 -5
- package/dist/esm/orm/adapters/json/index.mjs.map +1 -1
- package/dist/esm/orm/adapters/mongodb/index.min.mjs +1 -1
- package/dist/esm/orm/adapters/mongodb/index.min.mjs.map +1 -1
- package/dist/esm/orm/adapters/mongodb/index.mjs +6 -4
- package/dist/esm/orm/adapters/mongodb/index.mjs.map +1 -1
- package/dist/esm/orm/adapters/postgresql/index.min.mjs +2 -2
- package/dist/esm/orm/adapters/postgresql/index.min.mjs.map +1 -1
- package/dist/esm/orm/adapters/postgresql/index.mjs +8 -5
- package/dist/esm/orm/adapters/postgresql/index.mjs.map +1 -1
- package/dist/esm/orm/index.min.mjs +1 -1
- package/dist/esm/orm/index.mjs +3 -3
- package/dist/esm/server/adapters/express/index.min.mjs +1 -1
- package/dist/esm/server/adapters/express/index.min.mjs.map +1 -1
- package/dist/esm/server/adapters/express/index.mjs +7 -3
- package/dist/esm/server/adapters/express/index.mjs.map +1 -1
- package/dist/esm/server/adapters/fastify/index.min.mjs +1 -1
- package/dist/esm/server/adapters/fastify/index.min.mjs.map +1 -1
- package/dist/esm/server/adapters/fastify/index.mjs +7 -3
- package/dist/esm/server/adapters/fastify/index.mjs.map +1 -1
- package/dist/esm/server/index.min.mjs +1 -1
- package/dist/esm/server/index.mjs +1 -1
- package/dist/esm/utilities/index.min.mjs +1 -1
- package/dist/esm/utilities/index.mjs +5 -4
- package/dist/esm/validations/index.min.mjs +1 -1
- package/dist/esm/validations/index.mjs +1 -1
- package/dist/types/{base-BDTBLZ9a.d.ts → base-BnwwLupM.d.ts} +3 -3
- package/dist/types/cache/adapters/in-memory/index.js +6 -3
- package/dist/types/cache/adapters/redis/index.js +5 -3
- package/dist/types/cache/index.js +2 -2
- package/dist/types/chunk-7MXHWHRV.js +134 -0
- package/dist/types/{chunk-LPB5LS7A.js → chunk-BKXNLF6X.js} +1 -1
- package/dist/types/{chunk-J3TGB5YQ.js → chunk-DZFKDZDZ.js} +8 -4
- package/dist/types/{chunk-YLJNBL6J.js → chunk-GQRSK2KP.js} +6 -4
- package/dist/types/chunk-PPD4WDG6.js +143 -0
- package/dist/types/{chunk-55CTVK7R.js → chunk-SZAA5GF6.js} +1 -1
- package/dist/types/{chunk-4DH3POYM.js → chunk-UGLZIYAR.js} +4 -4
- package/dist/types/{chunk-5Z26ZURE.js → chunk-UR7O43FC.js} +1 -1
- package/dist/types/{chunk-IZDJDGOV.js → chunk-X5ZDIXCZ.js} +2 -2
- package/dist/types/{chunk-TT5EORDK.js → chunk-YGIIUOQM.js} +166 -346
- package/dist/types/dbs/adapters/mongodb/index.js +8 -5
- package/dist/types/dbs/index.js +5 -3
- package/dist/types/errors/index.d.ts +8 -3
- package/dist/types/errors/index.js +3 -1
- package/dist/types/events/adapters/kafka/index.js +4 -2
- package/dist/types/events/adapters/rabbitmq/index.js +7 -3
- package/dist/types/index.js +1 -1
- package/dist/types/instance/index.js +1 -1
- package/dist/types/{introspection-EHGM4RMO.js → introspection-ZQMYTW6H.js} +2 -2
- package/dist/types/jobs/adapters/redis/index.js +10 -6
- package/dist/types/orm/adapters/in-memory/index.js +4 -3
- package/dist/types/orm/adapters/json/index.js +6 -5
- package/dist/types/orm/adapters/mongodb/index.js +6 -4
- package/dist/types/orm/adapters/postgresql/index.js +8 -5
- package/dist/types/orm/index.js +3 -3
- package/dist/types/{requestError-DdaL8hc3.d.ts → requestError-BmOhSuFb.d.ts} +1 -0
- package/dist/types/server/adapters/express/index.d.ts +2 -2
- package/dist/types/server/adapters/express/index.js +7 -3
- package/dist/types/server/adapters/fastify/index.d.ts +3 -3
- package/dist/types/server/adapters/fastify/index.js +7 -3
- package/dist/types/server/index.d.ts +4 -4
- package/dist/types/server/index.js +1 -1
- package/dist/types/utilities/index.d.ts +1 -2
- package/dist/types/utilities/index.js +5 -4
- package/dist/types/{validationError-oigtHqBi.d.ts → validationError-C2tVK4s7.d.ts} +1 -1
- package/dist/types/validations/index.d.ts +4 -4
- package/dist/types/validations/index.js +1 -1
- package/package.json +1 -1
- package/dist/esm/chunk-7NF7PV6S.min.mjs +0 -2
- package/dist/esm/chunk-A4P7P6BU.mjs.map +0 -1
- package/dist/esm/chunk-IN5YKIJ7.min.mjs +0 -32
- package/dist/esm/chunk-IN5YKIJ7.min.mjs.map +0 -1
- package/dist/esm/chunk-MQXTTWPS.min.mjs +0 -2
- package/dist/esm/introspection-THKMXV5V.min.mjs +0 -2
- /package/dist/esm/{chunk-2GGMLKRP.min.mjs.map → chunk-4GZ43EQ2.min.mjs.map} +0 -0
- /package/dist/esm/{chunk-IRYCN6PI.min.mjs.map → chunk-5FEVQT6K.min.mjs.map} +0 -0
- /package/dist/esm/{chunk-LKS5ZE45.mjs.map → chunk-74GY55PM.mjs.map} +0 -0
- /package/dist/esm/{chunk-HXFNN6RI.mjs.map → chunk-C3G4W4ZV.mjs.map} +0 -0
- /package/dist/esm/{chunk-676VIABN.min.mjs.map → chunk-LJZOS62I.min.mjs.map} +0 -0
- /package/dist/esm/{chunk-7SQ5JQYR.min.mjs.map → chunk-MCX2O5IT.min.mjs.map} +0 -0
- /package/dist/esm/{chunk-BWUFPMVG.mjs.map → chunk-MNKDFIVK.mjs.map} +0 -0
- /package/dist/esm/{chunk-TSVHZZE4.mjs.map → chunk-RFJ5URMP.mjs.map} +0 -0
- /package/dist/esm/{chunk-3TP7NINX.mjs.map → chunk-XESM7IWM.mjs.map} +0 -0
- /package/dist/esm/{chunk-P4PRHHIY.min.mjs.map → chunk-YWQTFKNY.min.mjs.map} +0 -0
- /package/dist/esm/{introspection-THKMXV5V.min.mjs.map → introspection-TO27QT2X.min.mjs.map} +0 -0
- /package/dist/esm/{introspection-YJF3QAUK.mjs.map → introspection-ZUQYVEFC.mjs.map} +0 -0
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as Ft}from "../chunk-676VIABN.min.mjs";import{A as zt,B as Qt,C as Xt,D as te,E as Zt,a as h,b as It,c as v,d as J,e as xe,f as ee,g as k,h as Se,i as x,j as pt,k as B,l as Ct,m as Ut,n as Mt,o as Nt,p as Dt,q as _t,r as Kt,s as Ht,t as _,u as Lt,v as jt,w as Vt,x as Gt,y as Wt,z as $t}from "../chunk-7SQ5JQYR.min.mjs";import{K as we,a as f}from "../chunk-IN5YKIJ7.min.mjs";import"../chunk-DSUJ5FUL.min.mjs";import"../chunk-AQY7QVYI.min.mjs";var g=class extends f{id;phase;constructor(e){super(`Migration failed at phase '${e.phase}' for migration '${e.id}'`,{id:e.id,phase:e.phase},e.cause),this.id=e.id,this.phase=e.phase}};function lt(a){if(a.op==="and"&&a.children.length===1&&a.children[0]instanceof ee&&a.children[0].op==="eq"){let e=a.children[0];return`${e.field}=${e.value}`}return be(a)}function be(a){if(a instanceof ee)return`${a.field} ${a.op} ${JSON.stringify(a.value)}`;let e=a.children.map(t=>be(t));return e.length===1?e[0]:`(${e.join(` ${a.op} `)})`}var K=class extends f{schema;operation;where;constructor(e){let t=e.message??`${e.schema}.${e.operation}: no row matched ${lt(e.where)}`;super(t,{schema:e.schema,operation:e.operation,where:e.where}),this.schema=e.schema,this.operation=e.operation,this.where=e.where}};var F=class extends f{key;eventName;constructor(e){super(`EventLog replay failed on event ${e.name} (key=${e.key})`,{key:e.key,name:e.name},e.cause),this.key=e.key,this.eventName=e.name}};import{ulid as ut}from"ulid";import{v as ft}from"valleyed";import{ulid as mt}from"ulid";import{v as T}from"valleyed";import"valleyed";var ae=class a{#e;#t;#a;#r;constructor(e,t,r,n){this.#e=e,this.#t=t??null,this.#a=r??{},this.#r=n??{}}get name(){return this.#e}pk(e,t,r){return new a(this.#e,new J(e,t,{onCreate:r}),{...this.#a},void 0)}field(e,t,r){let n={...this.#a,[e]:new J(e,t,r)};return new a(this.#e,this.#t,n,{...this.#r})}computed(e,t,r,n){let o={...this.#r,[e]:new xe(e,r,t,n)};return new a(this.#e,this.#t,{...this.#a},o)}build(){let e=this;return new I(e.#e,e.#t,e.#a,e.#r)}},I=class{#e;#t;#a;#r;constructor(e,t,r,n){this.#e=e,this.#t=t,this.#a=r,this.#r=n,this.#t&&Object.defineProperty(this.#t,"__schema",{value:this,enumerable:!1,configurable:!0});for(let o of Object.values(this.#a))Object.defineProperty(o,"__schema",{value:this,enumerable:!1,configurable:!0})}get name(){return this.#e}get pkField(){if(!this.#t)throw new Error(`Schema "${this.#e}" does not have a primary key defined`);return this.#t}get fieldDefs(){return this.#a}get computedDefs(){return this.#r}get fields(){return{...this.#t?{[this.#t.name]:this.#t}:{},...this.#a}}static from(e){return new ae(e)}};var E=I.from("event_log").pk("key",T.string(),()=>mt()).field("name",T.string()).field("ts",T.number()).field("body",T.any()).field("by",T.nullable(T.string())).build();async function ve(a,e,t,r,n){let o=ft.validate(t.pipe,r);if(!o.valid)throw new h("validation","event_log","fire",[{cause:o.error}]);return a.session(async()=>{let s=n?.at??new Date,i=s.getTime(),d=ut(i),c=n?.by??null;await a.on(E).one().create({key:d,name:e,ts:i,body:o.value,by:c});let m={key:d,name:e,ts:i,body:o.value,by:c,at:s,firstRun:!0};return await t.handle(o.value,m)})}var H=class{#e=new Map;#t=[];register(e,t){if(this.#e.has(e))throw new f(`EventLog handler "${e}" is already registered`,{name:e});this.#e.set(e,t),this.#t.push(e)}get(e){let t=this.#e.get(e);if(!t)throw new f(`EventLog handler "${e}" is not registered`,{name:e});return t}list(){return[...this.#t]}};var Ae=async(a,e,t)=>{let r={key:t.key,name:t.name,ts:t.ts,body:t.body,by:t.by,at:new Date(t.ts),firstRun:!1};try{await a.session(async()=>{await e.handle(t.body,r)})}catch(n){throw new F({key:t.key,name:t.name,cause:n})}};async function ke(a,e,t){let r=a.on(E).all().orderBy("ts","asc");t?.from&&(r=r.where(o=>o.gte("ts",t.from.getTime())));let n=await r.find();for(let o of n)await Ae(a,e.get(o.name),o)}async function Oe(a,e,t){let r=await a.on(E).one().id(t).find();if(!r)throw new F({key:t,name:"unknown",cause:new Error(`Event with key "${t}" not found`)});await Ae(a,e.get(r.name),r)}var re=class a{#e;#t;constructor(e,t){this.#e=e,this.#t=t}handler(e,t){return this.#t.register(e,t),(r,n)=>ve(this.#e,e,t,r,n)}replay(e){return ke(this.#e,this.#t,e)}rerun(e){return Oe(this.#e,this.#t,e)}static from(e){return{build:()=>new a(e,new H)}}};var Re=["dropForeignKey","dropIndex","dropField","dropTable","renameTable","renameField","createTable","addField","modifyField","addIndex","addForeignKey"];function yt(a,e){if(e==="execute")return!0;let t=`apply${e[0].toUpperCase()}${e.slice(1)}`;return typeof a[t]=="function"}function ht(a,e){return!(a.type!==e.type||(a.nullable??!1)!==e.nullable||a.default!==e.default||(a.unique??!1)!==(e.unique??!1))}var ne=a=>({name:a.name,type:a.type,...a.nullable?{nullable:!0}:{}});function gt(a){let e=a.pkField,t=Be(e.pipe),r=[];for(let n of Object.values(a.fieldDefs)){let o=n;r.push({name:o.name,type:Be(o.pipe),nullable:xt(o.pipe)})}return{name:a.name,pk:{name:e.name,type:t},fields:r}}var wt=new Set(["string","number","boolean","array","object","date"]);function Be(a){if(!a)return"string";let e=typeof a.schema=="function"?a.schema():void 0;if(e?.type)return wt.has(e.type)?e.type:"string";let t=a["~standard"];if(t?.validate){if(!t.validate(0).issues)return"number";if(!t.validate("").issues)return"string";if(!t.validate(!0).issues)return"boolean";if(!t.validate([]).issues)return"array";if(!t.validate({}).issues)return"object"}return"string"}function xt(a){if(!a)return!1;if((typeof a.context=="function"?a.context():void 0)?.optional)return!0;let t=a["~standard"];return!!(t?.validate&&!t.validate(void 0).issues)}function Te(a,e,t){let r=[],n=new Map(t.map(s=>[s.name,s])),o=new Map(e.map(s=>[s.name,s]));for(let s of t)if(!o.has(s.name)){for(let i of s.foreignKeys)r.push({kind:"dropForeignKey",table:s.name,name:i.name});for(let i of s.indexes)r.push({kind:"dropIndex",name:i.name});r.push({kind:"dropTable",name:s.name})}for(let s of e){let i=gt(s),d=n.get(i.name);if(!d){r.push({kind:"createTable",name:i.name,pk:i.pk,fields:i.fields.map(ne)});continue}let c=new Map(d.fields.map(p=>[p.name,p])),m=new Map(i.fields.map(p=>[p.name,p]));for(let p of d.fields)m.has(p.name)||r.push({kind:"dropField",table:i.name,name:p.name});for(let p of i.fields){let y=c.get(p.name);y?ht(p,y)||r.push({kind:"modifyField",table:i.name,name:p.name,to:ne(p)}):r.push({kind:"addField",table:i.name,field:ne(p)})}}return r.filter(s=>yt(a,s.kind)).sort((s,i)=>Re.indexOf(s.kind)-Re.indexOf(i.kind))}var Ee=class a{#e;#t;constructor(e,t,r){this.#e=t,this.#t=r}async diff(){let e=await this.#e.introspect(),t=Te(this.#e,this.#t,e);return t.length===0?null:t}async discover(){return this.#e.introspect()}static from(e,t){return{target(r){return{build(){return new a(e,t,r)}}}}}};async function Pe(a,e,t){if(t.kind==="execute"){await t.up(e);return}let r=`apply${t.kind[0].toUpperCase()}${t.kind.slice(1)}`,n=a[r];if(typeof n!="function")throw new Error(`Adapter does not support change kind '${t.kind}'`);await n.call(a,t)}function oe(a,e,t){let r=new Set(e.map(c=>c.id)),n=new Set(a.map(c=>c.id)),o=e.filter(c=>!n.has(c.id)).map(c=>c.id);if(o.length>0)throw new g({id:o[0],phase:"load",cause:`orphan migrations: [${o.join(", ")}]`});let s=[...a].sort((c,m)=>c.id.localeCompare(m.id)),i=[],d=[];for(let c of s)r.has(c.id)?d.push(c.id):i.push(c);if(t?.to!==void 0){let c=i.findIndex(m=>m.id===t.to);if(c===-1){if(r.has(t.to))return{pending:[],skipped:d};throw new g({id:t.to,phase:"load",cause:`unknown migration id: ${t.to}`})}i.splice(c+1)}return t?.steps!==void 0&&i.splice(t.steps),{pending:i,skipped:d}}function u(a){return!a||a.trim()===""}function se(a,e,t){u(e.name)&&a.failures.push({migrationId:a.migrationId,changeIndex:a.changeIndex,field:t,cause:`${t} name must be non-empty`}),a.adapter.supportedFieldTypes.length>0&&!a.adapter.supportedFieldTypes.includes(e.type)&&a.failures.push({migrationId:a.migrationId,changeIndex:a.changeIndex,field:t,cause:`unsupported field type '${e.type}'`})}function l(a,e,t){a.failures.push({migrationId:a.migrationId,changeIndex:a.changeIndex,...e?{field:e}:{},cause:t})}function St(a,e,t,r,n){if(e.kind==="execute")return;let o={adapter:a,migrationId:t,changeIndex:r,failures:n},s=`apply${e.kind[0].toUpperCase()}${e.kind.slice(1)}`;switch(typeof a[s]!="function"&&l(o,void 0,`adapter does not support change kind '${e.kind}'`),e.kind){case"createTable":{u(e.name)&&l(o,"name","table name must be non-empty"),u(e.pk.name)&&l(o,"pk.name","pk name must be non-empty"),a.supportedFieldTypes.length>0&&!a.supportedFieldTypes.includes(e.pk.type)&&l(o,"pk.type",`unsupported field type '${e.pk.type}'`);let i=new Set;for(let d of e.fields)se(o,d,"field"),i.has(d.name)&&l(o,"fields",`duplicate field name '${d.name}' in createTable`),i.add(d.name);e.pk.name&&i.has(e.pk.name)&&l(o,"pk.name",`pk name '${e.pk.name}' collides with a field name`);break}case"dropTable":{u(e.name)&&l(o,"name","table name must be non-empty");break}case"addField":{u(e.table)&&l(o,"table","table name must be non-empty"),se(o,e.field,"field");break}case"dropField":{u(e.table)&&l(o,"table","table name must be non-empty"),u(e.name)&&l(o,"name","field name must be non-empty");break}case"modifyField":{u(e.table)&&l(o,"table","table name must be non-empty"),u(e.name)&&l(o,"name","field name must be non-empty"),se(o,e.to,"to");break}case"renameTable":{u(e.from)&&l(o,"from","table name must be non-empty"),u(e.to)&&l(o,"to","table name must be non-empty");break}case"renameField":{u(e.table)&&l(o,"table","table name must be non-empty"),u(e.from)&&l(o,"from","field name must be non-empty"),u(e.to)&&l(o,"to","field name must be non-empty");break}case"addIndex":{u(e.table)&&l(o,"table","table name must be non-empty"),(!e.on||e.on.length===0)&&l(o,"on","addIndex.on must be non-empty");break}case"dropIndex":{u(e.name)&&l(o,"name","index name must be non-empty");break}case"addForeignKey":{u(e.table)&&l(o,"table","table name must be non-empty"),u(e.on)&&l(o,"on","addForeignKey.on must be non-empty"),u(e.references?.table)&&l(o,"references.table","references table must be non-empty"),u(e.references?.column)&&l(o,"references.column","references column must be non-empty");break}case"dropForeignKey":{u(e.table)&&l(o,"table","table name must be non-empty"),u(e.name)&&l(o,"name","foreign key name must be non-empty");break}}}function ie(a,e){let t=[],r=new Set;for(let n of e){if(u(n.id)){t.push({cause:"migration id must be a non-empty string"});continue}r.has(n.id)&&t.push({migrationId:n.id,cause:`duplicate migration id '${n.id}'`}),r.add(n.id);for(let o=0;o<n.changes.length;o++)St(a,n.changes[o],n.id,o,t)}if(t.length>0)throw new h("changes","migrations","build",t)}var qe=class a{#e;#t;#a;#r;constructor(e,t,r,n=!1){this.#e=e,this.#t=t,this.#a=r,this.#r=n}#o(e){if(typeof this.#t[e]!="function"){let t=e==="loadMigrations"?"load":"record";throw new g({id:"",phase:t,cause:`adapter does not implement ${e}`})}}async up(e){if(this.#o("loadMigrations"),this.#o("recordMigration"),!this.#r&&typeof this.#t.acquireMigrationLock=="function")try{return await this.#t.acquireMigrationLock(()=>this.#n(e))}catch(r){throw r instanceof g?r:new g({id:"",phase:"lock",cause:r})}return this.#n(e)}async status(){this.#o("loadMigrations");let e=await this.#t.loadMigrations(),t=new Map(e.map(n=>[n.id,n.appliedAt]));return[...this.#a].sort((n,o)=>n.id.localeCompare(o.id)).map(n=>{let o=t.get(n.id);return o!==void 0?{id:n.id,applied:!0,appliedAt:o}:{id:n.id,applied:!1}})}async dry(e){this.#o("loadMigrations");let t=await this.#t.loadMigrations(),{pending:r}=oe(this.#a,t,e);return{would:r.map(n=>n.id)}}async#n(e){let t;try{t=await this.#t.loadMigrations()}catch(s){throw new g({id:"",phase:"load",cause:s})}let{pending:r,skipped:n}=oe(this.#a,t,e),o=[];for(let s of r){let i=async()=>{for(let c of s.changes)try{await Pe(this.#t,this.#e,c)}catch(m){throw new g({id:s.id,phase:"user",cause:m})}try{await this.#t.recordMigration(s.id,Date.now())}catch(c){throw new g({id:s.id,phase:"record",cause:c})}};if(s.tx!==!1&&typeof this.#t.session=="function")try{await this.#e.session(i)}catch(c){throw c instanceof g?c:new g({id:s.id,phase:"session",cause:c})}else await i();o.push(s.id)}return{ran:o,skipped:n}}static from(e,t){return{migrations(r){return{build(){return ie(t,r),new a(e,t,r)},withoutLock(){return{build(){return ie(t,r),new a(e,t,r,!0)}}}}}}}};var L=class{constructor(e,t){this.direction=t;this.field=v(e)}field};var A=class{constructor(e,t,r,n,o){this.name=e;this.source=t;this.target=r;this.foreignKey=n;this.references=o}},S=class{constructor(e,t,r,n,o,s){this.name=e;this.source=t;this.target=r;this.foreignKey=n;this.fkOwner=o;this.references=s}},de=class a{#e;#t;constructor(e,t){this.#e=e,this.#t=t??{}}hasMany(e,t){let r=t.__schema,n={...this.#t,[e]:new A(e,this.#e,r,t,this.#e.pkField)};return new a(this.#e,n)}hasOne(e,t){let r=t.__schema,n={...this.#t,[e]:new S(e,this.#e,r,t,"target",this.#e.pkField)};return new a(this.#e,n)}belongsTo(e,t,r,n){let o=n??r.pkField,s={...this.#t,[e]:new S(e,this.#e,r,t,"source",o)};return new a(this.#e,s)}build(){return this.#t}},Fe=class{static from(e){return new de(e)}};import{v as bt}from"valleyed";function P(a,e){let t=a.computedDefs,r=new Set(Object.keys(t)),n=new Set(Object.keys(a.fields));if(!e||e.length===0)return{requestedSelect:null,adapterSelect:void 0,computeNames:[...r]};let o=new Set(e),s=new Set,i=new Set;for(let d of e){if(n.has(d)){s.add(d);continue}if(r.has(d)){i.add(d);for(let c of t[d].deps)s.add(c);continue}throw new f("Unknown selected field",{schema:a.name,selectedField:d,availableFields:[...n,...r]})}return{requestedSelect:o,adapterSelect:[...s],computeNames:[...i]}}function Ie(a,e,t){let r=a.computedDefs;return e.map(n=>{let o={...n};for(let i of t.computeNames){let d=r[i],c={};for(let p of d.deps){if(!(p in n))throw new f("Computed field dependency missing from adapter result",{schema:a.name,computedField:i,dependency:p,dependencies:d.deps});c[p]=n[p]}let m=bt.validate(d.pipe,d.compute(c));if(!m.valid)throw new f("Computed field validation failed",{schema:a.name,computedField:i,cause:m.error});o[i]=m.value}if(!t.requestedSelect)return o;let s={};for(let i of t.requestedSelect)i in o&&(s[i]=o[i]);return s})}var vt=100,Ce=5;function Ue(a){return a instanceof A||a instanceof S}function Me(a){return typeof a=="object"&&a!=null&&"def"in a}function At(a){return`${a.source.name}.${a.name}->${a.target.name}`}function q(a){return typeof a=="number"&&Number.isSafeInteger(a)&&a>0}function j(a){return typeof a=="number"&&Number.isSafeInteger(a)&&a>=0}function ce(){return we.maybeGet()?.settings.utils.paginationDefaultLimit??vt}function V(a,e,t){if(!e||e.length===0)return;let r=new Set(Object.keys(a.fields)),n=new Set(Object.keys(a.computedDefs));for(let o of e)r.has(o)||n.has(o)||t.push({field:o,cause:`Unknown selected field "${o}" on schema "${a.name}"`})}function C(a,e,t,r=1,n=[]){if(e!=null){if(!Array.isArray(e)){t.push({cause:"Preloads must be an array"});return}if(e.length!==0){if(r>Ce){t.push({cause:`Preload depth exceeded max depth ${Ce}`});return}for(let o of e){let s=Ue(o)?o:Me(o)?o.def:void 0;if(!Ue(s)){t.push({cause:"Invalid preload definition: expected a relation definition or nested preload definition with `def`"});continue}s.source!==a&&t.push({field:s.name,cause:`Preload relation "${s.name}" belongs to source schema "${s.source.name}" but was used from schema "${a.name}"`});let i=At(s);if(n.includes(i)){t.push({field:s.name,cause:`Preload cycle detected: ${[...n,i].join(" -> ")}`});continue}if(Me(o)){let d=o.preloads??[];if(!Array.isArray(d)){t.push({field:s.name,cause:`Nested preloads for relation "${s.name}" must be an array`});continue}C(s.target,d,t,r+1,[...n,i])}}}}}function pe(a,e){if(q(a))return a;e.push({field:"limit",option:"limit",cause:"Limit must be a positive safe integer"})}function le(a,e){if(j(a))return a;e.push({field:"offset",option:"offset",cause:"Offset must be a non-negative safe integer"})}function me(a,e){if(q(a))return a;e.push({field:"page",option:"page",cause:"Page must be a positive safe integer"})}function kt(a,e){if(a!==void 0){if(q(a))return a;e.push({field:"batchSize",option:"batchSize",cause:"Batch size must be a positive safe integer"})}}function Ot(a,e){if(a!==void 0){if(a==null||typeof a!="object"||Array.isArray(a)){e.push({option:"batchSize",cause:"Iteration options must be an object"});return}return kt(a.batchSize,e)}}function G(a,e,t){if(t.length>0)throw new h("query-shape",a.name,e,t)}function Ne(a,e,t){let r=[];V(a,t.select,r),C(a,t.preloads,r),G(a,e,r)}function De(a,e,t){let r=[];V(a,t.select,r),C(a,t.preloads,r);let n=t.limitSource===void 0?void 0:pe(t.limitSource.value,r),o;if(t.offsetSource?.kind==="offset")o=le(t.offsetSource.value,r);else if(t.offsetSource?.kind==="page"){let s=me(t.offsetSource.value,r);if(n===void 0&&t.limitSource===void 0&&(n=ce(),q(n)||(r.push({field:"limit",cause:"Default page limit must be a positive safe integer"}),n=void 0)),s!==void 0&&n!==void 0){let i=(s-1)*n;j(i)?o=i:r.push({field:"offset",cause:"Resolved page offset must be a non-negative safe integer"})}}return G(a,e,r),{limit:n,offset:o}}function _e(a,e,t,r){let n=[];V(a,t.select,n),C(a,t.preloads,n);let o=t.limitSource===void 0?void 0:pe(t.limitSource.value,n),s,i=Ot(r,n);if(t.offsetSource?.kind==="offset")s=le(t.offsetSource.value,n);else if(t.offsetSource?.kind==="page"){let d=me(t.offsetSource.value,n);if(o===void 0&&t.limitSource===void 0&&(o=ce(),q(o)||(n.push({field:"limit",option:"limit",cause:"Default page limit must be a positive safe integer"}),o=void 0)),d!==void 0&&o!==void 0){let c=(d-1)*o;j(c)?s=c:n.push({field:"offset",option:"offset",cause:"Resolved page offset must be a non-negative safe integer"})}}return G(a,e,n),{limit:o,offset:s,batchSize:i}}function Ke(a,e,t){let r=[];V(a,t.select,r),C(a,t.preloads,r);let n;t.limitSource===void 0?(n=ce(),q(n)||(r.push({field:"limit",cause:"Default page limit must be a positive safe integer"}),n=void 0)):n=pe(t.limitSource.value,r);let o=0,s=1;if(t.offsetSource?.kind==="offset"){let i=le(t.offsetSource.value,r);i!==void 0&&(o=i,n!==void 0&&(s=Math.floor(i/n)+1))}else if(t.offsetSource?.kind==="page"){let i=me(t.offsetSource.value,r);if(i!==void 0&&(s=i),i!==void 0&&n!==void 0){let d=(i-1)*n;j(d)?o=d:r.push({field:"offset",cause:"Resolved page offset must be a non-negative safe integer"})}}return G(a,e,r),{limit:n,offset:o,current:s}}import{v as O}from"valleyed";function He(a,e){let t=[],r={};for(let[n,o]of Object.entries(a.fields)){let s=o.onCreate?O.defaults(o.pipe,o.onCreate()):o.pipe,i=n in e?e[n]:void 0,d=O.validate(s,i);d.valid?r[n]=d.value:t.push({field:n,cause:d.error})}return t.length>0?{ok:!1,failures:t}:{ok:!0,value:r}}function ue(a,e){let t=He(a,e);if(!t.ok)throw new h("validation",a.name,"createOne",t.failures);return t.value}function Le(a,e){let t=[],r=[];for(let n=0;n<e.length;n++){let o=He(a,e[n]);if(o.ok)r.push(o.value);else for(let s of o.failures)t.push({...s,rowIndex:n})}if(t.length>0)throw new h("validation",a.name,"createMany",t);return r}function W(a,e){let t={},r={};for(let[s,i]of Object.entries(e))_(i)?r[s]=i:s in a.fieldDefs&&(t[s]=a.fieldDefs[s].pipe);for(let[s,i]of Object.entries(a.fieldDefs))!(s in e)&&i.onUpdate&&(t[s]=O.defaults(i.pipe,i.onUpdate()));let n=O.validate(O.object(t),e);if(!n.valid)throw new h("validation",a.name,"updateByPk",[{cause:n.error}]);return{...n.value,...r}}function rr(a,e,t="updateByPk"){let r=new Map;for(let d=0;d<e.length;d++)for(let c of te(e[d]))r.has(c)||r.set(c,[]),r.get(c).push(d);let n=[];for(let[d,c]of Object.entries(a.fieldDefs))if(c.onUpdate&&!r.has(d)){let m=new B({[d]:c.onUpdate()});n.push(m),r.set(d,[e.length+n.length-1])}let o=[...e,...n],s=[];for(let[d,c]of r)c.length>1&&s.push({field:d,cause:`field "${d}" touched by multiple ops at indices [${c.join(", ")}]`});if(s.length>0)throw new h("conflicting-ops",a.name,t,s);let i=[];for(let d=0;d<o.length;d++){let c=o[d];if(c instanceof B)for(let[m,p]of Object.entries(c.values)){let y=a.fields[m];if(!y)continue;let b=O.validate(y.pipe,p);b.valid||i.push({opIndex:d,field:m,cause:b.error})}}if(i.length>0)throw new h("validation",a.name,t,i);return o}function je(a,e,t,r){let n=a(t);for(let s of e)n=s(n,t);let o=O.validate(r,n);if(!o.valid)throw new h("validation",t.name,"schemaConfig",[{cause:o.error}]);return o.value}function Ve(a,e,t){let r=new Set(Object.keys(e)),n=[];for(let o of t)if(!(o instanceof B))for(let s of te(o))r.has(s)&&n.push({field:s,cause:`field "${s}" present in both create payload and atomic op "${o.kind}"`});if(n.length>0)throw new h("conflicting-ops",a.name,"upsertOne",n)}async function Ge(a,e){x(a.schema,e.where),Ne(a.schema,"findOne",e);let t=await a.use.findOne(e.where);return t?a.shapeOneRow(e.select,e.preloads,t):null}async function We(a,e){x(a.schema,e.where);let t=De(a.schema,"findMany",e),r=P(a.schema,e.select),n=await a.use.findMany(e.where,{select:r.adapterSelect,orderBy:[...e.orderBy],limit:t.limit,offset:t.offset});return a.shapeRows(e.select,e.preloads,n)}async function $e(a,e){return x(a.schema,e.where),a.use.count(e.where)}function Rt(a,e,t,r){let o=Math.ceil(e/t)||1,s=r<=1||r>o?null:r-1,i=r>=o?null:r+1;return{pages:{current:r,start:1,last:o,previous:s,next:i},docs:{limit:t,total:e,count:a.length},items:a}}async function ze(a,e){x(a.schema,e.where);let t=Ke(a.schema,"paginate",e),r=P(a.schema,e.select),n=a.use,[o,s]=await Promise.all([n.findMany(e.where,{select:r.adapterSelect,orderBy:[...e.orderBy],limit:t.limit,offset:t.offset}),n.count(e.where)]),i=await a.shapeRows(e.select,e.preloads,o);return Rt(i,s,t.limit,t.current)}async function*Qe(a,e,t){x(a.schema,e.where);let r=_e(a.schema,"iterate",e,t),n=P(a.schema,e.select);for await(let o of a.use.iterateMany(e.where,{select:n.adapterSelect,orderBy:[...e.orderBy],limit:r.limit,offset:r.offset,...r.batchSize===void 0?{}:{batchSize:r.batchSize}})){let i=(await a.shapeRows(e.select,e.preloads,[o]))[0];i&&(yield i)}}async function Xe(a,e,t){let r=ue(a.schema,t),n=await a.use.createOne(r),[o]=await a.shapeRows(e.select,e.preloads,[n]);return o}async function Ze(a,e,t){let r=Le(a.schema,t),n=await a.use.createMany(r);return a.shapeRows(e.select,e.preloads,n)}async function Ye(a,e,t){x(a.schema,e.where);let r=W(a.schema,t),n=await a.use.updateOne(e.where,r);return a.shapeOneRow(e.select,e.preloads,n)}async function Je(a,e,t){x(a.schema,e.where);let r=W(a.schema,t),n=await a.use.updateMany(e.where,r);return a.shapeRows(e.select,e.preloads,n)}async function et(a,e,t){x(a.schema,e.where);let r=ue(a.schema,t.create),n=[];if("update"in t){let s=W(a.schema,t.update),i={};for(let[d,c]of Object.entries(s))_(c)?n.push(c):i[d]=c;Object.keys(i).length>0&&n.unshift(new B(i))}n.length>0&&Ve(a.schema,t.create,n);let o=await a.use.upsertOne(e.where,r,n);return await a.shapeOneRow(e.select,e.preloads,o)}async function tt(a,e){x(a.schema,e.where);let t=await a.use.deleteOne(e.where);return a.shapeOneRow(e.select,e.preloads,t)}async function at(a,e){x(a.schema,e.where);let t=await a.use.deleteMany(e.where);return a.shapeRows(e.select,e.preloads,t)}async function rt(a,e){return Se(a.schema,a.use,e),a.use.aggregate(e)}var fe=5;function Bt(a){return typeof a=="object"&&a!=null&&"def"in a}function Tt(a){return`${a.source.name}.${a.name}->${a.target.name}`}function ye(a,e){return[...new Set(a.map(t=>t[e]).filter(t=>t!=null))]}function nt(a,e,t,r){return a.map(n=>({...n,[e]:r.get(n[t])??null}))}function Et(a,e,t,r){return a.map(n=>({...n,[e]:r.get(n[t])??[]}))}function ot(a){return a.map(e=>{if(e instanceof A||e instanceof S)return{def:e,preloads:[]};if(!Bt(e)||!(e.def instanceof A||e.def instanceof S))throw new Error("Invalid preload definition: nested preloads must include a relation definition in `def`");return{def:e.def,preloads:ot(e.preloads??[])}})}async function st(a,e,t){return $(a,ot(e),t,1,[])}async function $(a,e,t,r,n){for(let o of e)a=await Pt(a,o,t,r,n);return a}async function Pt(a,e,t,r,n){if(r>fe)throw new f(`Preload depth exceeded max depth ${fe}`,{operation:"resolvePreload",depth:r,maxDepth:fe});let{def:o}=e,{target:s,name:i}=o,d=Tt(o);if(n.includes(d))throw new f(`Preload cycle detected: ${[...n,d].join(" -> ")}`,{operation:"resolvePreload",path:n,step:d});let c=[...n,d];if(o instanceof S){if(o.fkOwner==="source"){let w=o.references.name,R=ye(a,o.foreignKey.name);if(R.length===0)return a.map(D=>({...D,[i]:null}));let N=await t(s).findMany(k.create().in(w,R));e.preloads.length>0&&N.length>0&&(N=await $(N,e.preloads,t,r+1,c));let ct=new Map(N.map(D=>[D[w],D]));return nt(a,i,o.foreignKey.name,ct)}let m=o.references.name,p=ye(a,m);if(p.length===0)return a.map(w=>({...w,[i]:null}));let y=await t(s).findMany(k.create().in(o.foreignKey,p));e.preloads.length>0&&y.length>0&&(y=await $(y,e.preloads,t,r+1,c));let b=new Map(y.map(w=>[w[o.foreignKey.name],w]));return nt(a,i,m,b)}if(o instanceof A){let m=o.references.name,p=ye(a,m);if(p.length===0)return a.map(w=>({...w,[i]:[]}));let y=await t(s).findMany(k.create().in(o.foreignKey,p));e.preloads.length>0&&y.length>0&&(y=await $(y,e.preloads,t,r+1,c));let b=new Map;for(let w of y){let R=w[o.foreignKey.name];b.has(R)||b.set(R,[]),b.get(R).push(w)}return Et(a,i,m,b)}throw new Error(`Unknown relation kind: ${String(Reflect.get(o,"kind"))}; expected OneRelation or ManyRelation`)}var U=class{constructor(e,t){this.schema=e;this.getUse=t}async shapeRows(e,t,r){let n=P(this.schema,e),o=Ie(this.schema,r,n);return t.length===0?o:await st(o,t,this.getUse)}async shapeOneRow(e,t,r){if(!r)return null;let[n]=await this.shapeRows(e,t,[r]);return n??null}get use(){return this.getUse(this.schema)}},z=class{_context;_where;_select;_preloads;constructor(e,t){this._context=e,this._where=t?.where?t.where.clone():k.create(),this._select=t?.select,this._preloads=t?.preloads??[]}where(e){let t=e(this._where.clone());return this._clone({where:t,select:this._select,preloads:this._preloads})}select(e){return this._clone({select:e})}preload(e){return this._clone({preloads:e})}_readState(e={}){return{where:e.where??this._where.clone(),select:e.select??this._select,preloads:e.preloads??[...this._preloads]}}},M=class{#e;constructor(e){this.#e=e}one(){return new Q(this.#e)}all(){return new X(this.#e)}aggregate(){return new Z(this.#e)}raw(...e){return this.#e.use.raw(...e)}},Q=class a extends z{_required;_requiredMessage;constructor(e,t,r){super(e,t),this._required=r?.required??!1,this._requiredMessage=r?.message}id(e){let t=this._where.clone().eq(this._context.schema.pkField,e);return this._clone({where:t,select:this._select,preloads:this._preloads})}required(e){return new a(this._context,this._readState(),{required:!0,message:e})}_assertFound(e,t){if(this._required&&e===null)throw new K({schema:this._context.schema.name,operation:t,where:this._where,message:this._requiredMessage})}_clone(e){return new a(this._context,this._readState(e),{required:this._required,message:this._requiredMessage})}create(e){return Xe(this._context,{select:this._select,preloads:this._preloads},e)}async update(e){let t=await Ye(this._context,{where:this._where,select:this._select,preloads:this._preloads},e);return this._assertFound(t,"updateOne"),t}upsert(e){return et(this._context,{where:this._where,select:this._select,preloads:this._preloads},e)}async delete(){let e=await tt(this._context,{where:this._where,select:this._select,preloads:this._preloads});return this._assertFound(e,"deleteOne"),e}async find(){let e=await Ge(this._context,{where:this._where,select:this._select,preloads:this._preloads});return this._assertFound(e,"findOne"),e}},X=class a extends z{#e;#t;#a;constructor(e,t,r){super(e,t),this.#e=r?.orderBy??[],this.#t=r?.limitSource,this.#a=r?.offsetSource}#r(e){let t=r=>Object.prototype.hasOwnProperty.call(e,r);return new a(this._context,this._readState(),{orderBy:t("orderBy")?e.orderBy:[...this.#e],limitSource:t("limitSource")?e.limitSource:this.#t,offsetSource:t("offsetSource")?e.offsetSource:this.#a})}_clone(e){return new a(this._context,this._readState({where:e.where,select:e.select,preloads:e.preloads}),{orderBy:[...this.#e],limitSource:this.#t,offsetSource:this.#a})}orderBy(e,t="asc"){return this.#r({orderBy:[...this.#e,new L(e,t)]})}limit(e){return this.#r({limitSource:{value:e}})}offset(e){return this.#r({offsetSource:{kind:"offset",value:e}})}page(e){return this.#r({offsetSource:{kind:"page",value:e}})}create(e){return Ze(this._context,{select:this._select,preloads:this._preloads},e)}update(e){return Je(this._context,{where:this._where,select:this._select,preloads:this._preloads},e)}delete(){return at(this._context,{where:this._where,select:this._select,preloads:this._preloads})}find(){return We(this._context,{where:this._where,select:this._select,preloads:this._preloads,orderBy:this.#e,limitSource:this.#t,offsetSource:this.#a})}count(){return $e(this._context,{where:this._where})}paginate(){return ze(this._context,{where:this._where,select:this._select,preloads:this._preloads,orderBy:this.#e,limitSource:this.#t,offsetSource:this.#a})}iterate(e){return Qe(this._context,{where:this._where,select:this._select,preloads:this._preloads,orderBy:this.#e,limitSource:this.#t,offsetSource:this.#a},e)}},Z=class a{#e;#t;#a;#r;#o;constructor(e,t){this.#e=e,this.#t=t?.where?t.where.clone():k.create(),this.#a=t?.having?t.having.clone():k.create(),this.#r=t?.aggregates??[],this.#o=t?.groupBy??[]}get#n(){return{where:this.#t,having:this.#a,aggregates:this.#r,groupBy:this.#o}}where(...e){let t=e[0];return new a(this.#e,{...this.#n,where:t(this.#t.clone())})}having(...e){let t=e[0];return new a(this.#e,{...this.#n,having:t(this.#a.clone())})}groupBy(...e){return new a(this.#e,{...this.#n,groupBy:e.map(t=>v(t))})}count(...[e]){return new a(this.#e,{...this.#n,aggregates:[...this.#r,{fn:"count",alias:e}]})}countDistinct(e,...[t]){return new a(this.#e,{...this.#n,aggregates:[...this.#r,{fn:"countDistinct",field:v(e),alias:t}]})}sum(e,...[t]){return new a(this.#e,{...this.#n,aggregates:[...this.#r,{fn:"sum",field:v(e),alias:t}]})}avg(e,...[t]){return new a(this.#e,{...this.#n,aggregates:[...this.#r,{fn:"avg",field:v(e),alias:t}]})}min(e,...[t]){return new a(this.#e,{...this.#n,aggregates:[...this.#r,{fn:"min",field:v(e),alias:t}]})}max(e,...[t]){return new a(this.#e,{...this.#n,aggregates:[...this.#r,{fn:"max",field:v(e),alias:t}]})}async run(...e){let t={aggregates:this.#r,groupBy:this.#o};this.#t.children.length>0&&(t.where=this.#t),this.#a.children.length>0&&(t.having=this.#a);let r=await rt(this.#e,t);return this.#o.length>0?r:r[0]}};import{AsyncLocalStorage as qt}from"async_hooks";var he=new qt;function it(a,e){let t=he.getStore()??[];return he.run([...t,a],e)}function dt(){return he.getStore()??[]}var Y=class{#e;#t;#a;constructor({adapter:e,resolve:t}){this.#e=e,this.#t=t,this.#a=e.schemaConfigPipe}#r(e){let t=[...dt()];if(this.#a)return je(this.#t,t,e,this.#a);let r=this.#t(e);for(let n of t)r=n(r,e);return r}#o(e){return this.#e.use(e,this.#r(e))}on(e){return new M(new U(e,t=>this.#o(t)))}static from(e){return new ge(e)}async session(e){return this.#e.session?.(e)??e()}resolve(e,t){return it(e,t)}},ge=class a{#e;#t;constructor(e,t){this.#e=e,this.#t=t}resolve(e){return new a(this.#e,e)}build(){return new Y({adapter:this.#e,resolve:this.#t})}};export{Z as AggregateBuilder,X as AllBuilder,xe as ComputedField,re as EventLog,E as EventLogSchema,It as Field,ee as Filter,k as FilterGroup,Ct as IncOp,A as ManyRelation,Nt as MaxOp,Ee as MigrationCodegen,qe as Migrator,Mt as MinOp,Ut as MulOp,Q as OneBuilder,S as OneRelation,L as OrderBy,pt as OrmAdapter,Ft as OrmIntrospectionError,g as OrmMigrationError,K as OrmNotFoundError,F as OrmReplayError,h as OrmValidationError,Ht as PatchOp,Kt as PullOp,_t as PushOp,Fe as Relations,Y as Repo,I as Schema,ae as SchemaBuilder,U as SchemaContext,J as SchemaField,M as SchemaRef,B as SetOp,Dt as UnsetOp,Se as assertNormalisedAggregate,x as assertNormalisedFilter,je as composeSchemaConfig,oe as computePending,Te as diffSchemas,Zt as flattenOps,jt as inc,_ as isUpdateOp,Wt as max,Gt as min,Vt as mul,te as opTouchedFields,Xt as patch,Qt as pull,zt as push,Lt as set,v as toFieldName,He as tryValidateCreateRow,$t as unset,ue as validateCreate,Le as validateCreateMany,W as validateUpdate,rr as validateUpdateOps,Ve as validateUpsertConflicts};
|
|
1
|
+
import{a as Ft}from "../chunk-LJZOS62I.min.mjs";import{A as zt,B as Qt,C as Xt,D as te,E as Zt,a as h,b as It,c as v,d as J,e as xe,f as ee,g as k,h as Se,i as x,j as pt,k as B,l as Ct,m as Ut,n as Mt,o as Nt,p as Dt,q as _t,r as Kt,s as Ht,t as _,u as Lt,v as jt,w as Vt,x as Gt,y as Wt,z as $t}from "../chunk-MCX2O5IT.min.mjs";import{C as we,a as f}from "../chunk-N3OD4QL2.min.mjs";import"../chunk-DSUJ5FUL.min.mjs";import"../chunk-AQY7QVYI.min.mjs";var g=class extends f{id;phase;constructor(e){super(`Migration failed at phase '${e.phase}' for migration '${e.id}'`,{id:e.id,phase:e.phase},e.cause),this.id=e.id,this.phase=e.phase}};function lt(a){if(a.op==="and"&&a.children.length===1&&a.children[0]instanceof ee&&a.children[0].op==="eq"){let e=a.children[0];return`${e.field}=${e.value}`}return be(a)}function be(a){if(a instanceof ee)return`${a.field} ${a.op} ${JSON.stringify(a.value)}`;let e=a.children.map(t=>be(t));return e.length===1?e[0]:`(${e.join(` ${a.op} `)})`}var K=class extends f{schema;operation;where;constructor(e){let t=e.message??`${e.schema}.${e.operation}: no row matched ${lt(e.where)}`;super(t,{schema:e.schema,operation:e.operation,where:e.where}),this.schema=e.schema,this.operation=e.operation,this.where=e.where}};var F=class extends f{key;eventName;constructor(e){super(`EventLog replay failed on event ${e.name} (key=${e.key})`,{key:e.key,name:e.name},e.cause),this.key=e.key,this.eventName=e.name}};import{ulid as ut}from"ulid";import{v as ft}from"valleyed";import{ulid as mt}from"ulid";import{v as T}from"valleyed";import"valleyed";var ae=class a{#e;#t;#a;#r;constructor(e,t,r,n){this.#e=e,this.#t=t??null,this.#a=r??{},this.#r=n??{}}get name(){return this.#e}pk(e,t,r){return new a(this.#e,new J(e,t,{onCreate:r}),{...this.#a},void 0)}field(e,t,r){let n={...this.#a,[e]:new J(e,t,r)};return new a(this.#e,this.#t,n,{...this.#r})}computed(e,t,r,n){let o={...this.#r,[e]:new xe(e,r,t,n)};return new a(this.#e,this.#t,{...this.#a},o)}build(){let e=this;return new I(e.#e,e.#t,e.#a,e.#r)}},I=class{#e;#t;#a;#r;constructor(e,t,r,n){this.#e=e,this.#t=t,this.#a=r,this.#r=n,this.#t&&Object.defineProperty(this.#t,"__schema",{value:this,enumerable:!1,configurable:!0});for(let o of Object.values(this.#a))Object.defineProperty(o,"__schema",{value:this,enumerable:!1,configurable:!0})}get name(){return this.#e}get pkField(){if(!this.#t)throw new Error(`Schema "${this.#e}" does not have a primary key defined`);return this.#t}get fieldDefs(){return this.#a}get computedDefs(){return this.#r}get fields(){return{...this.#t?{[this.#t.name]:this.#t}:{},...this.#a}}static from(e){return new ae(e)}};var E=I.from("event_log").pk("key",T.string(),()=>mt()).field("name",T.string()).field("ts",T.number()).field("body",T.any()).field("by",T.nullable(T.string())).build();async function ve(a,e,t,r,n){let o=ft.validate(t.pipe,r);if(!o.valid)throw new h("validation","event_log","fire",[{cause:o.error}]);return a.session(async()=>{let s=n?.at??new Date,i=s.getTime(),d=ut(i),c=n?.by??null;await a.on(E).one().create({key:d,name:e,ts:i,body:o.value,by:c});let m={key:d,name:e,ts:i,body:o.value,by:c,at:s,firstRun:!0};return await t.handle(o.value,m)})}var H=class{#e=new Map;#t=[];register(e,t){if(this.#e.has(e))throw new f(`EventLog handler "${e}" is already registered`,{name:e});this.#e.set(e,t),this.#t.push(e)}get(e){let t=this.#e.get(e);if(!t)throw new f(`EventLog handler "${e}" is not registered`,{name:e});return t}list(){return[...this.#t]}};var Ae=async(a,e,t)=>{let r={key:t.key,name:t.name,ts:t.ts,body:t.body,by:t.by,at:new Date(t.ts),firstRun:!1};try{await a.session(async()=>{await e.handle(t.body,r)})}catch(n){throw new F({key:t.key,name:t.name,cause:n})}};async function ke(a,e,t){let r=a.on(E).all().orderBy("ts","asc");t?.from&&(r=r.where(o=>o.gte("ts",t.from.getTime())));let n=await r.find();for(let o of n)await Ae(a,e.get(o.name),o)}async function Oe(a,e,t){let r=await a.on(E).one().id(t).find();if(!r)throw new F({key:t,name:"unknown",cause:new Error(`Event with key "${t}" not found`)});await Ae(a,e.get(r.name),r)}var re=class a{#e;#t;constructor(e,t){this.#e=e,this.#t=t}handler(e,t){return this.#t.register(e,t),(r,n)=>ve(this.#e,e,t,r,n)}replay(e){return ke(this.#e,this.#t,e)}rerun(e){return Oe(this.#e,this.#t,e)}static from(e){return{build:()=>new a(e,new H)}}};var Re=["dropForeignKey","dropIndex","dropField","dropTable","renameTable","renameField","createTable","addField","modifyField","addIndex","addForeignKey"];function yt(a,e){if(e==="execute")return!0;let t=`apply${e[0].toUpperCase()}${e.slice(1)}`;return typeof a[t]=="function"}function ht(a,e){return!(a.type!==e.type||(a.nullable??!1)!==e.nullable||a.default!==e.default||(a.unique??!1)!==(e.unique??!1))}var ne=a=>({name:a.name,type:a.type,...a.nullable?{nullable:!0}:{}});function gt(a){let e=a.pkField,t=Be(e.pipe),r=[];for(let n of Object.values(a.fieldDefs)){let o=n;r.push({name:o.name,type:Be(o.pipe),nullable:xt(o.pipe)})}return{name:a.name,pk:{name:e.name,type:t},fields:r}}var wt=new Set(["string","number","boolean","array","object","date"]);function Be(a){if(!a)return"string";let e=typeof a.schema=="function"?a.schema():void 0;if(e?.type)return wt.has(e.type)?e.type:"string";let t=a["~standard"];if(t?.validate){if(!t.validate(0).issues)return"number";if(!t.validate("").issues)return"string";if(!t.validate(!0).issues)return"boolean";if(!t.validate([]).issues)return"array";if(!t.validate({}).issues)return"object"}return"string"}function xt(a){if(!a)return!1;if((typeof a.context=="function"?a.context():void 0)?.optional)return!0;let t=a["~standard"];return!!(t?.validate&&!t.validate(void 0).issues)}function Te(a,e,t){let r=[],n=new Map(t.map(s=>[s.name,s])),o=new Map(e.map(s=>[s.name,s]));for(let s of t)if(!o.has(s.name)){for(let i of s.foreignKeys)r.push({kind:"dropForeignKey",table:s.name,name:i.name});for(let i of s.indexes)r.push({kind:"dropIndex",name:i.name});r.push({kind:"dropTable",name:s.name})}for(let s of e){let i=gt(s),d=n.get(i.name);if(!d){r.push({kind:"createTable",name:i.name,pk:i.pk,fields:i.fields.map(ne)});continue}let c=new Map(d.fields.map(p=>[p.name,p])),m=new Map(i.fields.map(p=>[p.name,p]));for(let p of d.fields)m.has(p.name)||r.push({kind:"dropField",table:i.name,name:p.name});for(let p of i.fields){let y=c.get(p.name);y?ht(p,y)||r.push({kind:"modifyField",table:i.name,name:p.name,to:ne(p)}):r.push({kind:"addField",table:i.name,field:ne(p)})}}return r.filter(s=>yt(a,s.kind)).sort((s,i)=>Re.indexOf(s.kind)-Re.indexOf(i.kind))}var Ee=class a{#e;#t;constructor(e,t,r){this.#e=t,this.#t=r}async diff(){let e=await this.#e.introspect(),t=Te(this.#e,this.#t,e);return t.length===0?null:t}async discover(){return this.#e.introspect()}static from(e,t){return{target(r){return{build(){return new a(e,t,r)}}}}}};async function Pe(a,e,t){if(t.kind==="execute"){await t.up(e);return}let r=`apply${t.kind[0].toUpperCase()}${t.kind.slice(1)}`,n=a[r];if(typeof n!="function")throw new Error(`Adapter does not support change kind '${t.kind}'`);await n.call(a,t)}function oe(a,e,t){let r=new Set(e.map(c=>c.id)),n=new Set(a.map(c=>c.id)),o=e.filter(c=>!n.has(c.id)).map(c=>c.id);if(o.length>0)throw new g({id:o[0],phase:"load",cause:`orphan migrations: [${o.join(", ")}]`});let s=[...a].sort((c,m)=>c.id.localeCompare(m.id)),i=[],d=[];for(let c of s)r.has(c.id)?d.push(c.id):i.push(c);if(t?.to!==void 0){let c=i.findIndex(m=>m.id===t.to);if(c===-1){if(r.has(t.to))return{pending:[],skipped:d};throw new g({id:t.to,phase:"load",cause:`unknown migration id: ${t.to}`})}i.splice(c+1)}return t?.steps!==void 0&&i.splice(t.steps),{pending:i,skipped:d}}function u(a){return!a||a.trim()===""}function se(a,e,t){u(e.name)&&a.failures.push({migrationId:a.migrationId,changeIndex:a.changeIndex,field:t,cause:`${t} name must be non-empty`}),a.adapter.supportedFieldTypes.length>0&&!a.adapter.supportedFieldTypes.includes(e.type)&&a.failures.push({migrationId:a.migrationId,changeIndex:a.changeIndex,field:t,cause:`unsupported field type '${e.type}'`})}function l(a,e,t){a.failures.push({migrationId:a.migrationId,changeIndex:a.changeIndex,...e?{field:e}:{},cause:t})}function St(a,e,t,r,n){if(e.kind==="execute")return;let o={adapter:a,migrationId:t,changeIndex:r,failures:n},s=`apply${e.kind[0].toUpperCase()}${e.kind.slice(1)}`;switch(typeof a[s]!="function"&&l(o,void 0,`adapter does not support change kind '${e.kind}'`),e.kind){case"createTable":{u(e.name)&&l(o,"name","table name must be non-empty"),u(e.pk.name)&&l(o,"pk.name","pk name must be non-empty"),a.supportedFieldTypes.length>0&&!a.supportedFieldTypes.includes(e.pk.type)&&l(o,"pk.type",`unsupported field type '${e.pk.type}'`);let i=new Set;for(let d of e.fields)se(o,d,"field"),i.has(d.name)&&l(o,"fields",`duplicate field name '${d.name}' in createTable`),i.add(d.name);e.pk.name&&i.has(e.pk.name)&&l(o,"pk.name",`pk name '${e.pk.name}' collides with a field name`);break}case"dropTable":{u(e.name)&&l(o,"name","table name must be non-empty");break}case"addField":{u(e.table)&&l(o,"table","table name must be non-empty"),se(o,e.field,"field");break}case"dropField":{u(e.table)&&l(o,"table","table name must be non-empty"),u(e.name)&&l(o,"name","field name must be non-empty");break}case"modifyField":{u(e.table)&&l(o,"table","table name must be non-empty"),u(e.name)&&l(o,"name","field name must be non-empty"),se(o,e.to,"to");break}case"renameTable":{u(e.from)&&l(o,"from","table name must be non-empty"),u(e.to)&&l(o,"to","table name must be non-empty");break}case"renameField":{u(e.table)&&l(o,"table","table name must be non-empty"),u(e.from)&&l(o,"from","field name must be non-empty"),u(e.to)&&l(o,"to","field name must be non-empty");break}case"addIndex":{u(e.table)&&l(o,"table","table name must be non-empty"),(!e.on||e.on.length===0)&&l(o,"on","addIndex.on must be non-empty");break}case"dropIndex":{u(e.name)&&l(o,"name","index name must be non-empty");break}case"addForeignKey":{u(e.table)&&l(o,"table","table name must be non-empty"),u(e.on)&&l(o,"on","addForeignKey.on must be non-empty"),u(e.references?.table)&&l(o,"references.table","references table must be non-empty"),u(e.references?.column)&&l(o,"references.column","references column must be non-empty");break}case"dropForeignKey":{u(e.table)&&l(o,"table","table name must be non-empty"),u(e.name)&&l(o,"name","foreign key name must be non-empty");break}}}function ie(a,e){let t=[],r=new Set;for(let n of e){if(u(n.id)){t.push({cause:"migration id must be a non-empty string"});continue}r.has(n.id)&&t.push({migrationId:n.id,cause:`duplicate migration id '${n.id}'`}),r.add(n.id);for(let o=0;o<n.changes.length;o++)St(a,n.changes[o],n.id,o,t)}if(t.length>0)throw new h("changes","migrations","build",t)}var qe=class a{#e;#t;#a;#r;constructor(e,t,r,n=!1){this.#e=e,this.#t=t,this.#a=r,this.#r=n}#o(e){if(typeof this.#t[e]!="function"){let t=e==="loadMigrations"?"load":"record";throw new g({id:"",phase:t,cause:`adapter does not implement ${e}`})}}async up(e){if(this.#o("loadMigrations"),this.#o("recordMigration"),!this.#r&&typeof this.#t.acquireMigrationLock=="function")try{return await this.#t.acquireMigrationLock(()=>this.#n(e))}catch(r){throw r instanceof g?r:new g({id:"",phase:"lock",cause:r})}return this.#n(e)}async status(){this.#o("loadMigrations");let e=await this.#t.loadMigrations(),t=new Map(e.map(n=>[n.id,n.appliedAt]));return[...this.#a].sort((n,o)=>n.id.localeCompare(o.id)).map(n=>{let o=t.get(n.id);return o!==void 0?{id:n.id,applied:!0,appliedAt:o}:{id:n.id,applied:!1}})}async dry(e){this.#o("loadMigrations");let t=await this.#t.loadMigrations(),{pending:r}=oe(this.#a,t,e);return{would:r.map(n=>n.id)}}async#n(e){let t;try{t=await this.#t.loadMigrations()}catch(s){throw new g({id:"",phase:"load",cause:s})}let{pending:r,skipped:n}=oe(this.#a,t,e),o=[];for(let s of r){let i=async()=>{for(let c of s.changes)try{await Pe(this.#t,this.#e,c)}catch(m){throw new g({id:s.id,phase:"user",cause:m})}try{await this.#t.recordMigration(s.id,Date.now())}catch(c){throw new g({id:s.id,phase:"record",cause:c})}};if(s.tx!==!1&&typeof this.#t.session=="function")try{await this.#e.session(i)}catch(c){throw c instanceof g?c:new g({id:s.id,phase:"session",cause:c})}else await i();o.push(s.id)}return{ran:o,skipped:n}}static from(e,t){return{migrations(r){return{build(){return ie(t,r),new a(e,t,r)},withoutLock(){return{build(){return ie(t,r),new a(e,t,r,!0)}}}}}}}};var L=class{constructor(e,t){this.direction=t;this.field=v(e)}field};var A=class{constructor(e,t,r,n,o){this.name=e;this.source=t;this.target=r;this.foreignKey=n;this.references=o}},S=class{constructor(e,t,r,n,o,s){this.name=e;this.source=t;this.target=r;this.foreignKey=n;this.fkOwner=o;this.references=s}},de=class a{#e;#t;constructor(e,t){this.#e=e,this.#t=t??{}}hasMany(e,t){let r=t.__schema,n={...this.#t,[e]:new A(e,this.#e,r,t,this.#e.pkField)};return new a(this.#e,n)}hasOne(e,t){let r=t.__schema,n={...this.#t,[e]:new S(e,this.#e,r,t,"target",this.#e.pkField)};return new a(this.#e,n)}belongsTo(e,t,r,n){let o=n??r.pkField,s={...this.#t,[e]:new S(e,this.#e,r,t,"source",o)};return new a(this.#e,s)}build(){return this.#t}},Fe=class{static from(e){return new de(e)}};import{v as bt}from"valleyed";function P(a,e){let t=a.computedDefs,r=new Set(Object.keys(t)),n=new Set(Object.keys(a.fields));if(!e||e.length===0)return{requestedSelect:null,adapterSelect:void 0,computeNames:[...r]};let o=new Set(e),s=new Set,i=new Set;for(let d of e){if(n.has(d)){s.add(d);continue}if(r.has(d)){i.add(d);for(let c of t[d].deps)s.add(c);continue}throw new f("Unknown selected field",{schema:a.name,selectedField:d,availableFields:[...n,...r]})}return{requestedSelect:o,adapterSelect:[...s],computeNames:[...i]}}function Ie(a,e,t){let r=a.computedDefs;return e.map(n=>{let o={...n};for(let i of t.computeNames){let d=r[i],c={};for(let p of d.deps){if(!(p in n))throw new f("Computed field dependency missing from adapter result",{schema:a.name,computedField:i,dependency:p,dependencies:d.deps});c[p]=n[p]}let m=bt.validate(d.pipe,d.compute(c));if(!m.valid)throw new f("Computed field validation failed",{schema:a.name,computedField:i,cause:m.error});o[i]=m.value}if(!t.requestedSelect)return o;let s={};for(let i of t.requestedSelect)i in o&&(s[i]=o[i]);return s})}var vt=100,Ce=5;function Ue(a){return a instanceof A||a instanceof S}function Me(a){return typeof a=="object"&&a!=null&&"def"in a}function At(a){return`${a.source.name}.${a.name}->${a.target.name}`}function q(a){return typeof a=="number"&&Number.isSafeInteger(a)&&a>0}function j(a){return typeof a=="number"&&Number.isSafeInteger(a)&&a>=0}function ce(){return we.maybeGet()?.settings.utils.paginationDefaultLimit??vt}function V(a,e,t){if(!e||e.length===0)return;let r=new Set(Object.keys(a.fields)),n=new Set(Object.keys(a.computedDefs));for(let o of e)r.has(o)||n.has(o)||t.push({field:o,cause:`Unknown selected field "${o}" on schema "${a.name}"`})}function C(a,e,t,r=1,n=[]){if(e!=null){if(!Array.isArray(e)){t.push({cause:"Preloads must be an array"});return}if(e.length!==0){if(r>Ce){t.push({cause:`Preload depth exceeded max depth ${Ce}`});return}for(let o of e){let s=Ue(o)?o:Me(o)?o.def:void 0;if(!Ue(s)){t.push({cause:"Invalid preload definition: expected a relation definition or nested preload definition with `def`"});continue}s.source!==a&&t.push({field:s.name,cause:`Preload relation "${s.name}" belongs to source schema "${s.source.name}" but was used from schema "${a.name}"`});let i=At(s);if(n.includes(i)){t.push({field:s.name,cause:`Preload cycle detected: ${[...n,i].join(" -> ")}`});continue}if(Me(o)){let d=o.preloads??[];if(!Array.isArray(d)){t.push({field:s.name,cause:`Nested preloads for relation "${s.name}" must be an array`});continue}C(s.target,d,t,r+1,[...n,i])}}}}}function pe(a,e){if(q(a))return a;e.push({field:"limit",option:"limit",cause:"Limit must be a positive safe integer"})}function le(a,e){if(j(a))return a;e.push({field:"offset",option:"offset",cause:"Offset must be a non-negative safe integer"})}function me(a,e){if(q(a))return a;e.push({field:"page",option:"page",cause:"Page must be a positive safe integer"})}function kt(a,e){if(a!==void 0){if(q(a))return a;e.push({field:"batchSize",option:"batchSize",cause:"Batch size must be a positive safe integer"})}}function Ot(a,e){if(a!==void 0){if(a==null||typeof a!="object"||Array.isArray(a)){e.push({option:"batchSize",cause:"Iteration options must be an object"});return}return kt(a.batchSize,e)}}function G(a,e,t){if(t.length>0)throw new h("query-shape",a.name,e,t)}function Ne(a,e,t){let r=[];V(a,t.select,r),C(a,t.preloads,r),G(a,e,r)}function De(a,e,t){let r=[];V(a,t.select,r),C(a,t.preloads,r);let n=t.limitSource===void 0?void 0:pe(t.limitSource.value,r),o;if(t.offsetSource?.kind==="offset")o=le(t.offsetSource.value,r);else if(t.offsetSource?.kind==="page"){let s=me(t.offsetSource.value,r);if(n===void 0&&t.limitSource===void 0&&(n=ce(),q(n)||(r.push({field:"limit",cause:"Default page limit must be a positive safe integer"}),n=void 0)),s!==void 0&&n!==void 0){let i=(s-1)*n;j(i)?o=i:r.push({field:"offset",cause:"Resolved page offset must be a non-negative safe integer"})}}return G(a,e,r),{limit:n,offset:o}}function _e(a,e,t,r){let n=[];V(a,t.select,n),C(a,t.preloads,n);let o=t.limitSource===void 0?void 0:pe(t.limitSource.value,n),s,i=Ot(r,n);if(t.offsetSource?.kind==="offset")s=le(t.offsetSource.value,n);else if(t.offsetSource?.kind==="page"){let d=me(t.offsetSource.value,n);if(o===void 0&&t.limitSource===void 0&&(o=ce(),q(o)||(n.push({field:"limit",option:"limit",cause:"Default page limit must be a positive safe integer"}),o=void 0)),d!==void 0&&o!==void 0){let c=(d-1)*o;j(c)?s=c:n.push({field:"offset",option:"offset",cause:"Resolved page offset must be a non-negative safe integer"})}}return G(a,e,n),{limit:o,offset:s,batchSize:i}}function Ke(a,e,t){let r=[];V(a,t.select,r),C(a,t.preloads,r);let n;t.limitSource===void 0?(n=ce(),q(n)||(r.push({field:"limit",cause:"Default page limit must be a positive safe integer"}),n=void 0)):n=pe(t.limitSource.value,r);let o=0,s=1;if(t.offsetSource?.kind==="offset"){let i=le(t.offsetSource.value,r);i!==void 0&&(o=i,n!==void 0&&(s=Math.floor(i/n)+1))}else if(t.offsetSource?.kind==="page"){let i=me(t.offsetSource.value,r);if(i!==void 0&&(s=i),i!==void 0&&n!==void 0){let d=(i-1)*n;j(d)?o=d:r.push({field:"offset",cause:"Resolved page offset must be a non-negative safe integer"})}}return G(a,e,r),{limit:n,offset:o,current:s}}import{v as O}from"valleyed";function He(a,e){let t=[],r={};for(let[n,o]of Object.entries(a.fields)){let s=o.onCreate?O.defaults(o.pipe,o.onCreate()):o.pipe,i=n in e?e[n]:void 0,d=O.validate(s,i);d.valid?r[n]=d.value:t.push({field:n,cause:d.error})}return t.length>0?{ok:!1,failures:t}:{ok:!0,value:r}}function ue(a,e){let t=He(a,e);if(!t.ok)throw new h("validation",a.name,"createOne",t.failures);return t.value}function Le(a,e){let t=[],r=[];for(let n=0;n<e.length;n++){let o=He(a,e[n]);if(o.ok)r.push(o.value);else for(let s of o.failures)t.push({...s,rowIndex:n})}if(t.length>0)throw new h("validation",a.name,"createMany",t);return r}function W(a,e){let t={},r={};for(let[s,i]of Object.entries(e))_(i)?r[s]=i:s in a.fieldDefs&&(t[s]=a.fieldDefs[s].pipe);for(let[s,i]of Object.entries(a.fieldDefs))!(s in e)&&i.onUpdate&&(t[s]=O.defaults(i.pipe,i.onUpdate()));let n=O.validate(O.object(t),e);if(!n.valid)throw new h("validation",a.name,"updateByPk",[{cause:n.error}]);return{...n.value,...r}}function rr(a,e,t="updateByPk"){let r=new Map;for(let d=0;d<e.length;d++)for(let c of te(e[d]))r.has(c)||r.set(c,[]),r.get(c).push(d);let n=[];for(let[d,c]of Object.entries(a.fieldDefs))if(c.onUpdate&&!r.has(d)){let m=new B({[d]:c.onUpdate()});n.push(m),r.set(d,[e.length+n.length-1])}let o=[...e,...n],s=[];for(let[d,c]of r)c.length>1&&s.push({field:d,cause:`field "${d}" touched by multiple ops at indices [${c.join(", ")}]`});if(s.length>0)throw new h("conflicting-ops",a.name,t,s);let i=[];for(let d=0;d<o.length;d++){let c=o[d];if(c instanceof B)for(let[m,p]of Object.entries(c.values)){let y=a.fields[m];if(!y)continue;let b=O.validate(y.pipe,p);b.valid||i.push({opIndex:d,field:m,cause:b.error})}}if(i.length>0)throw new h("validation",a.name,t,i);return o}function je(a,e,t,r){let n=a(t);for(let s of e)n=s(n,t);let o=O.validate(r,n);if(!o.valid)throw new h("validation",t.name,"schemaConfig",[{cause:o.error}]);return o.value}function Ve(a,e,t){let r=new Set(Object.keys(e)),n=[];for(let o of t)if(!(o instanceof B))for(let s of te(o))r.has(s)&&n.push({field:s,cause:`field "${s}" present in both create payload and atomic op "${o.kind}"`});if(n.length>0)throw new h("conflicting-ops",a.name,"upsertOne",n)}async function Ge(a,e){x(a.schema,e.where),Ne(a.schema,"findOne",e);let t=await a.use.findOne(e.where);return t?a.shapeOneRow(e.select,e.preloads,t):null}async function We(a,e){x(a.schema,e.where);let t=De(a.schema,"findMany",e),r=P(a.schema,e.select),n=await a.use.findMany(e.where,{select:r.adapterSelect,orderBy:[...e.orderBy],limit:t.limit,offset:t.offset});return a.shapeRows(e.select,e.preloads,n)}async function $e(a,e){return x(a.schema,e.where),a.use.count(e.where)}function Rt(a,e,t,r){let o=Math.ceil(e/t)||1,s=r<=1||r>o?null:r-1,i=r>=o?null:r+1;return{pages:{current:r,start:1,last:o,previous:s,next:i},docs:{limit:t,total:e,count:a.length},items:a}}async function ze(a,e){x(a.schema,e.where);let t=Ke(a.schema,"paginate",e),r=P(a.schema,e.select),n=a.use,[o,s]=await Promise.all([n.findMany(e.where,{select:r.adapterSelect,orderBy:[...e.orderBy],limit:t.limit,offset:t.offset}),n.count(e.where)]),i=await a.shapeRows(e.select,e.preloads,o);return Rt(i,s,t.limit,t.current)}async function*Qe(a,e,t){x(a.schema,e.where);let r=_e(a.schema,"iterate",e,t),n=P(a.schema,e.select);for await(let o of a.use.iterateMany(e.where,{select:n.adapterSelect,orderBy:[...e.orderBy],limit:r.limit,offset:r.offset,...r.batchSize===void 0?{}:{batchSize:r.batchSize}})){let i=(await a.shapeRows(e.select,e.preloads,[o]))[0];i&&(yield i)}}async function Xe(a,e,t){let r=ue(a.schema,t),n=await a.use.createOne(r),[o]=await a.shapeRows(e.select,e.preloads,[n]);return o}async function Ze(a,e,t){let r=Le(a.schema,t),n=await a.use.createMany(r);return a.shapeRows(e.select,e.preloads,n)}async function Ye(a,e,t){x(a.schema,e.where);let r=W(a.schema,t),n=await a.use.updateOne(e.where,r);return a.shapeOneRow(e.select,e.preloads,n)}async function Je(a,e,t){x(a.schema,e.where);let r=W(a.schema,t),n=await a.use.updateMany(e.where,r);return a.shapeRows(e.select,e.preloads,n)}async function et(a,e,t){x(a.schema,e.where);let r=ue(a.schema,t.create),n=[];if("update"in t){let s=W(a.schema,t.update),i={};for(let[d,c]of Object.entries(s))_(c)?n.push(c):i[d]=c;Object.keys(i).length>0&&n.unshift(new B(i))}n.length>0&&Ve(a.schema,t.create,n);let o=await a.use.upsertOne(e.where,r,n);return await a.shapeOneRow(e.select,e.preloads,o)}async function tt(a,e){x(a.schema,e.where);let t=await a.use.deleteOne(e.where);return a.shapeOneRow(e.select,e.preloads,t)}async function at(a,e){x(a.schema,e.where);let t=await a.use.deleteMany(e.where);return a.shapeRows(e.select,e.preloads,t)}async function rt(a,e){return Se(a.schema,a.use,e),a.use.aggregate(e)}var fe=5;function Bt(a){return typeof a=="object"&&a!=null&&"def"in a}function Tt(a){return`${a.source.name}.${a.name}->${a.target.name}`}function ye(a,e){return[...new Set(a.map(t=>t[e]).filter(t=>t!=null))]}function nt(a,e,t,r){return a.map(n=>({...n,[e]:r.get(n[t])??null}))}function Et(a,e,t,r){return a.map(n=>({...n,[e]:r.get(n[t])??[]}))}function ot(a){return a.map(e=>{if(e instanceof A||e instanceof S)return{def:e,preloads:[]};if(!Bt(e)||!(e.def instanceof A||e.def instanceof S))throw new Error("Invalid preload definition: nested preloads must include a relation definition in `def`");return{def:e.def,preloads:ot(e.preloads??[])}})}async function st(a,e,t){return $(a,ot(e),t,1,[])}async function $(a,e,t,r,n){for(let o of e)a=await Pt(a,o,t,r,n);return a}async function Pt(a,e,t,r,n){if(r>fe)throw new f(`Preload depth exceeded max depth ${fe}`,{operation:"resolvePreload",depth:r,maxDepth:fe});let{def:o}=e,{target:s,name:i}=o,d=Tt(o);if(n.includes(d))throw new f(`Preload cycle detected: ${[...n,d].join(" -> ")}`,{operation:"resolvePreload",path:n,step:d});let c=[...n,d];if(o instanceof S){if(o.fkOwner==="source"){let w=o.references.name,R=ye(a,o.foreignKey.name);if(R.length===0)return a.map(D=>({...D,[i]:null}));let N=await t(s).findMany(k.create().in(w,R));e.preloads.length>0&&N.length>0&&(N=await $(N,e.preloads,t,r+1,c));let ct=new Map(N.map(D=>[D[w],D]));return nt(a,i,o.foreignKey.name,ct)}let m=o.references.name,p=ye(a,m);if(p.length===0)return a.map(w=>({...w,[i]:null}));let y=await t(s).findMany(k.create().in(o.foreignKey,p));e.preloads.length>0&&y.length>0&&(y=await $(y,e.preloads,t,r+1,c));let b=new Map(y.map(w=>[w[o.foreignKey.name],w]));return nt(a,i,m,b)}if(o instanceof A){let m=o.references.name,p=ye(a,m);if(p.length===0)return a.map(w=>({...w,[i]:[]}));let y=await t(s).findMany(k.create().in(o.foreignKey,p));e.preloads.length>0&&y.length>0&&(y=await $(y,e.preloads,t,r+1,c));let b=new Map;for(let w of y){let R=w[o.foreignKey.name];b.has(R)||b.set(R,[]),b.get(R).push(w)}return Et(a,i,m,b)}throw new Error(`Unknown relation kind: ${String(Reflect.get(o,"kind"))}; expected OneRelation or ManyRelation`)}var U=class{constructor(e,t){this.schema=e;this.getUse=t}async shapeRows(e,t,r){let n=P(this.schema,e),o=Ie(this.schema,r,n);return t.length===0?o:await st(o,t,this.getUse)}async shapeOneRow(e,t,r){if(!r)return null;let[n]=await this.shapeRows(e,t,[r]);return n??null}get use(){return this.getUse(this.schema)}},z=class{_context;_where;_select;_preloads;constructor(e,t){this._context=e,this._where=t?.where?t.where.clone():k.create(),this._select=t?.select,this._preloads=t?.preloads??[]}where(e){let t=e(this._where.clone());return this._clone({where:t,select:this._select,preloads:this._preloads})}select(e){return this._clone({select:e})}preload(e){return this._clone({preloads:e})}_readState(e={}){return{where:e.where??this._where.clone(),select:e.select??this._select,preloads:e.preloads??[...this._preloads]}}},M=class{#e;constructor(e){this.#e=e}one(){return new Q(this.#e)}all(){return new X(this.#e)}aggregate(){return new Z(this.#e)}raw(...e){return this.#e.use.raw(...e)}},Q=class a extends z{_required;_requiredMessage;constructor(e,t,r){super(e,t),this._required=r?.required??!1,this._requiredMessage=r?.message}id(e){let t=this._where.clone().eq(this._context.schema.pkField,e);return this._clone({where:t,select:this._select,preloads:this._preloads})}required(e){return new a(this._context,this._readState(),{required:!0,message:e})}_assertFound(e,t){if(this._required&&e===null)throw new K({schema:this._context.schema.name,operation:t,where:this._where,message:this._requiredMessage})}_clone(e){return new a(this._context,this._readState(e),{required:this._required,message:this._requiredMessage})}create(e){return Xe(this._context,{select:this._select,preloads:this._preloads},e)}async update(e){let t=await Ye(this._context,{where:this._where,select:this._select,preloads:this._preloads},e);return this._assertFound(t,"updateOne"),t}upsert(e){return et(this._context,{where:this._where,select:this._select,preloads:this._preloads},e)}async delete(){let e=await tt(this._context,{where:this._where,select:this._select,preloads:this._preloads});return this._assertFound(e,"deleteOne"),e}async find(){let e=await Ge(this._context,{where:this._where,select:this._select,preloads:this._preloads});return this._assertFound(e,"findOne"),e}},X=class a extends z{#e;#t;#a;constructor(e,t,r){super(e,t),this.#e=r?.orderBy??[],this.#t=r?.limitSource,this.#a=r?.offsetSource}#r(e){let t=r=>Object.prototype.hasOwnProperty.call(e,r);return new a(this._context,this._readState(),{orderBy:t("orderBy")?e.orderBy:[...this.#e],limitSource:t("limitSource")?e.limitSource:this.#t,offsetSource:t("offsetSource")?e.offsetSource:this.#a})}_clone(e){return new a(this._context,this._readState({where:e.where,select:e.select,preloads:e.preloads}),{orderBy:[...this.#e],limitSource:this.#t,offsetSource:this.#a})}orderBy(e,t="asc"){return this.#r({orderBy:[...this.#e,new L(e,t)]})}limit(e){return this.#r({limitSource:{value:e}})}offset(e){return this.#r({offsetSource:{kind:"offset",value:e}})}page(e){return this.#r({offsetSource:{kind:"page",value:e}})}create(e){return Ze(this._context,{select:this._select,preloads:this._preloads},e)}update(e){return Je(this._context,{where:this._where,select:this._select,preloads:this._preloads},e)}delete(){return at(this._context,{where:this._where,select:this._select,preloads:this._preloads})}find(){return We(this._context,{where:this._where,select:this._select,preloads:this._preloads,orderBy:this.#e,limitSource:this.#t,offsetSource:this.#a})}count(){return $e(this._context,{where:this._where})}paginate(){return ze(this._context,{where:this._where,select:this._select,preloads:this._preloads,orderBy:this.#e,limitSource:this.#t,offsetSource:this.#a})}iterate(e){return Qe(this._context,{where:this._where,select:this._select,preloads:this._preloads,orderBy:this.#e,limitSource:this.#t,offsetSource:this.#a},e)}},Z=class a{#e;#t;#a;#r;#o;constructor(e,t){this.#e=e,this.#t=t?.where?t.where.clone():k.create(),this.#a=t?.having?t.having.clone():k.create(),this.#r=t?.aggregates??[],this.#o=t?.groupBy??[]}get#n(){return{where:this.#t,having:this.#a,aggregates:this.#r,groupBy:this.#o}}where(...e){let t=e[0];return new a(this.#e,{...this.#n,where:t(this.#t.clone())})}having(...e){let t=e[0];return new a(this.#e,{...this.#n,having:t(this.#a.clone())})}groupBy(...e){return new a(this.#e,{...this.#n,groupBy:e.map(t=>v(t))})}count(...[e]){return new a(this.#e,{...this.#n,aggregates:[...this.#r,{fn:"count",alias:e}]})}countDistinct(e,...[t]){return new a(this.#e,{...this.#n,aggregates:[...this.#r,{fn:"countDistinct",field:v(e),alias:t}]})}sum(e,...[t]){return new a(this.#e,{...this.#n,aggregates:[...this.#r,{fn:"sum",field:v(e),alias:t}]})}avg(e,...[t]){return new a(this.#e,{...this.#n,aggregates:[...this.#r,{fn:"avg",field:v(e),alias:t}]})}min(e,...[t]){return new a(this.#e,{...this.#n,aggregates:[...this.#r,{fn:"min",field:v(e),alias:t}]})}max(e,...[t]){return new a(this.#e,{...this.#n,aggregates:[...this.#r,{fn:"max",field:v(e),alias:t}]})}async run(...e){let t={aggregates:this.#r,groupBy:this.#o};this.#t.children.length>0&&(t.where=this.#t),this.#a.children.length>0&&(t.having=this.#a);let r=await rt(this.#e,t);return this.#o.length>0?r:r[0]}};import{AsyncLocalStorage as qt}from"async_hooks";var he=new qt;function it(a,e){let t=he.getStore()??[];return he.run([...t,a],e)}function dt(){return he.getStore()??[]}var Y=class{#e;#t;#a;constructor({adapter:e,resolve:t}){this.#e=e,this.#t=t,this.#a=e.schemaConfigPipe}#r(e){let t=[...dt()];if(this.#a)return je(this.#t,t,e,this.#a);let r=this.#t(e);for(let n of t)r=n(r,e);return r}#o(e){return this.#e.use(e,this.#r(e))}on(e){return new M(new U(e,t=>this.#o(t)))}static from(e){return new ge(e)}async session(e){return this.#e.session?.(e)??e()}resolve(e,t){return it(e,t)}},ge=class a{#e;#t;constructor(e,t){this.#e=e,this.#t=t}resolve(e){return new a(this.#e,e)}build(){return new Y({adapter:this.#e,resolve:this.#t})}};export{Z as AggregateBuilder,X as AllBuilder,xe as ComputedField,re as EventLog,E as EventLogSchema,It as Field,ee as Filter,k as FilterGroup,Ct as IncOp,A as ManyRelation,Nt as MaxOp,Ee as MigrationCodegen,qe as Migrator,Mt as MinOp,Ut as MulOp,Q as OneBuilder,S as OneRelation,L as OrderBy,pt as OrmAdapter,Ft as OrmIntrospectionError,g as OrmMigrationError,K as OrmNotFoundError,F as OrmReplayError,h as OrmValidationError,Ht as PatchOp,Kt as PullOp,_t as PushOp,Fe as Relations,Y as Repo,I as Schema,ae as SchemaBuilder,U as SchemaContext,J as SchemaField,M as SchemaRef,B as SetOp,Dt as UnsetOp,Se as assertNormalisedAggregate,x as assertNormalisedFilter,je as composeSchemaConfig,oe as computePending,Te as diffSchemas,Zt as flattenOps,jt as inc,_ as isUpdateOp,Wt as max,Gt as min,Vt as mul,te as opTouchedFields,Xt as patch,Qt as pull,zt as push,Lt as set,v as toFieldName,He as tryValidateCreateRow,$t as unset,ue as validateCreate,Le as validateCreateMany,W as validateUpdate,rr as validateUpdateOps,Ve as validateUpsertConflicts};
|
|
2
2
|
//# sourceMappingURL=index.min.mjs.map
|
package/dist/esm/orm/index.mjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
OrmIntrospectionError
|
|
3
|
-
} from "../chunk-
|
|
3
|
+
} from "../chunk-MNKDFIVK.mjs";
|
|
4
4
|
import {
|
|
5
5
|
ComputedField,
|
|
6
6
|
Field,
|
|
@@ -33,11 +33,11 @@ import {
|
|
|
33
33
|
set,
|
|
34
34
|
toFieldName,
|
|
35
35
|
unset
|
|
36
|
-
} from "../chunk-
|
|
36
|
+
} from "../chunk-XESM7IWM.mjs";
|
|
37
37
|
import {
|
|
38
38
|
EquippedError,
|
|
39
39
|
Instance
|
|
40
|
-
} from "../chunk-
|
|
40
|
+
} from "../chunk-7N4WUZ7P.mjs";
|
|
41
41
|
import "../chunk-VCCS7CAI.mjs";
|
|
42
42
|
import "../chunk-J5LGTIGS.mjs";
|
|
43
43
|
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{d as y}from "../../../chunk-SPOVKWV3.min.mjs";import{a as m}from "../../../chunk-CU2HU5UE.min.mjs";import{C as p,g as c,l as d,s as u,t as l}from "../../../chunk-N3OD4QL2.min.mjs";import"../../../chunk-DSUJ5FUL.min.mjs";import"../../../chunk-AQY7QVYI.min.mjs";import R from"http";import x from"cookie-parser";import b from"cors";import i from"express";import f from"express-fileupload";import{rateLimit as q}from"express-rate-limit";import v from"helmet";import{pinoHttp as w}from"pino-http";var h=class extends m(u,l){#e;#s;constructor(s){super(s);let e=i(),r=p.get(),t=R.createServer(e);this.#e=e,this.#s=t,this.setup(t,s),e.disable("x-powered-by"),s.requests.log&&e.use(w({logger:r.log})),e.use(i.json()),e.use(i.text()),e.use(x()),e.use(v({crossOriginResourcePolicy:{policy:"cross-origin"},contentSecurityPolicy:!1})),e.use(b(this.cors)),e.use(i.urlencoded({extended:!1})),s.publicPath&&e.use(i.static(s.publicPath)),e.use(f({limits:{fileSize:r.settings.utils.maxFileUploadSizeInMb*1024*1024},useTempFiles:!1})),s.requests.rateLimit.enabled&&e.use(q({windowMs:s.requests.rateLimit.periodInMs,limit:s.requests.rateLimit.limit,handler:(n,o)=>o.status(c.TooManyRequests).json([{message:"Too Many Requests"}])}))}async parseRequest(s){let e=Object.fromEntries(await Promise.all(Object.entries(s.files??{}).map(async([r,t])=>{let n=Array.isArray(t)?t:[t],o=await Promise.all(n.map(async a=>({name:a.name,type:a.mimetype,size:a.size,isTruncated:a.truncated,data:a.data,duration:await y(a.data)})));return[r,o]})));return new d({ip:s.ip,body:s.body??{},cookies:s.cookies??{},params:s.params??{},query:s.query??{},method:s.method,path:s.path,headers:s.headers,files:e})}async handleResponse(s,e){if(e.piped)e.body.pipe(s);else{Object.entries(e.headers).forEach(([t,n])=>s.header(t,n)),Object.entries(e.cookies).forEach(([t,{value:n,...o}])=>s.cookie(t,n,o));let r=e.body===null||e.body===void 0?"json":"send";s.status(e.status)[r](e.body).end()}}createRawResponder(s,e){return this.createNodeRawResponder({request:s,response:e})}registerRoute(s,e,r){this.#e[s]?.(e,async(t,n)=>r(t,n))}registerErrorHandler(s){this.#e.use(async(e,r,t,n)=>s(e,r,t))}registerNotFoundHandler(s){this.#e.use(async(e,r,t)=>s(e,r))}startServer(s){return new Promise((e,r)=>{try{let t=this.#s.listen({host:"0.0.0.0",port:s},async()=>e(!0));p.on("close",t.close)}catch(t){r(t)}})}};export{h as ExpressServer};
|
|
2
2
|
//# sourceMappingURL=index.min.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/server/adapters/express/index.ts"],"sourcesContent":["import http from 'http'\n\nimport cookie from 'cookie-parser'\nimport cors from 'cors'\nimport express from 'express'\nimport fileUpload from 'express-fileupload'\nimport { rateLimit } from 'express-rate-limit'\n// import slowDown from 'express-slow-down'\nimport helmet from 'helmet'\nimport { pinoHttp } from 'pino-http'\n\nimport { Instance } from '../../../instance'\nimport { configurable, getMediaDuration } from '../../../utilities'\nimport { Request, Response } from '../../requests'\nimport { StatusCodes, type IncomingFile, type MethodsEnum } from '../../types'\nimport { type RawResponder, Server, serverConfigPipe } from '../base'\n\nexport class ExpressServer extends configurable(serverConfigPipe, Server) {\n\t#app: express.Express\n\t#httpServer: http.Server\n\n\tprotected constructor(config: typeof ExpressServer.Config) {\n\t\tsuper(config)\n\t\tconst app = express()\n\t\tconst instance = Instance.get()\n\t\tconst httpServer = http.createServer(app)\n\t\tthis.#app = app\n\t\tthis.#httpServer = httpServer\n\n\t\tthis.setup(httpServer, config)\n\n\t\tapp.disable('x-powered-by')\n\t\tif (config.requests.log) app.use(pinoHttp({ logger: instance.log }))\n\t\tapp.use(express.json())\n\t\tapp.use(express.text())\n\t\tapp.use(cookie())\n\t\tapp.use(\n\t\t\thelmet({\n\t\t\t\tcrossOriginResourcePolicy: { policy: 'cross-origin' },\n\t\t\t\tcontentSecurityPolicy: false,\n\t\t\t}),\n\t\t)\n\t\tapp.use(cors(this.cors))\n\t\tapp.use(express.urlencoded({ extended: false }))\n\t\tif (config.publicPath) app.use(express.static(config.publicPath))\n\t\tapp.use(\n\t\t\tfileUpload({\n\t\t\t\tlimits: { fileSize: instance.settings.utils.maxFileUploadSizeInMb * 1024 * 1024 },\n\t\t\t\tuseTempFiles: false,\n\t\t\t}),\n\t\t)\n\t\tif (config.requests.rateLimit.enabled)\n\t\t\tapp.use(\n\t\t\t\trateLimit({\n\t\t\t\t\twindowMs: config.requests.rateLimit.periodInMs,\n\t\t\t\t\tlimit: config.requests.rateLimit.limit,\n\t\t\t\t\thandler: (_: express.Request, res: express.Response) =>\n\t\t\t\t\t\tres.status(StatusCodes.TooManyRequests).json([{ message: 'Too Many Requests' }]),\n\t\t\t\t}),\n\t\t\t)\n\t\t/* if (this.settings.slowdown.enabled) app.use(slowDown({\n\t\t\t\twindowMs: this.settings.slowdown.periodInMs,\n\t\t\t\tdelayAfter: this.settings.slowdown.delayAfter,\n\t\t\t\tdelayMs: this.settings.slowdown.delayInMs\n\t\t\t})) */\n\t}\n\n\tprotected async parseRequest(req: any) {\n\t\tconst files = Object.fromEntries(\n\t\t\tawait Promise.all(\n\t\t\t\tObject.entries(req.files ?? {}).map(async ([key, file]) => {\n\t\t\t\t\tconst uploads = Array.isArray(file) ? file : [file]\n\t\t\t\t\tconst fileArray: IncomingFile[] = await Promise.all(\n\t\t\t\t\t\tuploads.map(async (f: any) => ({\n\t\t\t\t\t\t\tname: f.name,\n\t\t\t\t\t\t\ttype: f.mimetype,\n\t\t\t\t\t\t\tsize: f.size,\n\t\t\t\t\t\t\tisTruncated: f.truncated,\n\t\t\t\t\t\t\tdata: f.data,\n\t\t\t\t\t\t\tduration: await getMediaDuration(f.data),\n\t\t\t\t\t\t})),\n\t\t\t\t\t)\n\t\t\t\t\treturn <const>[key, fileArray]\n\t\t\t\t}),\n\t\t\t),\n\t\t)\n\n\t\treturn new Request<any>({\n\t\t\tip: req.ip,\n\t\t\tbody: req.body ?? {},\n\t\t\tcookies: req.cookies ?? {},\n\t\t\tparams: req.params ?? {},\n\t\t\tquery: req.query ?? {},\n\t\t\tmethod: <any>req.method,\n\t\t\tpath: req.path,\n\t\t\theaders: req.headers,\n\t\t\tfiles,\n\t\t})\n\t}\n\n\tprotected async handleResponse(res: any, response: Response<any>) {\n\t\tif (!response.piped) {\n\t\t\tObject.entries(response.headers).forEach(([key, value]) => res.header(key, value as string))\n\t\t\tObject.entries(response.cookies).forEach(([key, { value, ...opts }]) => res.cookie(key, value, opts))\n\t\t\tconst type = response.body === null || response.body === undefined ? 'json' : 'send'\n\t\t\tres.status(response.status)[type](response.body).end()\n\t\t} else {\n\t\t\tresponse.body.pipe(res)\n\t\t}\n\t}\n\n\tprotected createRawResponder(req: express.Request, res: express.Response): RawResponder {\n\t\treturn this.createNodeRawResponder({ request: req, response: res })\n\t}\n\n\tprotected registerRoute(method: MethodsEnum, path: string, cb: (req: any, res: any) => Promise<void>) {\n\t\tthis.#app[method]?.(path, async (req: any, res: any) => cb(req, res))\n\t}\n\n\tprotected registerErrorHandler(cb: (error: Error, req: any, res: any) => Promise<void>) {\n\t\tthis.#app.use(async (err: any, req: any, res: any, _next: any) => cb(err, req, res))\n\t}\n\n\tprotected registerNotFoundHandler(cb: (req: any, res: any) => Promise<void>) {\n\t\tthis.#app.use(async (req: any, res: any, _next: any) => cb(req, res))\n\t}\n\n\tprotected startServer(port: number) {\n\t\treturn new Promise<boolean>((resolve: (s: boolean) => void, reject: (e: Error) => void) => {\n\t\t\ttry {\n\t\t\t\tconst server = this.#httpServer.listen({ host: '0.0.0.0', port }, async () => resolve(true))\n\t\t\t\tInstance.on('close', server.close)\n\t\t\t} catch (err) {\n\t\t\t\treject(<Error>err)\n\t\t\t}\n\t\t})\n\t}\n}\n\nif (import.meta.vitest) {\n\tconst { describe, expect, test, vi } = import.meta.vitest\n\n\tconst testInstanceState = globalThis as typeof globalThis & { __equippedTestInstanceAliased?: boolean }\n\n\tfunction ensureTestInstance() {\n\t\tconst instance = Instance.maybeGet() ?? Instance.create({ app: { name: 'equipped-test' }, log: { level: 'silent' } })\n\t\tif (!testInstanceState.__equippedTestInstanceAliased) {\n\t\t\tinstance.alias('equipped-test')\n\t\t\ttestInstanceState.__equippedTestInstanceAliased = true\n\t\t}\n\t}\n\n\tfunction createExpressResponse() {\n\t\treturn {\n\t\t\tstatusCode: 200,\n\t\t\theadersSent: false,\n\t\t\twritableEnded: false,\n\t\t\tsetHeader: vi.fn(),\n\t\t\tend(chunk?: unknown) {\n\t\t\t\tvoid chunk\n\t\t\t\tthis.headersSent = true\n\t\t\t\tthis.writableEnded = true\n\t\t\t},\n\t\t}\n\t}\n\n\tclass TestExpressServer extends ExpressServer {\n\t\texposeRawResponder(req: express.Request, res: express.Response) {\n\t\t\treturn this.createRawResponder(req, res)\n\t\t}\n\t}\n\n\tdescribe('ExpressServer raw responder', () => {\n\t\ttest('passes the Express request and response to the raw Node handler', async () => {\n\t\t\tensureTestInstance()\n\t\t\tconst server = TestExpressServer.create({ port: 0, requests: { log: false } })\n\t\t\tconst req = { marker: 'request' } as unknown as express.Request\n\t\t\tconst res = createExpressResponse() as unknown as express.Response\n\t\t\tlet received: { request: unknown; response: unknown } | null = null\n\n\t\t\tawait server.exposeRawResponder(\n\t\t\t\treq,\n\t\t\t\tres,\n\t\t\t)(async (request, response) => {\n\t\t\t\treceived = { request, response }\n\t\t\t\tresponse.end('ok')\n\t\t\t})\n\n\t\t\texpect(received).toEqual({ request: req, response: res })\n\t\t})\n\t})\n}\n"],"mappings":"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","names":["http","cookie","cors","express","fileUpload","rateLimit","helmet","pinoHttp","ExpressServer","configurable","serverConfigPipe","Server","#app","#httpServer","config","app","express","instance","Instance","httpServer","http","pinoHttp","cookie","helmet","cors","fileUpload","rateLimit","_","res","StatusCodes","req","files","key","file","uploads","fileArray","f","getMediaDuration","Request","response","value","opts","type","method","path","cb","err","_next","port","resolve","reject","server"]}
|
|
1
|
+
{"version":3,"sources":["../../../../../src/server/adapters/express/index.ts"],"sourcesContent":["import http from 'http'\n\nimport cookie from 'cookie-parser'\nimport cors from 'cors'\nimport express from 'express'\nimport fileUpload from 'express-fileupload'\nimport { rateLimit } from 'express-rate-limit'\n// import slowDown from 'express-slow-down'\nimport helmet from 'helmet'\nimport { pinoHttp } from 'pino-http'\n\nimport { Instance } from '../../../instance'\nimport { configurable, getMediaDuration } from '../../../utilities'\nimport { Request, Response } from '../../requests'\nimport { StatusCodes, type IncomingFile, type MethodsEnum } from '../../types'\nimport { type RawResponder, Server, serverConfigPipe } from '../base'\n\nexport class ExpressServer extends configurable(serverConfigPipe, Server) {\n\t#app: express.Express\n\t#httpServer: http.Server\n\n\tprotected constructor(config: typeof ExpressServer.Config) {\n\t\tsuper(config)\n\t\tconst app = express()\n\t\tconst instance = Instance.get()\n\t\tconst httpServer = http.createServer(app)\n\t\tthis.#app = app\n\t\tthis.#httpServer = httpServer\n\n\t\tthis.setup(httpServer, config)\n\n\t\tapp.disable('x-powered-by')\n\t\tif (config.requests.log) app.use(pinoHttp({ logger: instance.log }))\n\t\tapp.use(express.json())\n\t\tapp.use(express.text())\n\t\tapp.use(cookie())\n\t\tapp.use(\n\t\t\thelmet({\n\t\t\t\tcrossOriginResourcePolicy: { policy: 'cross-origin' },\n\t\t\t\tcontentSecurityPolicy: false,\n\t\t\t}),\n\t\t)\n\t\tapp.use(cors(this.cors))\n\t\tapp.use(express.urlencoded({ extended: false }))\n\t\tif (config.publicPath) app.use(express.static(config.publicPath))\n\t\tapp.use(\n\t\t\tfileUpload({\n\t\t\t\tlimits: { fileSize: instance.settings.utils.maxFileUploadSizeInMb * 1024 * 1024 },\n\t\t\t\tuseTempFiles: false,\n\t\t\t}),\n\t\t)\n\t\tif (config.requests.rateLimit.enabled)\n\t\t\tapp.use(\n\t\t\t\trateLimit({\n\t\t\t\t\twindowMs: config.requests.rateLimit.periodInMs,\n\t\t\t\t\tlimit: config.requests.rateLimit.limit,\n\t\t\t\t\thandler: (_: express.Request, res: express.Response) =>\n\t\t\t\t\t\tres.status(StatusCodes.TooManyRequests).json([{ message: 'Too Many Requests' }]),\n\t\t\t\t}),\n\t\t\t)\n\t\t/* if (this.settings.slowdown.enabled) app.use(slowDown({\n\t\t\t\twindowMs: this.settings.slowdown.periodInMs,\n\t\t\t\tdelayAfter: this.settings.slowdown.delayAfter,\n\t\t\t\tdelayMs: this.settings.slowdown.delayInMs\n\t\t\t})) */\n\t}\n\n\tprotected async parseRequest(req: any) {\n\t\tconst files = Object.fromEntries(\n\t\t\tawait Promise.all(\n\t\t\t\tObject.entries(req.files ?? {}).map(async ([key, file]) => {\n\t\t\t\t\tconst uploads = Array.isArray(file) ? file : [file]\n\t\t\t\t\tconst fileArray: IncomingFile[] = await Promise.all(\n\t\t\t\t\t\tuploads.map(async (f: any) => ({\n\t\t\t\t\t\t\tname: f.name,\n\t\t\t\t\t\t\ttype: f.mimetype,\n\t\t\t\t\t\t\tsize: f.size,\n\t\t\t\t\t\t\tisTruncated: f.truncated,\n\t\t\t\t\t\t\tdata: f.data,\n\t\t\t\t\t\t\tduration: await getMediaDuration(f.data),\n\t\t\t\t\t\t})),\n\t\t\t\t\t)\n\t\t\t\t\treturn <const>[key, fileArray]\n\t\t\t\t}),\n\t\t\t),\n\t\t)\n\n\t\treturn new Request<any>({\n\t\t\tip: req.ip,\n\t\t\tbody: req.body ?? {},\n\t\t\tcookies: req.cookies ?? {},\n\t\t\tparams: req.params ?? {},\n\t\t\tquery: req.query ?? {},\n\t\t\tmethod: <any>req.method,\n\t\t\tpath: req.path,\n\t\t\theaders: req.headers,\n\t\t\tfiles,\n\t\t})\n\t}\n\n\tprotected async handleResponse(res: any, response: Response<any>) {\n\t\tif (!response.piped) {\n\t\t\tObject.entries(response.headers).forEach(([key, value]) => res.header(key, value as string))\n\t\t\tObject.entries(response.cookies).forEach(([key, { value, ...opts }]) => res.cookie(key, value, opts))\n\t\t\tconst type = response.body === null || response.body === undefined ? 'json' : 'send'\n\t\t\tres.status(response.status)[type](response.body).end()\n\t\t} else {\n\t\t\tresponse.body.pipe(res)\n\t\t}\n\t}\n\n\tprotected createRawResponder(req: express.Request, res: express.Response): RawResponder {\n\t\treturn this.createNodeRawResponder({ request: req, response: res })\n\t}\n\n\tprotected registerRoute(method: MethodsEnum, path: string, cb: (req: any, res: any) => Promise<void>) {\n\t\tthis.#app[method]?.(path, async (req: any, res: any) => cb(req, res))\n\t}\n\n\tprotected registerErrorHandler(cb: (error: Error, req: any, res: any) => Promise<void>) {\n\t\tthis.#app.use(async (err: any, req: any, res: any, _next: any) => cb(err, req, res))\n\t}\n\n\tprotected registerNotFoundHandler(cb: (req: any, res: any) => Promise<void>) {\n\t\tthis.#app.use(async (req: any, res: any, _next: any) => cb(req, res))\n\t}\n\n\tprotected startServer(port: number) {\n\t\treturn new Promise<boolean>((resolve: (s: boolean) => void, reject: (e: Error) => void) => {\n\t\t\ttry {\n\t\t\t\tconst server = this.#httpServer.listen({ host: '0.0.0.0', port }, async () => resolve(true))\n\t\t\t\tInstance.on('close', server.close)\n\t\t\t} catch (err) {\n\t\t\t\treject(<Error>err)\n\t\t\t}\n\t\t})\n\t}\n}\n\nif (import.meta.vitest) {\n\tconst { describe, expect, test, vi } = import.meta.vitest\n\n\tconst testInstanceState = globalThis as typeof globalThis & { __equippedTestInstanceAliased?: boolean }\n\n\tfunction ensureTestInstance() {\n\t\tconst instance = Instance.maybeGet() ?? Instance.create({ app: { name: 'equipped-test' }, log: { level: 'silent' } })\n\t\tif (!testInstanceState.__equippedTestInstanceAliased) {\n\t\t\tinstance.alias('equipped-test')\n\t\t\ttestInstanceState.__equippedTestInstanceAliased = true\n\t\t}\n\t}\n\n\tfunction createExpressResponse() {\n\t\treturn {\n\t\t\tstatusCode: 200,\n\t\t\theadersSent: false,\n\t\t\twritableEnded: false,\n\t\t\tsetHeader: vi.fn(),\n\t\t\tend(chunk?: unknown) {\n\t\t\t\tvoid chunk\n\t\t\t\tthis.headersSent = true\n\t\t\t\tthis.writableEnded = true\n\t\t\t},\n\t\t}\n\t}\n\n\tclass TestExpressServer extends ExpressServer {\n\t\texposeRawResponder(req: express.Request, res: express.Response) {\n\t\t\treturn this.createRawResponder(req, res)\n\t\t}\n\t}\n\n\tdescribe('ExpressServer raw responder', () => {\n\t\ttest('passes the Express request and response to the raw Node handler', async () => {\n\t\t\tensureTestInstance()\n\t\t\tconst server = TestExpressServer.create({ port: 0, requests: { log: false } })\n\t\t\tconst req = { marker: 'request' } as unknown as express.Request\n\t\t\tconst res = createExpressResponse() as unknown as express.Response\n\t\t\tlet received: { request: unknown; response: unknown } | null = null\n\n\t\t\tawait server.exposeRawResponder(\n\t\t\t\treq,\n\t\t\t\tres,\n\t\t\t)(async (request, response) => {\n\t\t\t\treceived = { request, response }\n\t\t\t\tresponse.end('ok')\n\t\t\t})\n\n\t\t\texpect(received).toEqual({ request: req, response: res })\n\t\t})\n\t})\n}\n"],"mappings":"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","names":["http","cookie","cors","express","fileUpload","rateLimit","helmet","pinoHttp","ExpressServer","configurable","serverConfigPipe","Server","#app","#httpServer","config","app","express","instance","Instance","httpServer","http","pinoHttp","cookie","helmet","cors","fileUpload","rateLimit","_","res","StatusCodes","req","files","key","file","uploads","fileArray","f","getMediaDuration","Request","response","value","opts","type","method","path","cb","err","_next","port","resolve","reject","server"]}
|
|
@@ -1,12 +1,16 @@
|
|
|
1
|
+
import {
|
|
2
|
+
getMediaDuration
|
|
3
|
+
} from "../../../chunk-A332TTED.mjs";
|
|
4
|
+
import {
|
|
5
|
+
configurable
|
|
6
|
+
} from "../../../chunk-NEF3UYFA.mjs";
|
|
1
7
|
import {
|
|
2
8
|
Instance,
|
|
3
9
|
Request,
|
|
4
10
|
Server,
|
|
5
11
|
StatusCodes,
|
|
6
|
-
configurable,
|
|
7
|
-
getMediaDuration,
|
|
8
12
|
serverConfigPipe
|
|
9
|
-
} from "../../../chunk-
|
|
13
|
+
} from "../../../chunk-7N4WUZ7P.mjs";
|
|
10
14
|
import "../../../chunk-VCCS7CAI.mjs";
|
|
11
15
|
import "../../../chunk-J5LGTIGS.mjs";
|
|
12
16
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/server/adapters/express/index.ts"],"sourcesContent":["import http from 'http'\n\nimport cookie from 'cookie-parser'\nimport cors from 'cors'\nimport express from 'express'\nimport fileUpload from 'express-fileupload'\nimport { rateLimit } from 'express-rate-limit'\n// import slowDown from 'express-slow-down'\nimport helmet from 'helmet'\nimport { pinoHttp } from 'pino-http'\n\nimport { Instance } from '../../../instance'\nimport { configurable, getMediaDuration } from '../../../utilities'\nimport { Request, Response } from '../../requests'\nimport { StatusCodes, type IncomingFile, type MethodsEnum } from '../../types'\nimport { type RawResponder, Server, serverConfigPipe } from '../base'\n\nexport class ExpressServer extends configurable(serverConfigPipe, Server) {\n\t#app: express.Express\n\t#httpServer: http.Server\n\n\tprotected constructor(config: typeof ExpressServer.Config) {\n\t\tsuper(config)\n\t\tconst app = express()\n\t\tconst instance = Instance.get()\n\t\tconst httpServer = http.createServer(app)\n\t\tthis.#app = app\n\t\tthis.#httpServer = httpServer\n\n\t\tthis.setup(httpServer, config)\n\n\t\tapp.disable('x-powered-by')\n\t\tif (config.requests.log) app.use(pinoHttp({ logger: instance.log }))\n\t\tapp.use(express.json())\n\t\tapp.use(express.text())\n\t\tapp.use(cookie())\n\t\tapp.use(\n\t\t\thelmet({\n\t\t\t\tcrossOriginResourcePolicy: { policy: 'cross-origin' },\n\t\t\t\tcontentSecurityPolicy: false,\n\t\t\t}),\n\t\t)\n\t\tapp.use(cors(this.cors))\n\t\tapp.use(express.urlencoded({ extended: false }))\n\t\tif (config.publicPath) app.use(express.static(config.publicPath))\n\t\tapp.use(\n\t\t\tfileUpload({\n\t\t\t\tlimits: { fileSize: instance.settings.utils.maxFileUploadSizeInMb * 1024 * 1024 },\n\t\t\t\tuseTempFiles: false,\n\t\t\t}),\n\t\t)\n\t\tif (config.requests.rateLimit.enabled)\n\t\t\tapp.use(\n\t\t\t\trateLimit({\n\t\t\t\t\twindowMs: config.requests.rateLimit.periodInMs,\n\t\t\t\t\tlimit: config.requests.rateLimit.limit,\n\t\t\t\t\thandler: (_: express.Request, res: express.Response) =>\n\t\t\t\t\t\tres.status(StatusCodes.TooManyRequests).json([{ message: 'Too Many Requests' }]),\n\t\t\t\t}),\n\t\t\t)\n\t\t/* if (this.settings.slowdown.enabled) app.use(slowDown({\n\t\t\t\twindowMs: this.settings.slowdown.periodInMs,\n\t\t\t\tdelayAfter: this.settings.slowdown.delayAfter,\n\t\t\t\tdelayMs: this.settings.slowdown.delayInMs\n\t\t\t})) */\n\t}\n\n\tprotected async parseRequest(req: any) {\n\t\tconst files = Object.fromEntries(\n\t\t\tawait Promise.all(\n\t\t\t\tObject.entries(req.files ?? {}).map(async ([key, file]) => {\n\t\t\t\t\tconst uploads = Array.isArray(file) ? file : [file]\n\t\t\t\t\tconst fileArray: IncomingFile[] = await Promise.all(\n\t\t\t\t\t\tuploads.map(async (f: any) => ({\n\t\t\t\t\t\t\tname: f.name,\n\t\t\t\t\t\t\ttype: f.mimetype,\n\t\t\t\t\t\t\tsize: f.size,\n\t\t\t\t\t\t\tisTruncated: f.truncated,\n\t\t\t\t\t\t\tdata: f.data,\n\t\t\t\t\t\t\tduration: await getMediaDuration(f.data),\n\t\t\t\t\t\t})),\n\t\t\t\t\t)\n\t\t\t\t\treturn <const>[key, fileArray]\n\t\t\t\t}),\n\t\t\t),\n\t\t)\n\n\t\treturn new Request<any>({\n\t\t\tip: req.ip,\n\t\t\tbody: req.body ?? {},\n\t\t\tcookies: req.cookies ?? {},\n\t\t\tparams: req.params ?? {},\n\t\t\tquery: req.query ?? {},\n\t\t\tmethod: <any>req.method,\n\t\t\tpath: req.path,\n\t\t\theaders: req.headers,\n\t\t\tfiles,\n\t\t})\n\t}\n\n\tprotected async handleResponse(res: any, response: Response<any>) {\n\t\tif (!response.piped) {\n\t\t\tObject.entries(response.headers).forEach(([key, value]) => res.header(key, value as string))\n\t\t\tObject.entries(response.cookies).forEach(([key, { value, ...opts }]) => res.cookie(key, value, opts))\n\t\t\tconst type = response.body === null || response.body === undefined ? 'json' : 'send'\n\t\t\tres.status(response.status)[type](response.body).end()\n\t\t} else {\n\t\t\tresponse.body.pipe(res)\n\t\t}\n\t}\n\n\tprotected createRawResponder(req: express.Request, res: express.Response): RawResponder {\n\t\treturn this.createNodeRawResponder({ request: req, response: res })\n\t}\n\n\tprotected registerRoute(method: MethodsEnum, path: string, cb: (req: any, res: any) => Promise<void>) {\n\t\tthis.#app[method]?.(path, async (req: any, res: any) => cb(req, res))\n\t}\n\n\tprotected registerErrorHandler(cb: (error: Error, req: any, res: any) => Promise<void>) {\n\t\tthis.#app.use(async (err: any, req: any, res: any, _next: any) => cb(err, req, res))\n\t}\n\n\tprotected registerNotFoundHandler(cb: (req: any, res: any) => Promise<void>) {\n\t\tthis.#app.use(async (req: any, res: any, _next: any) => cb(req, res))\n\t}\n\n\tprotected startServer(port: number) {\n\t\treturn new Promise<boolean>((resolve: (s: boolean) => void, reject: (e: Error) => void) => {\n\t\t\ttry {\n\t\t\t\tconst server = this.#httpServer.listen({ host: '0.0.0.0', port }, async () => resolve(true))\n\t\t\t\tInstance.on('close', server.close)\n\t\t\t} catch (err) {\n\t\t\t\treject(<Error>err)\n\t\t\t}\n\t\t})\n\t}\n}\n\nif (import.meta.vitest) {\n\tconst { describe, expect, test, vi } = import.meta.vitest\n\n\tconst testInstanceState = globalThis as typeof globalThis & { __equippedTestInstanceAliased?: boolean }\n\n\tfunction ensureTestInstance() {\n\t\tconst instance = Instance.maybeGet() ?? Instance.create({ app: { name: 'equipped-test' }, log: { level: 'silent' } })\n\t\tif (!testInstanceState.__equippedTestInstanceAliased) {\n\t\t\tinstance.alias('equipped-test')\n\t\t\ttestInstanceState.__equippedTestInstanceAliased = true\n\t\t}\n\t}\n\n\tfunction createExpressResponse() {\n\t\treturn {\n\t\t\tstatusCode: 200,\n\t\t\theadersSent: false,\n\t\t\twritableEnded: false,\n\t\t\tsetHeader: vi.fn(),\n\t\t\tend(chunk?: unknown) {\n\t\t\t\tvoid chunk\n\t\t\t\tthis.headersSent = true\n\t\t\t\tthis.writableEnded = true\n\t\t\t},\n\t\t}\n\t}\n\n\tclass TestExpressServer extends ExpressServer {\n\t\texposeRawResponder(req: express.Request, res: express.Response) {\n\t\t\treturn this.createRawResponder(req, res)\n\t\t}\n\t}\n\n\tdescribe('ExpressServer raw responder', () => {\n\t\ttest('passes the Express request and response to the raw Node handler', async () => {\n\t\t\tensureTestInstance()\n\t\t\tconst server = TestExpressServer.create({ port: 0, requests: { log: false } })\n\t\t\tconst req = { marker: 'request' } as unknown as express.Request\n\t\t\tconst res = createExpressResponse() as unknown as express.Response\n\t\t\tlet received: { request: unknown; response: unknown } | null = null\n\n\t\t\tawait server.exposeRawResponder(\n\t\t\t\treq,\n\t\t\t\tres,\n\t\t\t)(async (request, response) => {\n\t\t\t\treceived = { request, response }\n\t\t\t\tresponse.end('ok')\n\t\t\t})\n\n\t\t\texpect(received).toEqual({ request: req, response: res })\n\t\t})\n\t})\n}\n"],"mappings":"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","names":["ensureTestInstance","createExpressResponse"]}
|
|
1
|
+
{"version":3,"sources":["../../../../../src/server/adapters/express/index.ts"],"sourcesContent":["import http from 'http'\n\nimport cookie from 'cookie-parser'\nimport cors from 'cors'\nimport express from 'express'\nimport fileUpload from 'express-fileupload'\nimport { rateLimit } from 'express-rate-limit'\n// import slowDown from 'express-slow-down'\nimport helmet from 'helmet'\nimport { pinoHttp } from 'pino-http'\n\nimport { Instance } from '../../../instance'\nimport { configurable, getMediaDuration } from '../../../utilities'\nimport { Request, Response } from '../../requests'\nimport { StatusCodes, type IncomingFile, type MethodsEnum } from '../../types'\nimport { type RawResponder, Server, serverConfigPipe } from '../base'\n\nexport class ExpressServer extends configurable(serverConfigPipe, Server) {\n\t#app: express.Express\n\t#httpServer: http.Server\n\n\tprotected constructor(config: typeof ExpressServer.Config) {\n\t\tsuper(config)\n\t\tconst app = express()\n\t\tconst instance = Instance.get()\n\t\tconst httpServer = http.createServer(app)\n\t\tthis.#app = app\n\t\tthis.#httpServer = httpServer\n\n\t\tthis.setup(httpServer, config)\n\n\t\tapp.disable('x-powered-by')\n\t\tif (config.requests.log) app.use(pinoHttp({ logger: instance.log }))\n\t\tapp.use(express.json())\n\t\tapp.use(express.text())\n\t\tapp.use(cookie())\n\t\tapp.use(\n\t\t\thelmet({\n\t\t\t\tcrossOriginResourcePolicy: { policy: 'cross-origin' },\n\t\t\t\tcontentSecurityPolicy: false,\n\t\t\t}),\n\t\t)\n\t\tapp.use(cors(this.cors))\n\t\tapp.use(express.urlencoded({ extended: false }))\n\t\tif (config.publicPath) app.use(express.static(config.publicPath))\n\t\tapp.use(\n\t\t\tfileUpload({\n\t\t\t\tlimits: { fileSize: instance.settings.utils.maxFileUploadSizeInMb * 1024 * 1024 },\n\t\t\t\tuseTempFiles: false,\n\t\t\t}),\n\t\t)\n\t\tif (config.requests.rateLimit.enabled)\n\t\t\tapp.use(\n\t\t\t\trateLimit({\n\t\t\t\t\twindowMs: config.requests.rateLimit.periodInMs,\n\t\t\t\t\tlimit: config.requests.rateLimit.limit,\n\t\t\t\t\thandler: (_: express.Request, res: express.Response) =>\n\t\t\t\t\t\tres.status(StatusCodes.TooManyRequests).json([{ message: 'Too Many Requests' }]),\n\t\t\t\t}),\n\t\t\t)\n\t\t/* if (this.settings.slowdown.enabled) app.use(slowDown({\n\t\t\t\twindowMs: this.settings.slowdown.periodInMs,\n\t\t\t\tdelayAfter: this.settings.slowdown.delayAfter,\n\t\t\t\tdelayMs: this.settings.slowdown.delayInMs\n\t\t\t})) */\n\t}\n\n\tprotected async parseRequest(req: any) {\n\t\tconst files = Object.fromEntries(\n\t\t\tawait Promise.all(\n\t\t\t\tObject.entries(req.files ?? {}).map(async ([key, file]) => {\n\t\t\t\t\tconst uploads = Array.isArray(file) ? file : [file]\n\t\t\t\t\tconst fileArray: IncomingFile[] = await Promise.all(\n\t\t\t\t\t\tuploads.map(async (f: any) => ({\n\t\t\t\t\t\t\tname: f.name,\n\t\t\t\t\t\t\ttype: f.mimetype,\n\t\t\t\t\t\t\tsize: f.size,\n\t\t\t\t\t\t\tisTruncated: f.truncated,\n\t\t\t\t\t\t\tdata: f.data,\n\t\t\t\t\t\t\tduration: await getMediaDuration(f.data),\n\t\t\t\t\t\t})),\n\t\t\t\t\t)\n\t\t\t\t\treturn <const>[key, fileArray]\n\t\t\t\t}),\n\t\t\t),\n\t\t)\n\n\t\treturn new Request<any>({\n\t\t\tip: req.ip,\n\t\t\tbody: req.body ?? {},\n\t\t\tcookies: req.cookies ?? {},\n\t\t\tparams: req.params ?? {},\n\t\t\tquery: req.query ?? {},\n\t\t\tmethod: <any>req.method,\n\t\t\tpath: req.path,\n\t\t\theaders: req.headers,\n\t\t\tfiles,\n\t\t})\n\t}\n\n\tprotected async handleResponse(res: any, response: Response<any>) {\n\t\tif (!response.piped) {\n\t\t\tObject.entries(response.headers).forEach(([key, value]) => res.header(key, value as string))\n\t\t\tObject.entries(response.cookies).forEach(([key, { value, ...opts }]) => res.cookie(key, value, opts))\n\t\t\tconst type = response.body === null || response.body === undefined ? 'json' : 'send'\n\t\t\tres.status(response.status)[type](response.body).end()\n\t\t} else {\n\t\t\tresponse.body.pipe(res)\n\t\t}\n\t}\n\n\tprotected createRawResponder(req: express.Request, res: express.Response): RawResponder {\n\t\treturn this.createNodeRawResponder({ request: req, response: res })\n\t}\n\n\tprotected registerRoute(method: MethodsEnum, path: string, cb: (req: any, res: any) => Promise<void>) {\n\t\tthis.#app[method]?.(path, async (req: any, res: any) => cb(req, res))\n\t}\n\n\tprotected registerErrorHandler(cb: (error: Error, req: any, res: any) => Promise<void>) {\n\t\tthis.#app.use(async (err: any, req: any, res: any, _next: any) => cb(err, req, res))\n\t}\n\n\tprotected registerNotFoundHandler(cb: (req: any, res: any) => Promise<void>) {\n\t\tthis.#app.use(async (req: any, res: any, _next: any) => cb(req, res))\n\t}\n\n\tprotected startServer(port: number) {\n\t\treturn new Promise<boolean>((resolve: (s: boolean) => void, reject: (e: Error) => void) => {\n\t\t\ttry {\n\t\t\t\tconst server = this.#httpServer.listen({ host: '0.0.0.0', port }, async () => resolve(true))\n\t\t\t\tInstance.on('close', server.close)\n\t\t\t} catch (err) {\n\t\t\t\treject(<Error>err)\n\t\t\t}\n\t\t})\n\t}\n}\n\nif (import.meta.vitest) {\n\tconst { describe, expect, test, vi } = import.meta.vitest\n\n\tconst testInstanceState = globalThis as typeof globalThis & { __equippedTestInstanceAliased?: boolean }\n\n\tfunction ensureTestInstance() {\n\t\tconst instance = Instance.maybeGet() ?? Instance.create({ app: { name: 'equipped-test' }, log: { level: 'silent' } })\n\t\tif (!testInstanceState.__equippedTestInstanceAliased) {\n\t\t\tinstance.alias('equipped-test')\n\t\t\ttestInstanceState.__equippedTestInstanceAliased = true\n\t\t}\n\t}\n\n\tfunction createExpressResponse() {\n\t\treturn {\n\t\t\tstatusCode: 200,\n\t\t\theadersSent: false,\n\t\t\twritableEnded: false,\n\t\t\tsetHeader: vi.fn(),\n\t\t\tend(chunk?: unknown) {\n\t\t\t\tvoid chunk\n\t\t\t\tthis.headersSent = true\n\t\t\t\tthis.writableEnded = true\n\t\t\t},\n\t\t}\n\t}\n\n\tclass TestExpressServer extends ExpressServer {\n\t\texposeRawResponder(req: express.Request, res: express.Response) {\n\t\t\treturn this.createRawResponder(req, res)\n\t\t}\n\t}\n\n\tdescribe('ExpressServer raw responder', () => {\n\t\ttest('passes the Express request and response to the raw Node handler', async () => {\n\t\t\tensureTestInstance()\n\t\t\tconst server = TestExpressServer.create({ port: 0, requests: { log: false } })\n\t\t\tconst req = { marker: 'request' } as unknown as express.Request\n\t\t\tconst res = createExpressResponse() as unknown as express.Response\n\t\t\tlet received: { request: unknown; response: unknown } | null = null\n\n\t\t\tawait server.exposeRawResponder(\n\t\t\t\treq,\n\t\t\t\tres,\n\t\t\t)(async (request, response) => {\n\t\t\t\treceived = { request, response }\n\t\t\t\tresponse.end('ok')\n\t\t\t})\n\n\t\t\texpect(received).toEqual({ request: req, response: res })\n\t\t})\n\t})\n}\n"],"mappings":"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","names":["ensureTestInstance","createExpressResponse"]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{d as f}from "../../../chunk-SPOVKWV3.min.mjs";import{a as y}from "../../../chunk-CU2HU5UE.min.mjs";import{B as d,C as o,g as p,l as c,s as l,t as u}from "../../../chunk-N3OD4QL2.min.mjs";import"../../../chunk-DSUJ5FUL.min.mjs";import"../../../chunk-AQY7QVYI.min.mjs";import R from"@fastify/cookie";import h from"@fastify/cors";import g from"@fastify/formbody";import w from"@fastify/helmet";import q from"@fastify/multipart";import F from"@fastify/rate-limit";import b from"@fastify/static";import v from"fastify";import S from"qs";var m=class extends y(l,u){#e;constructor(e){super(e);let s=o.get(),t=v({disableRequestLogging:!e.requests.log,loggerInstance:e.requests.log?s.log:void 0,ajv:{customOptions:{coerceTypes:!1}},routerOptions:{ignoreTrailingSlash:!0,caseSensitive:!1},schemaErrorFormatter:(r,a)=>new d(r.map(i=>({messages:[i.message??""],field:`${a}${i.instancePath}`.replaceAll("/",".")})))});this.#e=t,this.setup(t.server,e),t.decorateRequest("savedReq",null),t.setValidatorCompiler(()=>()=>!0),t.setSerializerCompiler(()=>r=>JSON.stringify(r)),e.publicPath&&t.register(b,{root:e.publicPath}),t.register(R,{}),t.register(h,this.cors),t.register(g,{parser:r=>S.parse(r)}),t.register(w,{crossOriginResourcePolicy:{policy:"cross-origin"},contentSecurityPolicy:!1}),t.register(q,{attachFieldsToBody:"keyValues",throwFileSizeLimit:!1,limits:{fileSize:s.settings.utils.maxFileUploadSizeInMb*1024*1024},onFile:async r=>{let a=await r.toBuffer(),i={name:r.filename,type:r.mimetype,size:a.byteLength,isTruncated:r.file.truncated,data:a,duration:await f(a)};r.value=i}}),e.requests.rateLimit.enabled&&t.register(F,{max:e.requests.rateLimit.limit,timeWindow:e.requests.rateLimit.periodInMs,errorResponseBuilder:(r,a)=>({statusCode:p.TooManyRequests,message:JSON.stringify([{message:`Too Many Requests. Retry in ${a.after}`}])})})}async parseRequest(e){let{body:s,files:t}=k(e.body??{});return new c({ip:e.ip,body:s,cookies:e.cookies??{},params:e.params??{},query:e.query??{},method:e.method,path:e.url,headers:e.headers,files:t})}async handleResponse(e,s){for(let[t,{value:r,...a}]of Object.entries(s.cookies))e=e.setCookie(t,r,a);await e.status(s.status).headers(s.headers).send(s.body)}createRawResponder(e,s){return this.createNodeRawResponder({request:e.raw,response:s.raw,beforeHandle:()=>s.hijack()})}registerRoute(e,s,t){this.#e.register(async r=>{r.route({url:s,method:e,handler:t})})}registerErrorHandler(e){this.#e.setErrorHandler(e)}registerNotFoundHandler(e){this.#e.setNotFoundHandler(e)}async startServer(e){return await this.#e.ready(),await this.#e.listen({port:e,host:"0.0.0.0"}),o.on("close",this.#e.close),!0}};function k(n){if(typeof n!="object")return{body:n,files:{}};let e=Object.entries(n??{}),s=a=>Array.isArray(a)?s(a.at(0)):Buffer.isBuffer(a?.data),t=e.filter(([a,i])=>s(i)).map(([a,i])=>[a,Array.isArray(i)?i:[i]]),r=e.filter(([a,i])=>!s(i));return{body:Object.fromEntries(r),files:Object.fromEntries(t)}}export{m as FastifyServer};
|
|
2
2
|
//# sourceMappingURL=index.min.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/server/adapters/fastify/index.ts"],"sourcesContent":["import fastifyCookie from '@fastify/cookie'\nimport fastifyCors from '@fastify/cors'\nimport fastifyFormBody from '@fastify/formbody'\nimport fastifyHelmet from '@fastify/helmet'\nimport fastifyMultipart from '@fastify/multipart'\nimport fastifyRateLimit from '@fastify/rate-limit'\nimport fastifyStatic from '@fastify/static'\nimport Fastify, { type FastifyReply, type FastifyRequest } from 'fastify'\n// import fastifySlowDown from 'fastify-slow-down'\nimport qs from 'qs'\n\nimport { ValidationError } from '../../../errors'\nimport { Instance } from '../../../instance'\nimport { configurable, getMediaDuration } from '../../../utilities'\nimport { Request, Response } from '../../requests'\nimport { StatusCodes, type IncomingFile, type MethodsEnum } from '../../types'\nimport { type RawResponder, Server, serverConfigPipe } from '../base'\n\nexport class FastifyServer extends configurable(serverConfigPipe, Server) {\n\t#app: ReturnType<typeof Fastify>\n\n\tprotected constructor(config: typeof FastifyServer.Config) {\n\t\tsuper(config)\n\t\tconst instance = Instance.get()\n\t\tconst app = Fastify({\n\t\t\tdisableRequestLogging: !config.requests.log,\n\t\t\tloggerInstance: config.requests.log ? instance.log : undefined,\n\t\t\tajv: { customOptions: { coerceTypes: false } },\n\t\t\trouterOptions: {\n\t\t\t\tignoreTrailingSlash: true,\n\t\t\t\tcaseSensitive: false,\n\t\t\t},\n\t\t\tschemaErrorFormatter: (errors, data) =>\n\t\t\t\tnew ValidationError(\n\t\t\t\t\terrors.map((error) => ({\n\t\t\t\t\t\tmessages: [error.message ?? ''],\n\t\t\t\t\t\tfield: `${data}${error.instancePath}`.replaceAll('/', '.'),\n\t\t\t\t\t})),\n\t\t\t\t),\n\t\t})\n\t\tthis.#app = app\n\n\t\tthis.setup(app.server, config)\n\n\t\tapp.decorateRequest('savedReq', null)\n\t\tapp.setValidatorCompiler(() => () => true)\n\t\tapp.setSerializerCompiler(() => (data) => JSON.stringify(data))\n\t\tif (config.publicPath) app.register(fastifyStatic, { root: config.publicPath })\n\t\tapp.register(fastifyCookie, {})\n\t\tapp.register(fastifyCors, this.cors)\n\t\tapp.register(fastifyFormBody, { parser: (str) => qs.parse(str) })\n\t\tapp.register(fastifyHelmet, { crossOriginResourcePolicy: { policy: 'cross-origin' }, contentSecurityPolicy: false })\n\t\tapp.register(fastifyMultipart, {\n\t\t\tattachFieldsToBody: 'keyValues',\n\t\t\tthrowFileSizeLimit: false,\n\t\t\tlimits: { fileSize: instance.settings.utils.maxFileUploadSizeInMb * 1024 * 1024 },\n\t\t\tonFile: async (f) => {\n\t\t\t\tconst buffer = await f.toBuffer()\n\t\t\t\tconst parsed: IncomingFile = {\n\t\t\t\t\tname: f.filename,\n\t\t\t\t\ttype: f.mimetype,\n\t\t\t\t\tsize: buffer.byteLength,\n\t\t\t\t\tisTruncated: f.file.truncated,\n\t\t\t\t\tdata: buffer,\n\t\t\t\t\tduration: await getMediaDuration(buffer),\n\t\t\t\t}\n\t\t\t\t// @ts-ignore\n\t\t\t\tf.value = parsed\n\t\t\t},\n\t\t})\n\t\t/* if (this.settings.slowdown.enabled) app.register(fastifySlowDown, {\n\t\t\t\ttimeWindow: this.settings.slowdown.periodInMs,\n\t\t\t\tdelayAfter: this.settings.slowdown.delayAfter,\n\t\t\t\tdelay: this.settings.slowdown.delayInMs\n\t\t\t}) */\n\t\tif (config.requests.rateLimit.enabled)\n\t\t\tapp.register(fastifyRateLimit, {\n\t\t\t\tmax: config.requests.rateLimit.limit,\n\t\t\t\ttimeWindow: config.requests.rateLimit.periodInMs,\n\t\t\t\terrorResponseBuilder: (_, context) => ({\n\t\t\t\t\tstatusCode: StatusCodes.TooManyRequests,\n\t\t\t\t\tmessage: JSON.stringify([{ message: `Too Many Requests. Retry in ${context.after}` }]),\n\t\t\t\t}),\n\t\t\t})\n\t}\n\n\tprotected async parseRequest(req: any) {\n\t\tconst { body, files } = excludeBufferKeys(req.body ?? {})\n\n\t\treturn new Request({\n\t\t\tip: req.ip,\n\t\t\tbody,\n\t\t\tcookies: req.cookies ?? {},\n\t\t\tparams: req.params ?? <any>{},\n\t\t\tquery: req.query ?? {},\n\t\t\tmethod: <any>req.method,\n\t\t\tpath: req.url,\n\t\t\theaders: req.headers,\n\t\t\tfiles,\n\t\t})\n\t}\n\n\tprotected async handleResponse(res: any, response: Response<any>) {\n\t\tfor (const [key, { value, ...opts }] of Object.entries(response.cookies)) res = res.setCookie(key, value, opts)\n\t\tawait res.status(response.status).headers(response.headers).send(response.body)\n\t}\n\n\tprotected createRawResponder(req: FastifyRequest, res: FastifyReply): RawResponder {\n\t\treturn this.createNodeRawResponder({ request: req.raw, response: res.raw, beforeHandle: () => res.hijack() })\n\t}\n\n\tprotected registerRoute(method: MethodsEnum, path: string, cb: (req: any, res: any) => Promise<void>) {\n\t\tthis.#app.register(async (inst) => {\n\t\t\tinst.route({ url: path, method, handler: cb })\n\t\t})\n\t}\n\n\tprotected registerErrorHandler(cb: (error: Error, req: any, res: any) => Promise<void>) {\n\t\tthis.#app.setErrorHandler(cb)\n\t}\n\n\tprotected registerNotFoundHandler(cb: (req: any, res: any) => Promise<void>) {\n\t\tthis.#app.setNotFoundHandler(cb)\n\t}\n\n\tprotected async startServer(port: number) {\n\t\tawait this.#app.ready()\n\t\tawait this.#app.listen({ port, host: '0.0.0.0' })\n\t\tInstance.on('close', this.#app.close)\n\t\treturn true\n\t}\n}\n\nfunction excludeBufferKeys<T>(body: T) {\n\tif (typeof body !== 'object') return { body, files: {} }\n\tconst entries = Object.entries(body ?? {})\n\tconst isFile = (val: any) => (Array.isArray(val) ? isFile(val.at(0)) : Buffer.isBuffer(val?.data))\n\tconst fileEntries = entries.filter(([_, value]) => isFile(value)).map(([key, value]) => [key, Array.isArray(value) ? value : [value]])\n\tconst nonFileEntries = entries.filter(([_, value]) => !isFile(value))\n\treturn {\n\t\tbody: <T>Object.fromEntries(nonFileEntries),\n\t\tfiles: <Record<string, IncomingFile[]>>Object.fromEntries(fileEntries),\n\t}\n}\n\nif (import.meta.vitest) {\n\tconst { describe, expect, test, vi } = import.meta.vitest\n\n\tconst testInstanceState = globalThis as typeof globalThis & { __equippedTestInstanceAliased?: boolean }\n\n\tfunction ensureTestInstance() {\n\t\tconst instance = Instance.maybeGet() ?? Instance.create({ app: { name: 'equipped-test' }, log: { level: 'silent' } })\n\t\tif (!testInstanceState.__equippedTestInstanceAliased) {\n\t\t\tinstance.alias('equipped-test')\n\t\t\ttestInstanceState.__equippedTestInstanceAliased = true\n\t\t}\n\t}\n\n\tfunction createRawResponse() {\n\t\treturn {\n\t\t\tstatusCode: 200,\n\t\t\theadersSent: false,\n\t\t\twritableEnded: false,\n\t\t\tsetHeader: vi.fn(),\n\t\t\tend(chunk?: unknown) {\n\t\t\t\tvoid chunk\n\t\t\t\tthis.headersSent = true\n\t\t\t\tthis.writableEnded = true\n\t\t\t},\n\t\t}\n\t}\n\n\tclass TestFastifyServer extends FastifyServer {\n\t\texposeRawResponder(req: FastifyRequest, res: FastifyReply) {\n\t\t\treturn this.createRawResponder(req, res)\n\t\t}\n\t}\n\n\tdescribe('FastifyServer raw responder', () => {\n\t\ttest('hijacks the Fastify reply before passing Node raw request and response to the handler', async () => {\n\t\t\tensureTestInstance()\n\t\t\tconst server = TestFastifyServer.create({ port: 0, requests: { log: false } })\n\t\t\tconst rawRequest = { marker: 'request' }\n\t\t\tconst rawResponse = createRawResponse()\n\t\t\tconst reply = { raw: rawResponse, hijack: vi.fn() } as unknown as FastifyReply\n\t\t\tconst request = { raw: rawRequest } as unknown as FastifyRequest\n\t\t\tlet received: { request: unknown; response: unknown } | null = null\n\n\t\t\tawait server.exposeRawResponder(\n\t\t\t\trequest,\n\t\t\t\treply,\n\t\t\t)(async (req, res) => {\n\t\t\t\treceived = { request: req, response: res }\n\t\t\t\tres.end('ok')\n\t\t\t})\n\n\t\t\texpect(reply.hijack).toHaveBeenCalledOnce()\n\t\t\texpect(received).toEqual({ request: rawRequest, response: rawResponse })\n\t\t})\n\t})\n}\n"],"mappings":"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","names":["fastifyCookie","fastifyCors","fastifyFormBody","fastifyHelmet","fastifyMultipart","fastifyRateLimit","fastifyStatic","Fastify","qs","FastifyServer","configurable","serverConfigPipe","Server","#app","config","instance","Instance","app","Fastify","errors","data","ValidationError","error","fastifyStatic","fastifyCookie","fastifyCors","fastifyFormBody","str","qs","fastifyHelmet","fastifyMultipart","f","buffer","parsed","getMediaDuration","fastifyRateLimit","_","context","StatusCodes","req","body","files","excludeBufferKeys","Request","res","response","key","value","opts","method","path","cb","inst","port","entries","isFile","val","fileEntries","nonFileEntries"]}
|
|
1
|
+
{"version":3,"sources":["../../../../../src/server/adapters/fastify/index.ts"],"sourcesContent":["import fastifyCookie from '@fastify/cookie'\nimport fastifyCors from '@fastify/cors'\nimport fastifyFormBody from '@fastify/formbody'\nimport fastifyHelmet from '@fastify/helmet'\nimport fastifyMultipart from '@fastify/multipart'\nimport fastifyRateLimit from '@fastify/rate-limit'\nimport fastifyStatic from '@fastify/static'\nimport Fastify, { type FastifyReply, type FastifyRequest } from 'fastify'\n// import fastifySlowDown from 'fastify-slow-down'\nimport qs from 'qs'\n\nimport { ValidationError } from '../../../errors'\nimport { Instance } from '../../../instance'\nimport { configurable, getMediaDuration } from '../../../utilities'\nimport { Request, Response } from '../../requests'\nimport { StatusCodes, type IncomingFile, type MethodsEnum } from '../../types'\nimport { type RawResponder, Server, serverConfigPipe } from '../base'\n\nexport class FastifyServer extends configurable(serverConfigPipe, Server) {\n\t#app: ReturnType<typeof Fastify>\n\n\tprotected constructor(config: typeof FastifyServer.Config) {\n\t\tsuper(config)\n\t\tconst instance = Instance.get()\n\t\tconst app = Fastify({\n\t\t\tdisableRequestLogging: !config.requests.log,\n\t\t\tloggerInstance: config.requests.log ? instance.log : undefined,\n\t\t\tajv: { customOptions: { coerceTypes: false } },\n\t\t\trouterOptions: {\n\t\t\t\tignoreTrailingSlash: true,\n\t\t\t\tcaseSensitive: false,\n\t\t\t},\n\t\t\tschemaErrorFormatter: (errors, data) =>\n\t\t\t\tnew ValidationError(\n\t\t\t\t\terrors.map((error) => ({\n\t\t\t\t\t\tmessages: [error.message ?? ''],\n\t\t\t\t\t\tfield: `${data}${error.instancePath}`.replaceAll('/', '.'),\n\t\t\t\t\t})),\n\t\t\t\t),\n\t\t})\n\t\tthis.#app = app\n\n\t\tthis.setup(app.server, config)\n\n\t\tapp.decorateRequest('savedReq', null)\n\t\tapp.setValidatorCompiler(() => () => true)\n\t\tapp.setSerializerCompiler(() => (data) => JSON.stringify(data))\n\t\tif (config.publicPath) app.register(fastifyStatic, { root: config.publicPath })\n\t\tapp.register(fastifyCookie, {})\n\t\tapp.register(fastifyCors, this.cors)\n\t\tapp.register(fastifyFormBody, { parser: (str) => qs.parse(str) })\n\t\tapp.register(fastifyHelmet, { crossOriginResourcePolicy: { policy: 'cross-origin' }, contentSecurityPolicy: false })\n\t\tapp.register(fastifyMultipart, {\n\t\t\tattachFieldsToBody: 'keyValues',\n\t\t\tthrowFileSizeLimit: false,\n\t\t\tlimits: { fileSize: instance.settings.utils.maxFileUploadSizeInMb * 1024 * 1024 },\n\t\t\tonFile: async (f) => {\n\t\t\t\tconst buffer = await f.toBuffer()\n\t\t\t\tconst parsed: IncomingFile = {\n\t\t\t\t\tname: f.filename,\n\t\t\t\t\ttype: f.mimetype,\n\t\t\t\t\tsize: buffer.byteLength,\n\t\t\t\t\tisTruncated: f.file.truncated,\n\t\t\t\t\tdata: buffer,\n\t\t\t\t\tduration: await getMediaDuration(buffer),\n\t\t\t\t}\n\t\t\t\t// @ts-ignore\n\t\t\t\tf.value = parsed\n\t\t\t},\n\t\t})\n\t\t/* if (this.settings.slowdown.enabled) app.register(fastifySlowDown, {\n\t\t\t\ttimeWindow: this.settings.slowdown.periodInMs,\n\t\t\t\tdelayAfter: this.settings.slowdown.delayAfter,\n\t\t\t\tdelay: this.settings.slowdown.delayInMs\n\t\t\t}) */\n\t\tif (config.requests.rateLimit.enabled)\n\t\t\tapp.register(fastifyRateLimit, {\n\t\t\t\tmax: config.requests.rateLimit.limit,\n\t\t\t\ttimeWindow: config.requests.rateLimit.periodInMs,\n\t\t\t\terrorResponseBuilder: (_, context) => ({\n\t\t\t\t\tstatusCode: StatusCodes.TooManyRequests,\n\t\t\t\t\tmessage: JSON.stringify([{ message: `Too Many Requests. Retry in ${context.after}` }]),\n\t\t\t\t}),\n\t\t\t})\n\t}\n\n\tprotected async parseRequest(req: any) {\n\t\tconst { body, files } = excludeBufferKeys(req.body ?? {})\n\n\t\treturn new Request({\n\t\t\tip: req.ip,\n\t\t\tbody,\n\t\t\tcookies: req.cookies ?? {},\n\t\t\tparams: req.params ?? <any>{},\n\t\t\tquery: req.query ?? {},\n\t\t\tmethod: <any>req.method,\n\t\t\tpath: req.url,\n\t\t\theaders: req.headers,\n\t\t\tfiles,\n\t\t})\n\t}\n\n\tprotected async handleResponse(res: any, response: Response<any>) {\n\t\tfor (const [key, { value, ...opts }] of Object.entries(response.cookies)) res = res.setCookie(key, value, opts)\n\t\tawait res.status(response.status).headers(response.headers).send(response.body)\n\t}\n\n\tprotected createRawResponder(req: FastifyRequest, res: FastifyReply): RawResponder {\n\t\treturn this.createNodeRawResponder({ request: req.raw, response: res.raw, beforeHandle: () => res.hijack() })\n\t}\n\n\tprotected registerRoute(method: MethodsEnum, path: string, cb: (req: any, res: any) => Promise<void>) {\n\t\tthis.#app.register(async (inst) => {\n\t\t\tinst.route({ url: path, method, handler: cb })\n\t\t})\n\t}\n\n\tprotected registerErrorHandler(cb: (error: Error, req: any, res: any) => Promise<void>) {\n\t\tthis.#app.setErrorHandler(cb)\n\t}\n\n\tprotected registerNotFoundHandler(cb: (req: any, res: any) => Promise<void>) {\n\t\tthis.#app.setNotFoundHandler(cb)\n\t}\n\n\tprotected async startServer(port: number) {\n\t\tawait this.#app.ready()\n\t\tawait this.#app.listen({ port, host: '0.0.0.0' })\n\t\tInstance.on('close', this.#app.close)\n\t\treturn true\n\t}\n}\n\nfunction excludeBufferKeys<T>(body: T) {\n\tif (typeof body !== 'object') return { body, files: {} }\n\tconst entries = Object.entries(body ?? {})\n\tconst isFile = (val: any) => (Array.isArray(val) ? isFile(val.at(0)) : Buffer.isBuffer(val?.data))\n\tconst fileEntries = entries.filter(([_, value]) => isFile(value)).map(([key, value]) => [key, Array.isArray(value) ? value : [value]])\n\tconst nonFileEntries = entries.filter(([_, value]) => !isFile(value))\n\treturn {\n\t\tbody: <T>Object.fromEntries(nonFileEntries),\n\t\tfiles: <Record<string, IncomingFile[]>>Object.fromEntries(fileEntries),\n\t}\n}\n\nif (import.meta.vitest) {\n\tconst { describe, expect, test, vi } = import.meta.vitest\n\n\tconst testInstanceState = globalThis as typeof globalThis & { __equippedTestInstanceAliased?: boolean }\n\n\tfunction ensureTestInstance() {\n\t\tconst instance = Instance.maybeGet() ?? Instance.create({ app: { name: 'equipped-test' }, log: { level: 'silent' } })\n\t\tif (!testInstanceState.__equippedTestInstanceAliased) {\n\t\t\tinstance.alias('equipped-test')\n\t\t\ttestInstanceState.__equippedTestInstanceAliased = true\n\t\t}\n\t}\n\n\tfunction createRawResponse() {\n\t\treturn {\n\t\t\tstatusCode: 200,\n\t\t\theadersSent: false,\n\t\t\twritableEnded: false,\n\t\t\tsetHeader: vi.fn(),\n\t\t\tend(chunk?: unknown) {\n\t\t\t\tvoid chunk\n\t\t\t\tthis.headersSent = true\n\t\t\t\tthis.writableEnded = true\n\t\t\t},\n\t\t}\n\t}\n\n\tclass TestFastifyServer extends FastifyServer {\n\t\texposeRawResponder(req: FastifyRequest, res: FastifyReply) {\n\t\t\treturn this.createRawResponder(req, res)\n\t\t}\n\t}\n\n\tdescribe('FastifyServer raw responder', () => {\n\t\ttest('hijacks the Fastify reply before passing Node raw request and response to the handler', async () => {\n\t\t\tensureTestInstance()\n\t\t\tconst server = TestFastifyServer.create({ port: 0, requests: { log: false } })\n\t\t\tconst rawRequest = { marker: 'request' }\n\t\t\tconst rawResponse = createRawResponse()\n\t\t\tconst reply = { raw: rawResponse, hijack: vi.fn() } as unknown as FastifyReply\n\t\t\tconst request = { raw: rawRequest } as unknown as FastifyRequest\n\t\t\tlet received: { request: unknown; response: unknown } | null = null\n\n\t\t\tawait server.exposeRawResponder(\n\t\t\t\trequest,\n\t\t\t\treply,\n\t\t\t)(async (req, res) => {\n\t\t\t\treceived = { request: req, response: res }\n\t\t\t\tres.end('ok')\n\t\t\t})\n\n\t\t\texpect(reply.hijack).toHaveBeenCalledOnce()\n\t\t\texpect(received).toEqual({ request: rawRequest, response: rawResponse })\n\t\t})\n\t})\n}\n"],"mappings":"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","names":["fastifyCookie","fastifyCors","fastifyFormBody","fastifyHelmet","fastifyMultipart","fastifyRateLimit","fastifyStatic","Fastify","qs","FastifyServer","configurable","serverConfigPipe","Server","#app","config","instance","Instance","app","Fastify","errors","data","ValidationError","error","fastifyStatic","fastifyCookie","fastifyCors","fastifyFormBody","str","qs","fastifyHelmet","fastifyMultipart","f","buffer","parsed","getMediaDuration","fastifyRateLimit","_","context","StatusCodes","req","body","files","excludeBufferKeys","Request","res","response","key","value","opts","method","path","cb","inst","port","entries","isFile","val","fileEntries","nonFileEntries"]}
|
|
@@ -1,13 +1,17 @@
|
|
|
1
|
+
import {
|
|
2
|
+
getMediaDuration
|
|
3
|
+
} from "../../../chunk-A332TTED.mjs";
|
|
4
|
+
import {
|
|
5
|
+
configurable
|
|
6
|
+
} from "../../../chunk-NEF3UYFA.mjs";
|
|
1
7
|
import {
|
|
2
8
|
Instance,
|
|
3
9
|
Request,
|
|
4
10
|
Server,
|
|
5
11
|
StatusCodes,
|
|
6
12
|
ValidationError,
|
|
7
|
-
configurable,
|
|
8
|
-
getMediaDuration,
|
|
9
13
|
serverConfigPipe
|
|
10
|
-
} from "../../../chunk-
|
|
14
|
+
} from "../../../chunk-7N4WUZ7P.mjs";
|
|
11
15
|
import "../../../chunk-VCCS7CAI.mjs";
|
|
12
16
|
import "../../../chunk-J5LGTIGS.mjs";
|
|
13
17
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/server/adapters/fastify/index.ts"],"sourcesContent":["import fastifyCookie from '@fastify/cookie'\nimport fastifyCors from '@fastify/cors'\nimport fastifyFormBody from '@fastify/formbody'\nimport fastifyHelmet from '@fastify/helmet'\nimport fastifyMultipart from '@fastify/multipart'\nimport fastifyRateLimit from '@fastify/rate-limit'\nimport fastifyStatic from '@fastify/static'\nimport Fastify, { type FastifyReply, type FastifyRequest } from 'fastify'\n// import fastifySlowDown from 'fastify-slow-down'\nimport qs from 'qs'\n\nimport { ValidationError } from '../../../errors'\nimport { Instance } from '../../../instance'\nimport { configurable, getMediaDuration } from '../../../utilities'\nimport { Request, Response } from '../../requests'\nimport { StatusCodes, type IncomingFile, type MethodsEnum } from '../../types'\nimport { type RawResponder, Server, serverConfigPipe } from '../base'\n\nexport class FastifyServer extends configurable(serverConfigPipe, Server) {\n\t#app: ReturnType<typeof Fastify>\n\n\tprotected constructor(config: typeof FastifyServer.Config) {\n\t\tsuper(config)\n\t\tconst instance = Instance.get()\n\t\tconst app = Fastify({\n\t\t\tdisableRequestLogging: !config.requests.log,\n\t\t\tloggerInstance: config.requests.log ? instance.log : undefined,\n\t\t\tajv: { customOptions: { coerceTypes: false } },\n\t\t\trouterOptions: {\n\t\t\t\tignoreTrailingSlash: true,\n\t\t\t\tcaseSensitive: false,\n\t\t\t},\n\t\t\tschemaErrorFormatter: (errors, data) =>\n\t\t\t\tnew ValidationError(\n\t\t\t\t\terrors.map((error) => ({\n\t\t\t\t\t\tmessages: [error.message ?? ''],\n\t\t\t\t\t\tfield: `${data}${error.instancePath}`.replaceAll('/', '.'),\n\t\t\t\t\t})),\n\t\t\t\t),\n\t\t})\n\t\tthis.#app = app\n\n\t\tthis.setup(app.server, config)\n\n\t\tapp.decorateRequest('savedReq', null)\n\t\tapp.setValidatorCompiler(() => () => true)\n\t\tapp.setSerializerCompiler(() => (data) => JSON.stringify(data))\n\t\tif (config.publicPath) app.register(fastifyStatic, { root: config.publicPath })\n\t\tapp.register(fastifyCookie, {})\n\t\tapp.register(fastifyCors, this.cors)\n\t\tapp.register(fastifyFormBody, { parser: (str) => qs.parse(str) })\n\t\tapp.register(fastifyHelmet, { crossOriginResourcePolicy: { policy: 'cross-origin' }, contentSecurityPolicy: false })\n\t\tapp.register(fastifyMultipart, {\n\t\t\tattachFieldsToBody: 'keyValues',\n\t\t\tthrowFileSizeLimit: false,\n\t\t\tlimits: { fileSize: instance.settings.utils.maxFileUploadSizeInMb * 1024 * 1024 },\n\t\t\tonFile: async (f) => {\n\t\t\t\tconst buffer = await f.toBuffer()\n\t\t\t\tconst parsed: IncomingFile = {\n\t\t\t\t\tname: f.filename,\n\t\t\t\t\ttype: f.mimetype,\n\t\t\t\t\tsize: buffer.byteLength,\n\t\t\t\t\tisTruncated: f.file.truncated,\n\t\t\t\t\tdata: buffer,\n\t\t\t\t\tduration: await getMediaDuration(buffer),\n\t\t\t\t}\n\t\t\t\t// @ts-ignore\n\t\t\t\tf.value = parsed\n\t\t\t},\n\t\t})\n\t\t/* if (this.settings.slowdown.enabled) app.register(fastifySlowDown, {\n\t\t\t\ttimeWindow: this.settings.slowdown.periodInMs,\n\t\t\t\tdelayAfter: this.settings.slowdown.delayAfter,\n\t\t\t\tdelay: this.settings.slowdown.delayInMs\n\t\t\t}) */\n\t\tif (config.requests.rateLimit.enabled)\n\t\t\tapp.register(fastifyRateLimit, {\n\t\t\t\tmax: config.requests.rateLimit.limit,\n\t\t\t\ttimeWindow: config.requests.rateLimit.periodInMs,\n\t\t\t\terrorResponseBuilder: (_, context) => ({\n\t\t\t\t\tstatusCode: StatusCodes.TooManyRequests,\n\t\t\t\t\tmessage: JSON.stringify([{ message: `Too Many Requests. Retry in ${context.after}` }]),\n\t\t\t\t}),\n\t\t\t})\n\t}\n\n\tprotected async parseRequest(req: any) {\n\t\tconst { body, files } = excludeBufferKeys(req.body ?? {})\n\n\t\treturn new Request({\n\t\t\tip: req.ip,\n\t\t\tbody,\n\t\t\tcookies: req.cookies ?? {},\n\t\t\tparams: req.params ?? <any>{},\n\t\t\tquery: req.query ?? {},\n\t\t\tmethod: <any>req.method,\n\t\t\tpath: req.url,\n\t\t\theaders: req.headers,\n\t\t\tfiles,\n\t\t})\n\t}\n\n\tprotected async handleResponse(res: any, response: Response<any>) {\n\t\tfor (const [key, { value, ...opts }] of Object.entries(response.cookies)) res = res.setCookie(key, value, opts)\n\t\tawait res.status(response.status).headers(response.headers).send(response.body)\n\t}\n\n\tprotected createRawResponder(req: FastifyRequest, res: FastifyReply): RawResponder {\n\t\treturn this.createNodeRawResponder({ request: req.raw, response: res.raw, beforeHandle: () => res.hijack() })\n\t}\n\n\tprotected registerRoute(method: MethodsEnum, path: string, cb: (req: any, res: any) => Promise<void>) {\n\t\tthis.#app.register(async (inst) => {\n\t\t\tinst.route({ url: path, method, handler: cb })\n\t\t})\n\t}\n\n\tprotected registerErrorHandler(cb: (error: Error, req: any, res: any) => Promise<void>) {\n\t\tthis.#app.setErrorHandler(cb)\n\t}\n\n\tprotected registerNotFoundHandler(cb: (req: any, res: any) => Promise<void>) {\n\t\tthis.#app.setNotFoundHandler(cb)\n\t}\n\n\tprotected async startServer(port: number) {\n\t\tawait this.#app.ready()\n\t\tawait this.#app.listen({ port, host: '0.0.0.0' })\n\t\tInstance.on('close', this.#app.close)\n\t\treturn true\n\t}\n}\n\nfunction excludeBufferKeys<T>(body: T) {\n\tif (typeof body !== 'object') return { body, files: {} }\n\tconst entries = Object.entries(body ?? {})\n\tconst isFile = (val: any) => (Array.isArray(val) ? isFile(val.at(0)) : Buffer.isBuffer(val?.data))\n\tconst fileEntries = entries.filter(([_, value]) => isFile(value)).map(([key, value]) => [key, Array.isArray(value) ? value : [value]])\n\tconst nonFileEntries = entries.filter(([_, value]) => !isFile(value))\n\treturn {\n\t\tbody: <T>Object.fromEntries(nonFileEntries),\n\t\tfiles: <Record<string, IncomingFile[]>>Object.fromEntries(fileEntries),\n\t}\n}\n\nif (import.meta.vitest) {\n\tconst { describe, expect, test, vi } = import.meta.vitest\n\n\tconst testInstanceState = globalThis as typeof globalThis & { __equippedTestInstanceAliased?: boolean }\n\n\tfunction ensureTestInstance() {\n\t\tconst instance = Instance.maybeGet() ?? Instance.create({ app: { name: 'equipped-test' }, log: { level: 'silent' } })\n\t\tif (!testInstanceState.__equippedTestInstanceAliased) {\n\t\t\tinstance.alias('equipped-test')\n\t\t\ttestInstanceState.__equippedTestInstanceAliased = true\n\t\t}\n\t}\n\n\tfunction createRawResponse() {\n\t\treturn {\n\t\t\tstatusCode: 200,\n\t\t\theadersSent: false,\n\t\t\twritableEnded: false,\n\t\t\tsetHeader: vi.fn(),\n\t\t\tend(chunk?: unknown) {\n\t\t\t\tvoid chunk\n\t\t\t\tthis.headersSent = true\n\t\t\t\tthis.writableEnded = true\n\t\t\t},\n\t\t}\n\t}\n\n\tclass TestFastifyServer extends FastifyServer {\n\t\texposeRawResponder(req: FastifyRequest, res: FastifyReply) {\n\t\t\treturn this.createRawResponder(req, res)\n\t\t}\n\t}\n\n\tdescribe('FastifyServer raw responder', () => {\n\t\ttest('hijacks the Fastify reply before passing Node raw request and response to the handler', async () => {\n\t\t\tensureTestInstance()\n\t\t\tconst server = TestFastifyServer.create({ port: 0, requests: { log: false } })\n\t\t\tconst rawRequest = { marker: 'request' }\n\t\t\tconst rawResponse = createRawResponse()\n\t\t\tconst reply = { raw: rawResponse, hijack: vi.fn() } as unknown as FastifyReply\n\t\t\tconst request = { raw: rawRequest } as unknown as FastifyRequest\n\t\t\tlet received: { request: unknown; response: unknown } | null = null\n\n\t\t\tawait server.exposeRawResponder(\n\t\t\t\trequest,\n\t\t\t\treply,\n\t\t\t)(async (req, res) => {\n\t\t\t\treceived = { request: req, response: res }\n\t\t\t\tres.end('ok')\n\t\t\t})\n\n\t\t\texpect(reply.hijack).toHaveBeenCalledOnce()\n\t\t\texpect(received).toEqual({ request: rawRequest, response: rawResponse })\n\t\t})\n\t})\n}\n"],"mappings":"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","names":["ensureTestInstance","createRawResponse"]}
|
|
1
|
+
{"version":3,"sources":["../../../../../src/server/adapters/fastify/index.ts"],"sourcesContent":["import fastifyCookie from '@fastify/cookie'\nimport fastifyCors from '@fastify/cors'\nimport fastifyFormBody from '@fastify/formbody'\nimport fastifyHelmet from '@fastify/helmet'\nimport fastifyMultipart from '@fastify/multipart'\nimport fastifyRateLimit from '@fastify/rate-limit'\nimport fastifyStatic from '@fastify/static'\nimport Fastify, { type FastifyReply, type FastifyRequest } from 'fastify'\n// import fastifySlowDown from 'fastify-slow-down'\nimport qs from 'qs'\n\nimport { ValidationError } from '../../../errors'\nimport { Instance } from '../../../instance'\nimport { configurable, getMediaDuration } from '../../../utilities'\nimport { Request, Response } from '../../requests'\nimport { StatusCodes, type IncomingFile, type MethodsEnum } from '../../types'\nimport { type RawResponder, Server, serverConfigPipe } from '../base'\n\nexport class FastifyServer extends configurable(serverConfigPipe, Server) {\n\t#app: ReturnType<typeof Fastify>\n\n\tprotected constructor(config: typeof FastifyServer.Config) {\n\t\tsuper(config)\n\t\tconst instance = Instance.get()\n\t\tconst app = Fastify({\n\t\t\tdisableRequestLogging: !config.requests.log,\n\t\t\tloggerInstance: config.requests.log ? instance.log : undefined,\n\t\t\tajv: { customOptions: { coerceTypes: false } },\n\t\t\trouterOptions: {\n\t\t\t\tignoreTrailingSlash: true,\n\t\t\t\tcaseSensitive: false,\n\t\t\t},\n\t\t\tschemaErrorFormatter: (errors, data) =>\n\t\t\t\tnew ValidationError(\n\t\t\t\t\terrors.map((error) => ({\n\t\t\t\t\t\tmessages: [error.message ?? ''],\n\t\t\t\t\t\tfield: `${data}${error.instancePath}`.replaceAll('/', '.'),\n\t\t\t\t\t})),\n\t\t\t\t),\n\t\t})\n\t\tthis.#app = app\n\n\t\tthis.setup(app.server, config)\n\n\t\tapp.decorateRequest('savedReq', null)\n\t\tapp.setValidatorCompiler(() => () => true)\n\t\tapp.setSerializerCompiler(() => (data) => JSON.stringify(data))\n\t\tif (config.publicPath) app.register(fastifyStatic, { root: config.publicPath })\n\t\tapp.register(fastifyCookie, {})\n\t\tapp.register(fastifyCors, this.cors)\n\t\tapp.register(fastifyFormBody, { parser: (str) => qs.parse(str) })\n\t\tapp.register(fastifyHelmet, { crossOriginResourcePolicy: { policy: 'cross-origin' }, contentSecurityPolicy: false })\n\t\tapp.register(fastifyMultipart, {\n\t\t\tattachFieldsToBody: 'keyValues',\n\t\t\tthrowFileSizeLimit: false,\n\t\t\tlimits: { fileSize: instance.settings.utils.maxFileUploadSizeInMb * 1024 * 1024 },\n\t\t\tonFile: async (f) => {\n\t\t\t\tconst buffer = await f.toBuffer()\n\t\t\t\tconst parsed: IncomingFile = {\n\t\t\t\t\tname: f.filename,\n\t\t\t\t\ttype: f.mimetype,\n\t\t\t\t\tsize: buffer.byteLength,\n\t\t\t\t\tisTruncated: f.file.truncated,\n\t\t\t\t\tdata: buffer,\n\t\t\t\t\tduration: await getMediaDuration(buffer),\n\t\t\t\t}\n\t\t\t\t// @ts-ignore\n\t\t\t\tf.value = parsed\n\t\t\t},\n\t\t})\n\t\t/* if (this.settings.slowdown.enabled) app.register(fastifySlowDown, {\n\t\t\t\ttimeWindow: this.settings.slowdown.periodInMs,\n\t\t\t\tdelayAfter: this.settings.slowdown.delayAfter,\n\t\t\t\tdelay: this.settings.slowdown.delayInMs\n\t\t\t}) */\n\t\tif (config.requests.rateLimit.enabled)\n\t\t\tapp.register(fastifyRateLimit, {\n\t\t\t\tmax: config.requests.rateLimit.limit,\n\t\t\t\ttimeWindow: config.requests.rateLimit.periodInMs,\n\t\t\t\terrorResponseBuilder: (_, context) => ({\n\t\t\t\t\tstatusCode: StatusCodes.TooManyRequests,\n\t\t\t\t\tmessage: JSON.stringify([{ message: `Too Many Requests. Retry in ${context.after}` }]),\n\t\t\t\t}),\n\t\t\t})\n\t}\n\n\tprotected async parseRequest(req: any) {\n\t\tconst { body, files } = excludeBufferKeys(req.body ?? {})\n\n\t\treturn new Request({\n\t\t\tip: req.ip,\n\t\t\tbody,\n\t\t\tcookies: req.cookies ?? {},\n\t\t\tparams: req.params ?? <any>{},\n\t\t\tquery: req.query ?? {},\n\t\t\tmethod: <any>req.method,\n\t\t\tpath: req.url,\n\t\t\theaders: req.headers,\n\t\t\tfiles,\n\t\t})\n\t}\n\n\tprotected async handleResponse(res: any, response: Response<any>) {\n\t\tfor (const [key, { value, ...opts }] of Object.entries(response.cookies)) res = res.setCookie(key, value, opts)\n\t\tawait res.status(response.status).headers(response.headers).send(response.body)\n\t}\n\n\tprotected createRawResponder(req: FastifyRequest, res: FastifyReply): RawResponder {\n\t\treturn this.createNodeRawResponder({ request: req.raw, response: res.raw, beforeHandle: () => res.hijack() })\n\t}\n\n\tprotected registerRoute(method: MethodsEnum, path: string, cb: (req: any, res: any) => Promise<void>) {\n\t\tthis.#app.register(async (inst) => {\n\t\t\tinst.route({ url: path, method, handler: cb })\n\t\t})\n\t}\n\n\tprotected registerErrorHandler(cb: (error: Error, req: any, res: any) => Promise<void>) {\n\t\tthis.#app.setErrorHandler(cb)\n\t}\n\n\tprotected registerNotFoundHandler(cb: (req: any, res: any) => Promise<void>) {\n\t\tthis.#app.setNotFoundHandler(cb)\n\t}\n\n\tprotected async startServer(port: number) {\n\t\tawait this.#app.ready()\n\t\tawait this.#app.listen({ port, host: '0.0.0.0' })\n\t\tInstance.on('close', this.#app.close)\n\t\treturn true\n\t}\n}\n\nfunction excludeBufferKeys<T>(body: T) {\n\tif (typeof body !== 'object') return { body, files: {} }\n\tconst entries = Object.entries(body ?? {})\n\tconst isFile = (val: any) => (Array.isArray(val) ? isFile(val.at(0)) : Buffer.isBuffer(val?.data))\n\tconst fileEntries = entries.filter(([_, value]) => isFile(value)).map(([key, value]) => [key, Array.isArray(value) ? value : [value]])\n\tconst nonFileEntries = entries.filter(([_, value]) => !isFile(value))\n\treturn {\n\t\tbody: <T>Object.fromEntries(nonFileEntries),\n\t\tfiles: <Record<string, IncomingFile[]>>Object.fromEntries(fileEntries),\n\t}\n}\n\nif (import.meta.vitest) {\n\tconst { describe, expect, test, vi } = import.meta.vitest\n\n\tconst testInstanceState = globalThis as typeof globalThis & { __equippedTestInstanceAliased?: boolean }\n\n\tfunction ensureTestInstance() {\n\t\tconst instance = Instance.maybeGet() ?? Instance.create({ app: { name: 'equipped-test' }, log: { level: 'silent' } })\n\t\tif (!testInstanceState.__equippedTestInstanceAliased) {\n\t\t\tinstance.alias('equipped-test')\n\t\t\ttestInstanceState.__equippedTestInstanceAliased = true\n\t\t}\n\t}\n\n\tfunction createRawResponse() {\n\t\treturn {\n\t\t\tstatusCode: 200,\n\t\t\theadersSent: false,\n\t\t\twritableEnded: false,\n\t\t\tsetHeader: vi.fn(),\n\t\t\tend(chunk?: unknown) {\n\t\t\t\tvoid chunk\n\t\t\t\tthis.headersSent = true\n\t\t\t\tthis.writableEnded = true\n\t\t\t},\n\t\t}\n\t}\n\n\tclass TestFastifyServer extends FastifyServer {\n\t\texposeRawResponder(req: FastifyRequest, res: FastifyReply) {\n\t\t\treturn this.createRawResponder(req, res)\n\t\t}\n\t}\n\n\tdescribe('FastifyServer raw responder', () => {\n\t\ttest('hijacks the Fastify reply before passing Node raw request and response to the handler', async () => {\n\t\t\tensureTestInstance()\n\t\t\tconst server = TestFastifyServer.create({ port: 0, requests: { log: false } })\n\t\t\tconst rawRequest = { marker: 'request' }\n\t\t\tconst rawResponse = createRawResponse()\n\t\t\tconst reply = { raw: rawResponse, hijack: vi.fn() } as unknown as FastifyReply\n\t\t\tconst request = { raw: rawRequest } as unknown as FastifyRequest\n\t\t\tlet received: { request: unknown; response: unknown } | null = null\n\n\t\t\tawait server.exposeRawResponder(\n\t\t\t\trequest,\n\t\t\t\treply,\n\t\t\t)(async (req, res) => {\n\t\t\t\treceived = { request: req, response: res }\n\t\t\t\tres.end('ok')\n\t\t\t})\n\n\t\t\texpect(reply.hijack).toHaveBeenCalledOnce()\n\t\t\texpect(received).toEqual({ request: rawRequest, response: rawResponse })\n\t\t})\n\t})\n}\n"],"mappings":"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","names":["ensureTestInstance","createRawResponse"]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{f as a,g as b,h as c,i as d,j as e,k as f,l as g,m as h,n as i,o as j,p as k,q as l,r as m,s as n,t as o,u as p}from "../chunk-N3OD4QL2.min.mjs";import"../chunk-DSUJ5FUL.min.mjs";import"../chunk-AQY7QVYI.min.mjs";export{j as BaseApiKeyRequestAuthMethod,m as BaseJwtCookieRequestAuthMethod,l as BaseJwtHeaderRequestAuthMethod,k as BaseJwtRequestAuthMethod,i as BaseRequestAuthMethod,a as Methods,g as Request,h as Response,f as Router,o as Server,b as StatusCodes,e as makeErrorMiddleware,c as makeMiddleware,d as makeResponseMiddleware,p as requireAuthUser,n as serverConfigPipe};
|
|
2
2
|
//# sourceMappingURL=index.min.mjs.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{a,b as c,c as d,d as e,e as f,f as g,g as h}from "../chunk-SPOVKWV3.min.mjs";import{a as b}from "../chunk-CU2HU5UE.min.mjs";import"../chunk-N3OD4QL2.min.mjs";import"../chunk-DSUJ5FUL.min.mjs";import"../chunk-AQY7QVYI.min.mjs";export{a as AuthProviders,c as Hash,f as Random,b as configurable,e as getMediaDuration,d as parseJSONValue,h as retry,g as sleep};
|
|
2
2
|
//# sourceMappingURL=index.min.mjs.map
|
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
import {
|
|
2
2
|
authProviders_exports,
|
|
3
|
-
configurable,
|
|
4
3
|
getMediaDuration,
|
|
5
4
|
hash_exports,
|
|
6
|
-
parseJSONObject,
|
|
7
5
|
parseJSONValue,
|
|
8
6
|
random_exports,
|
|
9
7
|
retry,
|
|
10
8
|
sleep
|
|
11
|
-
} from "../chunk-
|
|
9
|
+
} from "../chunk-A332TTED.mjs";
|
|
10
|
+
import {
|
|
11
|
+
configurable
|
|
12
|
+
} from "../chunk-NEF3UYFA.mjs";
|
|
13
|
+
import "../chunk-7N4WUZ7P.mjs";
|
|
12
14
|
import "../chunk-VCCS7CAI.mjs";
|
|
13
15
|
import "../chunk-J5LGTIGS.mjs";
|
|
14
16
|
export {
|
|
@@ -17,7 +19,6 @@ export {
|
|
|
17
19
|
random_exports as Random,
|
|
18
20
|
configurable,
|
|
19
21
|
getMediaDuration,
|
|
20
|
-
parseJSONObject,
|
|
21
22
|
parseJSONValue,
|
|
22
23
|
retry,
|
|
23
24
|
sleep
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{c as a,d as b,e as c}from "../chunk-
|
|
1
|
+
import{c as a,d as b,e as c}from "../chunk-N3OD4QL2.min.mjs";import"../chunk-DSUJ5FUL.min.mjs";import"../chunk-AQY7QVYI.min.mjs";export{b as pipeErrorToValidationError,c as validate,a as ve};
|
|
2
2
|
//# sourceMappingURL=index.min.mjs.map
|