equipped 5.3.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 +7 -0
- package/dist/cjs/server/adapters/express/index.cjs +47 -1
- package/dist/cjs/server/adapters/express/index.cjs.map +1 -1
- package/dist/cjs/server/adapters/express/index.min.cjs +6 -6
- package/dist/cjs/server/adapters/express/index.min.cjs.map +1 -1
- package/dist/cjs/server/adapters/fastify/index.cjs +47 -1
- package/dist/cjs/server/adapters/fastify/index.cjs.map +1 -1
- package/dist/cjs/server/adapters/fastify/index.min.cjs +6 -6
- package/dist/cjs/server/adapters/fastify/index.min.cjs.map +1 -1
- package/dist/cjs/server/index.cjs +47 -1
- package/dist/cjs/server/index.cjs.map +1 -1
- package/dist/cjs/server/index.min.cjs +6 -6
- 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-QHLKB47N.min.mjs → chunk-2GGMLKRP.min.mjs} +2 -2
- package/dist/esm/{chunk-PQCBVQL6.mjs → chunk-3TP7NINX.mjs} +2 -2
- package/dist/esm/{chunk-PNZNNUMN.mjs → chunk-5PZACGPI.mjs} +3 -3
- package/dist/esm/{chunk-ZGMFFK6Y.min.mjs → chunk-676VIABN.min.mjs} +2 -2
- package/dist/esm/{chunk-4MXYZS5R.mjs → chunk-7CP7ZE2O.mjs} +2 -2
- package/dist/esm/{chunk-5VW3JAFR.min.mjs → chunk-7NF7PV6S.min.mjs} +2 -2
- package/dist/esm/{chunk-4JLDXF7T.min.mjs → chunk-7SQ5JQYR.min.mjs} +2 -2
- package/dist/esm/{chunk-MDQKODYQ.mjs → chunk-A4P7P6BU.mjs} +48 -2
- package/dist/esm/chunk-A4P7P6BU.mjs.map +1 -0
- package/dist/esm/{chunk-JH6EBXY4.mjs → chunk-BWUFPMVG.mjs} +2 -2
- package/dist/esm/{chunk-AKQBDYUO.mjs → chunk-HXFNN6RI.mjs} +3 -3
- package/dist/esm/{chunk-FLAPYQUT.min.mjs → chunk-IN5YKIJ7.min.mjs} +7 -7
- package/dist/esm/chunk-IN5YKIJ7.min.mjs.map +1 -0
- package/dist/esm/{chunk-PCAUXBAG.min.mjs → chunk-IRYCN6PI.min.mjs} +2 -2
- package/dist/esm/{chunk-Z2TZ3KR7.mjs → chunk-LKS5ZE45.mjs} +2 -2
- package/dist/esm/{chunk-SGZNOYC3.min.mjs → chunk-MQXTTWPS.min.mjs} +2 -2
- package/dist/esm/{chunk-B5QQ32YY.min.mjs → chunk-P4PRHHIY.min.mjs} +2 -2
- package/dist/esm/{chunk-TVTYDU2D.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-32BRYKYY.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.mjs +1 -1
- package/dist/esm/server/adapters/fastify/index.min.mjs +1 -1
- package/dist/esm/server/adapters/fastify/index.mjs +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-DVr0fHil.d.ts → base-BDTBLZ9a.d.ts} +7 -1
- 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-NJ2FHI3U.js → chunk-4DH3POYM.js} +2 -2
- package/dist/types/{chunk-OHFTQGQG.js → chunk-55CTVK7R.js} +1 -1
- package/dist/types/{chunk-JQ2FWX4W.js → chunk-5Z26ZURE.js} +1 -1
- package/dist/types/{chunk-3M4PBZAQ.js → chunk-IZDJDGOV.js} +2 -2
- package/dist/types/{chunk-XGGGAEET.js → chunk-J3TGB5YQ.js} +1 -1
- package/dist/types/{chunk-3TKJGSCZ.js → chunk-LPB5LS7A.js} +1 -1
- package/dist/types/{chunk-YTY3EFNB.js → chunk-TT5EORDK.js} +47 -1
- package/dist/types/{chunk-65EHKCDZ.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-VOIU3XE6.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 +1 -1
- package/dist/types/server/adapters/express/index.js +1 -1
- package/dist/types/server/adapters/fastify/index.d.ts +1 -1
- package/dist/types/server/adapters/fastify/index.js +1 -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 +1 -1
- package/dist/esm/chunk-FLAPYQUT.min.mjs.map +0 -1
- package/dist/esm/chunk-MDQKODYQ.mjs.map +0 -1
- package/dist/esm/introspection-A72WMWE3.min.mjs +0 -2
- /package/dist/esm/{chunk-QHLKB47N.min.mjs.map → chunk-2GGMLKRP.min.mjs.map} +0 -0
- /package/dist/esm/{chunk-PQCBVQL6.mjs.map → chunk-3TP7NINX.mjs.map} +0 -0
- /package/dist/esm/{chunk-PNZNNUMN.mjs.map → chunk-5PZACGPI.mjs.map} +0 -0
- /package/dist/esm/{chunk-ZGMFFK6Y.min.mjs.map → chunk-676VIABN.min.mjs.map} +0 -0
- /package/dist/esm/{chunk-4MXYZS5R.mjs.map → chunk-7CP7ZE2O.mjs.map} +0 -0
- /package/dist/esm/{chunk-5VW3JAFR.min.mjs.map → chunk-7NF7PV6S.min.mjs.map} +0 -0
- /package/dist/esm/{chunk-4JLDXF7T.min.mjs.map → chunk-7SQ5JQYR.min.mjs.map} +0 -0
- /package/dist/esm/{chunk-JH6EBXY4.mjs.map → chunk-BWUFPMVG.mjs.map} +0 -0
- /package/dist/esm/{chunk-AKQBDYUO.mjs.map → chunk-HXFNN6RI.mjs.map} +0 -0
- /package/dist/esm/{chunk-PCAUXBAG.min.mjs.map → chunk-IRYCN6PI.min.mjs.map} +0 -0
- /package/dist/esm/{chunk-Z2TZ3KR7.mjs.map → chunk-LKS5ZE45.mjs.map} +0 -0
- /package/dist/esm/{chunk-SGZNOYC3.min.mjs.map → chunk-MQXTTWPS.min.mjs.map} +0 -0
- /package/dist/esm/{chunk-B5QQ32YY.min.mjs.map → chunk-P4PRHHIY.min.mjs.map} +0 -0
- /package/dist/esm/{chunk-TVTYDU2D.mjs.map → chunk-TSVHZZE4.mjs.map} +0 -0
- /package/dist/esm/{introspection-32BRYKYY.mjs.map → introspection-THKMXV5V.min.mjs.map} +0 -0
- /package/dist/esm/{introspection-A72WMWE3.min.mjs.map → introspection-YJF3QAUK.mjs.map} +0 -0
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
"use strict";var Ie=Object.create;var G=Object.defineProperty;var
|
|
2
|
-
${t.error.toString()}`,{messages:t.error.messages})),t.value}static create(e){if(s.#t)return s.crash(new
|
|
3
|
-
${t.error.toString()}`,{messages:t.error.messages})),new s(t.value)}static get(){return s.#t?s.#t:s.crash(new
|
|
1
|
+
"use strict";var Ie=Object.create;var G=Object.defineProperty;var Oe=Object.getOwnPropertyDescriptor;var Ne=Object.getOwnPropertyNames;var Me=Object.getPrototypeOf,je=Object.prototype.hasOwnProperty;var te=(s,e)=>{for(var t in e)G(s,t,{get:e[t],enumerable:!0})},V=(s,e,t,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of Ne(e))!je.call(s,r)&&r!==t&&G(s,r,{get:()=>e[r],enumerable:!(o=Oe(e,r))||o.enumerable});return s},O=(s,e,t)=>(V(s,e,"default"),t&&V(t,e,"default")),J=(s,e,t)=>(t=s!=null?Ie(Me(s)):{},V(e||!s||!s.__esModule?G(t,"default",{value:s,enumerable:!0}):t,s)),Le=s=>V(G({},"__esModule",{value:!0}),s);var ot={};te(ot,{BaseApiKeyRequestAuthMethod:()=>ce,BaseJwtCookieRequestAuthMethod:()=>ue,BaseJwtHeaderRequestAuthMethod:()=>de,BaseJwtRequestAuthMethod:()=>$,BaseRequestAuthMethod:()=>S,Methods:()=>x,Request:()=>pe,Response:()=>H,Router:()=>L,Server:()=>fe,StatusCodes:()=>h,makeErrorMiddleware:()=>We,makeMiddleware:()=>ae,makeResponseMiddleware:()=>ze,requireAuthUser:()=>st,serverConfigPipe:()=>Ye});module.exports=Le(ot);var ss=require("http"),rs=require("@fastify/cors"),ns=require("cors"),qe=require("socket.io"),Pe=J(require("supertest"),1),i=require("valleyed");var g=class extends Error{constructor(t,o,r){super(t,{cause:r});this.message=t;this.context=o;this.cause=r}};var C=class extends g{constructor(t,o,r){super(t,{serializedErrors:o},r);this.message=t;this.serializedErrors=o}};var K=class extends C{statusCode=h.BadRequest;constructor(e,t){super(e,[{message:e}],t)}};var E=class extends C{statusCode=h.NotAuthenticated;constructor(e="Not authenticated",t){super(e,[{message:e}],t)}};var U=class extends C{statusCode=h.NotFound;constructor(e="Not found",t){super(e,[{message:e}],t)}};var N=class extends C{statusCode=h.TokenExpired;constructor(e="Token expired",t){super(e,[{message:e}],t)}};var z=class extends C{statusCode=h.ValidationError;constructor(e,t){super("Unprocessable Entity",e.flatMap(({field:o,messages:r})=>r.map(n=>({message:n,field:o}))),t)}};var W=class{};var M=J(require("pino"),1),ge=require("ulid"),se=require("valleyed");function ye(s,e){for(let t of e.after)if(!s.some(o=>o.class===t)){let o=t.name||"unknown",r=e.class?.name||"anonymous";throw new Error(`Missing dependency: ${r} declares after: [${o}], but ${o} is not registered`)}if(e.class){let t=[...s,e];Fe(t)}s.push(e)}function Fe(s){let e=new Map;for(let n of s){if(!n.class)continue;let d=e.get(n.class);if(d)for(let u of n.after)d.includes(u)||d.push(u);else e.set(n.class,[...n.after])}let t=new Set,o=new Set;function r(n,d){if(o.has(n)){let u=d.indexOf(n),c=[...d.slice(u),n].map(R=>R.name||"unknown");throw new Error(`Cycle detected: ${c.join(" \u2192 ")}`)}if(!t.has(n)){o.add(n),d.push(n);for(let u of e.get(n)??[])r(u,d);d.pop(),o.delete(n),t.add(n)}}for(let n of e.keys())r(n,[])}function $e(s,e=!1){if(s.length===0)return[];let t=new Map,o=[];for(let c of s)if(c.class){let R=t.get(c.class);R?R.push(c):t.set(c.class,[c])}else o.push(c);let r=[...t.keys()],n=new Map,d=new Map;for(let c of r)n.set(c,0),d.set(c,[]);for(let c of s)if(c.class)for(let R of c.after){let[m,w]=e?[c.class,R]:[R,c.class],b=d.get(m);b.includes(w)||(b.push(w),n.set(w,n.get(w)+1))}let u=[],y=r.filter(c=>n.get(c)===0);for(;y.length>0;){let c=[],R=[];for(let m of y)c.push(...t.get(m)??[]);u.push(c);for(let m of y)for(let w of d.get(m)??[]){let b=n.get(w)-1;n.set(w,b),b===0&&R.push(w)}y=R}if(o.length>0){let c=o.filter(m=>m.after.length>0),R=o.filter(m=>m.after.length===0);if(c.length>0){let m=-1;for(let b of c)for(let B of b.after){let a=u.findIndex(p=>p.some(l=>l.class===B));a>m&&(m=a)}let w=m+1;w<u.length?u[w].push(...c):u.push(c)}R.length>0&&(u.length>0?u[u.length-1].push(...R):u.push(R))}return u}async function _(s,e=o=>{throw o},t=!1){let o=$e(s,t);for(let r of o)await Promise.all(r.map(async n=>{try{return typeof n.cb=="function"?await n.cb():await n.cb}catch(d){return e(d instanceof Error?d:new Error(`${d}`))}}))}var T=require("valleyed"),me=()=>T.v.object({app:T.v.object({name:T.v.string()}),log:T.v.defaults(T.v.object({level:T.v.defaults(T.v.in(["fatal","error","warn","info","debug","trace","silent"]),"info")}),{}),utils:T.v.defaults(T.v.object({hashSaltRounds:T.v.defaults(T.v.number(),10),paginationDefaultLimit:T.v.defaults(T.v.number(),100),maxFileUploadSizeInMb:T.v.defaults(T.v.number(),500)}),{})});var P=class s{static#e;static#t;static#o={};settings;log;constructor(e){s.#t=this,this.settings=Object.freeze(e),this.log=(0,M.default)({level:this.settings.log.level,serializers:{err:M.default.stdSerializers.err,error:M.default.stdSerializers.err,req:M.default.stdSerializers.req,res:M.default.stdSerializers.res},mixin:()=>({instanceId:s.#e})}),s.#s()}alias(e){if(s.#e!==void 0)return s.crash(new g("Instance already has an alias",{}));s.#e=e}get id(){return s.#e===void 0?s.crash(new g("Instance doesnt have an alias yet",{})):s.#e}getScopedName(e,t="."){return[this.settings.app.name,e].join(t)}async start(){try{await _(s.#o.setup??[]),await _(s.#o.start??[])}catch(e){s.crash(new g("Error starting instance",{},e))}}static envs(e){let t=se.v.validate(e,process.env);return t.valid||s.crash(new g(`Environment variables are not valid
|
|
2
|
+
${t.error.toString()}`,{messages:t.error.messages})),t.value}static create(e){if(s.#t)return s.crash(new g("Instance has been initialized already",{}));let t=se.v.validate(me(),e);return t.valid||s.crash(new g(`Settings are not valid
|
|
3
|
+
${t.error.toString()}`,{messages:t.error.messages})),new s(t.value)}static get(){return s.#t?s.#t:s.crash(new g("Has not been initialized. Make sure an instance has been created before you get an instance",{}))}static maybeGet(){return s.#t}static on(e,t,o){s.#o[e]??=[];let r={cb:t,class:o?.class,after:o?.after??[]};ye(s.#o[e],r)}static#s(){Object.entries({SIGHUP:1,SIGINT:2,SIGTERM:15}).forEach(([t,o])=>{process.on(t,async()=>{await _(s.#o.close??[],()=>{},!0),process.exit(128+o)})})}static resolveBeforeCrash(e){let t=e();return s.on("close",async()=>await t),t}static crash(e){console.error(e),process.exit(1)}static createId(e){return`${e?.prefix??""}${(0,ge.ulid)(e?.time?.getTime())}`}};var I={};te(I,{pipeErrorToValidationError:()=>j,validate:()=>Ue,ve:()=>re});O(I,require("valleyed"));var re={};te(re,{incomingFile:()=>Ve,incomingFiles:()=>Ge,requestLocalStorage:()=>Q,responseLocalStorage:()=>X,withRequest:()=>Je,withResponse:()=>Ke});var oe=require("async_hooks"),D=require("valleyed");var Re=s=>D.v.array(D.v.file(s).pipe(e=>{let t=`is larger than allowed limit of ${P.get().settings.utils.maxFileUploadSizeInMb}mb`;if(e?!e.isTruncated:!0)return e;throw D.PipeError.root(t,e)})),Ve=s=>D.v.define(D.v.compile(Re(s).pipe(D.v.min(1,"no file provided")).pipe(e=>e[0])),{schema:()=>({type:"string",format:"binary"})}),Ge=s=>D.v.define(D.v.compile(Re(s)),{schema:()=>({type:"string",format:"binary"})}),Q=new oe.AsyncLocalStorage,X=new oe.AsyncLocalStorage,Je=s=>D.v.define(e=>{let t=Q.getStore();if(!t)throw new Error("Request not found in context");let o=D.v.validate(s(t),e);return o.valid?o.value:o.error}),Ke=s=>D.v.define(e=>{let t=X.getStore();if(!t)throw new Error("Response not found in context");let o=D.v.validate(s(t),e);return o.valid?o.value:o.error});var ke=require("valleyed");function j(s){let e=s.messages.reduce((t,{path:o="",message:r})=>(t[o]?t[o].messages.push(r):t[o]={field:o,messages:[r]},t),{});return new z(Object.values(e))}function Ue(s,e){let t=ke.v.validate(s,e);if(t.valid)return t.value;throw j(t.error)}var F=require("@openapi-contrib/json-schema-to-openapi-schema"),be=require("valleyed");var ve=require("valleyed");var x={head:"head",get:"get",post:"post",put:"put",patch:"patch",delete:"delete",options:"options"},h={Ok:200,Found:302,BadRequest:400,NotAuthenticated:401,NotAuthorized:403,NotFound:404,ValidationError:422,TooManyRequests:429,TokenExpired:461};function ne(s,e){return{cb:s,onSetup:e}}var ae=(...s)=>ne(...s),ze=(...s)=>ne(...s),We=(...s)=>ne(...s);function _e(...s){let e={params:"",headers:"",query:"",body:"",cookies:"",response:"",responseHeaders:"",responseCookies:"",defaultStatusCode:"",defaultContentType:""};function t(o,r){return o?r?typeof o=="number"||typeof o=="string"||typeof o=="function"?r:ve.v.merge(o,r):o:r}return Object.fromEntries(Object.keys(e).map(o=>[o,s.map(r=>r[o]).reduce(t,null)]))}var we=(s,e)=>e.map(t=>({...s,...t,path:`${s.path}/${t.path}`,groups:[...s.groups??[],...t.groups??[]],middlewares:[...s.middlewares??[],...t.middlewares??[]],responseMiddlewares:[...s.responseMiddlewares??[],...t.responseMiddlewares??[]],schema:_e(s.schema??{},t.schema??{}),security:[...s.security??[],...t.security??[]]})),L=class{#e={path:""};#t=[];#o=[];constructor(e={path:""}){this.#e=e}#s(e){return(t,o={})=>r=>{let n=we(this.#e,[{...o,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=>we(this.#e,e.routes)))}};var xe=s=>{let e=P.get(),{app:t}=e.settings,o={openapi:"3.0.0",info:{title:`${t.name} ${e.id}`,version:s.openapi.docsVersion??""},servers:s.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={},d=a=>{let{allOf:p,oneOf:l,anyOf:f,...q}=a;return p?p.flatMap(v=>d(v)):[q]},u=a=>{if(!a||typeof a!="object")return a;if(typeof a.$refId=="string"){let{$refId:p,...l}=a,f=u(l);return o.components?.schemas?(o.components.schemas[p]=f,{$ref:`#/components/schemas/${p}`}):f}return Array.isArray(a)?a.map(p=>u(p)):Object.fromEntries(Object.entries(a).map(([p,l])=>[p,u(l)]))},y=a=>{if(!a.length)return;let p=a.map(v=>typeof v=="string"?{name:v}:v),l=p.map(v=>v.name).join(" > "),f=p.at(-1)?.name??"",q=p.map(v=>v.description?.trim()??"").filter(Boolean).join(`
|
|
4
4
|
|
|
5
5
|
|
|
6
6
|
|
|
7
|
-
`);if(!r[l]){r[l]=!0,o.tags.push({name:l,"x-displayName":f,description:q});let
|
|
7
|
+
`);if(!r[l]){r[l]=!0,o.tags.push({name:l,"x-displayName":f,description:q});let k=p.slice(0,-1).map(A=>A.name).join(" > ")||"default";if(!n[k]){let A={name:k,tags:[]};o["x-tagGroups"].push(A),n[k]=A}n[k].tags=[...new Set([...n[k].tags,l])]}return l},c=async(a,p,l,f)=>{if(l.response.response?.length){f.responses??={};for(let k of l.response.response){f.responses[k.status]??={description:"",content:{}};let A=f.responses[k.status];A.content[k.contentType]={schema:await(0,F.convert)(u(k.schema))}}}if(l.response.responseHeaders?.length){f.responses??={};for(let k of l.response.responseHeaders){f.responses[k.status]??={description:"",content:{}},f.responses[k.status];let A=f.responses[k.status];A.headers={schema:await(0,F.convert)(u(k.schema))}}}l.request.body&&(f.requestBody={required:!0,content:{"application/json":{schema:await(0,F.convert)(u(l.request.body))}}});let q=[],v=async(k,A)=>{if(!A)return;let Ee=d(A);for(let ee of Ee)if(ee.properties)for(let[he,Be]of Object.entries(ee.properties))q.push({name:he,in:k,schema:await(0,F.convert)(u(Be)),required:(ee.required||[]).includes(he)})};await Promise.all([v("query",l.request.query),v("path",l.request.params),v("header",l.request.headers)]),q.length&&(f.parameters=q),o.paths||(o.paths={}),o.paths[a]||(o.paths[a]={}),o.paths[a][p]=f},R=a=>`
|
|
8
8
|
<!doctype html>
|
|
9
9
|
<html>
|
|
10
10
|
<head>
|
|
11
|
-
<title>${(0,
|
|
11
|
+
<title>${(0,be.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>
|
|
@@ -28,5 +28,5 @@ ${t.error.toString()}`,{messages:t.error.messages})),new s(t.value)}static get()
|
|
|
28
28
|
</html>
|
|
29
29
|
`,m=a=>{let p=a.replace(/(\/\s*)+/g,"/");return p.startsWith("/")||(p=`/${p}`),p!=="/"&&p.endsWith("/")&&(p=p.slice(0,-1)),p},w=async(a,p)=>{if(a.hide)return;let l=y(a.groups??[]),f=m(a.path),q=`(${a.method.toUpperCase()}) ${f}`;await c(f,a.method.toLowerCase(),p,{operationId:q,summary:a.title??f,description:a.descriptions?.join(`
|
|
30
30
|
|
|
31
|
-
`),tags:l?[l]:void 0,security:a.security})},v="/openapi.json",O=new F({path:s.openapi.docsPath??"/",hide:!0});return O.get("/index.html")(a=>a.res({body:g(`.${v}`),contentType:"text/html"})),O.get(v)(a=>a.res({body:o})),{router:O,register:w,cleanPath:m}};var Qe=s=>{try{return s?.constructor?.name!=="String"?s:JSON.parse(s)}catch{return s}};function ie(s){return Object.fromEntries(Object.entries(s).map(([e,t])=>[e,Qe(t)]))}var pe=class{ip;method;path;body;params;query;headers;cookies;authUser=null;constructor({ip:e,body:t,cookies:o,params:r,query:n,method:d,path:u,headers:y,files:c}){this.ip=e,this.method=d,this.path=u,this.params=r,this.cookies=o,this.headers=y,this.query=ie(n),this.body=Object.assign(ie(t),c)}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:o={},cookies:r={},piped:n=!1,contentType:d="application/json"}){this.body=e,this.status=t,this.contentType=d,this.headers=o,this.cookies=r,this.piped=n,this.piped||(this.headers["Content-Type"]=d)}get cookieValues(){return Object.fromEntries(Object.entries(this.cookies).map(([e,t])=>[e,t]))}set cookieValues(e){Object.entries(e).forEach(([t,o])=>{this.cookies[t]&&(this.cookies[t].value=o)})}};var Gt=require("http2");var S=class{static async process(e,t){if(e.length===0)return null;let o;for(let r of e)try{return await r.parse(t)}catch(n){o=n}throw o instanceof C?o:new K("failed to parse auth user",o)}};var ce=class extends S{headerName;constructor(e){super(),this.headerName=e}async parse(e){let t=e[this.headerName];if(!t||typeof t!="string")throw new E;return this.verify(t)}routeSecuritySchemeName(){return this.headerName}};var Ce=J(require("@fastify/cookie"),1),Y=J(require("jsonwebtoken"),1);var $=class extends S{options;constructor(e){super(),this.options=e}#e(e){return`${this.options.storagePrefix??""}${e}`}async createToken(e){let t=Y.default.sign(e,this.options.signingKey,{expiresIn:this.options.storageTTL});return await this.store(this.#e(e.id),t,this.options.storageTTL),t}async parse(e){try{let t=await this.parseHeader(e),o=Y.default.verify(t,this.options.signingKey);if(!o)throw new E;if(this.options.enforceSingleSession){let r=await this.retrieve(this.#e(o.id));if(t&&t!==r)throw new N}return o}catch(t){throw t instanceof N?t:t instanceof Y.default.TokenExpiredError?new N(void 0,t):new E(void 0,t)}}async retrieveFor(e){return this.retrieve(this.#e(e))}async deleteFor(e){await this.delete(this.#e(e))}},de=class extends ${options;constructor(e){super(e),this.options=e}async parseHeader(e){let t=e[this.options.headerName];if(!t||typeof t!="string")throw new E;return t.startsWith("Bearer ")?t.slice(7):t}routeSecuritySchemeName(){return this.options.headerName}},ue=class extends ${options;constructor(e){super(e),this.options=e}async parseHeader(e){let o=(Ce.default.parse(e.cookie||"")??{})[this.options.cookieName];if(!o||typeof o!="string")throw new E;return o}routeSecuritySchemeName(){return`cookie:${this.options.cookieName}`}};var He=require("path-to-regexp");var Xe="__listener_emitter",Te="*",Z=class{constructor(e,t){this.config=t;this.socketInstance=e,this.#r(),A.on("setup",()=>{let o=t.eventBus?.stream(Xe,{fanout:!0});this.#o=o?o.publish:async r=>{e.to(r.channel).emit(r.channel,r)},o?.subscribe(async r=>{e.to(r.channel).emit(r.channel,r)})})}socketInstance;#e={onConnect:async()=>{},onDisconnect:async()=>{}};#t={};#o=async()=>{};async created(e,t,o){await this.#s(e,"created",{after:t.toJSON(),before:null},o)}async updated(e,{after:t,before:o},r){await this.#s(e,"updated",{after:t.toJSON(),before:o.toJSON()},r)}async deleted(e,t,o){await this.#s(e,"deleted",{before:t.toJSON(),after:null},o)}async#s(e,t,{before:o,after:r},n){let d=Array.isArray(n)?n:[n??Te],u=e.flatMap(y=>d.map(c=>`${c}:${y}`));await Promise.all(u.map(async y=>this.#o({channel:y,type:t,before:o,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,He.match)(n)(e),o=Object.keys(this.#t).find(t)??null;if(!o)return null;let r=t(o);return r?{config:this.#t[o],params:r.params}:null}#r=()=>{this.socketInstance.removeAllListeners("connection"),this.socketInstance.on("connection",async e=>{let t=e.id,o=await S.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:h.Ok,message:"",channel:r.channel})):typeof n=="function"&&n({code:h.ValidationError,message:"channel is required",channel:""})),e.on("join",async(r,n)=>{if(!r.channel)return typeof n=="function"&&n({code:h.ValidationError,message:"channel is required",channel:""});let d=r.channel,u=this.#n(d)??null;if(!u)return typeof n=="function"&&n({code:h.BadRequest,message:"unknown channel",channel:d});let c=`${await u.config({channel:d,user:o},u.params,r.query??{})??Te}:${d}`;return e.join(c),typeof n=="function"&&n({code:h.Ok,message:"",channel:c})}),o&&await this.#e.onConnect(o.id,t),e.on("disconnect",async()=>{o&&await this.#e.onDisconnect(o.id,t)})})}};var Ye=()=>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(W)),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(S)),[])}),Pe=Symbol("rawResponseHandled"),De=Object.freeze({[Pe]:!0}),Ze="Raw not-found handler did not start or complete a response";function et(s){return!!(s&&typeof s=="object"&&Pe in s)}function le(s){return s.headersSent||s.writableEnded}function Se(s,e){if(le(s))return;s.statusCode=h.BadRequest,s.setHeader("Content-Type","application/json");let t=e instanceof Error?e.message:`${e}`;s.end(JSON.stringify([{message:t}]))}var tt=Object.entries(h).filter(([,s])=>s>399).map(([s,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.${s}Response`,description:`${s} Response`})})),fe=class{socket;cors;#e;#t;#o;#s=[];#n=new Set;#r=!1;#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=xe(t);let o=new qe.Server(e,{cors:this.cors});this.socket=new Z(o,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:o,path:r,schema:n={},onError:d,middlewares:u=[],responseMiddlewares:y=[]}=t,c=`(${o.toUpperCase()}) ${this.#t.cleanPath(r)}`;if(this.#n.has(c))throw new k(`Route key ${c} already registered. All route keys must be unique`,{route:t,key:c});u.forEach(v=>v.onSetup?.(t)),d?.onSetup?.(t),y.forEach(v=>v.onSetup?.(t));let{validateRequest:g,validateResponse:m,jsonSchema:w}=this.#p(o,n);this.#n.add(c),await this.#t.register(t,w),this.registerRoute(o,this.#t.cleanPath(r),async(v,O)=>{let a=await g(await this.parseRequest(v));try{for(let f of u)await f.cb(a);let p=await t.handler(a),l=p instanceof H?p:new H({body:p,status:h.Ok,headers:{},piped:!1});for(let f of y)await f.cb(a,l);return await this.handleResponse(O,await m(l))}catch(p){if(d?.cb){let l=await d.cb(a,p),f=l instanceof H?l:new H({body:l,status:h.BadRequest,headers:{}});return await this.handleResponse(O,await m(f))}throw p}})})})}setNotFoundHandler(e){if(this.#r)throw new k("Cannot set not-found handler after server has started",{});return this.#a=e,this}test(){return(0,Ae.default)(this.#e)}async start(){this.#r=!0;let e=this.#o,t=A.get(),{app:o}=t.settings;e.healthPath&&this.addRoute({method:x.get,path:e.healthPath,handler:async n=>n.res({body:`${t.id}(${o.name}) service running`,contentType:"text/plain"})}),await Promise.all(this.#s.map(n=>n())),this.registerNotFoundHandler(async(n,d)=>await this.#i(n,d)),this.registerErrorHandler(async(n,d,u)=>{n instanceof k||A.get().log.error({error:n},"Uncaught error in route handler");let y=n instanceof C?new H({body:n.serializedErrors,status:n.statusCode}):n instanceof k?new H({body:[{message:n.message}],status:h.BadRequest}):new H({body:[{message:"Something went wrong",data:n.message}],status:h.BadRequest});return await this.handleResponse(u,y)});let r=await this.startServer(e.port);return r&&A.get().log.info(`${t.id}(${o.name}) service listening on port ${e.port}`),r}createNodeRawResponder(e){return async t=>{e.beforeHandle?.();try{await t(e.request,e.response)}catch(o){if(!le(e.response))return Se(e.response,o),De;throw o}return le(e.response)||Se(e.response,new k(Ze,{})),De}}async#i(e,t){let o=await this.parseRequest(e);if(!this.#a)throw new U(`Route ${o.path} not found`);let r=await this.#a({request:o,respondWithRaw:this.createRawResponder(e,t)});if(!et(r)){if(r instanceof H)return await this.handleResponse(t,r);throw new k("Not-found handler must return a Response or respondWithRaw(...)",{})}}#p(e,t){let o=t?.defaultStatusCode??h.Ok,r=t?.defaultContentType??"application/json",n=o,d=r,u={response:{},request:{}},y={},c={};[{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 p=t[a.key]??i.v.any();if(!a.skip&&(a.type==="request"&&(y[a.key]=p,u.request[a.key]=i.v.schema(p)),a.type==="response")){let l=tt.concat({status:o,contentType:d,pipe:p});c[a.key]=i.v.any().pipe(f=>{let q=l.find(R=>R.status===n)?.pipe;if(!q)throw i.PipeError.root(`schema not defined for status code: ${n}`,f);let b=i.v.validate(q,f);if(!b.valid)throw b.error;return b.value}),u.response[a.key]=l.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 w=i.v.object(c);return i.v.compile(w,{allErrors:!0}),{jsonSchema:u,validateRequest:async a=>{if(!Object.keys(y))return a;let p=Q.run(a,()=>i.v.validate(m,{params:a.params,headers:a.headers,query:a.query,body:a.body,cookies:a.cookies}));if(!p.valid)throw j(p.error);return a.params=p.value.params,a.headers=p.value.headers,a.query=p.value.query,a.body=p.value.body,a.cookies=p.value.cookies,a},validateResponse:async a=>{if(!Object.keys(c))return a;n=a.status,d=a.contentType;let p=X.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(!p.valid)throw j(p.error);return a.body=p.value.response,a.headers=p.value.responseHeaders,a.cookieValues=p.value.responseCookies,a}}}};var st=s=>ae(async e=>{if(e.authUser=await S.process(s,e.headers),!e.authUser)throw new E},e=>{e.security??=[];for(let t of s){let o=t.routeSecuritySchemeName();o&&e.security.push({[o]:[]})}e.descriptions??=[],e.descriptions.push("Requires a valid means of authentication.")});0&&(module.exports={BaseApiKeyRequestAuthMethod,BaseJwtCookieRequestAuthMethod,BaseJwtHeaderRequestAuthMethod,BaseJwtRequestAuthMethod,BaseRequestAuthMethod,Methods,Request,Response,Router,Server,StatusCodes,makeErrorMiddleware,makeMiddleware,makeResponseMiddleware,requireAuthUser,serverConfigPipe});
|
|
31
|
+
`),tags:l?[l]:void 0,security:a.security})},b="/openapi.json",B=new L({path:s.openapi.docsPath??"/",hide:!0});return B.get("/index.html")(a=>a.res({body:R(`.${b}`),contentType:"text/html"})),B.get(b)(a=>a.res({body:o})),{router:B,register:w,cleanPath:m}};var Qe=s=>{try{return s?.constructor?.name!=="String"?s:JSON.parse(s)}catch{return s}};function ie(s){return Object.fromEntries(Object.entries(s).map(([e,t])=>[e,Qe(t)]))}var pe=class{ip;method;path;body;params;query;headers;cookies;authUser=null;constructor({ip:e,body:t,cookies:o,params:r,query:n,method:d,path:u,headers:y,files:c}){this.ip=e,this.method=d,this.path=u,this.params=r,this.cookies=o,this.headers=y,this.query=ie(n),this.body=Object.assign(ie(t),c)}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:o={},cookies:r={},piped:n=!1,contentType:d="application/json"}){this.body=e,this.status=t,this.contentType=d,this.headers=o,this.cookies=r,this.piped=n,this.piped||(this.headers["Content-Type"]=d)}get cookieValues(){return Object.fromEntries(Object.entries(this.cookies).map(([e,t])=>[e,t]))}set cookieValues(e){Object.entries(e).forEach(([t,o])=>{this.cookies[t]&&(this.cookies[t].value=o)})}};var Gt=require("http2");var S=class{static async process(e,t){if(e.length===0)return null;let o;for(let r of e)try{return await r.parse(t)}catch(n){o=n}throw o instanceof C?o:new K("failed to parse auth user",o)}};var ce=class extends S{headerName;constructor(e){super(),this.headerName=e}async parse(e){let t=e[this.headerName];if(!t||typeof t!="string")throw new E;return this.verify(t)}routeSecuritySchemeName(){return this.headerName}};var Ce=J(require("@fastify/cookie"),1),Y=J(require("jsonwebtoken"),1);var $=class extends S{options;constructor(e){super(),this.options=e}#e(e){return`${this.options.storagePrefix??""}${e}`}async createToken(e){let t=Y.default.sign(e,this.options.signingKey,{expiresIn:this.options.storageTTL});return await this.store(this.#e(e.id),t,this.options.storageTTL),t}async parse(e){try{let t=await this.parseHeader(e),o=Y.default.verify(t,this.options.signingKey);if(!o)throw new E;if(this.options.enforceSingleSession){let r=await this.retrieve(this.#e(o.id));if(t&&t!==r)throw new N}return o}catch(t){throw t instanceof N?t:t instanceof Y.default.TokenExpiredError?new N(void 0,t):new E(void 0,t)}}async retrieveFor(e){return this.retrieve(this.#e(e))}async deleteFor(e){await this.delete(this.#e(e))}},de=class extends ${options;constructor(e){super(e),this.options=e}async parseHeader(e){let t=e[this.options.headerName];if(!t||typeof t!="string")throw new E;return t.startsWith("Bearer ")?t.slice(7):t}routeSecuritySchemeName(){return this.options.headerName}},ue=class extends ${options;constructor(e){super(e),this.options=e}async parseHeader(e){let o=(Ce.default.parse(e.cookie||"")??{})[this.options.cookieName];if(!o||typeof o!="string")throw new E;return o}routeSecuritySchemeName(){return`cookie:${this.options.cookieName}`}};var He=require("path-to-regexp");var Xe="__listener_emitter",Te="*",Z=class{constructor(e,t){this.config=t;this.socketInstance=e,this.#r(),P.on("setup",()=>{let o=t.eventBus?.stream(Xe,{fanout:!0});this.#o=o?o.publish:async r=>{e.to(r.channel).emit(r.channel,r)},o?.subscribe(async r=>{e.to(r.channel).emit(r.channel,r)})})}socketInstance;#e={onConnect:async()=>{},onDisconnect:async()=>{}};#t={};#o=async()=>{};async created(e,t,o){await this.#s(e,"created",{after:t.toJSON(),before:null},o)}async updated(e,{after:t,before:o},r){await this.#s(e,"updated",{after:t.toJSON(),before:o.toJSON()},r)}async deleted(e,t,o){await this.#s(e,"deleted",{before:t.toJSON(),after:null},o)}async#s(e,t,{before:o,after:r},n){let d=Array.isArray(n)?n:[n??Te],u=e.flatMap(y=>d.map(c=>`${c}:${y}`));await Promise.all(u.map(async y=>this.#o({channel:y,type:t,before:o,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,He.match)(n)(e),o=Object.keys(this.#t).find(t)??null;if(!o)return null;let r=t(o);return r?{config:this.#t[o],params:r.params}:null}#r=()=>{this.socketInstance.removeAllListeners("connection"),this.socketInstance.on("connection",async e=>{let t=e.id,o=await S.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:h.Ok,message:"",channel:r.channel})):typeof n=="function"&&n({code:h.ValidationError,message:"channel is required",channel:""})),e.on("join",async(r,n)=>{if(!r.channel)return typeof n=="function"&&n({code:h.ValidationError,message:"channel is required",channel:""});let d=r.channel,u=this.#n(d)??null;if(!u)return typeof n=="function"&&n({code:h.BadRequest,message:"unknown channel",channel:d});let c=`${await u.config({channel:d,user:o},u.params,r.query??{})??Te}:${d}`;return e.join(c),typeof n=="function"&&n({code:h.Ok,message:"",channel:c})}),o&&await this.#e.onConnect(o.id,t),e.on("disconnect",async()=>{o&&await this.#e.onDisconnect(o.id,t)})})}};var Ye=()=>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(W)),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(S)),[])}),Ae=Symbol("rawResponseHandled"),De=Object.freeze({[Ae]:!0}),Ze="Raw not-found handler did not start or complete a response";function et(s){return!!(s&&typeof s=="object"&&Ae in s)}function le(s){return s.headersSent||s.writableEnded}function Se(s,e){if(le(s))return;s.statusCode=h.BadRequest,s.setHeader("Content-Type","application/json");let t=e instanceof Error?e.message:`${e}`;s.end(JSON.stringify([{message:t}]))}var tt=Object.entries(h).filter(([,s])=>s>399).map(([s,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.${s}Response`,description:`${s} Response`})})),fe=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=xe(t);let o=new qe.Server(e,{cors:this.cors});this.socket=new Z(o,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:o,path:r,schema:n={},onError:d,middlewares:u=[],responseMiddlewares:y=[]}=t,c=`(${o.toUpperCase()}) ${this.#t.cleanPath(r)}`;if(this.#n.has(c))throw new g(`Route key ${c} already registered. All route keys must be unique`,{route:t,key:c});u.forEach(b=>b.onSetup?.(t)),d?.onSetup?.(t),y.forEach(b=>b.onSetup?.(t));let{validateRequest:R,validateResponse:m,jsonSchema:w}=this.#c(o,n);this.#n.add(c),await this.#t.register(t,w),this.registerRoute(o,this.#t.cleanPath(r),async(b,B)=>{let a=await R(await this.parseRequest(b));try{for(let f of u)await f.cb(a);let p=await t.handler(a),l=p instanceof H?p:new H({body:p,status:h.Ok,headers:{},piped:!1});for(let f of y)await f.cb(a,l);return await this.handleResponse(B,await m(l))}catch(p){if(d?.cb){let l=await d.cb(a,p),f=l instanceof H?l:new H({body:l,status:h.BadRequest,headers:{}});return await this.handleResponse(B,await m(f))}throw p}})})})}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,Pe.default)(this.#e)}async start(){this.#r=!0;let e=this.#o,t=P.get(),{app:o}=t.settings;e.healthPath&&this.addRoute({method:x.get,path:e.healthPath,handler:async n=>n.res({body:`${t.id}(${o.name}) service running`,contentType:"text/plain"})}),await Promise.all(this.#s.map(n=>n())),this.registerNotFoundHandler(async(n,d)=>await this.#p(n,d)),this.registerErrorHandler(async(n,d,u)=>{n instanceof g||P.get().log.error({error:n},"Uncaught error in route handler");let y=n instanceof C?new H({body:n.serializedErrors,status:n.statusCode}):n instanceof g?new H({body:[{message:n.message}],status:h.BadRequest}):new H({body:[{message:"Something went wrong",data:n.message}],status:h.BadRequest});return await this.handleResponse(u,y)});for(let n of this.#i)await n({httpServer:this.#e,port:e.port});let r=await this.startServer(e.port);return r&&P.get().log.info(`${t.id}(${o.name}) service listening on port ${e.port}`),r}createNodeRawResponder(e){return async t=>{e.beforeHandle?.();try{await t(e.request,e.response)}catch(o){if(!le(e.response))return Se(e.response,o),De;throw o}return le(e.response)||Se(e.response,new g(Ze,{})),De}}async#p(e,t){let o=await this.parseRequest(e);if(!this.#a)throw new U(`Route ${o.path} not found`);let r=await this.#a({request:o,respondWithRaw:this.createRawResponder(e,t)});if(!et(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 o=t?.defaultStatusCode??h.Ok,r=t?.defaultContentType??"application/json",n=o,d=r,u={response:{},request:{}},y={},c={};[{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 p=t[a.key]??i.v.any();if(!a.skip&&(a.type==="request"&&(y[a.key]=p,u.request[a.key]=i.v.schema(p)),a.type==="response")){let l=tt.concat({status:o,contentType:d,pipe:p});c[a.key]=i.v.any().pipe(f=>{let q=l.find(k=>k.status===n)?.pipe;if(!q)throw i.PipeError.root(`schema not defined for status code: ${n}`,f);let v=i.v.validate(q,f);if(!v.valid)throw v.error;return v.value}),u.response[a.key]=l.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 w=i.v.object(c);return i.v.compile(w,{allErrors:!0}),{jsonSchema:u,validateRequest:async a=>{if(!Object.keys(y))return a;let p=Q.run(a,()=>i.v.validate(m,{params:a.params,headers:a.headers,query:a.query,body:a.body,cookies:a.cookies}));if(!p.valid)throw j(p.error);return a.params=p.value.params,a.headers=p.value.headers,a.query=p.value.query,a.body=p.value.body,a.cookies=p.value.cookies,a},validateResponse:async a=>{if(!Object.keys(c))return a;n=a.status,d=a.contentType;let p=X.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(!p.valid)throw j(p.error);return a.body=p.value.response,a.headers=p.value.responseHeaders,a.cookieValues=p.value.responseCookies,a}}}};var st=s=>ae(async e=>{if(e.authUser=await S.process(s,e.headers),!e.authUser)throw new E},e=>{e.security??=[];for(let t of s){let o=t.routeSecuritySchemeName();o&&e.security.push({[o]:[]})}e.descriptions??=[],e.descriptions.push("Requires a valid means of authentication.")});0&&(module.exports={BaseApiKeyRequestAuthMethod,BaseJwtCookieRequestAuthMethod,BaseJwtHeaderRequestAuthMethod,BaseJwtRequestAuthMethod,BaseRequestAuthMethod,Methods,Request,Response,Router,Server,StatusCodes,makeErrorMiddleware,makeMiddleware,makeResponseMiddleware,requireAuthUser,serverConfigPipe});
|
|
32
32
|
//# sourceMappingURL=index.min.cjs.map
|