equipped 5.3.0-alpha.0 → 5.3.1
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 +14 -0
- package/dist/cjs/server/adapters/express/index.cjs +312 -4
- 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 +315 -4
- 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 +261 -4
- 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/esm/cache/adapters/in-memory/index.min.mjs +1 -1
- package/dist/esm/cache/adapters/in-memory/index.mjs +2 -2
- package/dist/esm/cache/adapters/redis/index.min.mjs +1 -1
- package/dist/esm/cache/adapters/redis/index.mjs +3 -3
- package/dist/esm/cache/index.min.mjs +1 -1
- package/dist/esm/cache/index.mjs +2 -2
- package/dist/esm/{chunk-AUKXL4EA.min.mjs → chunk-2GGMLKRP.min.mjs} +2 -2
- package/dist/esm/{chunk-TWKHVLLT.mjs → chunk-3TP7NINX.mjs} +2 -2
- package/dist/esm/{chunk-RIRBNBTC.mjs → chunk-5PZACGPI.mjs} +3 -3
- package/dist/esm/{chunk-OXI6IKAM.min.mjs → chunk-676VIABN.min.mjs} +2 -2
- package/dist/esm/{chunk-I4BB436E.mjs → chunk-7CP7ZE2O.mjs} +2 -2
- package/dist/esm/{chunk-YTM6ZURZ.min.mjs → chunk-7NF7PV6S.min.mjs} +2 -2
- package/dist/esm/{chunk-WHIWTP2Z.min.mjs → chunk-7SQ5JQYR.min.mjs} +2 -2
- package/dist/esm/{chunk-2TCFNKRZ.mjs → chunk-A4P7P6BU.mjs} +262 -5
- package/dist/esm/chunk-A4P7P6BU.mjs.map +1 -0
- package/dist/esm/{chunk-KW3PBDFD.mjs → chunk-BWUFPMVG.mjs} +2 -2
- package/dist/esm/{chunk-YTHRK2PO.mjs → chunk-HXFNN6RI.mjs} +3 -3
- package/dist/esm/chunk-IN5YKIJ7.min.mjs +32 -0
- package/dist/esm/chunk-IN5YKIJ7.min.mjs.map +1 -0
- package/dist/esm/{chunk-ECBJ3NT3.min.mjs → chunk-IRYCN6PI.min.mjs} +2 -2
- package/dist/esm/{chunk-IEBC3OWN.mjs → chunk-LKS5ZE45.mjs} +2 -2
- package/dist/esm/{chunk-6DW4GW3R.min.mjs → chunk-MQXTTWPS.min.mjs} +2 -2
- package/dist/esm/{chunk-MYGAF2AC.min.mjs → chunk-P4PRHHIY.min.mjs} +2 -2
- package/dist/esm/{chunk-6SB5M4XH.mjs → chunk-TSVHZZE4.mjs} +3 -3
- package/dist/esm/dbs/adapters/mongodb/index.min.mjs +1 -1
- package/dist/esm/dbs/adapters/mongodb/index.mjs +3 -3
- package/dist/esm/dbs/index.min.mjs +1 -1
- package/dist/esm/dbs/index.mjs +3 -3
- package/dist/esm/errors/index.min.mjs +1 -1
- package/dist/esm/errors/index.mjs +1 -1
- package/dist/esm/events/adapters/kafka/index.min.mjs +1 -1
- package/dist/esm/events/adapters/kafka/index.mjs +2 -2
- package/dist/esm/events/adapters/rabbitmq/index.min.mjs +1 -1
- package/dist/esm/events/adapters/rabbitmq/index.mjs +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-THKMXV5V.min.mjs +2 -0
- package/dist/esm/{introspection-Y7EXSYPD.mjs → introspection-YJF3QAUK.mjs} +3 -3
- package/dist/esm/jobs/adapters/redis/index.min.mjs +1 -1
- package/dist/esm/jobs/adapters/redis/index.mjs +3 -3
- package/dist/esm/orm/adapters/in-memory/index.min.mjs +1 -1
- package/dist/esm/orm/adapters/in-memory/index.mjs +3 -3
- package/dist/esm/orm/adapters/json/index.min.mjs +1 -1
- package/dist/esm/orm/adapters/json/index.mjs +3 -3
- package/dist/esm/orm/adapters/mongodb/index.min.mjs +1 -1
- package/dist/esm/orm/adapters/mongodb/index.mjs +2 -2
- package/dist/esm/orm/adapters/postgresql/index.min.mjs +2 -2
- package/dist/esm/orm/adapters/postgresql/index.mjs +3 -3
- 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 +52 -1
- 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 +55 -1
- 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 +1 -1
- package/dist/esm/validations/index.min.mjs +1 -1
- package/dist/esm/validations/index.mjs +1 -1
- package/dist/types/{base-3PpBAx1K.d.ts → base-BDTBLZ9a.d.ts} +26 -2
- package/dist/types/cache/adapters/in-memory/index.js +2 -2
- package/dist/types/cache/adapters/redis/index.js +3 -3
- package/dist/types/cache/index.js +2 -2
- package/dist/types/{chunk-H6JBLKX5.js → chunk-4DH3POYM.js} +2 -2
- package/dist/types/{chunk-XOU2A2Y6.js → chunk-55CTVK7R.js} +1 -1
- package/dist/types/{chunk-A2MRYMCA.js → chunk-5Z26ZURE.js} +1 -1
- package/dist/types/{chunk-JZ2JTENY.js → chunk-IZDJDGOV.js} +2 -2
- package/dist/types/{chunk-IAHTILKJ.js → chunk-J3TGB5YQ.js} +1 -1
- package/dist/types/{chunk-LWUMIHL4.js → chunk-LPB5LS7A.js} +1 -1
- package/dist/types/{chunk-32DMHN3G.js → chunk-TT5EORDK.js} +261 -4
- package/dist/types/{chunk-4LRJJSGG.js → chunk-YLJNBL6J.js} +2 -2
- package/dist/types/dbs/adapters/mongodb/index.js +3 -3
- package/dist/types/dbs/index.js +3 -3
- package/dist/types/errors/index.js +1 -1
- package/dist/types/events/adapters/kafka/index.js +2 -2
- package/dist/types/events/adapters/rabbitmq/index.js +1 -1
- package/dist/types/index.js +1 -1
- package/dist/types/instance/index.js +1 -1
- package/dist/types/{introspection-ZQCAW254.js → introspection-EHGM4RMO.js} +2 -2
- package/dist/types/jobs/adapters/redis/index.js +3 -3
- package/dist/types/orm/adapters/in-memory/index.js +3 -3
- package/dist/types/orm/adapters/json/index.js +3 -3
- package/dist/types/orm/adapters/mongodb/index.js +2 -2
- package/dist/types/orm/adapters/postgresql/index.js +3 -3
- package/dist/types/orm/index.js +3 -3
- package/dist/types/server/adapters/express/index.d.ts +3 -1
- package/dist/types/server/adapters/express/index.js +52 -1
- package/dist/types/server/adapters/fastify/index.d.ts +3 -1
- package/dist/types/server/adapters/fastify/index.js +55 -1
- package/dist/types/server/index.d.ts +2 -2
- package/dist/types/server/index.js +1 -1
- package/dist/types/utilities/index.js +1 -1
- package/dist/types/validations/index.js +1 -1
- package/package.json +2 -4
- package/dist/esm/chunk-2TCFNKRZ.mjs.map +0 -1
- package/dist/esm/chunk-LTDVZJYJ.min.mjs +0 -32
- package/dist/esm/chunk-LTDVZJYJ.min.mjs.map +0 -1
- package/dist/esm/introspection-GP3G26B6.min.mjs +0 -2
- /package/dist/esm/{chunk-AUKXL4EA.min.mjs.map → chunk-2GGMLKRP.min.mjs.map} +0 -0
- /package/dist/esm/{chunk-TWKHVLLT.mjs.map → chunk-3TP7NINX.mjs.map} +0 -0
- /package/dist/esm/{chunk-RIRBNBTC.mjs.map → chunk-5PZACGPI.mjs.map} +0 -0
- /package/dist/esm/{chunk-OXI6IKAM.min.mjs.map → chunk-676VIABN.min.mjs.map} +0 -0
- /package/dist/esm/{chunk-I4BB436E.mjs.map → chunk-7CP7ZE2O.mjs.map} +0 -0
- /package/dist/esm/{chunk-YTM6ZURZ.min.mjs.map → chunk-7NF7PV6S.min.mjs.map} +0 -0
- /package/dist/esm/{chunk-WHIWTP2Z.min.mjs.map → chunk-7SQ5JQYR.min.mjs.map} +0 -0
- /package/dist/esm/{chunk-KW3PBDFD.mjs.map → chunk-BWUFPMVG.mjs.map} +0 -0
- /package/dist/esm/{chunk-YTHRK2PO.mjs.map → chunk-HXFNN6RI.mjs.map} +0 -0
- /package/dist/esm/{chunk-ECBJ3NT3.min.mjs.map → chunk-IRYCN6PI.min.mjs.map} +0 -0
- /package/dist/esm/{chunk-IEBC3OWN.mjs.map → chunk-LKS5ZE45.mjs.map} +0 -0
- /package/dist/esm/{chunk-6DW4GW3R.min.mjs.map → chunk-MQXTTWPS.min.mjs.map} +0 -0
- /package/dist/esm/{chunk-MYGAF2AC.min.mjs.map → chunk-P4PRHHIY.min.mjs.map} +0 -0
- /package/dist/esm/{chunk-6SB5M4XH.mjs.map → chunk-TSVHZZE4.mjs.map} +0 -0
- /package/dist/esm/{introspection-GP3G26B6.min.mjs.map → introspection-THKMXV5V.min.mjs.map} +0 -0
- /package/dist/esm/{introspection-Y7EXSYPD.mjs.map → introspection-YJF3QAUK.mjs.map} +0 -0
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
"use strict";var
|
|
2
|
-
${t.error.toString()}`,{messages:t.error.messages})),t.value}static create(e){if(o.#t)return o.crash(new
|
|
3
|
-
${t.error.toString()}`,{messages:t.error.messages})),new o(t.value)}static get(){return o.#t?o.#t:o.crash(new
|
|
1
|
+
"use strict";var Ne=Object.create;var $=Object.defineProperty;var Le=Object.getOwnPropertyDescriptor;var $e=Object.getOwnPropertyNames;var Ve=Object.getPrototypeOf,Ge=Object.prototype.hasOwnProperty;var Z=(o,e)=>{for(var t in e)$(o,t,{get:e[t],enumerable:!0})},L=(o,e,t,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of $e(e))!Ge.call(o,r)&&r!==t&&$(o,r,{get:()=>e[r],enumerable:!(s=Le(e,r))||s.enumerable});return o},O=(o,e,t)=>(L(o,e,"default"),t&&L(t,e,"default")),E=(o,e,t)=>(t=o!=null?Ne(Ve(o)):{},L(e||!o||!o.__esModule?$(t,"default",{value:o,enumerable:!0}):t,o)),We=o=>L($({},"__esModule",{value:!0}),o);var nt={};Z(nt,{FastifyServer:()=>ae});module.exports=We(nt);var De=E(require("@fastify/cookie"),1),Se=E(require("@fastify/cors"),1),qe=E(require("@fastify/formbody"),1),Ee=E(require("@fastify/helmet"),1),Ae=E(require("@fastify/multipart"),1),Be=E(require("@fastify/rate-limit"),1),Oe=E(require("@fastify/static"),1),Ie=E(require("fastify"),1),Me=E(require("qs"),1);var g=class extends Error{constructor(t,s,r){super(t,{cause:r});this.message=t;this.context=s;this.cause=r}};var S=class extends g{constructor(t,s,r){super(t,{serializedErrors:s},r);this.message=t;this.serializedErrors=s}};var Nt=require("http"),$t=require("@fastify/cors"),Vt=require("cors"),xe=require("socket.io"),Te=E(require("supertest"),1),i=require("valleyed");var V=class{};var I=E(require("pino"),1),de=require("ulid"),ee=require("valleyed");function pe(o,e){for(let t of e.after)if(!o.some(s=>s.class===t)){let s=t.name||"unknown",r=e.class?.name||"anonymous";throw new Error(`Missing dependency: ${r} declares after: [${s}], but ${s} is not registered`)}if(e.class){let t=[...o,e];ze(t)}o.push(e)}function ze(o){let e=new Map;for(let n of o){if(!n.class)continue;let p=e.get(n.class);if(p)for(let d of n.after)p.includes(d)||p.push(d);else e.set(n.class,[...n.after])}let t=new Set,s=new Set;function r(n,p){if(s.has(n)){let d=p.indexOf(n),u=[...p.slice(d),n].map(R=>R.name||"unknown");throw new Error(`Cycle detected: ${u.join(" \u2192 ")}`)}if(!t.has(n)){s.add(n),p.push(n);for(let d of e.get(n)??[])r(d,p);p.pop(),s.delete(n),t.add(n)}}for(let n of e.keys())r(n,[])}function Ke(o,e=!1){if(o.length===0)return[];let t=new Map,s=[];for(let u of o)if(u.class){let R=t.get(u.class);R?R.push(u):t.set(u.class,[u])}else s.push(u);let r=[...t.keys()],n=new Map,p=new Map;for(let u of r)n.set(u,0),p.set(u,[]);for(let u of o)if(u.class)for(let R of u.after){let[h,w]=e?[u.class,R]:[R,u.class],k=p.get(h);k.includes(w)||(k.push(w),n.set(w,n.get(w)+1))}let d=[],y=r.filter(u=>n.get(u)===0);for(;y.length>0;){let u=[],R=[];for(let h of y)u.push(...t.get(h)??[]);d.push(u);for(let h of y)for(let w of p.get(h)??[]){let k=n.get(w)-1;n.set(w,k),k===0&&R.push(w)}y=R}if(s.length>0){let u=s.filter(h=>h.after.length>0),R=s.filter(h=>h.after.length===0);if(u.length>0){let h=-1;for(let k of u)for(let A of k.after){let a=d.findIndex(c=>c.some(l=>l.class===A));a>h&&(h=a)}let w=h+1;w<d.length?d[w].push(...u):d.push(u)}R.length>0&&(d.length>0?d[d.length-1].push(...R):d.push(R))}return d}async function G(o,e=s=>{throw s},t=!1){let s=Ke(o,t);for(let r of s)await Promise.all(r.map(async n=>{try{return typeof n.cb=="function"?await n.cb():await n.cb}catch(p){return e(p instanceof Error?p:new Error(`${p}`))}}))}var C=require("valleyed"),ce=()=>C.v.object({app:C.v.object({name:C.v.string()}),log:C.v.defaults(C.v.object({level:C.v.defaults(C.v.in(["fatal","error","warn","info","debug","trace","silent"]),"info")}),{}),utils:C.v.defaults(C.v.object({hashSaltRounds:C.v.defaults(C.v.number(),10),paginationDefaultLimit:C.v.defaults(C.v.number(),100),maxFileUploadSizeInMb:C.v.defaults(C.v.number(),500)}),{})});var T=class o{static#e;static#t;static#o={};settings;log;constructor(e){o.#t=this,this.settings=Object.freeze(e),this.log=(0,I.default)({level:this.settings.log.level,serializers:{err:I.default.stdSerializers.err,error:I.default.stdSerializers.err,req:I.default.stdSerializers.req,res:I.default.stdSerializers.res},mixin:()=>({instanceId:o.#e})}),o.#s()}alias(e){if(o.#e!==void 0)return o.crash(new g("Instance already has an alias",{}));o.#e=e}get id(){return o.#e===void 0?o.crash(new g("Instance doesnt have an alias yet",{})):o.#e}getScopedName(e,t="."){return[this.settings.app.name,e].join(t)}async start(){try{await G(o.#o.setup??[]),await G(o.#o.start??[])}catch(e){o.crash(new g("Error starting instance",{},e))}}static envs(e){let t=ee.v.validate(e,process.env);return t.valid||o.crash(new g(`Environment variables are not valid
|
|
2
|
+
${t.error.toString()}`,{messages:t.error.messages})),t.value}static create(e){if(o.#t)return o.crash(new g("Instance has been initialized already",{}));let t=ee.v.validate(ce(),e);return t.valid||o.crash(new g(`Settings are not valid
|
|
3
|
+
${t.error.toString()}`,{messages:t.error.messages})),new o(t.value)}static get(){return o.#t?o.#t:o.crash(new g("Has not been initialized. Make sure an instance has been created before you get an instance",{}))}static maybeGet(){return o.#t}static on(e,t,s){o.#o[e]??=[];let r={cb:t,class:s?.class,after:s?.after??[]};pe(o.#o[e],r)}static#s(){Object.entries({SIGHUP:1,SIGINT:2,SIGTERM:15}).forEach(([t,s])=>{process.on(t,async()=>{await G(o.#o.close??[],()=>{},!0),process.exit(128+s)})})}static resolveBeforeCrash(e){let t=e();return o.on("close",async()=>await t),t}static crash(e){console.error(e),process.exit(1)}static createId(e){return`${e?.prefix??""}${(0,de.ulid)(e?.time?.getTime())}`}};var B={};Z(B,{pipeErrorToValidationError:()=>F,validate:()=>Xe,ve:()=>se});O(B,require("valleyed"));var se={};Z(se,{incomingFile:()=>Je,incomingFiles:()=>Ue,requestLocalStorage:()=>W,responseLocalStorage:()=>z,withRequest:()=>_e,withResponse:()=>Qe});var te=require("async_hooks"),P=require("valleyed");var ue=o=>P.v.array(P.v.file(o).pipe(e=>{let t=`is larger than allowed limit of ${T.get().settings.utils.maxFileUploadSizeInMb}mb`;if(e?!e.isTruncated:!0)return e;throw P.PipeError.root(t,e)})),Je=o=>P.v.define(P.v.compile(ue(o).pipe(P.v.min(1,"no file provided")).pipe(e=>e[0])),{schema:()=>({type:"string",format:"binary"})}),Ue=o=>P.v.define(P.v.compile(ue(o)),{schema:()=>({type:"string",format:"binary"})}),W=new te.AsyncLocalStorage,z=new te.AsyncLocalStorage,_e=o=>P.v.define(e=>{let t=W.getStore();if(!t)throw new Error("Request not found in context");let s=P.v.validate(o(t),e);return s.valid?s.value:s.error}),Qe=o=>P.v.define(e=>{let t=z.getStore();if(!t)throw new Error("Response not found in context");let s=P.v.validate(o(t),e);return s.valid?s.value:s.error});var le=require("valleyed");function F(o){let e=o.messages.reduce((t,{path:s="",message:r})=>(t[s]?t[s].messages.push(r):t[s]={field:s,messages:[r]},t),{});return new M(Object.values(e))}function Xe(o,e){let t=le.v.validate(o,e);if(t.valid)return t.value;throw F(t.error)}var N=require("@openapi-contrib/json-schema-to-openapi-schema"),he=require("valleyed");var ye=require("valleyed");var x={head:"head",get:"get",post:"post",put:"put",patch:"patch",delete:"delete",options:"options"},m={Ok:200,Found:302,BadRequest:400,NotAuthenticated:401,NotAuthorized:403,NotFound:404,ValidationError:422,TooManyRequests:429,TokenExpired:461};function Ye(...o){let e={params:"",headers:"",query:"",body:"",cookies:"",response:"",responseHeaders:"",responseCookies:"",defaultStatusCode:"",defaultContentType:""};function t(s,r){return s?r?typeof s=="number"||typeof s=="string"||typeof s=="function"?r:ye.v.merge(s,r):s:r}return Object.fromEntries(Object.keys(e).map(s=>[s,o.map(r=>r[s]).reduce(t,null)]))}var fe=(o,e)=>e.map(t=>({...o,...t,path:`${o.path}/${t.path}`,groups:[...o.groups??[],...t.groups??[]],middlewares:[...o.middlewares??[],...t.middlewares??[]],responseMiddlewares:[...o.responseMiddlewares??[],...t.responseMiddlewares??[]],schema:Ye(o.schema??{},t.schema??{}),security:[...o.security??[],...t.security??[]]})),K=class{#e={path:""};#t=[];#o=[];constructor(e={path:""}){this.#e=e}#s(e){return(t,s={})=>r=>{let n=fe(this.#e,[{...s,path:t,method:e,handler:r}])[0];return this.#t.push(n),n}}head=this.#s(x.head);get=this.#s(x.get);post=this.#s(x.post);put=this.#s(x.put);patch=this.#s(x.patch);delete=this.#s(x.delete);options=this.#s(x.options);nest(...e){e.forEach(t=>this.#o.push(t))}get routes(){return[...this.#t].concat(this.#o.flatMap(e=>fe(this.#e,e.routes)))}};var me=o=>{let e=T.get(),{app:t}=e.settings,s={openapi:"3.0.0",info:{title:`${t.name} ${e.id}`,version:o.openapi.docsVersion??""},servers:o.openapi.docsBaseUrl?.map(a=>({url:a})),paths:{},components:{schemas:{},securitySchemes:{Authorization:{type:"apiKey",name:"authorization",in:"header"},RefreshToken:{type:"apiKey",name:"x-refresh-token",in:"header"},ApiKey:{type:"apiKey",name:"x-api-key",in:"header"}}},tags:[],"x-tagGroups":[]},r={},n={},p=a=>{let{allOf:c,oneOf:l,anyOf:f,...D}=a;return c?c.flatMap(v=>p(v)):[D]},d=a=>{if(!a||typeof a!="object")return a;if(typeof a.$refId=="string"){let{$refId:c,...l}=a,f=d(l);return s.components?.schemas?(s.components.schemas[c]=f,{$ref:`#/components/schemas/${c}`}):f}return Array.isArray(a)?a.map(c=>d(c)):Object.fromEntries(Object.entries(a).map(([c,l])=>[c,d(l)]))},y=a=>{if(!a.length)return;let c=a.map(v=>typeof v=="string"?{name:v}:v),l=c.map(v=>v.name).join(" > "),f=c.at(-1)?.name??"",D=c.map(v=>v.description?.trim()??"").filter(Boolean).join(`
|
|
4
4
|
|
|
5
5
|
|
|
6
6
|
|
|
7
|
-
`);if(!
|
|
7
|
+
`);if(!r[l]){r[l]=!0,s.tags.push({name:l,"x-displayName":f,description:D});let b=c.slice(0,-1).map(q=>q.name).join(" > ")||"default";if(!n[b]){let q={name:b,tags:[]};s["x-tagGroups"].push(q),n[b]=q}n[b].tags=[...new Set([...n[b].tags,l])]}return l},u=async(a,c,l,f)=>{if(l.response.response?.length){f.responses??={};for(let b of l.response.response){f.responses[b.status]??={description:"",content:{}};let q=f.responses[b.status];q.content[b.contentType]={schema:await(0,N.convert)(d(b.schema))}}}if(l.response.responseHeaders?.length){f.responses??={};for(let b of l.response.responseHeaders){f.responses[b.status]??={description:"",content:{}},f.responses[b.status];let q=f.responses[b.status];q.headers={schema:await(0,N.convert)(d(b.schema))}}}l.request.body&&(f.requestBody={required:!0,content:{"application/json":{schema:await(0,N.convert)(d(l.request.body))}}});let D=[],v=async(b,q)=>{if(!q)return;let je=p(q);for(let Y of je)if(Y.properties)for(let[ie,Fe]of Object.entries(Y.properties))D.push({name:ie,in:b,schema:await(0,N.convert)(d(Fe)),required:(Y.required||[]).includes(ie)})};await Promise.all([v("query",l.request.query),v("path",l.request.params),v("header",l.request.headers)]),D.length&&(f.parameters=D),s.paths||(s.paths={}),s.paths[a]||(s.paths[a]={}),s.paths[a][c]=f},R=a=>`
|
|
8
8
|
<!doctype html>
|
|
9
9
|
<html>
|
|
10
10
|
<head>
|
|
11
|
-
<title>${(0,
|
|
11
|
+
<title>${(0,he.capitalize)(`${t.name} ${e.id}`)}</title>
|
|
12
12
|
<meta charset="utf-8" />
|
|
13
13
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
14
14
|
<style>
|
|
@@ -26,7 +26,7 @@ ${t.error.toString()}`,{messages:t.error.messages})),new o(t.value)}static get()
|
|
|
26
26
|
<script src="https://cdn.jsdelivr.net/npm/@scalar/api-reference@1.38.0"></script>
|
|
27
27
|
</body>
|
|
28
28
|
</html>
|
|
29
|
-
`,
|
|
29
|
+
`,h=a=>{let c=a.replace(/(\/\s*)+/g,"/");return c.startsWith("/")||(c=`/${c}`),c!=="/"&&c.endsWith("/")&&(c=c.slice(0,-1)),c},w=async(a,c)=>{if(a.hide)return;let l=y(a.groups??[]),f=h(a.path),D=`(${a.method.toUpperCase()}) ${f}`;await u(f,a.method.toLowerCase(),c,{operationId:D,summary:a.title??f,description:a.descriptions?.join(`
|
|
30
30
|
|
|
31
|
-
`),tags:d?[d]:void 0,security:a.security})},C="/openapi.json",O=new W({path:o.openapi.docsPath??"/",hide:!0});return O.get("/index.html")(a=>a.res({body:g(`.${C}`),contentType:"text/html"})),O.get(C)(a=>a.res({body:s})),{router:O,register:b,cleanPath:m}};var oe=require("valleyed");function he(o,e){let t=o();oe.v.compile(t);class s extends e{constructor(p,...u){super(...u);this.config=p}static create(p,...u){let y=oe.v.validate(t,p);if(!y.valid)throw y.error;return new this(y.value,...u)}}return s}var Qe=o=>{try{return o?.constructor?.name!=="String"?o:JSON.parse(o)}catch{return o}};function re(o){return Object.fromEntries(Object.entries(o).map(([e,t])=>[e,Qe(t)]))}var ge=require("music-metadata"),Re=async o=>{try{return(await(0,ge.parseBuffer)(o)).format.duration??0}catch{return 0}};var J=class{ip;method;path;body;params;query;headers;cookies;authUser=null;constructor({ip:e,body:t,cookies:s,params:n,query:r,method:p,path:u,headers:y,files:l}){this.ip=e,this.method=p,this.path=u,this.params=n,this.cookies=s,this.headers=y,this.query=re(r),this.body=Object.assign(re(t),l)}pipe(e,t={}){return new P({...t,piped:!0,body:e})}res(e){return new P({...e,piped:!1})}error(e){return new P({...e,piped:!1})}},P=class{body;headers;cookies;status;contentType;piped;constructor({body:e,status:t=200,headers:s={},cookies:n={},piped:r=!1,contentType:p="application/json"}){this.body=e,this.status=t,this.contentType=p,this.headers=s,this.cookies=n,this.piped=r,this.piped||(this.headers["Content-Type"]=p)}get cookieValues(){return Object.fromEntries(Object.entries(this.cookies).map(([e,t])=>[e,t]))}set cookieValues(e){Object.entries(e).forEach(([t,s])=>{this.cookies[t]&&(this.cookies[t].value=s)})}};var Dt=require("http2");var j=class{static async process(e,t){if(e.length===0)return null;let s;for(let n of e)try{return await n.parse(t)}catch(r){s=r}throw s instanceof A?s:new U("failed to parse auth user",s)}};var ke=require("path-to-regexp");var Xe="__listener_emitter",be="*",Q=class{constructor(e,t){this.config=t;this.socketInstance=e,this.#n(),w.on("setup",()=>{let s=t.eventBus?.stream(Xe,{fanout:!0});this.#o=s?s.publish:async n=>{e.to(n.channel).emit(n.channel,n)},s?.subscribe(async n=>{e.to(n.channel).emit(n.channel,n)})})}socketInstance;#e={onConnect:async()=>{},onDisconnect:async()=>{}};#t={};#o=async()=>{};async created(e,t,s){await this.#s(e,"created",{after:t.toJSON(),before:null},s)}async updated(e,{after:t,before:s},n){await this.#s(e,"updated",{after:t.toJSON(),before:s.toJSON()},n)}async deleted(e,t,s){await this.#s(e,"deleted",{before:t.toJSON(),after:null},s)}async#s(e,t,{before:s,after:n},r){let p=Array.isArray(r)?r:[r??be],u=e.flatMap(y=>p.map(l=>`${l}:${y}`));await Promise.all(u.map(async y=>this.#o({channel:y,type:t,before:s,after:n})))}set connectionCallbacks(e){this.#e=e,this.#n()}register(e,t){return this.#t[e]=t,this.#t[e+"/:id"]=t,this}#r(e){let t=r=>(0,ke.match)(r)(e),s=Object.keys(this.#t).find(t)??null;if(!s)return null;let n=t(s);return n?{config:this.#t[s],params:n.params}:null}#n=()=>{this.socketInstance.removeAllListeners("connection"),this.socketInstance.on("connection",async e=>{let t=e.id,s=await j.process(this.config.socketsAuthMethods,e.handshake.headers).catch(()=>null);e.on("leave",async(n,r)=>n.channel?(e.leave(n.channel),typeof r=="function"&&r({code:h.Ok,message:"",channel:n.channel})):typeof r=="function"&&r({code:h.ValidationError,message:"channel is required",channel:""})),e.on("join",async(n,r)=>{if(!n.channel)return typeof r=="function"&&r({code:h.ValidationError,message:"channel is required",channel:""});let p=n.channel,u=this.#r(p)??null;if(!u)return typeof r=="function"&&r({code:h.BadRequest,message:"unknown channel",channel:p});let l=`${await u.config({channel:p,user:s},u.params,n.query??{})??be}:${p}`;return e.join(l),typeof r=="function"&&r({code:h.Ok,message:"",channel:l})}),s&&await this.#e.onConnect(s.id,t),e.on("disconnect",async()=>{s&&await this.#e.onDisconnect(s.id,t)})})}};var ve=()=>i.v.object({port:i.v.number(),cors:i.v.optional(i.v.object({origin:i.v.optional(i.v.or([i.v.array(i.v.string()),i.v.is(!0)])),methods:i.v.optional(i.v.array(i.v.in(Object.values(T)))),credentials:i.v.optional(i.v.boolean())})),eventBus:i.v.optional(i.v.instanceOf(G)),publicPath:i.v.optional(i.v.string()),healthPath:i.v.optional(i.v.string()),openapi:i.v.defaults(i.v.object({docsVersion:i.v.defaults(i.v.string(),"1.0.0"),docsBaseUrl:i.v.defaults(i.v.array(i.v.string()),["/"]),docsPath:i.v.defaults(i.v.string(),"/__docs")}),{}),requests:i.v.defaults(i.v.object({log:i.v.defaults(i.v.boolean(),!0),rateLimit:i.v.defaults(i.v.object({enabled:i.v.defaults(i.v.boolean(),!1),periodInMs:i.v.defaults(i.v.number(),3600*1e3),limit:i.v.defaults(i.v.number(),5e3)}),{}),slowdown:i.v.defaults(i.v.object({enabled:i.v.defaults(i.v.boolean(),!1),periodInMs:i.v.defaults(i.v.number(),600*1e3),delayAfter:i.v.defaults(i.v.number(),2e3),delayInMs:i.v.defaults(i.v.number(),500)}),{})}),{}),socketsAuthMethods:i.v.defaults(i.v.array(i.v.instanceOf(j)),[])}),Ye=Object.entries(h).filter(([,o])=>o>399).map(([o,e])=>({status:e,contentType:"application/json",pipe:i.v.meta(i.v.array(i.v.object({message:i.v.string(),field:i.v.optional(i.v.string())})),{$refId:`Errors.${o}Response`,description:`${o} Response`})})),X=class{socket;cors;#e;#t;#o;#s=[];#r=new Set;setup(e,t){this.#e=e,this.#o=t,this.cors={origin:t.cors?.origin?(n,r)=>r(null,!0):t.cors?.origin,methods:(t.cors?.methods??Object.values(T)).filter(n=>n!==T.options).map(n=>n.toUpperCase()),credentials:t.cors?.credentials},this.#t=me(t);let s=new Ce.Server(e,{cors:this.cors});this.socket=new Q(s,t),this.addRouter(this.#t.router)}addRouter(...e){e.map(t=>t.routes).forEach(t=>this.addRoute(...t))}addRoute(...e){e.forEach(t=>{this.#s.push(async()=>{let{method:s,path:n,schema:r={},onError:p,middlewares:u=[],responseMiddlewares:y=[]}=t,l=`(${s.toUpperCase()}) ${this.#t.cleanPath(n)}`;if(this.#r.has(l))throw new x(`Route key ${l} already registered. All route keys must be unique`,{route:t,key:l});u.forEach(C=>C.onSetup?.(t)),p?.onSetup?.(t),y.forEach(C=>C.onSetup?.(t));let{validateRequest:g,validateResponse:m,jsonSchema:b}=this.#n(s,r);this.#r.add(l),await this.#t.register(t,b),this.registerRoute(s,this.#t.cleanPath(n),async(C,O)=>{let a=await g(await this.parseRequest(C));try{for(let f of u)await f.cb(a);let c=await t.handler(a),d=c instanceof P?c:new P({body:c,status:h.Ok,headers:{},piped:!1});for(let f of y)await f.cb(a,d);return await this.handleResponse(O,await m(d))}catch(c){if(p?.cb){let d=await p.cb(a,c),f=d instanceof P?d:new P({body:d,status:h.BadRequest,headers:{}});return await this.handleResponse(O,await m(f))}throw c}})})})}test(){return(0,xe.default)(this.#e)}async start(){let e=this.#o,t=w.get(),{app:s}=t.settings;e.healthPath&&this.addRoute({method:T.get,path:e.healthPath,handler:async r=>r.res({body:`${t.id}(${s.name}) service running`,contentType:"text/plain"})}),await Promise.all(this.#s.map(r=>r())),this.registerNotFoundHandler(async r=>{let p=await this.parseRequest(r);throw new Y(`Route ${p.path} not found`)}),this.registerErrorHandler(async(r,p,u)=>{r instanceof x||w.get().log.error({error:r},"Uncaught error in route handler");let y=r instanceof A?new P({body:r.serializedErrors,status:r.statusCode}):r instanceof x?new P({body:[{message:r.message}],status:h.BadRequest}):new P({body:[{message:"Something went wrong",data:r.message}],status:h.BadRequest});return await this.handleResponse(u,y)});let n=await this.startServer(e.port);return n&&w.get().log.info(`${t.id}(${s.name}) service listening on port ${e.port}`),n}#n(e,t){let s=t?.defaultStatusCode??h.Ok,n=t?.defaultContentType??"application/json",r=s,p=n,u={response:{},request:{}},y={},l={};[{key:"params",type:"request"},{key:"headers",type:"request"},{key:"cookies",type:"request"},{key:"query",type:"request"},{key:"body",type:"request",skip:![T.post,T.put,T.patch].includes(e)},{key:"response",type:"response"},{key:"responseHeaders",type:"response"},{key:"responseCookies",type:"response"}].forEach(a=>{let c=t[a.key]??i.v.any();if(!a.skip&&(a.type==="request"&&(y[a.key]=c,u.request[a.key]=i.v.schema(c)),a.type==="response")){let d=Ye.concat({status:s,contentType:p,pipe:c});l[a.key]=i.v.any().pipe(f=>{let H=d.find(R=>R.status===r)?.pipe;if(!H)throw i.PipeError.root(`schema not defined for status code: ${r}`,f);let k=i.v.validate(H,f);if(!k.valid)throw k.error;return k.value}),u.response[a.key]=d.map(f=>({status:f.status,contentType:f.contentType,schema:i.v.schema(f.pipe)}))}});let m=i.v.object(y);i.v.compile(m,{allErrors:!0});let b=i.v.object(l);return i.v.compile(b,{allErrors:!0}),{jsonSchema:u,validateRequest:async a=>{if(!Object.keys(y))return a;let c=K.run(a,()=>i.v.validate(m,{params:a.params,headers:a.headers,query:a.query,body:a.body,cookies:a.cookies}));if(!c.valid)throw L(c.error);return a.params=c.value.params,a.headers=c.value.headers,a.query=c.value.query,a.body=c.value.body,a.cookies=c.value.cookies,a},validateResponse:async a=>{if(!Object.keys(l))return a;r=a.status,p=a.contentType;let c=z.run(a,()=>i.v.validate(b,{responseHeaders:a.headers,responseCookies:Object.fromEntries(Object.entries(a.cookies).map(([d,f])=>[d,f.value])),response:a.body}));if(!c.valid)throw L(c.error);return a.body=c.value.response,a.headers=c.value.responseHeaders,a.cookieValues=c.value.responseCookies,a}}}};var U=class extends A{statusCode=h.BadRequest;constructor(e,t){super(e,[{message:e}],t)}};var Y=class extends A{statusCode=h.NotFound;constructor(e="Not found",t){super(e,[{message:e}],t)}};var M=class extends A{statusCode=h.ValidationError;constructor(e,t){super("Unprocessable Entity",e.flatMap(({field:s,messages:n})=>n.map(r=>({message:r,field:s}))),t)}};var ne=class extends he(ve,X){#e;constructor(e){super(e);let t=w.get(),s=(0,qe.default)({disableRequestLogging:!e.requests.log,loggerInstance:e.requests.log?t.log:void 0,ajv:{customOptions:{coerceTypes:!1}},routerOptions:{ignoreTrailingSlash:!0,caseSensitive:!1},schemaErrorFormatter:(n,r)=>new M(n.map(p=>({messages:[p.message??""],field:`${r}${p.instancePath}`.replaceAll("/",".")})))});this.#e=s,this.setup(s.server,e),s.decorateRequest("savedReq",null),s.setValidatorCompiler(()=>()=>!0),s.setSerializerCompiler(()=>n=>JSON.stringify(n)),e.publicPath&&s.register(Ee.default,{root:e.publicPath}),s.register(Te.default,{}),s.register(we.default,this.cors),s.register(De.default,{parser:n=>Oe.default.parse(n)}),s.register(Pe.default,{crossOriginResourcePolicy:{policy:"cross-origin"},contentSecurityPolicy:!1}),s.register(He.default,{attachFieldsToBody:"keyValues",throwFileSizeLimit:!1,limits:{fileSize:t.settings.utils.maxFileUploadSizeInMb*1024*1024},onFile:async n=>{let r=await n.toBuffer(),p={name:n.filename,type:n.mimetype,size:r.byteLength,isTruncated:n.file.truncated,data:r,duration:await Re(r)};n.value=p}}),e.requests.rateLimit.enabled&&s.register(Ae.default,{max:e.requests.rateLimit.limit,timeWindow:e.requests.rateLimit.periodInMs,errorResponseBuilder:(n,r)=>({statusCode:h.TooManyRequests,message:JSON.stringify([{message:`Too Many Requests. Retry in ${r.after}`}])})})}async parseRequest(e){let{body:t,files:s}=Ze(e.body??{});return new J({ip:e.ip,body:t,cookies:e.cookies??{},params:e.params??{},query:e.query??{},method:e.method,path:e.url,headers:e.headers,files:s})}async handleResponse(e,t){for(let[s,{value:n,...r}]of Object.entries(t.cookies))e=e.setCookie(s,n,r);await e.status(t.status).headers(t.headers).send(t.body)}registerRoute(e,t,s){this.#e.register(async n=>{n.route({url:t,method:e,handler:s})})}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"}),w.on("close",this.#e.close),!0}};function Ze(o){if(typeof o!="object")return{body:o,files:{}};let e=Object.entries(o??{}),t=r=>Array.isArray(r)?t(r.at(0)):Buffer.isBuffer(r?.data),s=e.filter(([r,p])=>t(p)).map(([r,p])=>[r,Array.isArray(p)?p:[p]]),n=e.filter(([r,p])=>!t(p));return{body:Object.fromEntries(n),files:Object.fromEntries(s)}}0&&(module.exports={FastifyServer});
|
|
31
|
+
`),tags:l?[l]:void 0,security:a.security})},k="/openapi.json",A=new K({path:o.openapi.docsPath??"/",hide:!0});return A.get("/index.html")(a=>a.res({body:R(`.${k}`),contentType:"text/html"})),A.get(k)(a=>a.res({body:s})),{router:A,register:w,cleanPath:h}};var oe=require("valleyed");function ge(o,e){let t=o();oe.v.compile(t);class s extends e{constructor(p,...d){super(...d);this.config=p}static create(p,...d){let y=oe.v.validate(t,p);if(!y.valid)throw y.error;return new this(y.value,...d)}}return s}var Ze=o=>{try{return o?.constructor?.name!=="String"?o:JSON.parse(o)}catch{return o}};function re(o){return Object.fromEntries(Object.entries(o).map(([e,t])=>[e,Ze(t)]))}var Re=require("music-metadata"),be=async o=>{try{return(await(0,Re.parseBuffer)(o)).format.duration??0}catch{return 0}};var J=class{ip;method;path;body;params;query;headers;cookies;authUser=null;constructor({ip:e,body:t,cookies:s,params:r,query:n,method:p,path:d,headers:y,files:u}){this.ip=e,this.method=p,this.path=d,this.params=r,this.cookies=s,this.headers=y,this.query=re(n),this.body=Object.assign(re(t),u)}pipe(e,t={}){return new H({...t,piped:!0,body:e})}res(e){return new H({...e,piped:!1})}error(e){return new H({...e,piped:!1})}},H=class{body;headers;cookies;status;contentType;piped;constructor({body:e,status:t=200,headers:s={},cookies:r={},piped:n=!1,contentType:p="application/json"}){this.body=e,this.status=t,this.contentType=p,this.headers=s,this.cookies=r,this.piped=n,this.piped||(this.headers["Content-Type"]=p)}get cookieValues(){return Object.fromEntries(Object.entries(this.cookies).map(([e,t])=>[e,t]))}set cookieValues(e){Object.entries(e).forEach(([t,s])=>{this.cookies[t]&&(this.cookies[t].value=s)})}};var At=require("http2");var j=class{static async process(e,t){if(e.length===0)return null;let s;for(let r of e)try{return await r.parse(t)}catch(n){s=n}throw s instanceof S?s:new U("failed to parse auth user",s)}};var ve=require("path-to-regexp");var et="__listener_emitter",we="*",_=class{constructor(e,t){this.config=t;this.socketInstance=e,this.#r(),T.on("setup",()=>{let s=t.eventBus?.stream(et,{fanout:!0});this.#o=s?s.publish:async r=>{e.to(r.channel).emit(r.channel,r)},s?.subscribe(async r=>{e.to(r.channel).emit(r.channel,r)})})}socketInstance;#e={onConnect:async()=>{},onDisconnect:async()=>{}};#t={};#o=async()=>{};async created(e,t,s){await this.#s(e,"created",{after:t.toJSON(),before:null},s)}async updated(e,{after:t,before:s},r){await this.#s(e,"updated",{after:t.toJSON(),before:s.toJSON()},r)}async deleted(e,t,s){await this.#s(e,"deleted",{before:t.toJSON(),after:null},s)}async#s(e,t,{before:s,after:r},n){let p=Array.isArray(n)?n:[n??we],d=e.flatMap(y=>p.map(u=>`${u}:${y}`));await Promise.all(d.map(async y=>this.#o({channel:y,type:t,before:s,after:r})))}set connectionCallbacks(e){this.#e=e,this.#r()}register(e,t){return this.#t[e]=t,this.#t[e+"/:id"]=t,this}#n(e){let t=n=>(0,ve.match)(n)(e),s=Object.keys(this.#t).find(t)??null;if(!s)return null;let r=t(s);return r?{config:this.#t[s],params:r.params}:null}#r=()=>{this.socketInstance.removeAllListeners("connection"),this.socketInstance.on("connection",async e=>{let t=e.id,s=await j.process(this.config.socketsAuthMethods,e.handshake.headers).catch(()=>null);e.on("leave",async(r,n)=>r.channel?(e.leave(r.channel),typeof n=="function"&&n({code:m.Ok,message:"",channel:r.channel})):typeof n=="function"&&n({code:m.ValidationError,message:"channel is required",channel:""})),e.on("join",async(r,n)=>{if(!r.channel)return typeof n=="function"&&n({code:m.ValidationError,message:"channel is required",channel:""});let p=r.channel,d=this.#n(p)??null;if(!d)return typeof n=="function"&&n({code:m.BadRequest,message:"unknown channel",channel:p});let u=`${await d.config({channel:p,user:s},d.params,r.query??{})??we}:${p}`;return e.join(u),typeof n=="function"&&n({code:m.Ok,message:"",channel:u})}),s&&await this.#e.onConnect(s.id,t),e.on("disconnect",async()=>{s&&await this.#e.onDisconnect(s.id,t)})})}};var Pe=()=>i.v.object({port:i.v.number(),cors:i.v.optional(i.v.object({origin:i.v.optional(i.v.or([i.v.array(i.v.string()),i.v.is(!0)])),methods:i.v.optional(i.v.array(i.v.in(Object.values(x)))),credentials:i.v.optional(i.v.boolean())})),eventBus:i.v.optional(i.v.instanceOf(V)),publicPath:i.v.optional(i.v.string()),healthPath:i.v.optional(i.v.string()),openapi:i.v.defaults(i.v.object({docsVersion:i.v.defaults(i.v.string(),"1.0.0"),docsBaseUrl:i.v.defaults(i.v.array(i.v.string()),["/"]),docsPath:i.v.defaults(i.v.string(),"/__docs")}),{}),requests:i.v.defaults(i.v.object({log:i.v.defaults(i.v.boolean(),!0),rateLimit:i.v.defaults(i.v.object({enabled:i.v.defaults(i.v.boolean(),!1),periodInMs:i.v.defaults(i.v.number(),3600*1e3),limit:i.v.defaults(i.v.number(),5e3)}),{}),slowdown:i.v.defaults(i.v.object({enabled:i.v.defaults(i.v.boolean(),!1),periodInMs:i.v.defaults(i.v.number(),600*1e3),delayAfter:i.v.defaults(i.v.number(),2e3),delayInMs:i.v.defaults(i.v.number(),500)}),{})}),{}),socketsAuthMethods:i.v.defaults(i.v.array(i.v.instanceOf(j)),[])}),He=Symbol("rawResponseHandled"),ke=Object.freeze({[He]:!0}),tt="Raw not-found handler did not start or complete a response";function st(o){return!!(o&&typeof o=="object"&&He in o)}function ne(o){return o.headersSent||o.writableEnded}function Ce(o,e){if(ne(o))return;o.statusCode=m.BadRequest,o.setHeader("Content-Type","application/json");let t=e instanceof Error?e.message:`${e}`;o.end(JSON.stringify([{message:t}]))}var ot=Object.entries(m).filter(([,o])=>o>399).map(([o,e])=>({status:e,contentType:"application/json",pipe:i.v.meta(i.v.array(i.v.object({message:i.v.string(),field:i.v.optional(i.v.string())})),{$refId:`Errors.${o}Response`,description:`${o} Response`})})),Q=class{socket;cors;#e;#t;#o;#s=[];#n=new Set;#r=!1;#i=[];#a=null;setup(e,t){this.#e=e,this.#o=t,this.cors={origin:t.cors?.origin?(r,n)=>n(null,!0):t.cors?.origin,methods:(t.cors?.methods??Object.values(x)).filter(r=>r!==x.options).map(r=>r.toUpperCase()),credentials:t.cors?.credentials},this.#t=me(t);let s=new xe.Server(e,{cors:this.cors});this.socket=new _(s,t),this.addRouter(this.#t.router)}addRouter(...e){e.map(t=>t.routes).forEach(t=>this.addRoute(...t))}addRoute(...e){e.forEach(t=>{this.#s.push(async()=>{let{method:s,path:r,schema:n={},onError:p,middlewares:d=[],responseMiddlewares:y=[]}=t,u=`(${s.toUpperCase()}) ${this.#t.cleanPath(r)}`;if(this.#n.has(u))throw new g(`Route key ${u} already registered. All route keys must be unique`,{route:t,key:u});d.forEach(k=>k.onSetup?.(t)),p?.onSetup?.(t),y.forEach(k=>k.onSetup?.(t));let{validateRequest:R,validateResponse:h,jsonSchema:w}=this.#c(s,n);this.#n.add(u),await this.#t.register(t,w),this.registerRoute(s,this.#t.cleanPath(r),async(k,A)=>{let a=await R(await this.parseRequest(k));try{for(let f of d)await f.cb(a);let c=await t.handler(a),l=c instanceof H?c:new H({body:c,status:m.Ok,headers:{},piped:!1});for(let f of y)await f.cb(a,l);return await this.handleResponse(A,await h(l))}catch(c){if(p?.cb){let l=await p.cb(a,c),f=l instanceof H?l:new H({body:l,status:m.BadRequest,headers:{}});return await this.handleResponse(A,await h(f))}throw c}})})})}setNotFoundHandler(e){if(this.#r)throw new g("Cannot set not-found handler after server has started",{});return this.#a=e,this}onBeforeListen(e){if(this.#r)throw new g("Cannot add before-listen handler after server has started",{});return this.#i.push(e),this}test(){return(0,Te.default)(this.#e)}async start(){this.#r=!0;let e=this.#o,t=T.get(),{app:s}=t.settings;e.healthPath&&this.addRoute({method:x.get,path:e.healthPath,handler:async n=>n.res({body:`${t.id}(${s.name}) service running`,contentType:"text/plain"})}),await Promise.all(this.#s.map(n=>n())),this.registerNotFoundHandler(async(n,p)=>await this.#p(n,p)),this.registerErrorHandler(async(n,p,d)=>{n instanceof g||T.get().log.error({error:n},"Uncaught error in route handler");let y=n instanceof S?new H({body:n.serializedErrors,status:n.statusCode}):n instanceof g?new H({body:[{message:n.message}],status:m.BadRequest}):new H({body:[{message:"Something went wrong",data:n.message}],status:m.BadRequest});return await this.handleResponse(d,y)});for(let n of this.#i)await n({httpServer:this.#e,port:e.port});let r=await this.startServer(e.port);return r&&T.get().log.info(`${t.id}(${s.name}) service listening on port ${e.port}`),r}createNodeRawResponder(e){return async t=>{e.beforeHandle?.();try{await t(e.request,e.response)}catch(s){if(!ne(e.response))return Ce(e.response,s),ke;throw s}return ne(e.response)||Ce(e.response,new g(tt,{})),ke}}async#p(e,t){let s=await this.parseRequest(e);if(!this.#a)throw new X(`Route ${s.path} not found`);let r=await this.#a({request:s,respondWithRaw:this.createRawResponder(e,t)});if(!st(r)){if(r instanceof H)return await this.handleResponse(t,r);throw new g("Not-found handler must return a Response or respondWithRaw(...)",{})}}#c(e,t){let s=t?.defaultStatusCode??m.Ok,r=t?.defaultContentType??"application/json",n=s,p=r,d={response:{},request:{}},y={},u={};[{key:"params",type:"request"},{key:"headers",type:"request"},{key:"cookies",type:"request"},{key:"query",type:"request"},{key:"body",type:"request",skip:![x.post,x.put,x.patch].includes(e)},{key:"response",type:"response"},{key:"responseHeaders",type:"response"},{key:"responseCookies",type:"response"}].forEach(a=>{let c=t[a.key]??i.v.any();if(!a.skip&&(a.type==="request"&&(y[a.key]=c,d.request[a.key]=i.v.schema(c)),a.type==="response")){let l=ot.concat({status:s,contentType:p,pipe:c});u[a.key]=i.v.any().pipe(f=>{let D=l.find(b=>b.status===n)?.pipe;if(!D)throw i.PipeError.root(`schema not defined for status code: ${n}`,f);let v=i.v.validate(D,f);if(!v.valid)throw v.error;return v.value}),d.response[a.key]=l.map(f=>({status:f.status,contentType:f.contentType,schema:i.v.schema(f.pipe)}))}});let h=i.v.object(y);i.v.compile(h,{allErrors:!0});let w=i.v.object(u);return i.v.compile(w,{allErrors:!0}),{jsonSchema:d,validateRequest:async a=>{if(!Object.keys(y))return a;let c=W.run(a,()=>i.v.validate(h,{params:a.params,headers:a.headers,query:a.query,body:a.body,cookies:a.cookies}));if(!c.valid)throw F(c.error);return a.params=c.value.params,a.headers=c.value.headers,a.query=c.value.query,a.body=c.value.body,a.cookies=c.value.cookies,a},validateResponse:async a=>{if(!Object.keys(u))return a;n=a.status,p=a.contentType;let c=z.run(a,()=>i.v.validate(w,{responseHeaders:a.headers,responseCookies:Object.fromEntries(Object.entries(a.cookies).map(([l,f])=>[l,f.value])),response:a.body}));if(!c.valid)throw F(c.error);return a.body=c.value.response,a.headers=c.value.responseHeaders,a.cookieValues=c.value.responseCookies,a}}}};var U=class extends S{statusCode=m.BadRequest;constructor(e,t){super(e,[{message:e}],t)}};var X=class extends S{statusCode=m.NotFound;constructor(e="Not found",t){super(e,[{message:e}],t)}};var M=class extends S{statusCode=m.ValidationError;constructor(e,t){super("Unprocessable Entity",e.flatMap(({field:s,messages:r})=>r.map(n=>({message:n,field:s}))),t)}};var ae=class extends ge(Pe,Q){#e;constructor(e){super(e);let t=T.get(),s=(0,Ie.default)({disableRequestLogging:!e.requests.log,loggerInstance:e.requests.log?t.log:void 0,ajv:{customOptions:{coerceTypes:!1}},routerOptions:{ignoreTrailingSlash:!0,caseSensitive:!1},schemaErrorFormatter:(r,n)=>new M(r.map(p=>({messages:[p.message??""],field:`${n}${p.instancePath}`.replaceAll("/",".")})))});this.#e=s,this.setup(s.server,e),s.decorateRequest("savedReq",null),s.setValidatorCompiler(()=>()=>!0),s.setSerializerCompiler(()=>r=>JSON.stringify(r)),e.publicPath&&s.register(Oe.default,{root:e.publicPath}),s.register(De.default,{}),s.register(Se.default,this.cors),s.register(qe.default,{parser:r=>Me.default.parse(r)}),s.register(Ee.default,{crossOriginResourcePolicy:{policy:"cross-origin"},contentSecurityPolicy:!1}),s.register(Ae.default,{attachFieldsToBody:"keyValues",throwFileSizeLimit:!1,limits:{fileSize:t.settings.utils.maxFileUploadSizeInMb*1024*1024},onFile:async r=>{let n=await r.toBuffer(),p={name:r.filename,type:r.mimetype,size:n.byteLength,isTruncated:r.file.truncated,data:n,duration:await be(n)};r.value=p}}),e.requests.rateLimit.enabled&&s.register(Be.default,{max:e.requests.rateLimit.limit,timeWindow:e.requests.rateLimit.periodInMs,errorResponseBuilder:(r,n)=>({statusCode:m.TooManyRequests,message:JSON.stringify([{message:`Too Many Requests. Retry in ${n.after}`}])})})}async parseRequest(e){let{body:t,files:s}=rt(e.body??{});return new J({ip:e.ip,body:t,cookies:e.cookies??{},params:e.params??{},query:e.query??{},method:e.method,path:e.url,headers:e.headers,files:s})}async handleResponse(e,t){for(let[s,{value:r,...n}]of Object.entries(t.cookies))e=e.setCookie(s,r,n);await e.status(t.status).headers(t.headers).send(t.body)}createRawResponder(e,t){return this.createNodeRawResponder({request:e.raw,response:t.raw,beforeHandle:()=>t.hijack()})}registerRoute(e,t,s){this.#e.register(async r=>{r.route({url:t,method:e,handler:s})})}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"}),T.on("close",this.#e.close),!0}};function rt(o){if(typeof o!="object")return{body:o,files:{}};let e=Object.entries(o??{}),t=n=>Array.isArray(n)?t(n.at(0)):Buffer.isBuffer(n?.data),s=e.filter(([n,p])=>t(p)).map(([n,p])=>[n,Array.isArray(p)?p:[p]]),r=e.filter(([n,p])=>!t(p));return{body:Object.fromEntries(r),files:Object.fromEntries(s)}}0&&(module.exports={FastifyServer});
|
|
32
32
|
//# sourceMappingURL=index.min.cjs.map
|