express-zod-api 24.0.0-beta.1 → 24.0.0-beta.11

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/dist/index.d.ts CHANGED
@@ -195,8 +195,7 @@ declare abstract class AbstractMiddleware {
195
195
  }
196
196
  declare class Middleware<OPT extends FlatObject, OUT extends FlatObject, SCO extends string, IN extends IOSchema = EmptySchema> extends AbstractMiddleware {
197
197
  #private;
198
- constructor({ input, // @todo revisit
199
- security, handler, }: {
198
+ constructor({ input, security, handler, }: {
200
199
  /**
201
200
  * @desc Input schema of the Middleware, combining properties from all the enabled input sources
202
201
  * @default z.object({})
@@ -224,11 +223,11 @@ declare class ExpressMiddleware<R extends Request, S extends Response, OUT exten
224
223
  });
225
224
  }
226
225
 
227
- type Base = object & {
226
+ type Base$1 = object & {
228
227
  [Symbol.iterator]?: never;
229
228
  };
230
229
  /** @desc The type allowed on the top level of Middlewares and Endpoints */
231
- type IOSchema = z.ZodType<Base>;
230
+ type IOSchema = z.ZodType<Base$1>;
232
231
 
233
232
  declare const methods: ("get" | "post" | "put" | "delete" | "patch")[];
234
233
  type Method = (typeof methods)[number];
@@ -465,7 +464,7 @@ type UploadOptions = Pick<express_fileupload__default.Options, "createParentPath
465
464
  type CompressionOptions = Pick<compression.CompressionOptions, "threshold" | "level" | "strategy" | "chunkSize" | "memLevel">;
466
465
  interface GracefulOptions {
467
466
  /**
468
- * @desc Time given to drain ongoing requests before exit.
467
+ * @desc Time given to drain ongoing requests before closing the server.
469
468
  * @default 1000
470
469
  * */
471
470
  timeout?: number;
@@ -475,6 +474,8 @@ interface GracefulOptions {
475
474
  * @default [SIGINT, SIGTERM]
476
475
  * */
477
476
  events?: string[];
477
+ /** @desc The hook to call after the server was closed, but before terminating the process. */
478
+ beforeExit?: () => void | Promise<void>;
478
479
  }
479
480
  type BeforeRouting = (params: {
480
481
  app: IRouter;
@@ -543,6 +544,7 @@ declare function createConfig(config: AppConfig): AppConfig;
543
544
 
544
545
  /** @desc this type does not allow props assignment, but it works for reading them when merged with another interface */
545
546
  type EmptyObject = z.output<EmptySchema>;
547
+ /** Avoiding z.ZodObject<Record<string, never>, $strip>, because its z.output<> is generic "object" (external issue) */
546
548
  type EmptySchema = z.ZodRecord<z.ZodString, z.ZodNever>;
547
549
  type FlatObject = Record<string, unknown>;
548
550
  /** @link https://stackoverflow.com/a/65492934 */
@@ -556,33 +558,6 @@ interface TagOverrides {
556
558
  }
557
559
  type Tag = NoNever<keyof TagOverrides, string>;
558
560
  declare const getMessageFromError: (error: Error) => string;
559
- declare const getExamples: <T extends $ZodType, V extends "original" | "parsed" | undefined>({ schema, variant, validate, pullProps, }: {
560
- schema: T;
561
- /**
562
- * @desc examples variant: original or parsed
563
- * @example "parsed" — for the case when possible schema transformations should be applied
564
- * @default "original"
565
- * @override validate: variant "parsed" activates validation as well
566
- * */
567
- variant?: V;
568
- /**
569
- * @desc filters out the examples that do not match the schema
570
- * @default variant === "parsed"
571
- * */
572
- validate?: boolean;
573
- /**
574
- * @desc should pull examples from properties — applicable to ZodObject only
575
- * @default false
576
- * */
577
- pullProps?: boolean;
578
- }) => ReadonlyArray<V extends "parsed" ? z.output<T> : z.input<T>>;
579
-
580
- declare const metaSymbol: unique symbol;
581
- interface Metadata {
582
- examples: unknown[];
583
- /** @override ZodDefault::_zod.def.defaultValue() in depictDefault */
584
- defaultLabel?: string;
585
- }
586
561
 
587
562
  /**
588
563
  * @fileoverview Mapping utils for Zod Runtime Plugin (remap)
@@ -603,18 +578,18 @@ type Intact<T, U> = {
603
578
 
604
579
  declare module "zod/v4/core" {
605
580
  interface GlobalMeta {
606
- [metaSymbol]?: Metadata;
607
581
  deprecated?: boolean;
582
+ default?: unknown;
608
583
  }
609
584
  }
610
585
  declare module "zod/v4" {
611
586
  interface ZodType {
612
- /** @desc Add an example value (before any transformations, can be called multiple times) */
613
- example(example: z.input<this>): this;
587
+ /** @desc Shorthand for .meta({examples}), it can be called multiple times */
588
+ example(example: z.output<this>): this;
614
589
  deprecated(): this;
615
590
  }
616
591
  interface ZodDefault<T extends $ZodType = $ZodType> extends ZodType {
617
- /** @desc Change the default value in the generated Documentation to a label */
592
+ /** @desc Change the default value in the generated Documentation to a label, alias for .meta({ default }) */
618
593
  label(label: string): this;
619
594
  }
620
595
  interface ZodObject<out Shape extends $ZodShape = $ZodLooseShape, out Config extends $ZodObjectConfig = $ZodObjectConfig> extends ZodType {
@@ -674,8 +649,7 @@ declare class EndpointsFactory<IN extends IOSchema = EmptySchema, OUT extends Fl
674
649
  } | undefined) => EndpointsFactory<IN, OUT & AOUT, SCO>;
675
650
  addExpressMiddleware<R extends Request, S extends Response, AOUT extends FlatObject = EmptyObject>(...params: ConstructorParameters<typeof ExpressMiddleware<R, S, AOUT>>): EndpointsFactory<IN, OUT & AOUT, SCO>;
676
651
  addOptions<AOUT extends FlatObject>(getOptions: () => Promise<AOUT>): EndpointsFactory<IN, OUT & AOUT, SCO>;
677
- build<BOUT extends IOSchema, BIN extends IOSchema = EmptySchema>({ input, // @todo revisit
678
- output: outputSchema, operationId, scope, tag, method, ...rest }: BuildProps<BIN, BOUT, IN, OUT, SCO>): Endpoint<z.ZodIntersection<IN, BIN>, BOUT, OUT>;
652
+ build<BOUT extends IOSchema, BIN extends IOSchema = EmptySchema>({ input, output: outputSchema, operationId, scope, tag, method, ...rest }: BuildProps<BIN, BOUT, IN, OUT, SCO>): Endpoint<z.ZodIntersection<IN, BIN>, BOUT, OUT>;
679
653
  /** @desc shorthand for returning {} while having output schema z.object({}) */
680
654
  buildVoid<BIN extends IOSchema = EmptySchema>({ handler, ...rest }: Omit<BuildProps<BIN, z.ZodVoid, IN, OUT, SCO>, "output">): Endpoint<z.ZodIntersection<IN, BIN>, z.ZodObject<{}, z.core.$strip>, OUT>;
681
655
  }
@@ -698,7 +672,7 @@ declare const createServer: (config: ServerConfig, routing: Routing) => Promise<
698
672
  }>;
699
673
 
700
674
  interface ReqResCommons {
701
- makeRef: (key: object, subject: SchemaObject | ReferenceObject, name?: string) => ReferenceObject;
675
+ makeRef: (key: object | string, subject: SchemaObject | ReferenceObject, name?: string) => ReferenceObject;
702
676
  path: string;
703
677
  method: Method;
704
678
  }
@@ -741,7 +715,7 @@ interface DocumentationParams {
741
715
  /**
742
716
  * @desc Handling rules for your own branded schemas.
743
717
  * @desc Keys: brands (recommended to use unique symbols).
744
- * @desc Values: functions having schema as first argument that you should assign type to, second one is a context.
718
+ * @desc Values: functions having Zod context as first argument, second one is the framework context.
745
719
  * @example { MyBrand: ( { zodSchema, jsonSchema } ) => ({ type: "object" })
746
720
  */
747
721
  brandHandling?: BrandHandling;
@@ -928,20 +902,10 @@ declare class EventStreamFactory<E extends EventsMap> extends EndpointsFactory<E
928
902
  constructor(events: E);
929
903
  }
930
904
 
931
- declare const variants: {
932
- buffer: () => z.core.$ZodBranded<z.ZodCustom<Buffer<ArrayBufferLike>, Buffer<ArrayBufferLike>>, symbol>;
933
- string: () => z.core.$ZodBranded<z.ZodString, symbol>;
934
- binary: () => z.core.$ZodBranded<z.ZodUnion<[z.ZodCustom<Buffer<ArrayBufferLike>, Buffer<ArrayBufferLike>>, z.ZodString]>, symbol>;
935
- base64: () => z.core.$ZodBranded<z.ZodBase64, symbol>;
936
- };
937
- type Variants = typeof variants;
938
- type Variant = keyof Variants;
939
- declare function file(): ReturnType<Variants["string"]>;
940
- declare function file<K extends Variant>(variant: K): ReturnType<Variants[K]>;
941
-
942
905
  declare const base: z.ZodObject<{
943
906
  raw: z.core.$ZodBranded<z.ZodCustom<Buffer<ArrayBufferLike>, Buffer<ArrayBufferLike>>, symbol>;
944
907
  }, z.core.$strip>;
908
+ type Base = ReturnType<typeof base.brand<symbol>>;
945
909
  declare const extended: <S extends $ZodShape>(extra: S) => z.core.$ZodBranded<z.ZodObject<("raw" & keyof S extends never ? {
946
910
  raw: z.core.$ZodBranded<z.ZodCustom<Buffer<ArrayBufferLike>, Buffer<ArrayBufferLike>>, symbol>;
947
911
  } & S : ({
@@ -955,17 +919,16 @@ declare const extended: <S extends $ZodShape>(extra: S) => z.core.$ZodBranded<z.
955
919
  } extends infer T_1 extends z.core.util.SomeObject ? { [K in keyof T_1 as K extends keyof S ? never : K]: {
956
920
  raw: z.core.$ZodBranded<z.ZodCustom<Buffer<ArrayBufferLike>, Buffer<ArrayBufferLike>>, symbol>;
957
921
  }[K]; } : never) & { [K_1 in keyof S]: S[K_1]; })[k]; } : never, z.core.$strip>, symbol>;
958
- /** Shorthand for z.object({ raw: ez.file("buffer") }) */
959
- declare function raw(): ReturnType<typeof base.brand<symbol>>;
922
+ declare function raw(): Base;
960
923
  declare function raw<S extends $ZodShape>(extra: S): ReturnType<typeof extended<S>>;
961
924
 
962
925
  declare const ez: {
963
- dateIn: () => zod_v4_core.$ZodBranded<zod_v4.ZodPipe<zod_v4.ZodPipe<zod_v4.ZodUnion<[zod_v4.ZodString, zod_v4.ZodString, zod_v4.ZodString]>, zod_v4.ZodTransform<Date, string>>, zod_v4.ZodDate>, symbol>;
964
- dateOut: () => zod_v4_core.$ZodBranded<zod_v4.ZodPipe<zod_v4.ZodDate, zod_v4.ZodTransform<string, Date>>, symbol>;
926
+ dateIn: ({ examples, ...rest }?: Parameters<zod_v4.ZodString["meta"]>[0]) => zod_v4_core.$ZodBranded<zod_v4.ZodPipe<zod_v4.ZodPipe<zod_v4.ZodUnion<readonly [zod_v4.ZodISODate, zod_v4.ZodISODateTime, zod_v4.ZodISODateTime]>, zod_v4.ZodTransform<Date, string>>, zod_v4.ZodDate>, symbol>;
927
+ dateOut: ({ examples, ...rest }?: Parameters<zod_v4.ZodString["meta"]>[0]) => zod_v4_core.$ZodBranded<zod_v4.ZodPipe<zod_v4.ZodDate, zod_v4.ZodTransform<string, Date>>, symbol>;
965
928
  form: <S extends zod_v4_core.$ZodShape>(base: S | zod_v4.ZodObject<S>) => zod_v4_core.$ZodBranded<zod_v4.ZodObject<{ -readonly [P in keyof S]: S[P]; }, zod_v4_core.$strip>, symbol>;
966
- file: typeof file;
967
929
  upload: () => zod_v4_core.$ZodBranded<zod_v4.ZodCustom<express_fileupload.UploadedFile, express_fileupload.UploadedFile>, symbol>;
968
930
  raw: typeof raw;
931
+ buffer: () => zod_v4_core.$ZodBranded<zod_v4.ZodCustom<Buffer<ArrayBufferLike>, Buffer<ArrayBufferLike>>, symbol>;
969
932
  };
970
933
 
971
- export { type ApiResponse, type AppConfig, type BasicSecurity, type BearerSecurity, BuiltinLogger, type CommonConfig, type CookieSecurity, DependsOnMethod, type Depicter, Documentation, DocumentationError, EndpointsFactory, EventStreamFactory, type FlatObject, type HeaderSecurity, type IOSchema, type InputSecurity, InputValidationError, Integration, type LoggerOverrides, type Method, Middleware, MissingPeerError, type OAuth2Security, type OpenIdSecurity, OutputValidationError, type Producer, ResultHandler, type Routing, RoutingError, ServeStatic, type ServerConfig, type TagOverrides, arrayEndpointsFactory, arrayResultHandler, attachRouting, createConfig, createServer, defaultEndpointsFactory, defaultResultHandler, ensureHttpError, ez, getExamples, getMessageFromError, testEndpoint, testMiddleware };
934
+ export { type ApiResponse, type AppConfig, type BasicSecurity, type BearerSecurity, BuiltinLogger, type CommonConfig, type CookieSecurity, DependsOnMethod, type Depicter, Documentation, DocumentationError, EndpointsFactory, EventStreamFactory, type FlatObject, type HeaderSecurity, type IOSchema, type InputSecurity, InputValidationError, Integration, type LoggerOverrides, type Method, Middleware, MissingPeerError, type OAuth2Security, type OpenIdSecurity, OutputValidationError, type Producer, ResultHandler, type Routing, RoutingError, ServeStatic, type ServerConfig, type TagOverrides, arrayEndpointsFactory, arrayResultHandler, attachRouting, createConfig, createServer, defaultEndpointsFactory, defaultResultHandler, ensureHttpError, ez, getMessageFromError, testEndpoint, testMiddleware };
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
- import*as L from"ramda";import{z as Y}from"zod/v4";import*as j from"ramda";import{globalRegistry as yr,z as rt}from"zod/v4";var E={json:"application/json",upload:"multipart/form-data",raw:"application/octet-stream",sse:"text/event-stream",form:"application/x-www-form-urlencoded"};var me=class extends Error{name="RoutingError";cause;constructor(t,r,o){super(t),this.cause={method:r,path:o}}},J=class extends Error{name="DocumentationError";cause;constructor(t,{method:r,path:o,isResponse:n}){super(t),this.cause=`${n?"Response":"Input"} schema of an Endpoint assigned to ${r.toUpperCase()} method of ${o} path.`}},He=class extends Error{name="IOSchemaError"},tt=class extends He{constructor(r){super("Found",{cause:r});this.cause=r}name="DeepCheckError"},le=class extends He{constructor(r){super(te(r),{cause:r});this.cause=r}name="OutputValidationError"},G=class extends He{constructor(r){super(te(r),{cause:r});this.cause=r}name="InputValidationError"},ee=class extends Error{constructor(r,o){super(te(r),{cause:r});this.cause=r;this.handled=o}name="ResultHandlerError"},Ke=class extends Error{name="MissingPeerError";constructor(t){super(`Missing peer dependency: ${t}. Please install it to use the feature.`)}};var At=/:([A-Za-z0-9_]+)/g,ot=e=>e.match(At)?.map(t=>t.slice(1))||[],Bo=e=>{let r=(e.header("content-type")||"").toLowerCase().startsWith(E.upload);return"files"in e&&r},Ct={get:["query","params"],post:["body","params","files"],put:["body","params"],patch:["body","params"],delete:["query","params"]},Fo=["body","query","params"],It=e=>e.method.toLowerCase(),nt=(e,t={})=>{let r=It(e);return r==="options"?{}:(t[r]||Ct[r]||Fo).filter(o=>o==="files"?Bo(e):!0).reduce((o,n)=>Object.assign(o,e[n]),{})},re=e=>e instanceof Error?e:e instanceof rt.ZodError?new Error(te(e),{cause:e}):new Error(String(e)),te=e=>e instanceof rt.ZodError?e.issues.map(({path:t,message:r})=>(t.length?[t.join("/")]:[]).concat(r).join(": ")).join("; "):e instanceof le?`output${e.cause.issues[0]?.path.length>0?"/":": "}${e.message}`:e.message,oe=(e,t)=>e._zod.def.type===t,Do=e=>Object.entries(e._zod.def.shape).reduce((t,[r,o])=>{let{examples:n=[]}=yr.get(o)?.[O]||{};return ue(t,n.map(j.objOf(r)),([s,i])=>({...s,...i}))},[]),we=({schema:e,variant:t="original",validate:r=t==="parsed",pullProps:o=!1})=>{let n=yr.get(e)?.[O]?.examples||[];if(!n.length&&o&&oe(e,"object")&&(n=Do(e)),!r&&t==="original")return n;let s=[];for(let i of n){let p=rt.safeParse(e,i);p.success&&s.push(t==="parsed"?p.data:i)}return s},ue=(e,t,r)=>e.length&&t.length?j.xprod(e,t).map(r):e.concat(t),Nt=e=>e.charAt(0).toUpperCase()+e.slice(1).toLowerCase(),ne=(...e)=>{let t=j.chain(o=>o.split(/[^A-Z0-9]/gi),e);return j.chain(o=>o.replaceAll(/[A-Z]+/g,n=>`/${n}`).split("/"),t).map(Nt).join("")},st=j.tryCatch((e,t)=>typeof rt.parse(e,t),j.always(void 0)),it=({_zod:{optin:e,optout:t}},{isResponse:r})=>(r?t:e)==="optional",M=e=>typeof e=="object"&&e!==null,fe=j.memoizeWith(()=>"static",()=>process.env.NODE_ENV==="production");import*as gr from"ramda";var O=Symbol.for("express-zod-api"),hr=(e,t)=>{let r=e.meta(),o=t.meta();if(!r?.[O])return t;let n=ue(o?.[O]?.examples||[],r[O].examples||[],([s,i])=>typeof s=="object"&&typeof i=="object"&&s&&i?gr.mergeDeepRight(s,i):i);return t.meta({...o,[O]:{...o?.[O],examples:n}})},W=e=>{let{brand:t}=e._zod.bag;if(typeof t=="symbol"||typeof t=="string"||typeof t=="number")return t};var Uo=Y.core.$constructor("$EZBrandCheck",(e,t)=>{Y.core.$ZodCheck.init(e,t),e._zod.onattach.push(r=>r._zod.bag.brand=t.brand),e._zod.check=()=>{}}),Vo=function(e){let{[O]:t,...r}=this.meta()||{},o=t?.examples.slice()||[];return o.push(e),this.meta({...r,[O]:{...t,examples:o}})},_o=function(){return this.meta({...this.meta(),deprecated:!0})},Jo=function(e){let{[O]:t={examples:[]},...r}=this.meta()||{};return this.meta({...r,[O]:{...t,defaultLabel:e}})},Go=function(e){return this.check(new Uo({brand:e,check:"$EZBrandCheck"}))},Wo=function(e){let t=typeof e=="function"?e:L.pipe(L.toPairs,L.map(([s,i])=>L.pair(e[String(s)]||s,i)),L.fromPairs),r=t(L.map(L.invoker(0,"clone"),this._zod.def.shape)),n=(this._zod.def.catchall instanceof Y.ZodUnknown?Y.looseObject:Y.object)(r);return this.transform(t).pipe(n)};if(!(O in globalThis)){globalThis[O]=!0;for(let e of Object.keys(Y)){if(!e.startsWith("Zod")||/(Success|Error|Function)$/.test(e))continue;let t=Y[e];typeof t=="function"&&Object.defineProperties(t.prototype,{example:{get(){return Vo.bind(this)}},deprecated:{get(){return _o.bind(this)}},brand:{set(){},get(){return Go.bind(this)}}})}Object.defineProperty(Y.ZodDefault.prototype,"label",{get(){return Jo.bind(this)}}),Object.defineProperty(Y.ZodObject.prototype,"remap",{get(){return Wo.bind(this)}})}function Yo(e){return e}import{z as Mr}from"zod/v4";import*as Ae from"ramda";import{z as Nr}from"zod/v4";import*as ae from"ramda";import{z as Er}from"zod/v4";import{z as qe}from"zod/v4";var ye=Symbol("DateIn"),br=()=>qe.union([qe.iso.date(),qe.iso.datetime(),qe.iso.datetime({local:!0})]).transform(t=>new Date(t)).pipe(qe.date()).brand(ye);import{z as Qo}from"zod/v4";var ge=Symbol("DateOut"),xr=()=>Qo.date().transform(e=>e.toISOString()).brand(ge);import{z as Sr}from"zod/v4";var Be=Symbol("Form"),Rr=e=>(e instanceof Sr.ZodObject?e:Sr.object(e)).brand(Be);import{z as Xo}from"zod/v4";var se=Symbol("Upload"),Or=()=>Xo.custom(e=>typeof e=="object"&&e!==null&&"name"in e&&"encoding"in e&&"mimetype"in e&&"data"in e&&"tempFilePath"in e&&"truncated"in e&&"size"in e&&"md5"in e&&"mv"in e&&typeof e.name=="string"&&typeof e.encoding=="string"&&typeof e.mimetype=="string"&&Buffer.isBuffer(e.data)&&typeof e.tempFilePath=="string"&&typeof e.truncated=="boolean"&&typeof e.size=="number"&&typeof e.md5=="string"&&typeof e.mv=="function",{error:({input:e})=>({message:`Expected file upload, received ${typeof e}`})}).brand(se);import{z as tn}from"zod/v4";import{z as at}from"zod/v4";var ie=Symbol("File"),Tr=at.custom(e=>Buffer.isBuffer(e),{message:"Expected Buffer"}),en={buffer:()=>Tr.brand(ie),string:()=>at.string().brand(ie),binary:()=>Tr.or(at.string()).brand(ie),base64:()=>at.base64().brand(ie)};function pt(e){return en[e||"string"]()}var H=Symbol("Raw"),Pr=tn.object({raw:pt("buffer")}),rn=e=>Pr.extend(e).brand(H);function wr(e){return e?rn(e):Pr.brand(H)}var vr=(e,{io:t,condition:r})=>ae.tryCatch(()=>{Er.toJSONSchema(e,{io:t,unrepresentable:"any",override:({zodSchema:o})=>{if(r(o))throw new tt(o)}})},o=>o.cause)(),kr=(e,{io:t})=>{let o=[Er.toJSONSchema(e,{io:t,unrepresentable:"any",override:({jsonSchema:n})=>{typeof n.default=="bigint"&&delete n.default}})];for(;o.length;){let n=o.shift();if(ae.is(Object,n)){if(n.$ref==="#")return!0;o.push(...ae.values(n))}ae.is(Array,n)&&o.push(...ae.values(n))}return!1},Ar=e=>vr(e,{condition:t=>{let r=W(t);return typeof r=="symbol"&&[se,H,Be].includes(r)},io:"input"}),on=["nan","symbol","map","set","bigint","void","promise","never"],zt=(e,t)=>vr(e,{io:t,condition:r=>{let o=W(r),{type:n}=r._zod.def;return!!(on.includes(n)||t==="input"&&(n==="date"||o===ge)||t==="output"&&(o===ye||o===H||o===se))}});import an,{isHttpError as pn}from"http-errors";import Cr,{isHttpError as nn}from"http-errors";import{z as sn}from"zod/v4";var jt=(e,{variant:t,args:r,...o})=>{if(typeof e=="function"&&(e=e(...r)),e instanceof sn.ZodType)return[{schema:e,...o}];if(Array.isArray(e)&&!e.length){let n=new Error(`At least one ${t} response schema required.`);throw new ee(n)}return(Array.isArray(e)?e:[e]).map(({schema:n,statusCode:s,mimeType:i})=>({schema:n,statusCodes:typeof s=="number"?[s]:s||o.statusCodes,mimeTypes:typeof i=="string"?[i]:i===void 0?o.mimeTypes:i}))},Fe=(e,t,{url:r},o)=>!e.expose&&t.error("Server side error",{error:e,url:r,payload:o}),Ee=e=>nn(e)?e:Cr(e instanceof G?400:500,te(e),{cause:e.cause||e}),he=e=>fe()&&!e.expose?Cr(e.statusCode).message:e.message;var ct=({error:e,logger:t,response:r})=>{t.error("Result handler failure",e);let o=he(an(500,`An error occurred while serving the result: ${e.message}.`+(e.handled?`
2
- Original error: ${e.handled.message}.`:""),{expose:pn(e.cause)?e.cause.expose:!1}));r.status(500).type("text/plain").end(o)};import{z as Ir}from"zod/v4";var Mt=class{},D=class extends Mt{#e;#t;#r;constructor({input:t=Ir.object({}),security:r,handler:o}){super(),this.#e=t,this.#t=r,this.#r=o}get security(){return this.#t}get schema(){return this.#e}async execute({input:t,...r}){try{let o=await this.#e.parseAsync(t);return this.#r({...r,input:o})}catch(o){throw o instanceof Ir.ZodError?new G(o):o}}},ve=class extends D{constructor(t,{provider:r=()=>({}),transformer:o=n=>n}={}){super({handler:async({request:n,response:s})=>new Promise((i,p)=>{let d=c=>{if(c&&c instanceof Error)return p(o(c));i(r(n,s))};t(n,s,d)?.catch(d)})})}};var ke=class{nest(t){return Object.assign(t,{"":this})}};var De=class extends ke{},dt=class e extends De{#e;constructor(t){super(),this.#e=t}#t(t){return new e({...this.#e,...t})}deprecated(){return this.#t({deprecated:!0})}get isDeprecated(){return this.#e.deprecated||!1}get description(){return this.#e.description}get shortDescription(){return this.#e.shortDescription}get methods(){return Object.freeze(this.#e.methods)}get inputSchema(){return this.#e.inputSchema}get outputSchema(){return this.#e.outputSchema}get requestType(){let t=Ar(this.#e.inputSchema);if(t){let r=W(t);if(r===se)return"upload";if(r===H)return"raw";if(r===Be)return"form"}return"json"}getResponses(t){return Object.freeze(t==="negative"?this.#e.resultHandler.getNegativeResponse():this.#e.resultHandler.getPositiveResponse(this.#e.outputSchema))}get security(){let t=Ae.pluck("security",this.#e.middlewares||[]);return Ae.reject(Ae.isNil,t)}get scopes(){return Object.freeze(this.#e.scopes||[])}get tags(){return Object.freeze(this.#e.tags||[])}getOperationId(t){return this.#e.getOperationId?.(t)}async#r(t){try{return await this.#e.outputSchema.parseAsync(t)}catch(r){throw r instanceof Nr.ZodError?new le(r):r}}async#o({method:t,logger:r,options:o,response:n,...s}){for(let i of this.#e.middlewares||[])if(!(t==="options"&&!(i instanceof ve))&&(Object.assign(o,await i.execute({...s,options:o,response:n,logger:r})),n.writableEnded)){r.warn("A middleware has closed the stream. Accumulated options:",o);break}}async#n({input:t,...r}){let o;try{o=await this.#e.inputSchema.parseAsync(t)}catch(n){throw n instanceof Nr.ZodError?new G(n):n}return this.#e.handler({...r,input:o})}async#s(t){try{await this.#e.resultHandler.execute(t)}catch(r){ct({...t,error:new ee(re(r),t.error||void 0)})}}async execute({request:t,response:r,logger:o,config:n}){let s=It(t),i={},p={output:{},error:null},d=nt(t,n.inputSources);try{if(await this.#o({method:s,input:d,request:t,response:r,logger:o,options:i}),r.writableEnded)return;if(s==="options")return void r.status(200).end();p={output:await this.#r(await this.#n({input:d,logger:o,options:i})),error:null}}catch(c){p={output:null,error:re(c)}}await this.#s({...p,input:d,request:t,response:r,logger:o,options:i})}};import*as zr from"ramda";var jr=(e,t)=>{let r=zr.pluck("schema",e);r.push(t);let o=r.reduce((n,s)=>n.and(s));return r.reduce((n,s)=>hr(s,n),o)};import{z as K}from"zod/v4";var Ce={positive:200,negative:400},Ie=Object.keys(Ce);var Lt=class{#e;constructor(t){this.#e=t}execute(...t){return this.#e(...t)}},be=class extends Lt{#e;#t;constructor(t){super(t.handler),this.#e=t.positive,this.#t=t.negative}getPositiveResponse(t){return jt(this.#e,{variant:"positive",args:[t],statusCodes:[Ce.positive],mimeTypes:[E.json]})}getNegativeResponse(){return jt(this.#t,{variant:"negative",args:[],statusCodes:[Ce.negative],mimeTypes:[E.json]})}},xe=new be({positive:e=>{let t=we({schema:e,pullProps:!0}),r=K.object({status:K.literal("success"),data:e});return t.reduce((o,n)=>o.example({status:"success",data:n}),r)},negative:K.object({status:K.literal("error"),error:K.object({message:K.string()})}).example({status:"error",error:{message:"Sample error message"}}),handler:({error:e,input:t,output:r,request:o,response:n,logger:s})=>{if(e){let i=Ee(e);return Fe(i,s,o,t),void n.status(i.statusCode).set(i.headers).json({status:"error",error:{message:he(i)}})}n.status(Ce.positive).json({status:"success",data:r})}}),Zt=new be({positive:e=>{let t=we({schema:e}),r=e instanceof K.ZodObject&&"items"in e.shape&&e.shape.items instanceof K.ZodArray?e.shape.items:K.array(K.any());return t.reduce((o,n)=>M(n)&&"items"in n&&Array.isArray(n.items)?o.example(n.items):o,r)},negative:K.string().example("Sample error message"),handler:({response:e,output:t,error:r,logger:o,request:n,input:s})=>{if(r){let i=Ee(r);return Fe(i,o,n,s),void e.status(i.statusCode).type("text/plain").send(he(i))}if("items"in t&&Array.isArray(t.items))return void e.status(Ce.positive).json(t.items);throw new Error("Property 'items' is missing in the endpoint output")}});var Se=class e{constructor(t){this.resultHandler=t}middlewares=[];static#e(t,r){let o=new e(r);return o.middlewares=t,o}addMiddleware(t){return e.#e(this.middlewares.concat(t instanceof D?t:new D(t)),this.resultHandler)}use=this.addExpressMiddleware;addExpressMiddleware(...t){return e.#e(this.middlewares.concat(new ve(...t)),this.resultHandler)}addOptions(t){return e.#e(this.middlewares.concat(new D({handler:t})),this.resultHandler)}build({input:t=Mr.object({}),output:r,operationId:o,scope:n,tag:s,method:i,...p}){let{middlewares:d,resultHandler:c}=this,m=typeof i=="string"?[i]:i,g=typeof o=="function"?o:()=>o,h=typeof n=="string"?[n]:n||[],y=typeof s=="string"?[s]:s||[];return new dt({...p,middlewares:d,outputSchema:r,resultHandler:c,scopes:h,tags:y,methods:m,getOperationId:g,inputSchema:jr(d,t)})}buildVoid({handler:t,...r}){return this.build({...r,output:Mr.object({}),handler:async o=>(await t(o),{})})}},cn=new Se(xe),dn=new Se(Zt);import hn from"ansis";import{inspect as bn}from"node:util";import{performance as qr}from"node:perf_hooks";import{blue as mn,green as ln,hex as un,red as fn,cyanBright as yn}from"ansis";import*as Lr from"ramda";var $t={debug:mn,info:ln,warn:un("#FFA500"),error:fn,ctx:yn},mt={debug:10,info:20,warn:30,error:40},Zr=e=>M(e)&&Object.keys(mt).some(t=>t in e),$r=e=>e in mt,Hr=(e,t)=>mt[e]<mt[t],gn=(e,t=0)=>Intl.NumberFormat(void 0,{useGrouping:!1,minimumFractionDigits:0,maximumFractionDigits:t,style:"unit",unitDisplay:"long",unit:e}),Ne=Lr.memoizeWith((e,t)=>`${e}${t}`,gn),Kr=e=>e<1e-6?Ne("nanosecond",3).format(e/1e-6):e<.001?Ne("nanosecond").format(e/1e-6):e<1?Ne("microsecond").format(e/.001):e<1e3?Ne("millisecond").format(e):e<6e4?Ne("second",2).format(e/1e3):Ne("minute",2).format(e/6e4);var Ue=class e{config;constructor({color:t=hn.isSupported(),level:r=fe()?"warn":"debug",depth:o=2,ctx:n={}}={}){this.config={color:t,level:r,depth:o,ctx:n}}format(t){let{depth:r,color:o,level:n}=this.config;return bn(t,{depth:r,colors:o,breakLength:n==="debug"?80:1/0,compact:n==="debug"?3:!0})}print(t,r,o){let{level:n,ctx:{requestId:s,...i},color:p}=this.config;if(n==="silent"||Hr(t,n))return;let d=[new Date().toISOString()];s&&d.push(p?$t.ctx(s):s),d.push(p?`${$t[t](t)}:`:`${t}:`,r),o!==void 0&&d.push(this.format(o)),Object.keys(i).length>0&&d.push(this.format(i)),console.log(d.join(" "))}debug(t,r){this.print("debug",t,r)}info(t,r){this.print("info",t,r)}warn(t,r){this.print("warn",t,r)}error(t,r){this.print("error",t,r)}child(t){return new e({...this.config,ctx:t})}get ctx(){return this.config.ctx}profile(t){let r=qr.now();return()=>{let o=qr.now()-r,{message:n,severity:s="debug",formatter:i=Kr}=typeof t=="object"?t:{message:t};this.print(typeof s=="function"?s(o):s,n,i(o))}}};import*as Br from"ramda";var Ve=class e extends ke{#e;constructor(t){super(),this.#e=t}get entries(){let t=Br.filter(r=>!!r[1],Object.entries(this.#e));return Object.freeze(t)}deprecated(){let t=Object.entries(this.#e).reduce((r,[o,n])=>Object.assign(r,{[o]:n.deprecated()}),{});return new e(t)}};import xn from"express";var _e=class{#e;constructor(...t){this.#e=t}apply(t,r){return r(t,xn.static(...this.#e))}};import ft from"express";import Mn from"node:http";import Ln from"node:https";var ze=async(e,t="default")=>{try{return(await import(e))[t]}catch{}throw new Ke(e)};import En from"http-errors";import{z as Dr}from"zod/v4";import*as S from"ramda";var Sn=e=>e.type==="object",Rn=S.mergeDeepWith((e,t)=>{if(Array.isArray(e)&&Array.isArray(t))return S.concat(e,t);if(e===t)return t;throw new Error("Can not flatten properties")}),On=S.pipe(Object.keys,S.without(["type","properties","required","examples","description"]),S.isEmpty),Fr=S.pair(!0),je=(e,t="coerce")=>{let r=[S.pair(!1,e)],o={type:"object",properties:{}},n=[];for(;r.length;){let[s,i]=r.shift();if(i.description&&(o.description??=i.description),i.allOf&&r.push(...i.allOf.map(p=>{if(t==="throw"&&!(p.type==="object"&&On(p)))throw new Error("Can not merge");return S.pair(s,p)})),i.anyOf&&r.push(...S.map(Fr,i.anyOf)),i.oneOf&&r.push(...S.map(Fr,i.oneOf)),!!Sn(i)&&(i.properties&&(o.properties=(t==="throw"?Rn:S.mergeDeepRight)(o.properties,i.properties),!s&&i.required&&n.push(...i.required)),i.examples?.length&&(s?o.examples=S.concat(o.examples||[],i.examples):o.examples=ue(o.examples?.filter(M)||[],i.examples.filter(M),([p,d])=>S.mergeDeepRight(p,d))),i.propertyNames)){let p=[];typeof i.propertyNames.const=="string"&&p.push(i.propertyNames.const),i.propertyNames.enum&&p.push(...i.propertyNames.enum.filter(c=>typeof c=="string"));let d={...Object(i.additionalProperties)};for(let c of p)o.properties[c]??=d;s||n.push(...p)}}return n.length&&(o.required=[...new Set(n)]),o};var lt=class{constructor(t){this.logger=t}#e=new WeakSet;#t=new WeakMap;checkSchema(t,r){if(!this.#e.has(t)){for(let o of["input","output"]){let n=[Dr.toJSONSchema(t[`${o}Schema`],{unrepresentable:"any"})];for(;n.length>0;){let s=n.shift();s.type&&s.type!=="object"&&this.logger.warn(`Endpoint ${o} schema is not object-based`,r);for(let i of["allOf","oneOf","anyOf"])s[i]&&n.push(...s[i])}}if(t.requestType==="json"){let o=zt(t.inputSchema,"input");o&&this.logger.warn("The final input schema of the endpoint contains an unsupported JSON payload type.",Object.assign(r,{reason:o}))}for(let o of Ie)for(let{mimeTypes:n,schema:s}of t.getResponses(o)){if(!n?.includes(E.json))continue;let i=zt(s,"output");i&&this.logger.warn(`The final ${o} response schema of the endpoint contains an unsupported JSON payload type.`,Object.assign(r,{reason:i}))}this.#e.add(t)}}checkPathParams(t,r,o){let n=this.#t.get(r);if(n?.paths.includes(t))return;let s=ot(t);if(s.length===0)return;let i=n?.flat||je(Dr.toJSONSchema(r.inputSchema,{unrepresentable:"any",io:"input"}));for(let p of s)p in i.properties||this.logger.warn("The input schema of the endpoint is most likely missing the parameter of the path it's assigned to.",Object.assign(o,{path:t,param:p}));n?n.paths.push(t):this.#t.set(r,{flat:i,paths:[t]})}};var Ht=["get","post","put","delete","patch"],Ur=e=>Ht.includes(e);var Tn=e=>{let[t,r]=e.trim().split(/ (.+)/,2);return r&&Ur(t)?[r,t]:[e]},Pn=e=>e.trim().split("/").filter(Boolean).join("/"),Vr=(e,t)=>Object.entries(e).map(([r,o])=>{let[n,s]=Tn(r);return[[t||""].concat(Pn(n)||[]).join("/"),o,s]}),wn=(e,t)=>{throw new me("Route with explicit method can only be assigned with Endpoint",e,t)},_r=(e,t,r)=>{if(!(!r||r.includes(e)))throw new me(`Method ${e} is not supported by the assigned Endpoint.`,e,t)},Kt=(e,t,r)=>{let o=`${e} ${t}`;if(r.has(o))throw new me("Route has a duplicate",e,t);r.add(o)},Me=({routing:e,onEndpoint:t,onStatic:r})=>{let o=Vr(e),n=new Set;for(;o.length;){let[s,i,p]=o.shift();if(i instanceof De)if(p)Kt(p,s,n),_r(p,s,i.methods),t(i,s,p);else{let{methods:d=["get"]}=i;for(let c of d)Kt(c,s,n),t(i,s,c)}else if(p&&wn(p,s),i instanceof _e)r&&i.apply(s,r);else if(i instanceof Ve)for(let[d,c]of i.entries){let{methods:m}=c;Kt(d,s,n),_r(d,s,m),t(c,s,d)}else o.unshift(...Vr(i,s))}};import*as Jr from"ramda";var Gr=e=>e.sort((t,r)=>+(t==="options")-+(r==="options")).join(", ").toUpperCase(),vn=e=>({method:t},r,o)=>{let n=Gr(e);r.set({Allow:n});let s=En(405,`${t} is not allowed`,{headers:{Allow:n}});o(s)},kn=e=>({"Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":Gr(e),"Access-Control-Allow-Headers":"content-type"}),qt=({app:e,getLogger:t,config:r,routing:o,parsers:n})=>{let s=fe()?void 0:new lt(t()),i=new Map;Me({routing:o,onEndpoint:(c,m,g)=>{fe()||(s?.checkSchema(c,{path:m,method:g}),s?.checkPathParams(m,c,{method:g}));let h=n?.[c.requestType]||[],y=Jr.pair(h,c);i.has(m)||i.set(m,new Map(r.cors?[["options",y]]:[])),i.get(m)?.set(g,y)},onStatic:e.use.bind(e)}),s=void 0;let d=new Map;for(let[c,m]of i){let g=Array.from(m.keys());for(let[h,[y,k]]of m){let A=async(Z,R)=>{let C=t(Z);if(r.cors){let I=kn(g),F=typeof r.cors=="function"?await r.cors({request:Z,endpoint:k,logger:C,defaultHeaders:I}):I;R.set(F)}return k.execute({request:Z,response:R,logger:C,config:r})};e[h](c,...y,A)}r.wrongMethodBehavior!==404&&d.set(c,vn(g))}for(let[c,m]of d)e.all(c,m)};import Cn from"http-errors";import{setInterval as An}from"node:timers/promises";var Wr=e=>"_httpMessage"in e&&typeof e._httpMessage=="object"&&e._httpMessage!==null&&"headersSent"in e._httpMessage&&typeof e._httpMessage.headersSent=="boolean"&&"setHeader"in e._httpMessage&&typeof e._httpMessage.setHeader=="function",Yr=e=>"server"in e&&typeof e.server=="object"&&e.server!==null&&"close"in e.server&&typeof e.server.close=="function",Qr=e=>"encrypted"in e&&typeof e.encrypted=="boolean"&&e.encrypted,Xr=({},e)=>void(!e.headersSent&&e.setHeader("connection","close")),eo=e=>new Promise((t,r)=>void e.close(o=>o?r(o):t()));var to=(e,{timeout:t=1e3,logger:r}={})=>{let o,n=new Set,s=c=>void n.delete(c.destroy()),i=c=>void(Wr(c)?!c._httpMessage.headersSent&&c._httpMessage.setHeader("connection","close"):s(c)),p=c=>void(o?c.destroy():n.add(c.once("close",()=>void n.delete(c))));for(let c of e)for(let m of["connection","secureConnection"])c.on(m,p);let d=async()=>{for(let c of e)c.on("request",Xr);r?.info("Graceful shutdown",{sockets:n.size,timeout:t});for(let c of n)(Qr(c)||Yr(c))&&i(c);for await(let c of An(10,Date.now()))if(n.size===0||Date.now()-c>=t)break;for(let c of n)s(c);return Promise.allSettled(e.map(eo))};return{sockets:n,shutdown:()=>o??=d()}};var ro=({errorHandler:e,getLogger:t})=>async(r,o,n,s)=>r?e.execute({error:re(r),request:o,response:n,input:null,output:null,options:{},logger:t(o)}):s(),oo=({errorHandler:e,getLogger:t})=>async(r,o)=>{let n=Cn(404,`Can not ${r.method} ${r.path}`),s=t(r);try{await e.execute({request:r,response:o,logger:s,error:n,input:null,output:null,options:{}})}catch(i){ct({response:o,logger:s,error:new ee(re(i),n)})}},In=e=>(t,{},r)=>{if(Object.values(t?.files||[]).flat().find(({truncated:n})=>n))return r(e);r()},Nn=e=>({log:e.debug.bind(e)}),no=async({getLogger:e,config:t})=>{let r=await ze("express-fileupload"),{limitError:o,beforeUpload:n,...s}={...typeof t.upload=="object"&&t.upload},i=[];return i.push(async(p,d,c)=>{let m=e(p);return await n?.({request:p,logger:m}),r({debug:!0,...s,abortOnLimit:!1,parseNested:!0,logger:Nn(m)})(p,d,c)}),o&&i.push(In(o)),i},so=(e,{},t)=>{Buffer.isBuffer(e.body)&&(e.body={raw:e.body}),t()},io=({logger:e,config:{childLoggerProvider:t,accessLogger:r=({method:o,path:n},s)=>s.debug(`${o}: ${n}`)}})=>async(o,n,s)=>{let i=await t?.({request:o,parent:e})||e;r?.(o,i),o.res&&(o.res.locals[O]={logger:i}),s()},ao=e=>t=>t?.res?.locals[O]?.logger||e,po=e=>process.on("deprecation",({message:t,namespace:r,name:o,stack:n})=>e.warn(`${o} (${r}): ${t}`,n.split(`
3
- `).slice(1))),co=({servers:e,logger:t,options:{timeout:r,events:o=["SIGINT","SIGTERM"]}})=>{let n=to(e,{logger:t,timeout:r}),s=()=>n.shutdown().then(()=>process.exit());for(let i of o)process.on(i,s)};import{gray as zn,hex as mo,italic as ut,whiteBright as jn}from"ansis";var lo=e=>{if(e.columns<132)return;let t=ut("Proudly supports transgender community.".padStart(109)),r=ut("Start your API server with I/O schema validation and custom middlewares in minutes.".padStart(109)),o=ut("Thank you for choosing Express Zod API for your project.".padStart(132)),n=ut("for Ashley".padEnd(20)),s=mo("#F5A9B8"),i=mo("#5BCEFA"),p=new Array(14).fill(i,1,3).fill(s,3,5).fill(jn,5,7).fill(s,7,9).fill(i,9,12).fill(zn,12,13),d=`
1
+ import*as j from"ramda";import{z as G}from"zod/v4";var Te=Symbol.for("express-zod-api"),V=e=>{let{brand:t}=e._zod.bag||{};if(typeof t=="symbol"||typeof t=="string"||typeof t=="number")return t};var Bo=G.core.$constructor("$EZBrandCheck",(e,t)=>{G.core.$ZodCheck.init(e,t),e._zod.onattach.push(r=>r._zod.bag.brand=t.brand),e._zod.check=()=>{}}),Ho=function(e){let{examples:t=[]}=this.meta()||{},r=t.slice();return r.push(e),this.meta({examples:r})},Ko=function(){return this.meta({deprecated:!0})},qo=function(e){return this.meta({default:e})},Fo=function(e){return this.check(new Bo({brand:e,check:"$EZBrandCheck"}))},Uo=function(e){let t=typeof e=="function"?e:j.pipe(j.toPairs,j.map(([s,i])=>j.pair(e[String(s)]||s,i)),j.fromPairs),r=t(j.map(j.invoker(0,"clone"),this._zod.def.shape)),n=(this._zod.def.catchall instanceof G.ZodUnknown?G.looseObject:G.object)(r);return this.transform(t).pipe(n)};if(!(Te in globalThis)){globalThis[Te]=!0;for(let e of Object.keys(G)){if(!e.startsWith("Zod")||/(Success|Error|Function)$/.test(e))continue;let t=G[e];typeof t=="function"&&Object.defineProperties(t.prototype,{example:{value:Ho,writable:!1},deprecated:{value:Ko,writable:!1},brand:{set(){},get(){return Fo.bind(this)}}})}Object.defineProperty(G.ZodDefault.prototype,"label",{value:qo,writable:!1}),Object.defineProperty(G.ZodObject.prototype,"remap",{value:Uo,writable:!1})}function Do(e){return e}import{z as Ir}from"zod/v4";import*as se from"ramda";import{z as kr,globalRegistry as an}from"zod/v4";import*as ne from"ramda";import{z as Sr}from"zod/v4";import{z as _o}from"zod/v4";var pe=Symbol("Buffer"),tt=()=>_o.custom(e=>Buffer.isBuffer(e),{error:"Expected Buffer"}).brand(pe);import{z as $e}from"zod/v4";var ce=Symbol("DateIn"),ur=({examples:e,...t}={})=>$e.union([$e.iso.date(),$e.iso.datetime(),$e.iso.datetime({local:!0})]).meta({examples:e}).transform(o=>new Date(o)).pipe($e.date()).brand(ce).meta(t);import{z as Jo}from"zod/v4";var de=Symbol("DateOut"),fr=({examples:e,...t}={})=>Jo.date().transform(r=>r.toISOString()).brand(de).meta({...t,examples:e});import{z as Wo}from"zod/v4";import*as $ from"ramda";import{z as Ze}from"zod/v4";var w={json:"application/json",upload:"multipart/form-data",raw:"application/octet-stream",sse:"text/event-stream",form:"application/x-www-form-urlencoded"};var vt=/:([A-Za-z0-9_]+)/g,rt=e=>e.match(vt)?.map(t=>t.slice(1))||[],Vo=e=>{let r=(e.header("content-type")||"").toLowerCase().startsWith(w.upload);return"files"in e&&r},kt={get:["query","params"],post:["body","params","files"],put:["body","params"],patch:["body","params"],delete:["query","params"]},Go=["body","query","params"],Ct=e=>e.method.toLowerCase(),ot=(e,t={})=>{let r=Ct(e);return r==="options"?{}:(t[r]||kt[r]||Go).filter(o=>o==="files"?Vo(e):!0).reduce((o,n)=>Object.assign(o,e[n]),{})},ee=e=>e instanceof Error?e:e instanceof Ze.ZodError?new Ze.ZodRealError(e.issues):new Error(String(e)),me=e=>e instanceof Ze.ZodError?e.issues.map(({path:t,message:r})=>`${t.length?`${Ze.core.toDotPath(t)}: `:""}${r}`).join("; "):e.message,Pe=(e,t)=>e._zod.def.type===t,le=(e,t,r)=>e.length&&t.length?$.xprod(e,t).map(r):e.concat(t),At=e=>e.charAt(0).toUpperCase()+e.slice(1).toLowerCase(),te=(...e)=>{let t=$.chain(o=>o.split(/[^A-Z0-9]/gi),e);return $.chain(o=>o.replaceAll(/[A-Z]+/g,n=>`/${n}`).split("/"),t).map(At).join("")},nt=$.tryCatch((e,t)=>typeof Ze.parse(e,t),$.always(void 0)),z=e=>typeof e=="object"&&e!==null,ue=$.memoizeWith(()=>"static",()=>process.env.NODE_ENV==="production");var fe=class extends Error{name="RoutingError";cause;constructor(t,r,o){super(t),this.cause={method:r,path:o}}},W=class extends Error{name="DocumentationError";cause;constructor(t,{method:r,path:o,isResponse:n}){super(t),this.cause=`${n?"Response":"Input"} schema of an Endpoint assigned to ${r.toUpperCase()} method of ${o} path.`}},Be=class extends Error{name="IOSchemaError"},st=class extends Be{constructor(r){super("Found",{cause:r});this.cause=r}name="DeepCheckError"},He=class extends Be{constructor(r){let o=new Wo.ZodError(r.issues.map(({path:n,...s})=>({...s,path:["output",...n]})));super(me(o),{cause:r});this.cause=r}name="OutputValidationError"},Y=class extends Be{constructor(r){super(me(r),{cause:r});this.cause=r}name="InputValidationError"},re=class extends Error{constructor(r,o){super(me(r),{cause:r});this.cause=r;this.handled=o}name="ResultHandlerError"},Ke=class extends Error{name="MissingPeerError";constructor(t){super(`Missing peer dependency: ${t}. Please install it to use the feature.`)}};import{z as yr}from"zod/v4";var qe=Symbol("Form"),gr=e=>(e instanceof yr.ZodObject?e:yr.object(e)).brand(qe);import{z as Yo}from"zod/v4";var oe=Symbol("Upload"),hr=()=>Yo.custom(e=>typeof e=="object"&&e!==null&&"name"in e&&"encoding"in e&&"mimetype"in e&&"data"in e&&"tempFilePath"in e&&"truncated"in e&&"size"in e&&"md5"in e&&"mv"in e&&typeof e.name=="string"&&typeof e.encoding=="string"&&typeof e.mimetype=="string"&&Buffer.isBuffer(e.data)&&typeof e.tempFilePath=="string"&&typeof e.truncated=="boolean"&&typeof e.size=="number"&&typeof e.md5=="string"&&typeof e.mv=="function",{error:({input:e})=>({message:`Expected file upload, received ${typeof e}`})}).brand(oe);import{z as Qo}from"zod/v4";var Z=Symbol("Raw"),br=Qo.object({raw:tt()}),Xo=e=>br.extend(e).brand(Z);function xr(e){return e?Xo(e):br.brand(Z)}var Rr=(e,{io:t,condition:r})=>ne.tryCatch(()=>{Sr.toJSONSchema(e,{io:t,unrepresentable:"any",override:({zodSchema:o})=>{if(r(o))throw new st(o)}})},o=>o.cause)(),Or=(e,{io:t})=>{let o=[Sr.toJSONSchema(e,{io:t,unrepresentable:"any",override:({jsonSchema:n})=>{typeof n.default=="bigint"&&delete n.default}})];for(;o.length;){let n=o.shift();if(ne.is(Object,n)){if(n.$ref==="#")return!0;o.push(...ne.values(n))}ne.is(Array,n)&&o.push(...ne.values(n))}return!1},Tr=e=>Rr(e,{condition:t=>{let r=V(t);return typeof r=="symbol"&&[oe,Z,qe].includes(r)},io:"input"}),en=["nan","symbol","map","set","bigint","void","promise","never"],It=(e,t)=>Rr(e,{io:t,condition:r=>{let o=V(r),{type:n}=r._zod.def;return!!(en.includes(n)||o===pe||t==="input"&&(n==="date"||o===de)||t==="output"&&(o===ce||o===Z||o===oe))}});import nn,{isHttpError as sn}from"http-errors";import Pr,{isHttpError as tn}from"http-errors";import*as wr from"ramda";import{globalRegistry as rn,z as on}from"zod/v4";var Nt=(e,{variant:t,args:r,...o})=>{if(typeof e=="function"&&(e=e(...r)),e instanceof on.ZodType)return[{schema:e,...o}];if(Array.isArray(e)&&!e.length){let n=new Error(`At least one ${t} response schema required.`);throw new re(n)}return(Array.isArray(e)?e:[e]).map(({schema:n,statusCode:s,mimeType:i})=>({schema:n,statusCodes:typeof s=="number"?[s]:s||o.statusCodes,mimeTypes:typeof i=="string"?[i]:i===void 0?o.mimeTypes:i}))},Fe=(e,t,{url:r},o)=>!e.expose&&t.error("Server side error",{error:e,url:r,payload:o}),we=e=>tn(e)?e:Pr(e instanceof Y?400:500,me(e),{cause:e.cause||e}),ye=e=>ue()&&!e.expose?Pr(e.statusCode).message:e.message,Er=e=>Object.entries(e._zod.def.shape).reduce((t,[r,o])=>{let{examples:n=[]}=rn.get(o)||{};return le(t,n.map(wr.objOf(r)),([s,i])=>({...s,...i}))},[]);var it=({error:e,logger:t,response:r})=>{t.error("Result handler failure",e);let o=ye(nn(500,`An error occurred while serving the result: ${e.message}.`+(e.handled?`
2
+ Original error: ${e.handled.message}.`:""),{expose:sn(e.cause)?e.cause.expose:!1}));r.status(500).type("text/plain").end(o)};import{z as vr}from"zod/v4";var jt=class{},F=class extends jt{#e;#t;#r;constructor({input:t=vr.object({}),security:r,handler:o}){super(),this.#e=t,this.#t=r,this.#r=o}get security(){return this.#t}get schema(){return this.#e}async execute({input:t,...r}){try{let o=await this.#e.parseAsync(t);return this.#r({...r,input:o})}catch(o){throw o instanceof vr.ZodError?new Y(o):o}}},Ee=class extends F{constructor(t,{provider:r=()=>({}),transformer:o=n=>n}={}){super({handler:async({request:n,response:s})=>new Promise((i,p)=>{let d=c=>{if(c&&c instanceof Error)return p(o(c));i(r(n,s))};t(n,s,d)?.catch(d)})})}};var ve=class{nest(t){return Object.assign(t,{"":this})}};var Ue=class extends ve{},at=class e extends Ue{#e;#t=se.once(()=>{let t=this.#e.outputSchema.meta();if(t?.examples?.length||!Pe(this.#e.outputSchema,"object"))return;let r=Er(this.#e.outputSchema);r.length&&an.remove(this.#e.outputSchema).add(this.#e.outputSchema,{...t,examples:r})});constructor(t){super(),this.#e=t}#r(t){return new e({...this.#e,...t})}deprecated(){return this.#r({deprecated:!0})}get isDeprecated(){return this.#e.deprecated||!1}get description(){return this.#e.description}get shortDescription(){return this.#e.shortDescription}get methods(){return Object.freeze(this.#e.methods)}get inputSchema(){return this.#e.inputSchema}get outputSchema(){return this.#t(),this.#e.outputSchema}get requestType(){let t=Tr(this.#e.inputSchema);if(t){let r=V(t);if(r===oe)return"upload";if(r===Z)return"raw";if(r===qe)return"form"}return"json"}getResponses(t){return t==="positive"&&this.#t(),Object.freeze(t==="negative"?this.#e.resultHandler.getNegativeResponse():this.#e.resultHandler.getPositiveResponse(this.#e.outputSchema))}get security(){let t=se.pluck("security",this.#e.middlewares||[]);return se.reject(se.isNil,t)}get scopes(){return Object.freeze(this.#e.scopes||[])}get tags(){return Object.freeze(this.#e.tags||[])}getOperationId(t){return this.#e.getOperationId?.(t)}async#o(t){try{return await this.#e.outputSchema.parseAsync(t)}catch(r){throw r instanceof kr.ZodError?new He(r):r}}async#n({method:t,logger:r,options:o,response:n,...s}){for(let i of this.#e.middlewares||[])if(!(t==="options"&&!(i instanceof Ee))&&(Object.assign(o,await i.execute({...s,options:o,response:n,logger:r})),n.writableEnded)){r.warn("A middleware has closed the stream. Accumulated options:",o);break}}async#s({input:t,...r}){let o;try{o=await this.#e.inputSchema.parseAsync(t)}catch(n){throw n instanceof kr.ZodError?new Y(n):n}return this.#e.handler({...r,input:o})}async#i(t){try{await this.#e.resultHandler.execute(t)}catch(r){it({...t,error:new re(ee(r),t.error||void 0)})}}async execute({request:t,response:r,logger:o,config:n}){let s=Ct(t),i={},p={output:{},error:null},d=ot(t,n.inputSources);try{if(await this.#n({method:s,input:d,request:t,response:r,logger:o,options:i}),r.writableEnded)return;if(s==="options")return void r.status(200).end();p={output:await this.#o(await this.#s({input:d,logger:o,options:i})),error:null}}catch(c){p={output:null,error:ee(c)}}await this.#i({...p,input:d,request:t,response:r,logger:o,options:i})}};import*as Cr from"ramda";var Ar=(e,t)=>Cr.pluck("schema",e).concat(t).reduce((r,o)=>r.and(o));import{globalRegistry as pt,z as B}from"zod/v4";var ke={positive:200,negative:400},Ce=Object.keys(ke);var zt=class{#e;constructor(t){this.#e=t}execute(...t){return this.#e(...t)}},ge=class extends zt{#e;#t;constructor(t){super(t.handler),this.#e=t.positive,this.#t=t.negative}getPositiveResponse(t){return Nt(this.#e,{variant:"positive",args:[t],statusCodes:[ke.positive],mimeTypes:[w.json]})}getNegativeResponse(){return Nt(this.#t,{variant:"negative",args:[],statusCodes:[ke.negative],mimeTypes:[w.json]})}},he=new ge({positive:e=>{let t=B.object({status:B.literal("success"),data:e}),{examples:r=[]}=pt.get(e)||{};return r.length&&pt.add(t,{examples:r.map(o=>({status:"success",data:o}))}),t},negative:B.object({status:B.literal("error"),error:B.object({message:B.string()})}).example({status:"error",error:{message:"Sample error message"}}),handler:({error:e,input:t,output:r,request:o,response:n,logger:s})=>{if(e){let i=we(e);return Fe(i,s,o,t),void n.status(i.statusCode).set(i.headers).json({status:"error",error:{message:ye(i)}})}n.status(ke.positive).json({status:"success",data:r})}}),Lt=new ge({positive:e=>{let t=e instanceof B.ZodObject&&"items"in e.shape&&e.shape.items instanceof B.ZodArray?e.shape.items:B.array(B.any()),r=t.meta();if(r?.examples?.length)return t;let o=(pt.get(e)?.examples||[]).filter(n=>z(n)&&"items"in n&&Array.isArray(n.items)).map(n=>n.items);return o.length&&pt.remove(t).add(t,{...r,examples:o}),t},negative:B.string().example("Sample error message"),handler:({response:e,output:t,error:r,logger:o,request:n,input:s})=>{if(r){let i=we(r);return Fe(i,o,n,s),void e.status(i.statusCode).type("text/plain").send(ye(i))}if("items"in t&&Array.isArray(t.items))return void e.status(ke.positive).json(t.items);throw new Error("Property 'items' is missing in the endpoint output")}});var be=class e{constructor(t){this.resultHandler=t}middlewares=[];static#e(t,r){let o=new e(r);return o.middlewares=t,o}addMiddleware(t){return e.#e(this.middlewares.concat(t instanceof F?t:new F(t)),this.resultHandler)}use=this.addExpressMiddleware;addExpressMiddleware(...t){return e.#e(this.middlewares.concat(new Ee(...t)),this.resultHandler)}addOptions(t){return e.#e(this.middlewares.concat(new F({handler:t})),this.resultHandler)}build({input:t=Ir.object({}),output:r,operationId:o,scope:n,tag:s,method:i,...p}){let{middlewares:d,resultHandler:c}=this,m=typeof i=="string"?[i]:i,g=typeof o=="function"?o:()=>o,b=typeof n=="string"?[n]:n||[],y=typeof s=="string"?[s]:s||[];return new at({...p,middlewares:d,outputSchema:r,resultHandler:c,scopes:b,tags:y,methods:m,getOperationId:g,inputSchema:Ar(d,t)})}buildVoid({handler:t,...r}){return this.build({...r,output:Ir.object({}),handler:async o=>(await t(o),{})})}},pn=new be(he),cn=new be(Lt);import gn from"ansis";import{inspect as hn}from"node:util";import{performance as $r}from"node:perf_hooks";import{blue as dn,green as mn,hex as ln,red as un,cyanBright as fn}from"ansis";import*as Nr from"ramda";var Mt={debug:dn,info:mn,warn:ln("#FFA500"),error:un,ctx:fn},ct={debug:10,info:20,warn:30,error:40},jr=e=>z(e)&&Object.keys(ct).some(t=>t in e),zr=e=>e in ct,Lr=(e,t)=>ct[e]<ct[t],yn=(e,t=0)=>Intl.NumberFormat(void 0,{useGrouping:!1,minimumFractionDigits:0,maximumFractionDigits:t,style:"unit",unitDisplay:"long",unit:e}),Ae=Nr.memoizeWith((e,t)=>`${e}${t}`,yn),Mr=e=>e<1e-6?Ae("nanosecond",3).format(e/1e-6):e<.001?Ae("nanosecond").format(e/1e-6):e<1?Ae("microsecond").format(e/.001):e<1e3?Ae("millisecond").format(e):e<6e4?Ae("second",2).format(e/1e3):Ae("minute",2).format(e/6e4);var De=class e{config;constructor({color:t=gn.isSupported(),level:r=ue()?"warn":"debug",depth:o=2,ctx:n={}}={}){this.config={color:t,level:r,depth:o,ctx:n}}format(t){let{depth:r,color:o,level:n}=this.config;return hn(t,{depth:r,colors:o,breakLength:n==="debug"?80:1/0,compact:n==="debug"?3:!0})}print(t,r,o){let{level:n,ctx:{requestId:s,...i},color:p}=this.config;if(n==="silent"||Lr(t,n))return;let d=[new Date().toISOString()];s&&d.push(p?Mt.ctx(s):s),d.push(p?`${Mt[t](t)}:`:`${t}:`,r),o!==void 0&&d.push(this.format(o)),Object.keys(i).length>0&&d.push(this.format(i)),console.log(d.join(" "))}debug(t,r){this.print("debug",t,r)}info(t,r){this.print("info",t,r)}warn(t,r){this.print("warn",t,r)}error(t,r){this.print("error",t,r)}child(t){return new e({...this.config,ctx:t})}get ctx(){return this.config.ctx}profile(t){let r=$r.now();return()=>{let o=$r.now()-r,{message:n,severity:s="debug",formatter:i=Mr}=typeof t=="object"?t:{message:t};this.print(typeof s=="function"?s(o):s,n,i(o))}}};import*as Zr from"ramda";var _e=class e extends ve{#e;constructor(t){super(),this.#e=t}get entries(){let t=Zr.filter(r=>!!r[1],Object.entries(this.#e));return Object.freeze(t)}deprecated(){let t=Object.entries(this.#e).reduce((r,[o,n])=>Object.assign(r,{[o]:n.deprecated()}),{});return new e(t)}};import bn from"express";var Je=class{#e;constructor(...t){this.#e=t}apply(t,r){return r(t,bn.static(...this.#e))}};import lt from"express";import Ln from"node:http";import Mn from"node:https";var Ie=async(e,t="default")=>{try{return(await import(e))[t]}catch{}throw new Ke(e)};import En from"http-errors";import{z as Hr}from"zod/v4";import*as x from"ramda";var xn=e=>e.type==="object",Sn=x.mergeDeepWith((e,t)=>{if(Array.isArray(e)&&Array.isArray(t))return x.concat(e,t);if(e===t)return t;throw new Error("Can not flatten properties",{cause:{a:e,b:t}})}),Rn=x.pipe(Object.keys,x.without(["type","properties","required","examples","description","additionalProperties"]),x.isEmpty),Br=x.pair(!0),Ne=(e,t="coerce")=>{let r=[x.pair(!1,e)],o={type:"object",properties:{}},n=[];for(;r.length;){let[s,i]=r.shift();if(i.description&&(o.description??=i.description),i.allOf&&r.push(...i.allOf.map(p=>{if(t==="throw"&&!(p.type==="object"&&Rn(p)))throw new Error("Can not merge");return x.pair(s,p)})),i.anyOf&&r.push(...x.map(Br,i.anyOf)),i.oneOf&&r.push(...x.map(Br,i.oneOf)),i.examples?.length&&(s?o.examples=x.concat(o.examples||[],i.examples):o.examples=le(o.examples?.filter(z)||[],i.examples.filter(z),([p,d])=>x.mergeDeepRight(p,d))),!!xn(i)&&(r.push([s,{examples:On(i)}]),i.properties&&(o.properties=(t==="throw"?Sn:x.mergeDeepRight)(o.properties,i.properties),!s&&i.required&&n.push(...i.required)),i.propertyNames)){let p=[];typeof i.propertyNames.const=="string"&&p.push(i.propertyNames.const),i.propertyNames.enum&&p.push(...i.propertyNames.enum.filter(c=>typeof c=="string"));let d={...Object(i.additionalProperties)};for(let c of p)o.properties[c]??=d;s||n.push(...p)}}return n.length&&(o.required=[...new Set(n)]),o},On=e=>Object.entries(e.properties||{}).reduce((t,[r,{examples:o=[]}])=>le(t,o.map(x.objOf(r)),([n,s])=>({...n,...s})),[]);var dt=class{constructor(t){this.logger=t}#e=new WeakSet;#t=new WeakMap;checkSchema(t,r){if(!this.#e.has(t)){for(let o of["input","output"]){let n=[Hr.toJSONSchema(t[`${o}Schema`],{unrepresentable:"any"})];for(;n.length>0;){let s=n.shift();s.type&&s.type!=="object"&&this.logger.warn(`Endpoint ${o} schema is not object-based`,r);for(let i of["allOf","oneOf","anyOf"])s[i]&&n.push(...s[i])}}if(t.requestType==="json"){let o=It(t.inputSchema,"input");o&&this.logger.warn("The final input schema of the endpoint contains an unsupported JSON payload type.",Object.assign(r,{reason:o}))}for(let o of Ce)for(let{mimeTypes:n,schema:s}of t.getResponses(o)){if(!n?.includes(w.json))continue;let i=It(s,"output");i&&this.logger.warn(`The final ${o} response schema of the endpoint contains an unsupported JSON payload type.`,Object.assign(r,{reason:i}))}this.#e.add(t)}}checkPathParams(t,r,o){let n=this.#t.get(r);if(n?.paths.includes(t))return;let s=rt(t);if(s.length===0)return;let i=n?.flat||Ne(Hr.toJSONSchema(r.inputSchema,{unrepresentable:"any",io:"input"}));for(let p of s)p in i.properties||this.logger.warn("The input schema of the endpoint is most likely missing the parameter of the path it's assigned to.",Object.assign(o,{path:t,param:p}));n?n.paths.push(t):this.#t.set(r,{flat:i,paths:[t]})}};var $t=["get","post","put","delete","patch"],Kr=e=>$t.includes(e);var Tn=e=>{let[t,r]=e.trim().split(/ (.+)/,2);return r&&Kr(t)?[r,t]:[e]},Pn=e=>e.trim().split("/").filter(Boolean).join("/"),qr=(e,t)=>Object.entries(e).map(([r,o])=>{let[n,s]=Tn(r);return[[t||""].concat(Pn(n)||[]).join("/"),o,s]}),wn=(e,t)=>{throw new fe("Route with explicit method can only be assigned with Endpoint",e,t)},Fr=(e,t,r)=>{if(!(!r||r.includes(e)))throw new fe(`Method ${e} is not supported by the assigned Endpoint.`,e,t)},Zt=(e,t,r)=>{let o=`${e} ${t}`;if(r.has(o))throw new fe("Route has a duplicate",e,t);r.add(o)},je=({routing:e,onEndpoint:t,onStatic:r})=>{let o=qr(e),n=new Set;for(;o.length;){let[s,i,p]=o.shift();if(i instanceof Ue)if(p)Zt(p,s,n),Fr(p,s,i.methods),t(i,s,p);else{let{methods:d=["get"]}=i;for(let c of d)Zt(c,s,n),t(i,s,c)}else if(p&&wn(p,s),i instanceof Je)r&&i.apply(s,r);else if(i instanceof _e)for(let[d,c]of i.entries){let{methods:m}=c;Zt(d,s,n),Fr(d,s,m),t(c,s,d)}else o.unshift(...qr(i,s))}};import*as Ur from"ramda";var Dr=e=>e.sort((t,r)=>+(t==="options")-+(r==="options")).join(", ").toUpperCase(),vn=e=>({method:t},r,o)=>{let n=Dr(e);r.set({Allow:n});let s=En(405,`${t} is not allowed`,{headers:{Allow:n}});o(s)},kn=e=>({"Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":Dr(e),"Access-Control-Allow-Headers":"content-type"}),Bt=({app:e,getLogger:t,config:r,routing:o,parsers:n})=>{let s=ue()?void 0:new dt(t()),i=new Map;je({routing:o,onEndpoint:(c,m,g)=>{ue()||(s?.checkSchema(c,{path:m,method:g}),s?.checkPathParams(m,c,{method:g}));let b=n?.[c.requestType]||[],y=Ur.pair(b,c);i.has(m)||i.set(m,new Map(r.cors?[["options",y]]:[])),i.get(m)?.set(g,y)},onStatic:e.use.bind(e)}),s=void 0;let d=new Map;for(let[c,m]of i){let g=Array.from(m.keys());for(let[b,[y,v]]of m){let k=async(L,R)=>{let A=t(L);if(r.cors){let C=kn(g),q=typeof r.cors=="function"?await r.cors({request:L,endpoint:v,logger:A,defaultHeaders:C}):C;R.set(q)}return v.execute({request:L,response:R,logger:A,config:r})};e[b](c,...y,k)}r.wrongMethodBehavior!==404&&d.set(c,vn(g))}for(let[c,m]of d)e.all(c,m)};import An from"http-errors";import{setInterval as Cn}from"node:timers/promises";var _r=e=>"_httpMessage"in e&&typeof e._httpMessage=="object"&&e._httpMessage!==null&&"headersSent"in e._httpMessage&&typeof e._httpMessage.headersSent=="boolean"&&"setHeader"in e._httpMessage&&typeof e._httpMessage.setHeader=="function",Jr=e=>"server"in e&&typeof e.server=="object"&&e.server!==null&&"close"in e.server&&typeof e.server.close=="function",Vr=e=>"encrypted"in e&&typeof e.encrypted=="boolean"&&e.encrypted,Gr=({},e)=>void(!e.headersSent&&e.setHeader("connection","close")),Wr=e=>new Promise((t,r)=>void e.close(o=>o?r(o):t()));var Yr=(e,{timeout:t=1e3,logger:r}={})=>{let o,n=new Set,s=c=>void n.delete(c.destroy()),i=c=>void(_r(c)?!c._httpMessage.headersSent&&c._httpMessage.setHeader("connection","close"):s(c)),p=c=>void(o?c.destroy():n.add(c.once("close",()=>void n.delete(c))));for(let c of e)for(let m of["connection","secureConnection"])c.on(m,p);let d=async()=>{for(let c of e)c.on("request",Gr);r?.info("Graceful shutdown",{sockets:n.size,timeout:t});for(let c of n)(Vr(c)||Jr(c))&&i(c);for await(let c of Cn(10,Date.now()))if(n.size===0||Date.now()-c>=t)break;for(let c of n)s(c);return Promise.allSettled(e.map(Wr))};return{sockets:n,shutdown:()=>o??=d()}};var Qr=({errorHandler:e,getLogger:t})=>async(r,o,n,s)=>r?e.execute({error:ee(r),request:o,response:n,input:null,output:null,options:{},logger:t(o)}):s(),Xr=({errorHandler:e,getLogger:t})=>async(r,o)=>{let n=An(404,`Can not ${r.method} ${r.path}`),s=t(r);try{await e.execute({request:r,response:o,logger:s,error:n,input:null,output:null,options:{}})}catch(i){it({response:o,logger:s,error:new re(ee(i),n)})}},In=e=>(t,{},r)=>{if(Object.values(t?.files||[]).flat().find(({truncated:n})=>n))return r(e);r()},Nn=e=>({log:e.debug.bind(e)}),eo=async({getLogger:e,config:t})=>{let r=await Ie("express-fileupload"),{limitError:o,beforeUpload:n,...s}={...typeof t.upload=="object"&&t.upload},i=[];return i.push(async(p,d,c)=>{let m=e(p);return await n?.({request:p,logger:m}),r({debug:!0,...s,abortOnLimit:!1,parseNested:!0,logger:Nn(m)})(p,d,c)}),o&&i.push(In(o)),i},to=(e,{},t)=>{Buffer.isBuffer(e.body)&&(e.body={raw:e.body}),t()},ro=({logger:e,config:{childLoggerProvider:t,accessLogger:r=({method:o,path:n},s)=>s.debug(`${o}: ${n}`)}})=>async(o,n,s)=>{let i=await t?.({request:o,parent:e})||e;r?.(o,i),o.res&&(o.res.locals[Te]={logger:i}),s()},oo=e=>t=>t?.res?.locals[Te]?.logger||e,no=e=>process.on("deprecation",({message:t,namespace:r,name:o,stack:n})=>e.warn(`${o} (${r}): ${t}`,n.split(`
3
+ `).slice(1))),so=({servers:e,logger:t,options:{timeout:r,beforeExit:o,events:n=["SIGINT","SIGTERM"]}})=>{let s=Yr(e,{logger:t,timeout:r}),i=async()=>{await s.shutdown(),await o?.(),process.exit()};for(let p of n)process.on(p,i)};import{gray as jn,hex as io,italic as mt,whiteBright as zn}from"ansis";var ao=e=>{if(e.columns<132)return;let t=mt("Proudly supports transgender community.".padStart(109)),r=mt("Start your API server with I/O schema validation and custom middlewares in minutes.".padStart(109)),o=mt("Thank you for choosing Express Zod API for your project.".padStart(132)),n=mt("for Ashley".padEnd(20)),s=io("#F5A9B8"),i=io("#5BCEFA"),p=new Array(14).fill(i,1,3).fill(s,3,5).fill(zn,5,7).fill(s,7,9).fill(i,9,12).fill(jn,12,13),d=`
4
4
  8888888888 8888888888P 888 d8888 8888888b. 8888888
5
5
  888 d88P 888 d88888 888 Y88b 888
6
6
  888 d88P 888 d88P888 888 888 888
@@ -15,9 +15,9 @@ ${n}888${r}
15
15
  ${o}
16
16
  `;e.write(d.split(`
17
17
  `).map((c,m)=>p[m]?p[m](c):c).join(`
18
- `))};var uo=e=>{e.startupLogo!==!1&&lo(process.stdout);let t=e.errorHandler||xe,r=Zr(e.logger)?e.logger:new Ue(e.logger);r.debug("Running",{build:"v24.0.0-beta.1 (ESM)",env:process.env.NODE_ENV||"development"}),po(r);let o=io({logger:r,config:e}),s={getLogger:ao(r),errorHandler:t},i=oo(s),p=ro(s);return{...s,logger:r,notFoundHandler:i,catcher:p,loggingMiddleware:o}},Zn=(e,t)=>{let{logger:r,getLogger:o,notFoundHandler:n,loggingMiddleware:s}=uo(e);return qt({app:e.app.use(s),routing:t,getLogger:o,config:e}),{notFoundHandler:n,logger:r}},$n=async(e,t)=>{let{logger:r,getLogger:o,notFoundHandler:n,catcher:s,loggingMiddleware:i}=uo(e),p=ft().disable("x-powered-by").use(i);if(e.compression){let h=await ze("compression");p.use(h(typeof e.compression=="object"?e.compression:void 0))}await e.beforeRouting?.({app:p,getLogger:o});let d={json:[e.jsonParser||ft.json()],raw:[e.rawParser||ft.raw(),so],form:[e.formParser||ft.urlencoded()],upload:e.upload?await no({config:e,getLogger:o}):[]};qt({app:p,routing:t,getLogger:o,config:e,parsers:d}),p.use(s,n);let c=[],m=(h,y)=>()=>h.listen(y,()=>r.info("Listening",y)),g=[];if(e.http){let h=Mn.createServer(p);c.push(h),g.push(m(h,e.http.listen))}if(e.https){let h=Ln.createServer(e.https.options,p);c.push(h),g.push(m(h,e.https.listen))}return e.gracefulShutdown&&co({logger:r,servers:c,options:e.gracefulShutdown===!0?{}:e.gracefulShutdown}),{app:p,logger:r,servers:g.map(h=>h())}};import{OpenApiBuilder as us}from"openapi3-ts/oas31";import*as zo from"ramda";import*as x from"ramda";var fo=e=>M(e)&&"or"in e,yo=e=>M(e)&&"and"in e,Bt=e=>!yo(e)&&!fo(e),go=e=>{let t=x.filter(Bt,e),r=x.chain(x.prop("and"),x.filter(yo,e)),[o,n]=x.partition(Bt,r),s=x.concat(t,o),i=x.filter(fo,e);return x.map(x.prop("or"),x.concat(i,n)).reduce((d,c)=>ue(d,x.map(m=>Bt(m)?[m]:m.and,c),([m,g])=>x.concat(m,g)),x.reject(x.isEmpty,[s]))};import{isReferenceObject as Ro,isSchemaObject as yt}from"openapi3-ts/oas31";import*as l from"ramda";import{globalRegistry as Kn,z as bo}from"zod/v4";var ho=["a-im","accept","accept-additions","accept-ch","accept-charset","accept-datetime","accept-encoding","accept-features","accept-language","accept-signature","access-control","access-control-request-headers","access-control-request-method","alpn","alt-used","alternates","amp-cache-transform","apply-to-redirect-ref","authentication-control","authentication-info","authorization","available-dictionary","c-ext","c-man","c-opt","c-pep","c-pep-info","cache-control","cal-managed-id","caldav-timezones","capsule-protocol","cert-not-after","cert-not-before","client-cert","client-cert-chain","close","cmcd-object","cmcd-request","cmcd-session","cmcd-status","cmsd-dynamic","cmsd-static","concealed-auth-export","configuration-context","connection","content-digest","content-disposition","content-encoding","content-id","content-language","content-length","content-location","content-md5","content-range","content-script-type","content-type","cookie","cookie2","cross-origin-embedder-policy","cross-origin-embedder-policy-report-only","cross-origin-opener-policy","cross-origin-opener-policy-report-only","cross-origin-resource-policy","cta-common-access-token","dasl","date","dav","default-style","delta-base","deprecation","depth","derived-from","destination","detached-jws","differential-id","dictionary-id","digest","dpop","dpop-nonce","early-data","ediint-features","expect","expect-ct","ext","forwarded","from","getprofile","hobareg","host","http2-settings","if","if-match","if-modified-since","if-none-match","if-range","if-schedule-tag-match","if-unmodified-since","im","include-referred-token-binding-id","isolation","keep-alive","label","last-event-id","link","link-template","lock-token","man","max-forwards","memento-datetime","meter","method-check","method-check-expires","mime-version","negotiate","nel","odata-entityid","odata-isolation","odata-maxversion","odata-version","opt","ordering-type","origin","origin-agent-cluster","oscore","oslc-core-version","overwrite","p3p","pep","pep-info","permissions-policy","pics-label","ping-from","ping-to","position","pragma","prefer","preference-applied","priority","profileobject","protocol","protocol-info","protocol-query","protocol-request","proxy-authorization","proxy-features","proxy-instruction","public","public-key-pins","public-key-pins-report-only","range","redirect-ref","referer","referer-root","referrer-policy","repeatability-client-id","repeatability-first-sent","repeatability-request-id","repeatability-result","replay-nonce","reporting-endpoints","repr-digest","safe","schedule-reply","schedule-tag","sec-fetch-storage-access","sec-gpc","sec-purpose","sec-token-binding","sec-websocket-extensions","sec-websocket-key","sec-websocket-protocol","sec-websocket-version","security-scheme","setprofile","signature","signature-input","slug","soapaction","status-uri","sunset","surrogate-capability","tcn","te","timeout","topic","traceparent","tracestate","trailer","transfer-encoding","ttl","upgrade","urgency","uri","use-as-dictionary","user-agent","variant-vary","via","want-content-digest","want-digest","want-repr-digest","warning","x-content-type-options","x-frame-options"];var xo=50,Oo="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString",To={integer:0,number:0,string:"",boolean:!1,object:{},null:null,array:[]},Po=e=>e.replace(At,t=>`{${t.slice(1)}}`),qn=({zodSchema:e,jsonSchema:t})=>{let r=Kn.get(e)?.[O]?.defaultLabel??t.default;return{...t,default:typeof r=="bigint"?String(r):r}},Bn=({},e)=>{if(e.isResponse)throw new J("Please use ez.upload() only for input.",e);return{type:"string",format:"binary"}},Fn=({jsonSchema:e})=>({type:"string",format:e.type==="string"?e.format==="base64"?"byte":"file":"binary"}),Dn=({zodSchema:e,jsonSchema:t})=>{if(!e._zod.disc)return t;let r=Array.from(e._zod.disc.keys()).pop();return{...t,discriminator:t.discriminator??{propertyName:r}}},Un=l.tryCatch(({jsonSchema:e})=>{if(!e.allOf)throw"no allOf";return je(e,"throw")},(e,{jsonSchema:t})=>t),Vn=({jsonSchema:e})=>{if(!e.anyOf)return e;let t=e.anyOf[0];return Object.assign(t,{type:ts(t.type)})},So=e=>e in To,_n=({jsonSchema:e})=>({type:typeof e.enum?.[0],...e}),Jn=({jsonSchema:e})=>({type:typeof(e.const||e.enum?.[0]),...e}),Gn=({zodSchema:e,jsonSchema:t},{isResponse:r})=>{if(r||!oe(e,"object"))return t;let{required:o=[]}=t,n=[];for(let s of o){let i=e._zod.def.shape[s];i&&!it(i,{isResponse:r})&&n.push(s)}return{...t,required:n}},Re=({$ref:e,type:t,allOf:r,oneOf:o,anyOf:n,not:s,...i})=>{if(e)return{$ref:e};let p={type:Array.isArray(t)?t.filter(So):t&&So(t)?t:void 0,...i};for(let[d,c]of l.toPairs({allOf:r,oneOf:o,anyOf:n}))c&&(p[d]=c.map(Re));return s&&(p.not=Re(s)),p},Wn=({},e)=>{if(e.isResponse)throw new J("Please use ez.dateOut() for output.",e);return{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",pattern:/^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(\.\d+)?)?Z?$/.source,externalDocs:{url:Oo}}},Yn=({},e)=>{if(!e.isResponse)throw new J("Please use ez.dateIn() for input.",e);return{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",externalDocs:{url:Oo}}},Qn=()=>({type:"string",format:"bigint",pattern:/^-?\d+$/.source}),Xn=({zodSchema:e,jsonSchema:t})=>e._zod.def.rest!==null?t:{...t,items:{not:{}}},es=e=>{let t=Array.isArray(e.type)?e.type[0]:e.type;return To?.[t]},ts=e=>e==="null"?e:typeof e=="string"?[e,"null"]:e&&[...new Set(e).add("null")],rs=({zodSchema:e,jsonSchema:t},r)=>{let o=e._zod.def[r.isResponse?"out":"in"],n=e._zod.def[r.isResponse?"in":"out"];if(!oe(o,"transform"))return t;let s=Re(Ut(n,{ctx:r}));if(yt(s))if(r.isResponse){let i=st(o,es(s));if(i&&["number","string","boolean"].includes(i))return{type:i}}else{let{type:i,...p}=s;return{...p,format:`${p.format||i} (preprocessed)`}}return t},os=({jsonSchema:e})=>{if(e.type!=="object")return e;let t=e;return!t.properties||!("raw"in t.properties)?e:t.properties.raw},Ft=e=>e.length?l.fromPairs(l.zip(l.times(t=>`example${t+1}`,e.length),l.map(l.objOf("value"),e))):void 0,ns=(e,t)=>t?.includes(e)||e.startsWith("x-")||ho.includes(e),wo=({path:e,method:t,request:r,inputSources:o,makeRef:n,composition:s,isHeader:i,security:p,description:d=`${t.toUpperCase()} ${e} Parameter`})=>{let c=je(r),m=ot(e),g=o.includes("query"),h=o.includes("params"),y=o.includes("headers"),k=R=>h&&m.includes(R),A=l.chain(l.filter(R=>R.type==="header"),p??[]).map(({name:R})=>R),Z=R=>y&&(i?.(R,t,e)??ns(R,A));return Object.entries(c.properties).reduce((R,[C,I])=>{let F=k(C)?"path":Z(C)?"header":g?"query":void 0;if(!F)return R;let z=Re(I),Q=s==="components"?n(I,z,ne(d,C)):z;return R.concat({name:C,in:F,deprecated:I.deprecated,required:c.required?.includes(C)||!1,description:z.description||d,schema:Q,examples:Ft(yt(z)&&z.examples?.length?z.examples:l.pluck(C,c.examples?.filter(l.both(M,l.has(C)))||[]))})},[])},Dt={nullable:Vn,default:qn,union:Dn,bigint:Qn,intersection:Un,tuple:Xn,pipe:rs,literal:Jn,enum:_n,object:Gn,[ye]:Wn,[ge]:Yn,[se]:Bn,[ie]:Fn,[H]:os},ss=({zodSchema:e,jsonSchema:t},{isResponse:r})=>{let o={...t},n=we({schema:e,variant:r?"parsed":"original",validate:!0,pullProps:!0});return n.length&&(o.examples=n.slice()),o},is=(e,t,r)=>{let o=[e,t];for(;o.length;){let n=o.shift();if(l.is(Object,n)){if(Ro(n)&&!n.$ref.startsWith("#/components")){let s=n.$ref.split("/").pop(),i=t[s];i&&(n.$ref=r.makeRef(i,Re(i)).$ref);continue}o.push(...l.values(n))}l.is(Array,n)&&o.push(...l.values(n))}return e},Ut=(e,{ctx:t,rules:r=Dt})=>{let{$defs:o={},properties:n={}}=bo.toJSONSchema(bo.object({subject:e}),{unrepresentable:"any",io:t.isResponse?"output":"input",override:s=>{let i=W(s.zodSchema),p=r[i&&i in r?i:s.zodSchema._zod.def.type];if(p){let d={...p(s,t)};for(let c in s.jsonSchema)delete s.jsonSchema[c];Object.assign(s.jsonSchema,d)}Object.assign(s.jsonSchema,ss(s,t))}});return is(n.subject,o,t)},Eo=(e,t)=>{if(Ro(e))return[e,!1];let r=!1,o=l.map(p=>{let[d,c]=Eo(p,t);return r=r||c,d}),n=l.omit(t),s={properties:n,examples:l.map(n),required:l.without(t),allOf:o,oneOf:o,anyOf:o},i=l.evolve(s,e);return[i,r||!!i.required?.length]},vo=({method:e,path:t,schema:r,mimeTypes:o,variant:n,makeRef:s,composition:i,hasMultipleStatusCodes:p,statusCode:d,brandHandling:c,description:m=`${e.toUpperCase()} ${t} ${Nt(n)} response ${p?d:""}`.trim()})=>{if(!o)return{description:m};let g=Re(Ut(r,{rules:{...c,...Dt},ctx:{isResponse:!0,makeRef:s,path:t,method:e}})),h=[];yt(g)&&g.examples&&(h.push(...g.examples),delete g.examples);let y={schema:i==="components"?s(r,g,ne(m)):g,examples:Ft(h)};return{description:m,content:l.fromPairs(l.xprod(o,[y]))}},as=({format:e})=>{let t={type:"http",scheme:"bearer"};return e&&(t.bearerFormat=e),t},ps=({name:e},t)=>{let r={type:"apiKey",in:"query",name:e};return t?.includes("body")&&(t?.includes("query")?(r["x-in-alternative"]="body",r.description=`${e} CAN also be supplied within the request body`):(r["x-in-actual"]="body",r.description=`${e} MUST be supplied within the request body instead of query`)),r},cs=({name:e})=>({type:"apiKey",in:"header",name:e}),ds=({name:e})=>({type:"apiKey",in:"cookie",name:e}),ms=({url:e})=>({type:"openIdConnect",openIdConnectUrl:e}),ls=({flows:e={}})=>({type:"oauth2",flows:l.map(t=>({...t,scopes:t.scopes||{}}),l.reject(l.isNil,e))}),ko=(e,t=[])=>{let r=o=>o.type==="basic"?{type:"http",scheme:"basic"}:o.type==="bearer"?as(o):o.type==="input"?ps(o,t):o.type==="header"?cs(o):o.type==="cookie"?ds(o):o.type==="openid"?ms(o):ls(o);return e.map(o=>o.map(r))},Ao=(e,t,r)=>e.map(o=>o.reduce((n,s)=>{let i=r(s),p=["oauth2","openIdConnect"].includes(s.type);return Object.assign(n,{[i]:p?t:[]})},{})),Co=({schema:e,brandHandling:t,makeRef:r,path:o,method:n})=>Ut(e,{rules:{...t,...Dt},ctx:{isResponse:!1,makeRef:r,path:o,method:n}}),Io=({method:e,path:t,schema:r,request:o,mimeType:n,makeRef:s,composition:i,paramNames:p,description:d=`${e.toUpperCase()} ${t} Request body`})=>{let[c,m]=Eo(Re(o),p),g=[];yt(c)&&c.examples&&(g.push(...c.examples),delete c.examples);let h={schema:i==="components"?s(r,c,ne(d)):c,examples:Ft(g.length?g:je(o).examples?.filter(k=>M(k)&&!Array.isArray(k)).map(l.omit(p))||[])},y={description:d,content:{[n]:h}};return(m||n===E.raw)&&(y.required=!0),y},No=e=>Object.entries(e).reduce((t,[r,o])=>{if(!o)return t;let n={name:r,description:typeof o=="string"?o:o.description};return typeof o=="object"&&o.url&&(n.externalDocs={url:o.url}),t.concat(n)},[]),Vt=e=>e.length<=xo?e:e.slice(0,xo-1)+"\u2026",gt=e=>e.length?e.slice():void 0;var _t=class extends us{#e=new Map;#t=new Map;#r=new Map;#o(t,r,o=this.#r.get(t)){return o||(o=`Schema${this.#r.size+1}`,this.#r.set(t,o)),this.addSchema(o,r),{$ref:`#/components/schemas/${o}`}}#n(t,r,o){let n=o||ne(r,t),s=this.#t.get(n);if(s===void 0)return this.#t.set(n,1),n;if(o)throw new J(`Duplicated operationId: "${o}"`,{method:r,isResponse:!1,path:t});return s++,this.#t.set(n,s),`${n}${s}`}#s(t){let r=JSON.stringify(t);for(let n in this.rootDoc.components?.securitySchemes||{})if(r===JSON.stringify(this.rootDoc.components?.securitySchemes?.[n]))return n;let o=(this.#e.get(t.type)||0)+1;return this.#e.set(t.type,o),`${t.type.toUpperCase()}_${o}`}constructor({routing:t,config:r,title:o,version:n,serverUrl:s,descriptions:i,brandHandling:p,tags:d,isHeader:c,hasSummaryFromDescription:m=!0,composition:g="inline"}){super(),this.addInfo({title:o,version:n});for(let y of typeof s=="string"?[s]:s)this.addServer({url:y});Me({routing:t,onEndpoint:(y,k,A)=>{let Z={path:k,method:A,endpoint:y,composition:g,brandHandling:p,makeRef:this.#o.bind(this)},{description:R,shortDescription:C,scopes:I,inputSchema:F}=y,z=C?Vt(C):m&&R?Vt(R):void 0,Q=r.inputSources?.[A]||Ct[A],Pe=this.#n(k,A,y.getOperationId(A)),We=Co({...Z,schema:F}),ce=go(y.security),Ye=wo({...Z,inputSources:Q,isHeader:c,security:ce,request:We,description:i?.requestParameter?.call(null,{method:A,path:k,operationId:Pe})}),Qe={};for(let X of Ie){let de=y.getResponses(X);for(let{mimeTypes:et,schema:vt,statusCodes:fr}of de)for(let kt of fr)Qe[kt]=vo({...Z,variant:X,schema:vt,mimeTypes:et,statusCode:kt,hasMultipleStatusCodes:de.length>1||fr.length>1,description:i?.[`${X}Response`]?.call(null,{method:A,path:k,operationId:Pe,statusCode:kt})})}let Xe=Q.includes("body")?Io({...Z,request:We,paramNames:zo.pluck("name",Ye),schema:F,mimeType:E[y.requestType],description:i?.requestBody?.call(null,{method:A,path:k,operationId:Pe})}):void 0,wt=Ao(ko(ce,Q),I,X=>{let de=this.#s(X);return this.addSecurityScheme(de,X),de}),Et={operationId:Pe,summary:z,description:R,deprecated:y.isDeprecated||void 0,tags:gt(y.tags),parameters:gt(Ye),requestBody:Xe,security:gt(wt),responses:Qe};this.addPath(Po(k),{[A]:Et})}}),d&&(this.rootDoc.tags=No(d))}};import{createRequest as fs,createResponse as ys}from"node-mocks-http";var gs=e=>fs({...e,headers:{"content-type":E.json,...e?.headers}}),hs=e=>ys(e),bs=e=>{let t={warn:[],error:[],info:[],debug:[]};return new Proxy(e||{},{get(r,o,n){return o==="_getLogs"?()=>t:$r(o)?(...s)=>t[o].push(s):Reflect.get(r,o,n)}})},jo=({requestProps:e,responseOptions:t,configProps:r,loggerProps:o})=>{let n=gs(e),s=hs({req:n,...t});s.req=t?.req||n,n.res=s;let i=bs(o),p={cors:!1,logger:i,...r};return{requestMock:n,responseMock:s,loggerMock:i,configMock:p}},xs=async({endpoint:e,...t})=>{let{requestMock:r,responseMock:o,loggerMock:n,configMock:s}=jo(t);return await e.execute({request:r,response:o,config:s,logger:n}),{requestMock:r,responseMock:o,loggerMock:n}},Ss=async({middleware:e,options:t={},...r})=>{let{requestMock:o,responseMock:n,loggerMock:s,configMock:{inputSources:i,errorHandler:p=xe}}=jo(r),d=nt(o,i),c={request:o,response:n,logger:s,input:d,options:t};try{let m=await e.execute(c);return{requestMock:o,responseMock:n,loggerMock:s,output:m}}catch(m){return await p.execute({...c,error:re(m),output:null}),{requestMock:o,responseMock:n,loggerMock:s,output:{}}}};import*as Ho from"ramda";import Pt from"typescript";import{z as Ds}from"zod/v4";import*as $o from"ramda";import _ from"typescript";import*as U from"ramda";import u from"typescript";var a=u.factory,ht=[a.createModifier(u.SyntaxKind.ExportKeyword)],Rs=[a.createModifier(u.SyntaxKind.AsyncKeyword)],Je={public:[a.createModifier(u.SyntaxKind.PublicKeyword)],protectedReadonly:[a.createModifier(u.SyntaxKind.ProtectedKeyword),a.createModifier(u.SyntaxKind.ReadonlyKeyword)]},Jt=(e,t)=>u.addSyntheticLeadingComment(e,u.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0),Gt=(e,t)=>{let r=u.createSourceFile("print.ts","",u.ScriptTarget.Latest,!1,u.ScriptKind.TS);return u.createPrinter(t).printNode(u.EmitHint.Unspecified,e,r)},Os=/^[A-Za-z_$][A-Za-z0-9_$]*$/,Wt=e=>typeof e=="string"&&Os.test(e)?a.createIdentifier(e):w(e),bt=(e,...t)=>a.createTemplateExpression(a.createTemplateHead(e),t.map(([r,o=""],n)=>a.createTemplateSpan(r,n===t.length-1?a.createTemplateTail(o):a.createTemplateMiddle(o)))),xt=(e,{type:t,mod:r,init:o,optional:n}={})=>a.createParameterDeclaration(r,void 0,e,n?a.createToken(u.SyntaxKind.QuestionToken):void 0,t?f(t):void 0,o),Le=e=>Object.entries(e).map(([t,r])=>xt(t,typeof r=="string"||typeof r=="number"||typeof r=="object"&&"kind"in r?{type:r}:r)),Yt=(e,t=[])=>a.createConstructorDeclaration(Je.public,e,a.createBlock(t)),f=(e,t)=>typeof e=="number"?a.createKeywordTypeNode(e):typeof e=="string"||u.isIdentifier(e)?a.createTypeReferenceNode(e,t&&U.map(f,t)):e,Qt=f("Record",[u.SyntaxKind.StringKeyword,u.SyntaxKind.AnyKeyword]),Oe=(e,t,{isOptional:r,isDeprecated:o,comment:n}={})=>{let s=f(t),i=a.createPropertySignature(void 0,Wt(e),r?a.createToken(u.SyntaxKind.QuestionToken):void 0,r?a.createUnionTypeNode([s,f(u.SyntaxKind.UndefinedKeyword)]):s),p=U.reject(U.isNil,[o?"@deprecated":void 0,n]);return p.length?Jt(i,p.join(" ")):i},Xt=e=>u.setEmitFlags(e,u.EmitFlags.SingleLine),er=(...e)=>a.createArrayBindingPattern(e.map(t=>a.createBindingElement(void 0,void 0,t))),N=(e,t,{type:r,expose:o}={})=>a.createVariableStatement(o&&ht,a.createVariableDeclarationList([a.createVariableDeclaration(e,void 0,r?f(r):void 0,t)],u.NodeFlags.Const)),tr=(e,t)=>V(e,a.createUnionTypeNode(U.map($,t)),{expose:!0}),V=(e,t,{expose:r,comment:o,params:n}={})=>{let s=a.createTypeAliasDeclaration(r?ht:void 0,e,n&&sr(n),t);return o?Jt(s,o):s},Mo=(e,t)=>a.createPropertyDeclaration(Je.public,e,void 0,f(t),void 0),rr=(e,t,r,{typeParams:o,returns:n}={})=>a.createMethodDeclaration(Je.public,void 0,e,void 0,o&&sr(o),t,n,a.createBlock(r)),or=(e,t,{typeParams:r}={})=>a.createClassDeclaration(ht,e,r&&sr(r),void 0,t),nr=e=>a.createTypeOperatorNode(u.SyntaxKind.KeyOfKeyword,f(e)),St=e=>f(Promise.name,[e]),Rt=(e,t,{expose:r,comment:o}={})=>{let n=a.createInterfaceDeclaration(r?ht:void 0,e,void 0,void 0,t);return o?Jt(n,o):n},sr=e=>(Array.isArray(e)?e.map(t=>U.pair(t,void 0)):Object.entries(e)).map(([t,r])=>{let{type:o,init:n}=typeof r=="object"&&"init"in r?r:{type:r};return a.createTypeParameterDeclaration([],t,o?f(o):void 0,n?f(n):void 0)}),Te=(e,t,{isAsync:r}={})=>a.createArrowFunction(r?Rs:void 0,void 0,Array.isArray(e)?U.map(xt,e):Le(e),void 0,void 0,t),T=e=>e,Ge=(e,t,r)=>a.createConditionalExpression(e,a.createToken(u.SyntaxKind.QuestionToken),t,a.createToken(u.SyntaxKind.ColonToken),r),P=(e,...t)=>(...r)=>a.createCallExpression(t.reduce((o,n)=>typeof n=="string"||u.isIdentifier(n)?a.createPropertyAccessExpression(o,n):a.createElementAccessExpression(o,n),typeof e=="string"?a.createIdentifier(e):e),void 0,r),Ze=(e,...t)=>a.createNewExpression(a.createIdentifier(e),void 0,t),Ot=(e,t)=>f("Extract",[e,t]),ir=(e,t)=>a.createExpressionStatement(a.createBinaryExpression(e,a.createToken(u.SyntaxKind.EqualsToken),t)),q=(e,t)=>a.createIndexedAccessTypeNode(f(e),f(t)),Lo=e=>a.createUnionTypeNode([f(e),St(e)]),ar=(e,t)=>a.createFunctionTypeNode(void 0,Le(e),f(t)),w=e=>typeof e=="number"?a.createNumericLiteral(e):typeof e=="bigint"?a.createBigIntLiteral(e.toString()):typeof e=="boolean"?e?a.createTrue():a.createFalse():e===null?a.createNull():a.createStringLiteral(e),$=e=>a.createLiteralTypeNode(w(e)),Ts=[u.SyntaxKind.AnyKeyword,u.SyntaxKind.BigIntKeyword,u.SyntaxKind.BooleanKeyword,u.SyntaxKind.NeverKeyword,u.SyntaxKind.NumberKeyword,u.SyntaxKind.ObjectKeyword,u.SyntaxKind.StringKeyword,u.SyntaxKind.SymbolKeyword,u.SyntaxKind.UndefinedKeyword,u.SyntaxKind.UnknownKeyword,u.SyntaxKind.VoidKeyword],Zo=e=>Ts.includes(e.kind);var Tt=class{constructor(t){this.serverUrl=t}paths=new Set;tags=new Map;registry=new Map;#e={pathType:a.createIdentifier("Path"),implementationType:a.createIdentifier("Implementation"),keyParameter:a.createIdentifier("key"),pathParameter:a.createIdentifier("path"),paramsArgument:a.createIdentifier("params"),ctxArgument:a.createIdentifier("ctx"),methodParameter:a.createIdentifier("method"),requestParameter:a.createIdentifier("request"),eventParameter:a.createIdentifier("event"),dataParameter:a.createIdentifier("data"),handlerParameter:a.createIdentifier("handler"),msgParameter:a.createIdentifier("msg"),parseRequestFn:a.createIdentifier("parseRequest"),substituteFn:a.createIdentifier("substitute"),provideMethod:a.createIdentifier("provide"),onMethod:a.createIdentifier("on"),implementationArgument:a.createIdentifier("implementation"),hasBodyConst:a.createIdentifier("hasBody"),undefinedValue:a.createIdentifier("undefined"),responseConst:a.createIdentifier("response"),restConst:a.createIdentifier("rest"),searchParamsConst:a.createIdentifier("searchParams"),defaultImplementationConst:a.createIdentifier("defaultImplementation"),clientConst:a.createIdentifier("client"),contentTypeConst:a.createIdentifier("contentType"),isJsonConst:a.createIdentifier("isJSON"),sourceProp:a.createIdentifier("source")};interfaces={input:a.createIdentifier("Input"),positive:a.createIdentifier("PositiveResponse"),negative:a.createIdentifier("NegativeResponse"),encoded:a.createIdentifier("EncodedResponse"),response:a.createIdentifier("Response")};methodType=tr("Method",Ht);someOfType=V("SomeOf",q("T",nr("T")),{params:["T"]});requestType=V("Request",nr(this.interfaces.input),{expose:!0});someOf=({name:t})=>f(this.someOfType.name,[t]);makePathType=()=>tr(this.#e.pathType,Array.from(this.paths));makePublicInterfaces=()=>Object.keys(this.interfaces).map(t=>Rt(this.interfaces[t],Array.from(this.registry).map(([r,{store:o,isDeprecated:n}])=>Oe(r,o[t],{isDeprecated:n})),{expose:!0}));makeEndpointTags=()=>N("endpointTags",a.createObjectLiteralExpression(Array.from(this.tags).map(([t,r])=>a.createPropertyAssignment(Wt(t),a.createArrayLiteralExpression($o.map(w,r))))),{expose:!0});makeImplementationType=()=>V(this.#e.implementationType,ar({[this.#e.methodParameter.text]:this.methodType.name,[this.#e.pathParameter.text]:_.SyntaxKind.StringKeyword,[this.#e.paramsArgument.text]:Qt,[this.#e.ctxArgument.text]:{optional:!0,type:"T"}},St(_.SyntaxKind.AnyKeyword)),{expose:!0,params:{T:{init:_.SyntaxKind.UnknownKeyword}}});makeParseRequestFn=()=>N(this.#e.parseRequestFn,Te({[this.#e.requestParameter.text]:_.SyntaxKind.StringKeyword},a.createAsExpression(P(this.#e.requestParameter,T("split"))(a.createRegularExpressionLiteral("/ (.+)/"),w(2)),a.createTupleTypeNode([f(this.methodType.name),f(this.#e.pathType)]))));makeSubstituteFn=()=>N(this.#e.substituteFn,Te({[this.#e.pathParameter.text]:_.SyntaxKind.StringKeyword,[this.#e.paramsArgument.text]:Qt},a.createBlock([N(this.#e.restConst,a.createObjectLiteralExpression([a.createSpreadAssignment(this.#e.paramsArgument)])),a.createForInStatement(a.createVariableDeclarationList([a.createVariableDeclaration(this.#e.keyParameter)],_.NodeFlags.Const),this.#e.paramsArgument,a.createBlock([ir(this.#e.pathParameter,P(this.#e.pathParameter,T("replace"))(bt(":",[this.#e.keyParameter]),Te([],a.createBlock([a.createExpressionStatement(a.createDeleteExpression(a.createElementAccessExpression(this.#e.restConst,this.#e.keyParameter))),a.createReturnStatement(a.createElementAccessExpression(this.#e.paramsArgument,this.#e.keyParameter))]))))])),a.createReturnStatement(a.createAsExpression(a.createArrayLiteralExpression([this.#e.pathParameter,this.#e.restConst]),f("const")))])));#t=()=>rr(this.#e.provideMethod,Le({[this.#e.requestParameter.text]:"K",[this.#e.paramsArgument.text]:q(this.interfaces.input,"K"),[this.#e.ctxArgument.text]:{optional:!0,type:"T"}}),[N(er(this.#e.methodParameter,this.#e.pathParameter),P(this.#e.parseRequestFn)(this.#e.requestParameter)),a.createReturnStatement(P(a.createThis(),this.#e.implementationArgument)(this.#e.methodParameter,a.createSpreadElement(P(this.#e.substituteFn)(this.#e.pathParameter,this.#e.paramsArgument)),this.#e.ctxArgument))],{typeParams:{K:this.requestType.name},returns:St(q(this.interfaces.response,"K"))});makeClientClass=t=>or(t,[Yt([xt(this.#e.implementationArgument,{type:f(this.#e.implementationType,["T"]),mod:Je.protectedReadonly,init:this.#e.defaultImplementationConst})]),this.#t()],{typeParams:["T"]});#r=t=>bt("?",[Ze(URLSearchParams.name,t)]);#o=()=>Ze(URL.name,bt("",[this.#e.pathParameter],[this.#e.searchParamsConst]),w(this.serverUrl));makeDefaultImplementation=()=>{let t=a.createPropertyAssignment(T("method"),P(this.#e.methodParameter,T("toUpperCase"))()),r=a.createPropertyAssignment(T("headers"),Ge(this.#e.hasBodyConst,a.createObjectLiteralExpression([a.createPropertyAssignment(w("Content-Type"),w(E.json))]),this.#e.undefinedValue)),o=a.createPropertyAssignment(T("body"),Ge(this.#e.hasBodyConst,P(JSON[Symbol.toStringTag],T("stringify"))(this.#e.paramsArgument),this.#e.undefinedValue)),n=N(this.#e.responseConst,a.createAwaitExpression(P(fetch.name)(this.#o(),a.createObjectLiteralExpression([t,r,o])))),s=N(this.#e.hasBodyConst,a.createLogicalNot(P(a.createArrayLiteralExpression([w("get"),w("delete")]),T("includes"))(this.#e.methodParameter))),i=N(this.#e.searchParamsConst,Ge(this.#e.hasBodyConst,w(""),this.#r(this.#e.paramsArgument))),p=N(this.#e.contentTypeConst,P(this.#e.responseConst,T("headers"),T("get"))(w("content-type"))),d=a.createIfStatement(a.createPrefixUnaryExpression(_.SyntaxKind.ExclamationToken,this.#e.contentTypeConst),a.createReturnStatement()),c=N(this.#e.isJsonConst,P(this.#e.contentTypeConst,T("startsWith"))(w(E.json))),m=a.createReturnStatement(P(this.#e.responseConst,Ge(this.#e.isJsonConst,w(T("json")),w(T("text"))))());return N(this.#e.defaultImplementationConst,Te([this.#e.methodParameter,this.#e.pathParameter,this.#e.paramsArgument],a.createBlock([s,i,n,p,d,c,m]),{isAsync:!0}),{type:this.#e.implementationType})};#n=()=>Yt(Le({request:"K",params:q(this.interfaces.input,"K")}),[N(er(this.#e.pathParameter,this.#e.restConst),P(this.#e.substituteFn)(a.createElementAccessExpression(P(this.#e.parseRequestFn)(this.#e.requestParameter),w(1)),this.#e.paramsArgument)),N(this.#e.searchParamsConst,this.#r(this.#e.restConst)),ir(a.createPropertyAccessExpression(a.createThis(),this.#e.sourceProp),Ze("EventSource",this.#o()))]);#s=t=>a.createTypeLiteralNode([Oe(T("event"),t)]);#i=()=>rr(this.#e.onMethod,Le({[this.#e.eventParameter.text]:"E",[this.#e.handlerParameter.text]:ar({[this.#e.dataParameter.text]:q(Ot("R",Xt(this.#s("E"))),$(T("data")))},Lo(_.SyntaxKind.VoidKeyword))}),[a.createExpressionStatement(P(a.createThis(),this.#e.sourceProp,T("addEventListener"))(this.#e.eventParameter,Te([this.#e.msgParameter],P(this.#e.handlerParameter)(P(JSON[Symbol.toStringTag],T("parse"))(a.createPropertyAccessExpression(a.createParenthesizedExpression(a.createAsExpression(this.#e.msgParameter,f(MessageEvent.name))),T("data"))))))),a.createReturnStatement(a.createThis())],{typeParams:{E:q("R",$(T("event")))}});makeSubscriptionClass=t=>or(t,[Mo(this.#e.sourceProp,"EventSource"),this.#n(),this.#i()],{typeParams:{K:Ot(this.requestType.name,a.createTemplateLiteralType(a.createTemplateHead("get "),[a.createTemplateLiteralTypeSpan(f(_.SyntaxKind.StringKeyword),a.createTemplateTail(""))])),R:Ot(q(this.interfaces.positive,"K"),Xt(this.#s(_.SyntaxKind.StringKeyword)))}});makeUsageStatements=(t,r)=>[N(this.#e.clientConst,Ze(t)),P(this.#e.clientConst,this.#e.provideMethod)(w("get /v1/user/retrieve"),a.createObjectLiteralExpression([a.createPropertyAssignment("id",w("10"))])),P(Ze(r,w("get /v1/events/stream"),a.createObjectLiteralExpression()),this.#e.onMethod)(w("time"),Te(["time"],a.createBlock([])))]};import*as v from"ramda";import b from"typescript";import{globalRegistry as Ps}from"zod/v4";var pr=(e,{onEach:t,rules:r,onMissing:o,ctx:n={}})=>{let s=W(e),i=s&&s in r?r[s]:r[e._zod.def.type],d=i?i(e,{...n,next:m=>pr(m,{ctx:n,onEach:t,rules:r,onMissing:o})}):o(e,n),c=t&&t(e,{prev:d,...n});return c?{...d,...c}:d};var{factory:B}=b,ws={[b.SyntaxKind.AnyKeyword]:"",[b.SyntaxKind.BigIntKeyword]:BigInt(0),[b.SyntaxKind.BooleanKeyword]:!1,[b.SyntaxKind.NumberKeyword]:0,[b.SyntaxKind.ObjectKeyword]:{},[b.SyntaxKind.StringKeyword]:"",[b.SyntaxKind.UndefinedKeyword]:void 0},cr={name:v.path(["name","text"]),type:v.path(["type"]),optional:v.path(["questionToken"])},Es=({_zod:{def:e}})=>{let t=e.values.map(r=>r===void 0?f(b.SyntaxKind.UndefinedKeyword):$(r));return t.length===1?t[0]:B.createUnionTypeNode(t)},vs=(e,{isResponse:t,next:r,makeAlias:o})=>{let n=()=>{let s=Object.entries(e._zod.def.shape).map(([i,p])=>{let{description:d,deprecated:c}=Ps.get(p)||{};return Oe(i,r(p),{comment:d,isDeprecated:c,isOptional:it(p,{isResponse:t})})});return B.createTypeLiteralNode(s)};return kr(e,{io:t?"output":"input"})?o(e,n):n()},ks=({_zod:{def:e}},{next:t})=>B.createArrayTypeNode(t(e.element)),As=({_zod:{def:e}})=>B.createUnionTypeNode(Object.values(e.entries).map($)),Cs=({_zod:{def:e}},{next:t})=>{let r=new Map;for(let o of e.options){let n=t(o);r.set(Zo(n)?n.kind:n,n)}return B.createUnionTypeNode(Array.from(r.values()))},Is=e=>ws?.[e.kind],Ns=({_zod:{def:e}},{next:t})=>t(e.innerType),zs=({_zod:{def:e}},{next:t})=>B.createUnionTypeNode([t(e.innerType),$(null)]),js=({_zod:{def:e}},{next:t})=>B.createTupleTypeNode(e.items.map(t).concat(e.rest===null?[]:B.createRestTypeNode(t(e.rest)))),Ms=({_zod:{def:e}},{next:t})=>f("Record",[e.keyType,e.valueType].map(t)),Ls=v.tryCatch(e=>{if(!e.every(b.isTypeLiteralNode))throw new Error("Not objects");let t=v.chain(v.prop("members"),e),r=v.uniqWith((...o)=>{if(!v.eqBy(cr.name,...o))return!1;if(v.both(v.eqBy(cr.type),v.eqBy(cr.optional))(...o))return!0;throw new Error("Has conflicting prop")},t);return B.createTypeLiteralNode(r)},(e,t)=>B.createIntersectionTypeNode(t)),Zs=({_zod:{def:e}},{next:t})=>Ls([e.left,e.right].map(t)),pe=e=>()=>f(e),dr=({_zod:{def:e}},{next:t})=>t(e.innerType),$s=({_zod:{def:e}},{next:t,isResponse:r})=>{let o=e[r?"out":"in"],n=e[r?"in":"out"];if(!oe(o,"transform"))return t(o);let s=t(n),i=st(o,Is(s)),p={number:b.SyntaxKind.NumberKeyword,bigint:b.SyntaxKind.BigIntKeyword,boolean:b.SyntaxKind.BooleanKeyword,string:b.SyntaxKind.StringKeyword,undefined:b.SyntaxKind.UndefinedKeyword,object:b.SyntaxKind.ObjectKeyword};return f(i&&p[i]||b.SyntaxKind.AnyKeyword)},Hs=()=>$(null),Ks=({_zod:{def:e}},{makeAlias:t,next:r})=>t(e.getter,()=>r(e.getter())),qs=e=>{let t=f(b.SyntaxKind.StringKeyword),r=f("Buffer"),o=B.createUnionTypeNode([t,r]);return oe(e,"string")?t:oe(e,"union")?o:r},Bs=(e,{next:t})=>t(e._zod.def.shape.raw),Fs={string:pe(b.SyntaxKind.StringKeyword),number:pe(b.SyntaxKind.NumberKeyword),bigint:pe(b.SyntaxKind.BigIntKeyword),boolean:pe(b.SyntaxKind.BooleanKeyword),any:pe(b.SyntaxKind.AnyKeyword),undefined:pe(b.SyntaxKind.UndefinedKeyword),[ye]:pe(b.SyntaxKind.StringKeyword),[ge]:pe(b.SyntaxKind.StringKeyword),null:Hs,array:ks,tuple:js,record:Ms,object:vs,literal:Es,intersection:Zs,union:Cs,default:dr,enum:As,optional:Ns,nullable:zs,catch:dr,pipe:$s,lazy:Ks,readonly:dr,[ie]:qs,[H]:Bs},mr=(e,{brandHandling:t,ctx:r})=>pr(e,{rules:{...t,...Fs},onMissing:()=>f(b.SyntaxKind.AnyKeyword),ctx:r});var lr=class extends Tt{#e=[this.someOfType];#t=new Map;#r=[];#o(t,r){let o=this.#t.get(t)?.name?.text;if(!o){o=`Type${this.#t.size+1}`;let n=$(null);this.#t.set(t,V(o,n)),this.#t.set(t,V(o,r()))}return f(o)}constructor({routing:t,brandHandling:r,variant:o="client",clientClassName:n="Client",subscriptionClassName:s="Subscription",serverUrl:i="https://example.com",noContent:p=Ds.undefined()}){super(i);let d={makeAlias:this.#o.bind(this)},c={brandHandling:r,ctx:{...d,isResponse:!1}},m={brandHandling:r,ctx:{...d,isResponse:!0}};Me({routing:t,onEndpoint:(h,y,k)=>{let A=ne.bind(null,k,y),{isDeprecated:Z,inputSchema:R,tags:C}=h,I=`${k} ${y}`,F=V(A("input"),mr(R,c),{comment:I});this.#e.push(F);let z=Ie.reduce((We,ce)=>{let Ye=h.getResponses(ce),Qe=Ho.chain(([wt,{schema:Et,mimeTypes:X,statusCodes:de}])=>{let et=V(A(ce,"variant",`${wt+1}`),mr(X?Et:p,m),{comment:I});return this.#e.push(et),de.map(vt=>Oe(vt,et.name))},Array.from(Ye.entries())),Xe=Rt(A(ce,"response","variants"),Qe,{comment:I});return this.#e.push(Xe),Object.assign(We,{[ce]:Xe})},{});this.paths.add(y);let Q=$(I),Pe={input:f(F.name),positive:this.someOf(z.positive),negative:this.someOf(z.negative),response:a.createUnionTypeNode([q(this.interfaces.positive,Q),q(this.interfaces.negative,Q)]),encoded:a.createIntersectionTypeNode([f(z.positive.name),f(z.negative.name)])};this.registry.set(I,{isDeprecated:Z,store:Pe}),this.tags.set(I,C)}}),this.#e.unshift(...this.#t.values()),this.#e.push(this.makePathType(),this.methodType,...this.makePublicInterfaces(),this.requestType),o!=="types"&&(this.#e.push(this.makeEndpointTags(),this.makeParseRequestFn(),this.makeSubstituteFn(),this.makeImplementationType(),this.makeDefaultImplementation(),this.makeClientClass(n),this.makeSubscriptionClass(s)),this.#r.push(...this.makeUsageStatements(n,s)))}#n(t){return this.#r.length?this.#r.map(r=>typeof r=="string"?r:Gt(r,t)).join(`
19
- `):void 0}print(t){let r=this.#n(t),o=r&&Pt.addSyntheticLeadingComment(Pt.addSyntheticLeadingComment(a.createEmptyStatement(),Pt.SyntaxKind.SingleLineCommentTrivia," Usage example:"),Pt.SyntaxKind.MultiLineCommentTrivia,`
20
- ${r}`);return this.#e.concat(o||[]).map((n,s)=>Gt(n,s<this.#e.length?t:{...t,omitTrailingSemicolon:!0})).join(`
18
+ `))};var po=e=>{e.startupLogo!==!1&&ao(process.stdout);let t=e.errorHandler||he,r=jr(e.logger)?e.logger:new De(e.logger);r.debug("Running",{build:"v24.0.0-beta.11 (ESM)",env:process.env.NODE_ENV||"development"}),no(r);let o=ro({logger:r,config:e}),s={getLogger:oo(r),errorHandler:t},i=Xr(s),p=Qr(s);return{...s,logger:r,notFoundHandler:i,catcher:p,loggingMiddleware:o}},$n=(e,t)=>{let{logger:r,getLogger:o,notFoundHandler:n,loggingMiddleware:s}=po(e);return Bt({app:e.app.use(s),routing:t,getLogger:o,config:e}),{notFoundHandler:n,logger:r}},Zn=async(e,t)=>{let{logger:r,getLogger:o,notFoundHandler:n,catcher:s,loggingMiddleware:i}=po(e),p=lt().disable("x-powered-by").use(i);if(e.compression){let b=await Ie("compression");p.use(b(typeof e.compression=="object"?e.compression:void 0))}await e.beforeRouting?.({app:p,getLogger:o});let d={json:[e.jsonParser||lt.json()],raw:[e.rawParser||lt.raw(),to],form:[e.formParser||lt.urlencoded()],upload:e.upload?await eo({config:e,getLogger:o}):[]};Bt({app:p,routing:t,getLogger:o,config:e,parsers:d}),p.use(s,n);let c=[],m=(b,y)=>()=>b.listen(y,()=>r.info("Listening",y)),g=[];if(e.http){let b=Ln.createServer(p);c.push(b),g.push(m(b,e.http.listen))}if(e.https){let b=Mn.createServer(e.https.options,p);c.push(b),g.push(m(b,e.https.listen))}return c.length||r.warn("No servers configured."),e.gracefulShutdown&&so({logger:r,servers:c,options:e.gracefulShutdown===!0?{}:e.gracefulShutdown}),{app:p,logger:r,servers:g.map(b=>b())}};import{OpenApiBuilder as cs}from"openapi3-ts/oas31";import*as Co from"ramda";import*as S from"ramda";var co=e=>z(e)&&"or"in e,mo=e=>z(e)&&"and"in e,Ht=e=>!mo(e)&&!co(e),lo=e=>{let t=S.filter(Ht,e),r=S.chain(S.prop("and"),S.filter(mo,e)),[o,n]=S.partition(Ht,r),s=S.concat(t,o),i=S.filter(co,e);return S.map(S.prop("or"),S.concat(i,n)).reduce((d,c)=>le(d,S.map(m=>Ht(m)?[m]:m.and,c),([m,g])=>S.concat(m,g)),S.reject(S.isEmpty,[s]))};import{isReferenceObject as ho,isSchemaObject as ut}from"openapi3-ts/oas31";import*as l from"ramda";import{z as fo}from"zod/v4";var uo=["a-im","accept","accept-additions","accept-ch","accept-charset","accept-datetime","accept-encoding","accept-features","accept-language","accept-signature","access-control","access-control-request-headers","access-control-request-method","alpn","alt-used","alternates","amp-cache-transform","apply-to-redirect-ref","authentication-control","authentication-info","authorization","available-dictionary","c-ext","c-man","c-opt","c-pep","c-pep-info","cache-control","cal-managed-id","caldav-timezones","capsule-protocol","cert-not-after","cert-not-before","client-cert","client-cert-chain","close","cmcd-object","cmcd-request","cmcd-session","cmcd-status","cmsd-dynamic","cmsd-static","concealed-auth-export","configuration-context","connection","content-digest","content-disposition","content-encoding","content-id","content-language","content-length","content-location","content-md5","content-range","content-script-type","content-type","cookie","cookie2","cross-origin-embedder-policy","cross-origin-embedder-policy-report-only","cross-origin-opener-policy","cross-origin-opener-policy-report-only","cross-origin-resource-policy","cta-common-access-token","dasl","date","dav","default-style","delta-base","deprecation","depth","derived-from","destination","detached-jws","differential-id","dictionary-id","digest","dpop","dpop-nonce","early-data","ediint-features","expect","expect-ct","ext","forwarded","from","getprofile","hobareg","host","http2-settings","if","if-match","if-modified-since","if-none-match","if-range","if-schedule-tag-match","if-unmodified-since","im","include-referred-token-binding-id","isolation","keep-alive","label","last-event-id","link","link-template","lock-token","man","max-forwards","memento-datetime","meter","method-check","method-check-expires","mime-version","negotiate","nel","odata-entityid","odata-isolation","odata-maxversion","odata-version","opt","ordering-type","origin","origin-agent-cluster","oscore","oslc-core-version","overwrite","p3p","pep","pep-info","permissions-policy","pics-label","ping-from","ping-to","position","pragma","prefer","preference-applied","priority","profileobject","protocol","protocol-info","protocol-query","protocol-request","proxy-authorization","proxy-features","proxy-instruction","public","public-key-pins","public-key-pins-report-only","range","redirect-ref","referer","referer-root","referrer-policy","repeatability-client-id","repeatability-first-sent","repeatability-request-id","repeatability-result","replay-nonce","reporting-endpoints","repr-digest","safe","schedule-reply","schedule-tag","sec-fetch-storage-access","sec-gpc","sec-purpose","sec-token-binding","sec-websocket-extensions","sec-websocket-key","sec-websocket-protocol","sec-websocket-version","security-scheme","setprofile","signature","signature-input","slug","soapaction","status-uri","sunset","surrogate-capability","tcn","te","timeout","topic","traceparent","tracestate","trailer","transfer-encoding","ttl","upgrade","urgency","uri","use-as-dictionary","user-agent","variant-vary","via","want-content-digest","want-digest","want-repr-digest","warning","x-content-type-options","x-frame-options"];var yo=50,bo="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString",xo={integer:0,number:0,string:"",boolean:!1,object:{},null:null,array:[]},So=e=>e.replace(vt,t=>`{${t.slice(1)}}`),Hn=({},e)=>{if(e.isResponse)throw new W("Please use ez.upload() only for input.",e);return{type:"string",format:"binary"}},Kn=({jsonSchema:e})=>({...e,externalDocs:{description:"raw binary data",url:"https://swagger.io/specification/#working-with-binary-data"}}),qn=({zodSchema:e,jsonSchema:t})=>{if(!e._zod.propValues)return t;let r=Object.keys(e._zod.propValues).pop();return r?{...t,discriminator:t.discriminator??{propertyName:r}}:t},Fn=l.tryCatch(({jsonSchema:e})=>{if(!e.allOf)throw"no allOf";return Ne(e,"throw")},(e,{jsonSchema:t})=>t),Un=({jsonSchema:e})=>{if(!e.anyOf)return e;let t=e.anyOf[0];return Object.assign(t,{type:Qn(t.type)})},go=e=>e in xo,Dn=({jsonSchema:e})=>({type:typeof e.enum?.[0],...e}),_n=({jsonSchema:e})=>({type:typeof(e.const||e.enum?.[0]),...e}),xe=({$ref:e,type:t,allOf:r,oneOf:o,anyOf:n,not:s,...i})=>{if(e)return{$ref:e};let p={type:Array.isArray(t)?t.filter(go):t&&go(t)?t:void 0,...i};for(let[d,c]of l.toPairs({allOf:r,oneOf:o,anyOf:n}))c&&(p[d]=c.map(xe));return s&&(p.not=xe(s)),p},Jn=({jsonSchema:{examples:e,description:t}},r)=>{if(r.isResponse)throw new W("Please use ez.dateOut() for output.",r);let o={description:t||"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",pattern:/^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(\.\d+)?)?Z?$/.source,externalDocs:{url:bo}};return e?.length&&(o.examples=e),o},Vn=({jsonSchema:{examples:e,description:t}},r)=>{if(!r.isResponse)throw new W("Please use ez.dateIn() for input.",r);let o={description:t||"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",externalDocs:{url:bo}};return e?.length&&(o.examples=e),o},Gn=()=>({type:"string",format:"bigint",pattern:/^-?\d+$/.source}),Wn=({zodSchema:e,jsonSchema:t})=>e._zod.def.rest!==null?t:{...t,items:{not:{}}},Yn=e=>{let t=Array.isArray(e.type)?e.type[0]:e.type;return xo?.[t]},Qn=e=>e==="null"?e:typeof e=="string"?[e,"null"]:e&&[...new Set(e).add("null")],Xn=({zodSchema:e,jsonSchema:t},r)=>{let o=e._zod.def[r.isResponse?"out":"in"],n=e._zod.def[r.isResponse?"in":"out"];if(!Pe(o,"transform"))return t;let s=xe(Ft(n,{ctx:r}));if(ut(s))if(r.isResponse){let i=nt(o,Yn(s));if(i&&["number","string","boolean"].includes(i))return{...t,type:i}}else{let{type:i,...p}=s;return{...p,format:`${p.format||i} (preprocessed)`}}return t},es=({jsonSchema:e})=>{if(e.type!=="object")return e;let t=e;return!t.properties||!("raw"in t.properties)?e:t.properties.raw},Kt=e=>e.length?l.fromPairs(l.zip(l.times(t=>`example${t+1}`,e.length),l.map(l.objOf("value"),e))):void 0,ts=(e,t)=>t?.includes(e)||e.startsWith("x-")||uo.includes(e),Ro=({path:e,method:t,request:r,inputSources:o,makeRef:n,composition:s,isHeader:i,security:p,description:d=`${t.toUpperCase()} ${e} Parameter`})=>{let c=Ne(r),m=rt(e),g=o.includes("query"),b=o.includes("params"),y=o.includes("headers"),v=R=>b&&m.includes(R),k=l.chain(l.filter(R=>R.type==="header"),p??[]).map(({name:R})=>R),L=R=>y&&(i?.(R,t,e)??ts(R,k));return Object.entries(c.properties).reduce((R,[A,C])=>{let q=v(A)?"path":L(A)?"header":g?"query":void 0;if(!q)return R;let N=xe(C),Q=s==="components"?n(C.id||JSON.stringify(C),N,te(d,A)):N;return R.concat({name:A,in:q,deprecated:C.deprecated,required:c.required?.includes(A)||!1,description:N.description||d,schema:Q,examples:Kt(ut(N)&&N.examples?.length?N.examples:l.pluck(A,c.examples?.filter(l.both(z,l.has(A)))||[]))})},[])},qt={nullable:Un,union:qn,bigint:Gn,intersection:Fn,tuple:Wn,pipe:Xn,literal:_n,enum:Dn,[ce]:Jn,[de]:Vn,[oe]:Hn,[Z]:es,[pe]:Kn},rs=(e,t,r)=>{let o=[e,t];for(;o.length;){let n=o.shift();if(l.is(Object,n)){if(ho(n)&&!n.$ref.startsWith("#/components")){let s=n.$ref.split("/").pop(),i=t[s];i&&(n.$ref=r.makeRef(i.id||i,xe(i)).$ref);continue}o.push(...l.values(n))}l.is(Array,n)&&o.push(...l.values(n))}return e},Ft=(e,{ctx:t,rules:r=qt})=>{let{$defs:o={},properties:n={}}=fo.toJSONSchema(fo.object({subject:e}),{unrepresentable:"any",io:t.isResponse?"output":"input",override:s=>{let i=V(s.zodSchema),p=r[i&&i in r?i:s.zodSchema._zod.def.type];if(p){let d={...p(s,t)};for(let c in s.jsonSchema)delete s.jsonSchema[c];Object.assign(s.jsonSchema,d)}}});return rs(n.subject,o,t)},Oo=(e,t)=>{if(ho(e))return[e,!1];let r=!1,o=l.map(p=>{let[d,c]=Oo(p,t);return r=r||c,d}),n=l.omit(t),s={properties:n,examples:l.map(n),required:l.without(t),allOf:o,oneOf:o,anyOf:o},i=l.evolve(s,e);return[i,r||!!i.required?.length]},To=({method:e,path:t,schema:r,mimeTypes:o,variant:n,makeRef:s,composition:i,hasMultipleStatusCodes:p,statusCode:d,brandHandling:c,description:m=`${e.toUpperCase()} ${t} ${At(n)} response ${p?d:""}`.trim()})=>{if(!o)return{description:m};let g=xe(Ft(r,{rules:{...c,...qt},ctx:{isResponse:!0,makeRef:s,path:t,method:e}})),b=[];ut(g)&&g.examples&&(b.push(...g.examples),delete g.examples);let y={schema:i==="components"?s(r,g,te(m)):g,examples:Kt(b)};return{description:m,content:l.fromPairs(l.xprod(o,[y]))}},os=({format:e})=>{let t={type:"http",scheme:"bearer"};return e&&(t.bearerFormat=e),t},ns=({name:e},t)=>{let r={type:"apiKey",in:"query",name:e};return t?.includes("body")&&(t?.includes("query")?(r["x-in-alternative"]="body",r.description=`${e} CAN also be supplied within the request body`):(r["x-in-actual"]="body",r.description=`${e} MUST be supplied within the request body instead of query`)),r},ss=({name:e})=>({type:"apiKey",in:"header",name:e}),is=({name:e})=>({type:"apiKey",in:"cookie",name:e}),as=({url:e})=>({type:"openIdConnect",openIdConnectUrl:e}),ps=({flows:e={}})=>({type:"oauth2",flows:l.map(t=>({...t,scopes:t.scopes||{}}),l.reject(l.isNil,e))}),Po=(e,t=[])=>{let r=o=>o.type==="basic"?{type:"http",scheme:"basic"}:o.type==="bearer"?os(o):o.type==="input"?ns(o,t):o.type==="header"?ss(o):o.type==="cookie"?is(o):o.type==="openid"?as(o):ps(o);return e.map(o=>o.map(r))},wo=(e,t,r)=>e.map(o=>o.reduce((n,s)=>{let i=r(s),p=["oauth2","openIdConnect"].includes(s.type);return Object.assign(n,{[i]:p?t:[]})},{})),Eo=({schema:e,brandHandling:t,makeRef:r,path:o,method:n})=>Ft(e,{rules:{...t,...qt},ctx:{isResponse:!1,makeRef:r,path:o,method:n}}),vo=({method:e,path:t,schema:r,request:o,mimeType:n,makeRef:s,composition:i,paramNames:p,description:d=`${e.toUpperCase()} ${t} Request body`})=>{let[c,m]=Oo(xe(o),p),g=[];ut(c)&&c.examples&&(g.push(...c.examples),delete c.examples);let b={schema:i==="components"?s(r,c,te(d)):c,examples:Kt(g.length?g:Ne(o).examples?.filter(v=>z(v)&&!Array.isArray(v)).map(l.omit(p))||[])},y={description:d,content:{[n]:b}};return(m||n===w.raw)&&(y.required=!0),y},ko=e=>Object.entries(e).reduce((t,[r,o])=>{if(!o)return t;let n={name:r,description:typeof o=="string"?o:o.description};return typeof o=="object"&&o.url&&(n.externalDocs={url:o.url}),t.concat(n)},[]),Ut=e=>e.length<=yo?e:e.slice(0,yo-1)+"\u2026",ft=e=>e.length?e.slice():void 0;var Dt=class extends cs{#e=new Map;#t=new Map;#r=new Map;#o(t,r,o=this.#r.get(t)){return o||(o=`Schema${this.#r.size+1}`,this.#r.set(t,o)),this.addSchema(o,r),{$ref:`#/components/schemas/${o}`}}#n(t,r,o){let n=o||te(r,t),s=this.#t.get(n);if(s===void 0)return this.#t.set(n,1),n;if(o)throw new W(`Duplicated operationId: "${o}"`,{method:r,isResponse:!1,path:t});return s++,this.#t.set(n,s),`${n}${s}`}#s(t){let r=JSON.stringify(t);for(let n in this.rootDoc.components?.securitySchemes||{})if(r===JSON.stringify(this.rootDoc.components?.securitySchemes?.[n]))return n;let o=(this.#e.get(t.type)||0)+1;return this.#e.set(t.type,o),`${t.type.toUpperCase()}_${o}`}constructor({routing:t,config:r,title:o,version:n,serverUrl:s,descriptions:i,brandHandling:p,tags:d,isHeader:c,hasSummaryFromDescription:m=!0,composition:g="inline"}){super(),this.addInfo({title:o,version:n});for(let y of typeof s=="string"?[s]:s)this.addServer({url:y});je({routing:t,onEndpoint:(y,v,k)=>{let L={path:v,method:k,endpoint:y,composition:g,brandHandling:p,makeRef:this.#o.bind(this)},{description:R,shortDescription:A,scopes:C,inputSchema:q}=y,N=A?Ut(A):m&&R?Ut(R):void 0,Q=r.inputSources?.[k]||kt[k],Oe=this.#n(v,k,y.getOperationId(k)),We=Eo({...L,schema:q}),ie=lo(y.security),Ye=Ro({...L,inputSources:Q,isHeader:c,security:ie,request:We,description:i?.requestParameter?.call(null,{method:k,path:v,operationId:Oe})}),Qe={};for(let X of Ce){let ae=y.getResponses(X);for(let{mimeTypes:et,schema:wt,statusCodes:lr}of ae)for(let Et of lr)Qe[Et]=To({...L,variant:X,schema:wt,mimeTypes:et,statusCode:Et,hasMultipleStatusCodes:ae.length>1||lr.length>1,description:i?.[`${X}Response`]?.call(null,{method:k,path:v,operationId:Oe,statusCode:Et})})}let Xe=Q.includes("body")?vo({...L,request:We,paramNames:Co.pluck("name",Ye),schema:q,mimeType:w[y.requestType],description:i?.requestBody?.call(null,{method:k,path:v,operationId:Oe})}):void 0,Tt=wo(Po(ie,Q),C,X=>{let ae=this.#s(X);return this.addSecurityScheme(ae,X),ae}),Pt={operationId:Oe,summary:N,description:R,deprecated:y.isDeprecated||void 0,tags:ft(y.tags),parameters:ft(Ye),requestBody:Xe,security:ft(Tt),responses:Qe};this.addPath(So(v),{[k]:Pt})}}),d&&(this.rootDoc.tags=ko(d))}};import{createRequest as ds,createResponse as ms}from"node-mocks-http";var ls=e=>ds({...e,headers:{"content-type":w.json,...e?.headers}}),us=e=>ms(e),fs=e=>{let t={warn:[],error:[],info:[],debug:[]};return new Proxy(e||{},{get(r,o,n){return o==="_getLogs"?()=>t:zr(o)?(...s)=>t[o].push(s):Reflect.get(r,o,n)}})},Ao=({requestProps:e,responseOptions:t,configProps:r,loggerProps:o})=>{let n=ls(e),s=us({req:n,...t});s.req=t?.req||n,n.res=s;let i=fs(o),p={cors:!1,logger:i,...r};return{requestMock:n,responseMock:s,loggerMock:i,configMock:p}},ys=async({endpoint:e,...t})=>{let{requestMock:r,responseMock:o,loggerMock:n,configMock:s}=Ao(t);return await e.execute({request:r,response:o,config:s,logger:n}),{requestMock:r,responseMock:o,loggerMock:n}},gs=async({middleware:e,options:t={},...r})=>{let{requestMock:o,responseMock:n,loggerMock:s,configMock:{inputSources:i,errorHandler:p=he}}=Ao(r),d=ot(o,i),c={request:o,response:n,logger:s,input:d,options:t};try{let m=await e.execute(c);return{requestMock:o,responseMock:n,loggerMock:s,output:m}}catch(m){return await p.execute({...c,error:ee(m),output:null}),{requestMock:o,responseMock:n,loggerMock:s,output:{}}}};import*as Mo from"ramda";import Ot from"typescript";import{z as Hs}from"zod/v4";import*as zo from"ramda";import _ from"typescript";import*as U from"ramda";import u from"typescript";var a=u.factory,yt=[a.createModifier(u.SyntaxKind.ExportKeyword)],hs=[a.createModifier(u.SyntaxKind.AsyncKeyword)],Ve={public:[a.createModifier(u.SyntaxKind.PublicKeyword)],protectedReadonly:[a.createModifier(u.SyntaxKind.ProtectedKeyword),a.createModifier(u.SyntaxKind.ReadonlyKeyword)]},_t=(e,t)=>u.addSyntheticLeadingComment(e,u.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0),Jt=(e,t)=>{let r=u.createSourceFile("print.ts","",u.ScriptTarget.Latest,!1,u.ScriptKind.TS);return u.createPrinter(t).printNode(u.EmitHint.Unspecified,e,r)},bs=/^[A-Za-z_$][A-Za-z0-9_$]*$/,Vt=e=>typeof e=="string"&&bs.test(e)?a.createIdentifier(e):P(e),gt=(e,...t)=>a.createTemplateExpression(a.createTemplateHead(e),t.map(([r,o=""],n)=>a.createTemplateSpan(r,n===t.length-1?a.createTemplateTail(o):a.createTemplateMiddle(o)))),ht=(e,{type:t,mod:r,init:o,optional:n}={})=>a.createParameterDeclaration(r,void 0,e,n?a.createToken(u.SyntaxKind.QuestionToken):void 0,t?f(t):void 0,o),ze=e=>Object.entries(e).map(([t,r])=>ht(t,typeof r=="string"||typeof r=="number"||typeof r=="object"&&"kind"in r?{type:r}:r)),Gt=(e,t=[])=>a.createConstructorDeclaration(Ve.public,e,a.createBlock(t)),f=(e,t)=>typeof e=="number"?a.createKeywordTypeNode(e):typeof e=="string"||u.isIdentifier(e)?a.createTypeReferenceNode(e,t&&U.map(f,t)):e,Wt=f("Record",[u.SyntaxKind.StringKeyword,u.SyntaxKind.AnyKeyword]),Se=(e,t,{isOptional:r,isDeprecated:o,comment:n}={})=>{let s=f(t),i=a.createPropertySignature(void 0,Vt(e),r?a.createToken(u.SyntaxKind.QuestionToken):void 0,r?a.createUnionTypeNode([s,f(u.SyntaxKind.UndefinedKeyword)]):s),p=U.reject(U.isNil,[o?"@deprecated":void 0,n]);return p.length?_t(i,p.join(" ")):i},Yt=e=>u.setEmitFlags(e,u.EmitFlags.SingleLine),Qt=(...e)=>a.createArrayBindingPattern(e.map(t=>a.createBindingElement(void 0,void 0,t))),I=(e,t,{type:r,expose:o}={})=>a.createVariableStatement(o&&yt,a.createVariableDeclarationList([a.createVariableDeclaration(e,void 0,r?f(r):void 0,t)],u.NodeFlags.Const)),Xt=(e,t)=>D(e,a.createUnionTypeNode(U.map(M,t)),{expose:!0}),D=(e,t,{expose:r,comment:o,params:n}={})=>{let s=a.createTypeAliasDeclaration(r?yt:void 0,e,n&&or(n),t);return o?_t(s,o):s},Io=(e,t)=>a.createPropertyDeclaration(Ve.public,e,void 0,f(t),void 0),er=(e,t,r,{typeParams:o,returns:n}={})=>a.createMethodDeclaration(Ve.public,void 0,e,void 0,o&&or(o),t,n,a.createBlock(r)),tr=(e,t,{typeParams:r}={})=>a.createClassDeclaration(yt,e,r&&or(r),void 0,t),rr=e=>a.createTypeOperatorNode(u.SyntaxKind.KeyOfKeyword,f(e)),bt=e=>f(Promise.name,[e]),xt=(e,t,{expose:r,comment:o}={})=>{let n=a.createInterfaceDeclaration(r?yt:void 0,e,void 0,void 0,t);return o?_t(n,o):n},or=e=>(Array.isArray(e)?e.map(t=>U.pair(t,void 0)):Object.entries(e)).map(([t,r])=>{let{type:o,init:n}=typeof r=="object"&&"init"in r?r:{type:r};return a.createTypeParameterDeclaration([],t,o?f(o):void 0,n?f(n):void 0)}),Re=(e,t,{isAsync:r}={})=>a.createArrowFunction(r?hs:void 0,void 0,Array.isArray(e)?U.map(ht,e):ze(e),void 0,void 0,t),O=e=>e,Ge=(e,t,r)=>a.createConditionalExpression(e,a.createToken(u.SyntaxKind.QuestionToken),t,a.createToken(u.SyntaxKind.ColonToken),r),T=(e,...t)=>(...r)=>a.createCallExpression(t.reduce((o,n)=>typeof n=="string"||u.isIdentifier(n)?a.createPropertyAccessExpression(o,n):a.createElementAccessExpression(o,n),typeof e=="string"?a.createIdentifier(e):e),void 0,r),Le=(e,...t)=>a.createNewExpression(a.createIdentifier(e),void 0,t),St=(e,t)=>f("Extract",[e,t]),nr=(e,t)=>a.createExpressionStatement(a.createBinaryExpression(e,a.createToken(u.SyntaxKind.EqualsToken),t)),H=(e,t)=>a.createIndexedAccessTypeNode(f(e),f(t)),No=e=>a.createUnionTypeNode([f(e),bt(e)]),sr=(e,t)=>a.createFunctionTypeNode(void 0,ze(e),f(t)),P=e=>typeof e=="number"?a.createNumericLiteral(e):typeof e=="bigint"?a.createBigIntLiteral(e.toString()):typeof e=="boolean"?e?a.createTrue():a.createFalse():e===null?a.createNull():a.createStringLiteral(e),M=e=>a.createLiteralTypeNode(P(e)),xs=[u.SyntaxKind.AnyKeyword,u.SyntaxKind.BigIntKeyword,u.SyntaxKind.BooleanKeyword,u.SyntaxKind.NeverKeyword,u.SyntaxKind.NumberKeyword,u.SyntaxKind.ObjectKeyword,u.SyntaxKind.StringKeyword,u.SyntaxKind.SymbolKeyword,u.SyntaxKind.UndefinedKeyword,u.SyntaxKind.UnknownKeyword,u.SyntaxKind.VoidKeyword],jo=e=>xs.includes(e.kind);var Rt=class{constructor(t){this.serverUrl=t}paths=new Set;tags=new Map;registry=new Map;#e={pathType:a.createIdentifier("Path"),implementationType:a.createIdentifier("Implementation"),keyParameter:a.createIdentifier("key"),pathParameter:a.createIdentifier("path"),paramsArgument:a.createIdentifier("params"),ctxArgument:a.createIdentifier("ctx"),methodParameter:a.createIdentifier("method"),requestParameter:a.createIdentifier("request"),eventParameter:a.createIdentifier("event"),dataParameter:a.createIdentifier("data"),handlerParameter:a.createIdentifier("handler"),msgParameter:a.createIdentifier("msg"),parseRequestFn:a.createIdentifier("parseRequest"),substituteFn:a.createIdentifier("substitute"),provideMethod:a.createIdentifier("provide"),onMethod:a.createIdentifier("on"),implementationArgument:a.createIdentifier("implementation"),hasBodyConst:a.createIdentifier("hasBody"),undefinedValue:a.createIdentifier("undefined"),responseConst:a.createIdentifier("response"),restConst:a.createIdentifier("rest"),searchParamsConst:a.createIdentifier("searchParams"),defaultImplementationConst:a.createIdentifier("defaultImplementation"),clientConst:a.createIdentifier("client"),contentTypeConst:a.createIdentifier("contentType"),isJsonConst:a.createIdentifier("isJSON"),sourceProp:a.createIdentifier("source")};interfaces={input:a.createIdentifier("Input"),positive:a.createIdentifier("PositiveResponse"),negative:a.createIdentifier("NegativeResponse"),encoded:a.createIdentifier("EncodedResponse"),response:a.createIdentifier("Response")};methodType=Xt("Method",$t);someOfType=D("SomeOf",H("T",rr("T")),{params:["T"]});requestType=D("Request",rr(this.interfaces.input),{expose:!0});someOf=({name:t})=>f(this.someOfType.name,[t]);makePathType=()=>Xt(this.#e.pathType,Array.from(this.paths));makePublicInterfaces=()=>Object.keys(this.interfaces).map(t=>xt(this.interfaces[t],Array.from(this.registry).map(([r,{store:o,isDeprecated:n}])=>Se(r,o[t],{isDeprecated:n})),{expose:!0}));makeEndpointTags=()=>I("endpointTags",a.createObjectLiteralExpression(Array.from(this.tags).map(([t,r])=>a.createPropertyAssignment(Vt(t),a.createArrayLiteralExpression(zo.map(P,r))))),{expose:!0});makeImplementationType=()=>D(this.#e.implementationType,sr({[this.#e.methodParameter.text]:this.methodType.name,[this.#e.pathParameter.text]:_.SyntaxKind.StringKeyword,[this.#e.paramsArgument.text]:Wt,[this.#e.ctxArgument.text]:{optional:!0,type:"T"}},bt(_.SyntaxKind.AnyKeyword)),{expose:!0,params:{T:{init:_.SyntaxKind.UnknownKeyword}}});makeParseRequestFn=()=>I(this.#e.parseRequestFn,Re({[this.#e.requestParameter.text]:_.SyntaxKind.StringKeyword},a.createAsExpression(T(this.#e.requestParameter,O("split"))(a.createRegularExpressionLiteral("/ (.+)/"),P(2)),a.createTupleTypeNode([f(this.methodType.name),f(this.#e.pathType)]))));makeSubstituteFn=()=>I(this.#e.substituteFn,Re({[this.#e.pathParameter.text]:_.SyntaxKind.StringKeyword,[this.#e.paramsArgument.text]:Wt},a.createBlock([I(this.#e.restConst,a.createObjectLiteralExpression([a.createSpreadAssignment(this.#e.paramsArgument)])),a.createForInStatement(a.createVariableDeclarationList([a.createVariableDeclaration(this.#e.keyParameter)],_.NodeFlags.Const),this.#e.paramsArgument,a.createBlock([nr(this.#e.pathParameter,T(this.#e.pathParameter,O("replace"))(gt(":",[this.#e.keyParameter]),Re([],a.createBlock([a.createExpressionStatement(a.createDeleteExpression(a.createElementAccessExpression(this.#e.restConst,this.#e.keyParameter))),a.createReturnStatement(a.createElementAccessExpression(this.#e.paramsArgument,this.#e.keyParameter))]))))])),a.createReturnStatement(a.createAsExpression(a.createArrayLiteralExpression([this.#e.pathParameter,this.#e.restConst]),f("const")))])));#t=()=>er(this.#e.provideMethod,ze({[this.#e.requestParameter.text]:"K",[this.#e.paramsArgument.text]:H(this.interfaces.input,"K"),[this.#e.ctxArgument.text]:{optional:!0,type:"T"}}),[I(Qt(this.#e.methodParameter,this.#e.pathParameter),T(this.#e.parseRequestFn)(this.#e.requestParameter)),a.createReturnStatement(T(a.createThis(),this.#e.implementationArgument)(this.#e.methodParameter,a.createSpreadElement(T(this.#e.substituteFn)(this.#e.pathParameter,this.#e.paramsArgument)),this.#e.ctxArgument))],{typeParams:{K:this.requestType.name},returns:bt(H(this.interfaces.response,"K"))});makeClientClass=t=>tr(t,[Gt([ht(this.#e.implementationArgument,{type:f(this.#e.implementationType,["T"]),mod:Ve.protectedReadonly,init:this.#e.defaultImplementationConst})]),this.#t()],{typeParams:["T"]});#r=t=>gt("?",[Le(URLSearchParams.name,t)]);#o=()=>Le(URL.name,gt("",[this.#e.pathParameter],[this.#e.searchParamsConst]),P(this.serverUrl));makeDefaultImplementation=()=>{let t=a.createPropertyAssignment(O("method"),T(this.#e.methodParameter,O("toUpperCase"))()),r=a.createPropertyAssignment(O("headers"),Ge(this.#e.hasBodyConst,a.createObjectLiteralExpression([a.createPropertyAssignment(P("Content-Type"),P(w.json))]),this.#e.undefinedValue)),o=a.createPropertyAssignment(O("body"),Ge(this.#e.hasBodyConst,T(JSON[Symbol.toStringTag],O("stringify"))(this.#e.paramsArgument),this.#e.undefinedValue)),n=I(this.#e.responseConst,a.createAwaitExpression(T(fetch.name)(this.#o(),a.createObjectLiteralExpression([t,r,o])))),s=I(this.#e.hasBodyConst,a.createLogicalNot(T(a.createArrayLiteralExpression([P("get"),P("delete")]),O("includes"))(this.#e.methodParameter))),i=I(this.#e.searchParamsConst,Ge(this.#e.hasBodyConst,P(""),this.#r(this.#e.paramsArgument))),p=I(this.#e.contentTypeConst,T(this.#e.responseConst,O("headers"),O("get"))(P("content-type"))),d=a.createIfStatement(a.createPrefixUnaryExpression(_.SyntaxKind.ExclamationToken,this.#e.contentTypeConst),a.createReturnStatement()),c=I(this.#e.isJsonConst,T(this.#e.contentTypeConst,O("startsWith"))(P(w.json))),m=a.createReturnStatement(T(this.#e.responseConst,Ge(this.#e.isJsonConst,P(O("json")),P(O("text"))))());return I(this.#e.defaultImplementationConst,Re([this.#e.methodParameter,this.#e.pathParameter,this.#e.paramsArgument],a.createBlock([s,i,n,p,d,c,m]),{isAsync:!0}),{type:this.#e.implementationType})};#n=()=>Gt(ze({request:"K",params:H(this.interfaces.input,"K")}),[I(Qt(this.#e.pathParameter,this.#e.restConst),T(this.#e.substituteFn)(a.createElementAccessExpression(T(this.#e.parseRequestFn)(this.#e.requestParameter),P(1)),this.#e.paramsArgument)),I(this.#e.searchParamsConst,this.#r(this.#e.restConst)),nr(a.createPropertyAccessExpression(a.createThis(),this.#e.sourceProp),Le("EventSource",this.#o()))]);#s=t=>a.createTypeLiteralNode([Se(O("event"),t)]);#i=()=>er(this.#e.onMethod,ze({[this.#e.eventParameter.text]:"E",[this.#e.handlerParameter.text]:sr({[this.#e.dataParameter.text]:H(St("R",Yt(this.#s("E"))),M(O("data")))},No(_.SyntaxKind.VoidKeyword))}),[a.createExpressionStatement(T(a.createThis(),this.#e.sourceProp,O("addEventListener"))(this.#e.eventParameter,Re([this.#e.msgParameter],T(this.#e.handlerParameter)(T(JSON[Symbol.toStringTag],O("parse"))(a.createPropertyAccessExpression(a.createParenthesizedExpression(a.createAsExpression(this.#e.msgParameter,f(MessageEvent.name))),O("data"))))))),a.createReturnStatement(a.createThis())],{typeParams:{E:H("R",M(O("event")))}});makeSubscriptionClass=t=>tr(t,[Io(this.#e.sourceProp,"EventSource"),this.#n(),this.#i()],{typeParams:{K:St(this.requestType.name,a.createTemplateLiteralType(a.createTemplateHead("get "),[a.createTemplateLiteralTypeSpan(f(_.SyntaxKind.StringKeyword),a.createTemplateTail(""))])),R:St(H(this.interfaces.positive,"K"),Yt(this.#s(_.SyntaxKind.StringKeyword)))}});makeUsageStatements=(t,r)=>[I(this.#e.clientConst,Le(t)),T(this.#e.clientConst,this.#e.provideMethod)(P("get /v1/user/retrieve"),a.createObjectLiteralExpression([a.createPropertyAssignment("id",P("10"))])),T(Le(r,P("get /v1/events/stream"),a.createObjectLiteralExpression()),this.#e.onMethod)(P("time"),Re(["time"],a.createBlock([])))]};import*as E from"ramda";import h from"typescript";import{globalRegistry as Ss}from"zod/v4";var ir=(e,{onEach:t,rules:r,onMissing:o,ctx:n={}})=>{let s=V(e),i=s&&s in r?r[s]:r[e._zod.def.type],d=i?i(e,{...n,next:m=>ir(m,{ctx:n,onEach:t,rules:r,onMissing:o})}):o(e,n),c=t&&t(e,{prev:d,...n});return c?{...d,...c}:d};var{factory:J}=h,Rs={[h.SyntaxKind.AnyKeyword]:"",[h.SyntaxKind.BigIntKeyword]:BigInt(0),[h.SyntaxKind.BooleanKeyword]:!1,[h.SyntaxKind.NumberKeyword]:0,[h.SyntaxKind.ObjectKeyword]:{},[h.SyntaxKind.StringKeyword]:"",[h.SyntaxKind.UndefinedKeyword]:void 0},ar={name:E.path(["name","text"]),type:E.path(["type"]),optional:E.path(["questionToken"])},Os=({_zod:{def:e}})=>{let t=e.values.map(r=>r===void 0?f(h.SyntaxKind.UndefinedKeyword):M(r));return t.length===1?t[0]:J.createUnionTypeNode(t)},Ts=(e,{isResponse:t,next:r,makeAlias:o})=>{let n=()=>{let s=Object.entries(e._zod.def.shape).map(([i,p])=>{let{description:d,deprecated:c}=Ss.get(p)||{};return Se(i,r(p),{comment:d,isDeprecated:c,isOptional:(t?p._zod.optout:p._zod.optin)==="optional"})});return J.createTypeLiteralNode(s)};return Or(e,{io:t?"output":"input"})?o(e,n):n()},Ps=({_zod:{def:e}},{next:t})=>J.createArrayTypeNode(t(e.element)),ws=({_zod:{def:e}})=>J.createUnionTypeNode(Object.values(e.entries).map(M)),Es=({_zod:{def:e}},{next:t})=>{let r=new Map;for(let o of e.options){let n=t(o);r.set(jo(n)?n.kind:n,n)}return J.createUnionTypeNode(Array.from(r.values()))},vs=e=>Rs?.[e.kind],ks=({_zod:{def:e}},{next:t})=>t(e.innerType),Cs=({_zod:{def:e}},{next:t})=>J.createUnionTypeNode([t(e.innerType),M(null)]),As=({_zod:{def:e}},{next:t})=>J.createTupleTypeNode(e.items.map(t).concat(e.rest===null?[]:J.createRestTypeNode(t(e.rest)))),Is=({_zod:{def:e}},{next:t})=>f("Record",[e.keyType,e.valueType].map(t)),Ns=E.tryCatch(e=>{if(!e.every(h.isTypeLiteralNode))throw new Error("Not objects");let t=E.chain(E.prop("members"),e),r=E.uniqWith((...o)=>{if(!E.eqBy(ar.name,...o))return!1;if(E.both(E.eqBy(ar.type),E.eqBy(ar.optional))(...o))return!0;throw new Error("Has conflicting prop")},t);return J.createTypeLiteralNode(r)},(e,t)=>J.createIntersectionTypeNode(t)),js=({_zod:{def:e}},{next:t})=>Ns([e.left,e.right].map(t)),K=e=>()=>f(e),pr=({_zod:{def:e}},{next:t})=>t(e.innerType),Lo=e=>f(e?h.SyntaxKind.UnknownKeyword:h.SyntaxKind.AnyKeyword),zs=({_zod:{def:e}},{next:t,isResponse:r})=>{let o=e[r?"out":"in"],n=e[r?"in":"out"];if(!Pe(o,"transform"))return t(o);let s=t(n),i=nt(o,vs(s)),p={number:h.SyntaxKind.NumberKeyword,bigint:h.SyntaxKind.BigIntKeyword,boolean:h.SyntaxKind.BooleanKeyword,string:h.SyntaxKind.StringKeyword,undefined:h.SyntaxKind.UndefinedKeyword,object:h.SyntaxKind.ObjectKeyword};return f(i&&p[i]||Lo(r))},Ls=()=>M(null),Ms=({_zod:{def:e}},{makeAlias:t,next:r})=>t(e.getter,()=>r(e.getter())),$s=()=>f("Buffer"),Zs=(e,{next:t})=>t(e._zod.def.shape.raw),Bs={string:K(h.SyntaxKind.StringKeyword),number:K(h.SyntaxKind.NumberKeyword),bigint:K(h.SyntaxKind.BigIntKeyword),boolean:K(h.SyntaxKind.BooleanKeyword),any:K(h.SyntaxKind.AnyKeyword),undefined:K(h.SyntaxKind.UndefinedKeyword),[ce]:K(h.SyntaxKind.StringKeyword),[de]:K(h.SyntaxKind.StringKeyword),never:K(h.SyntaxKind.NeverKeyword),void:K(h.SyntaxKind.UndefinedKeyword),unknown:K(h.SyntaxKind.UnknownKeyword),null:Ls,array:Ps,tuple:As,record:Is,object:Ts,literal:Os,intersection:js,union:Es,default:pr,enum:ws,optional:ks,nullable:Cs,catch:pr,pipe:zs,lazy:Ms,readonly:pr,[pe]:$s,[Z]:Zs},cr=(e,{brandHandling:t,ctx:r})=>ir(e,{rules:{...t,...Bs},onMissing:({},{isResponse:o})=>Lo(o),ctx:r});var dr=class extends Rt{#e=[this.someOfType];#t=new Map;#r=[];#o(t,r){let o=this.#t.get(t)?.name?.text;if(!o){o=`Type${this.#t.size+1}`;let n=M(null);this.#t.set(t,D(o,n)),this.#t.set(t,D(o,r()))}return f(o)}constructor({routing:t,brandHandling:r,variant:o="client",clientClassName:n="Client",subscriptionClassName:s="Subscription",serverUrl:i="https://example.com",noContent:p=Hs.undefined()}){super(i);let d={makeAlias:this.#o.bind(this)},c={brandHandling:r,ctx:{...d,isResponse:!1}},m={brandHandling:r,ctx:{...d,isResponse:!0}};je({routing:t,onEndpoint:(b,y,v)=>{let k=te.bind(null,v,y),{isDeprecated:L,inputSchema:R,tags:A}=b,C=`${v} ${y}`,q=D(k("input"),cr(R,c),{comment:C});this.#e.push(q);let N=Ce.reduce((We,ie)=>{let Ye=b.getResponses(ie),Qe=Mo.chain(([Tt,{schema:Pt,mimeTypes:X,statusCodes:ae}])=>{let et=D(k(ie,"variant",`${Tt+1}`),cr(X?Pt:p,m),{comment:C});return this.#e.push(et),ae.map(wt=>Se(wt,et.name))},Array.from(Ye.entries())),Xe=xt(k(ie,"response","variants"),Qe,{comment:C});return this.#e.push(Xe),Object.assign(We,{[ie]:Xe})},{});this.paths.add(y);let Q=M(C),Oe={input:f(q.name),positive:this.someOf(N.positive),negative:this.someOf(N.negative),response:a.createUnionTypeNode([H(this.interfaces.positive,Q),H(this.interfaces.negative,Q)]),encoded:a.createIntersectionTypeNode([f(N.positive.name),f(N.negative.name)])};this.registry.set(C,{isDeprecated:L,store:Oe}),this.tags.set(C,A)}}),this.#e.unshift(...this.#t.values()),this.#e.push(this.makePathType(),this.methodType,...this.makePublicInterfaces(),this.requestType),o!=="types"&&(this.#e.push(this.makeEndpointTags(),this.makeParseRequestFn(),this.makeSubstituteFn(),this.makeImplementationType(),this.makeDefaultImplementation(),this.makeClientClass(n),this.makeSubscriptionClass(s)),this.#r.push(...this.makeUsageStatements(n,s)))}#n(t){return this.#r.length?this.#r.map(r=>typeof r=="string"?r:Jt(r,t)).join(`
19
+ `):void 0}print(t){let r=this.#n(t),o=r&&Ot.addSyntheticLeadingComment(Ot.addSyntheticLeadingComment(a.createEmptyStatement(),Ot.SyntaxKind.SingleLineCommentTrivia," Usage example:"),Ot.SyntaxKind.MultiLineCommentTrivia,`
20
+ ${r}`);return this.#e.concat(o||[]).map((n,s)=>Jt(n,s<this.#e.length?t:{...t,omitTrailingSemicolon:!0})).join(`
21
21
 
22
- `)}async printFormatted({printerOptions:t,format:r}={}){let o=r;if(!o)try{let i=(await ze("prettier")).format;o=p=>i(p,{filepath:"client.ts"})}catch{}let n=this.#n(t);this.#r=n&&o?[await o(n)]:this.#r;let s=this.print(t);return o?o(s):s}};import{z as $e}from"zod/v4";var qo=(e,t)=>$e.object({data:t,event:$e.literal(e),id:$e.string().optional(),retry:$e.int().positive().optional()}),Us=(e,t,r)=>qo(String(t),e[t]).transform(o=>[`event: ${o.event}`,`data: ${JSON.stringify(o.data)}`,"",""].join(`
23
- `)).parse({event:t,data:r}),Vs=1e4,Ko=e=>e.headersSent||e.writeHead(200,{connection:"keep-alive","content-type":E.sse,"cache-control":"no-cache"}),_s=e=>new D({handler:async({response:t})=>setTimeout(()=>Ko(t),Vs)&&{isClosed:()=>t.writableEnded||t.closed,emit:(r,o)=>{Ko(t),t.write(Us(e,r,o),"utf-8"),t.flush?.()}}}),Js=e=>new be({positive:()=>{let[t,...r]=Object.entries(e).map(([o,n])=>qo(o,n));return{mimeType:E.sse,schema:r.length?$e.discriminatedUnion("event",[t,...r]):t}},negative:{mimeType:"text/plain",schema:$e.string()},handler:async({response:t,error:r,logger:o,request:n,input:s})=>{if(r){let i=Ee(r);Fe(i,o,n,s),t.headersSent||t.status(i.statusCode).type("text/plain").write(he(i),"utf-8")}t.end()}}),ur=class extends Se{constructor(t){super(Js(t)),this.middlewares=[_s(t)]}};var Gs={dateIn:br,dateOut:xr,form:Rr,file:pt,upload:Or,raw:wr};export{Ue as BuiltinLogger,Ve as DependsOnMethod,_t as Documentation,J as DocumentationError,Se as EndpointsFactory,ur as EventStreamFactory,G as InputValidationError,lr as Integration,D as Middleware,Ke as MissingPeerError,le as OutputValidationError,be as ResultHandler,me as RoutingError,_e as ServeStatic,dn as arrayEndpointsFactory,Zt as arrayResultHandler,Zn as attachRouting,Yo as createConfig,$n as createServer,cn as defaultEndpointsFactory,xe as defaultResultHandler,Ee as ensureHttpError,Gs as ez,we as getExamples,te as getMessageFromError,xs as testEndpoint,Ss as testMiddleware};
22
+ `)}async printFormatted({printerOptions:t,format:r}={}){let o=r;if(!o)try{let i=(await Ie("prettier")).format;o=p=>i(p,{filepath:"client.ts"})}catch{}let n=this.#n(t);this.#r=n&&o?[await o(n)]:this.#r;let s=this.print(t);return o?o(s):s}};import{z as Me}from"zod/v4";var Zo=(e,t)=>Me.object({data:t,event:Me.literal(e),id:Me.string().optional(),retry:Me.int().positive().optional()}),Ks=(e,t,r)=>Zo(String(t),e[t]).transform(o=>[`event: ${o.event}`,`data: ${JSON.stringify(o.data)}`,"",""].join(`
23
+ `)).parse({event:t,data:r}),qs=1e4,$o=e=>e.headersSent||e.writeHead(200,{connection:"keep-alive","content-type":w.sse,"cache-control":"no-cache"}),Fs=e=>new F({handler:async({response:t})=>setTimeout(()=>$o(t),qs)&&{isClosed:()=>t.writableEnded||t.closed,emit:(r,o)=>{$o(t),t.write(Ks(e,r,o),"utf-8"),t.flush?.()}}}),Us=e=>new ge({positive:()=>{let[t,...r]=Object.entries(e).map(([o,n])=>Zo(o,n));return{mimeType:w.sse,schema:r.length?Me.discriminatedUnion("event",[t,...r]):t}},negative:{mimeType:"text/plain",schema:Me.string()},handler:async({response:t,error:r,logger:o,request:n,input:s})=>{if(r){let i=we(r);Fe(i,o,n,s),t.headersSent||t.status(i.statusCode).type("text/plain").write(ye(i),"utf-8")}t.end()}}),mr=class extends be{constructor(t){super(Us(t)),this.middlewares=[Fs(t)]}};var Ds={dateIn:ur,dateOut:fr,form:gr,upload:hr,raw:xr,buffer:tt};export{De as BuiltinLogger,_e as DependsOnMethod,Dt as Documentation,W as DocumentationError,be as EndpointsFactory,mr as EventStreamFactory,Y as InputValidationError,dr as Integration,F as Middleware,Ke as MissingPeerError,He as OutputValidationError,ge as ResultHandler,fe as RoutingError,Je as ServeStatic,cn as arrayEndpointsFactory,Lt as arrayResultHandler,$n as attachRouting,Do as createConfig,Zn as createServer,pn as defaultEndpointsFactory,he as defaultResultHandler,we as ensureHttpError,Ds as ez,me as getMessageFromError,ys as testEndpoint,gs as testMiddleware};
@@ -1 +1 @@
1
- "use strict";var i=Object.defineProperty;var u=Object.getOwnPropertyDescriptor;var S=Object.getOwnPropertyNames;var d=Object.prototype.hasOwnProperty;var y=(t,e)=>{for(var n in e)i(t,n,{get:e[n],enumerable:!0})},g=(t,e,n,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of S(e))!d.call(t,o)&&o!==n&&i(t,o,{get:()=>e[o],enumerable:!(s=u(e,o))||s.enumerable});return t};var T=t=>g(i({},"__esModule",{value:!0}),t);var h={};y(h,{default:()=>b});module.exports=T(h);var r=require("@typescript-eslint/utils"),f={numericRange:`${r.AST_NODE_TYPES.NewExpression}[callee.name='Documentation'] > ${r.AST_NODE_TYPES.ObjectExpression} > ${r.AST_NODE_TYPES.Property}[key.name='numericRange']`,optionalPropStyle:`${r.AST_NODE_TYPES.NewExpression}[callee.name='Integration'] > ${r.AST_NODE_TYPES.ObjectExpression} > ${r.AST_NODE_TYPES.Property}[key.name='optionalPropStyle']`,depicter:`${r.AST_NODE_TYPES.VariableDeclarator}[id.typeAnnotation.typeAnnotation.typeName.name='Depicter'] > ${r.AST_NODE_TYPES.ArrowFunctionExpression}`,nextCall:`${r.AST_NODE_TYPES.VariableDeclarator}[id.typeAnnotation.typeAnnotation.typeName.name='Depicter'] > ${r.AST_NODE_TYPES.ArrowFunctionExpression} ${r.AST_NODE_TYPES.CallExpression}[callee.name='next']`,zod:`${r.AST_NODE_TYPES.ImportDeclaration}[source.value='zod']`},E=t=>Object.keys(t).reduce((e,n)=>Object.assign(e,{[f[n]]:t[n]}),{}),l=(t,e)=>[t.range[0],t.range[1]+(e.sourceCode.getTokenAfter(t)?.value===","?1:0)],m=t=>e=>t.report({node:e,messageId:"remove",data:{subject:e.key.name},fix:n=>n.removeRange(l(e,t))}),x=r.ESLintUtils.RuleCreator.withoutDocs({meta:{type:"problem",fixable:"code",schema:[],messages:{change:"change {{ subject }} from {{ from }} to {{ to }}",add:"add {{ subject }} to {{ to }}",move:"move {{ subject }} to {{ to }}",remove:"remove {{ subject }}"}},defaultOptions:[],create:t=>E({numericRange:m(t),optionalPropStyle:m(t),depicter:e=>{let[n,s]=e.params;if(n?.type!==r.AST_NODE_TYPES.Identifier)return;let o=n.name;if(s?.type!==r.AST_NODE_TYPES.ObjectPattern)return;let p=s.properties.find(a=>a.type===r.AST_NODE_TYPES.Property&&a.key.type===r.AST_NODE_TYPES.Identifier&&a.key.name==="next");t.report({node:e,messageId:"change",data:{subject:"arguments",from:`[${o}, { next, ...rest }]`,to:`[{ zodSchema: ${o}, jsonSchema }, { ...rest }]`},fix:a=>{let c=[a.replaceText(n,`{ zodSchema: ${o}, jsonSchema }`)];return p&&c.push(a.removeRange(l(p,t))),c}})},nextCall:e=>t.report({node:e,messageId:"change",data:{subject:"statement",from:"next()",to:"jsonSchema"},fix:n=>n.replaceText(e,"jsonSchema")}),zod:e=>t.report({node:e.source,messageId:"change",data:{subject:"import",from:"zod",to:"zod/v4"},fix:n=>n.replaceText(e.source,'"zod/v4"')})})}),b={rules:{v24:x}};
1
+ "use strict";var i=Object.defineProperty;var u=Object.getOwnPropertyDescriptor;var S=Object.getOwnPropertyNames;var d=Object.prototype.hasOwnProperty;var f=(t,e)=>{for(var n in e)i(t,n,{get:e[n],enumerable:!0})},g=(t,e,n,a)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of S(e))!d.call(t,o)&&o!==n&&i(t,o,{get:()=>e[o],enumerable:!(a=u(e,o))||a.enumerable});return t};var y=t=>g(i({},"__esModule",{value:!0}),t);var z={};f(z,{default:()=>b});module.exports=y(z);var r=require("@typescript-eslint/utils"),T={numericRange:`${r.AST_NODE_TYPES.NewExpression}[callee.name='Documentation'] > ${r.AST_NODE_TYPES.ObjectExpression} > ${r.AST_NODE_TYPES.Property}[key.name='numericRange']`,optionalPropStyle:`${r.AST_NODE_TYPES.NewExpression}[callee.name='Integration'] > ${r.AST_NODE_TYPES.ObjectExpression} > ${r.AST_NODE_TYPES.Property}[key.name='optionalPropStyle']`,depicter:`${r.AST_NODE_TYPES.VariableDeclarator}[id.typeAnnotation.typeAnnotation.typeName.name='Depicter'] > ${r.AST_NODE_TYPES.ArrowFunctionExpression}`,nextCall:`${r.AST_NODE_TYPES.VariableDeclarator}[id.typeAnnotation.typeAnnotation.typeName.name='Depicter'] > ${r.AST_NODE_TYPES.ArrowFunctionExpression} ${r.AST_NODE_TYPES.CallExpression}[callee.name='next']`,zod:`${r.AST_NODE_TYPES.ImportDeclaration}[source.value='zod']`,ezFile:`${r.AST_NODE_TYPES.CallExpression}[arguments.0.type='${r.AST_NODE_TYPES.Literal}']:has( ${r.AST_NODE_TYPES.MemberExpression}[object.name='ez'][property.name='file'] )`},E=t=>Object.keys(t).reduce((e,n)=>Object.assign(e,{[T[n]]:t[n]}),{}),l=(t,e)=>[t.range[0],t.range[1]+(e.sourceCode.getTokenAfter(t)?.value===","?1:0)],m=t=>e=>t.report({node:e,messageId:"remove",data:{subject:e.key.name},fix:n=>n.removeRange(l(e,t))}),x=r.ESLintUtils.RuleCreator.withoutDocs({meta:{type:"problem",fixable:"code",schema:[],messages:{change:"change {{ subject }} from {{ from }} to {{ to }}",add:"add {{ subject }} to {{ to }}",move:"move {{ subject }} to {{ to }}",remove:"remove {{ subject }}"}},defaultOptions:[],create:t=>E({numericRange:m(t),optionalPropStyle:m(t),depicter:e=>{let[n,a]=e.params;if(n?.type!==r.AST_NODE_TYPES.Identifier)return;let o=n.name;if(a?.type!==r.AST_NODE_TYPES.ObjectPattern)return;let p=a.properties.find(s=>s.type===r.AST_NODE_TYPES.Property&&s.key.type===r.AST_NODE_TYPES.Identifier&&s.key.name==="next");t.report({node:e,messageId:"change",data:{subject:"arguments",from:`[${o}, { next, ...rest }]`,to:`[{ zodSchema: ${o}, jsonSchema }, { ...rest }]`},fix:s=>{let c=[s.replaceText(n,`{ zodSchema: ${o}, jsonSchema }`)];return p&&c.push(s.removeRange(l(p,t))),c}})},nextCall:e=>t.report({node:e,messageId:"change",data:{subject:"statement",from:"next()",to:"jsonSchema"},fix:n=>n.replaceText(e,"jsonSchema")}),zod:e=>t.report({node:e.source,messageId:"change",data:{subject:"import",from:"zod",to:"zod/v4"},fix:n=>n.replaceText(e.source,'"zod/v4"')}),ezFile:e=>{let[n]=e.arguments,a=n.value==="buffer"?"ez.buffer()":n.value==="base64"?"z.base64()":n.value==="binary"?"ez.buffer().or(z.string())":"z.string()";t.report({node:e,messageId:"change",data:{subject:"schema",from:"ez.file()",to:a},fix:o=>o.replaceText(e,a)})}})}),b={rules:{v24:x}};
@@ -1 +1 @@
1
- import{ESLintUtils as l,AST_NODE_TYPES as r}from"@typescript-eslint/utils";var u={numericRange:`${r.NewExpression}[callee.name='Documentation'] > ${r.ObjectExpression} > ${r.Property}[key.name='numericRange']`,optionalPropStyle:`${r.NewExpression}[callee.name='Integration'] > ${r.ObjectExpression} > ${r.Property}[key.name='optionalPropStyle']`,depicter:`${r.VariableDeclarator}[id.typeAnnotation.typeAnnotation.typeName.name='Depicter'] > ${r.ArrowFunctionExpression}`,nextCall:`${r.VariableDeclarator}[id.typeAnnotation.typeAnnotation.typeName.name='Depicter'] > ${r.ArrowFunctionExpression} ${r.CallExpression}[callee.name='next']`,zod:`${r.ImportDeclaration}[source.value='zod']`},S=e=>Object.keys(e).reduce((t,n)=>Object.assign(t,{[u[n]]:e[n]}),{}),m=(e,t)=>[e.range[0],e.range[1]+(t.sourceCode.getTokenAfter(e)?.value===","?1:0)],c=e=>t=>e.report({node:t,messageId:"remove",data:{subject:t.key.name},fix:n=>n.removeRange(m(t,e))}),d=l.RuleCreator.withoutDocs({meta:{type:"problem",fixable:"code",schema:[],messages:{change:"change {{ subject }} from {{ from }} to {{ to }}",add:"add {{ subject }} to {{ to }}",move:"move {{ subject }} to {{ to }}",remove:"remove {{ subject }}"}},defaultOptions:[],create:e=>S({numericRange:c(e),optionalPropStyle:c(e),depicter:t=>{let[n,s]=t.params;if(n?.type!==r.Identifier)return;let a=n.name;if(s?.type!==r.ObjectPattern)return;let i=s.properties.find(o=>o.type===r.Property&&o.key.type===r.Identifier&&o.key.name==="next");e.report({node:t,messageId:"change",data:{subject:"arguments",from:`[${a}, { next, ...rest }]`,to:`[{ zodSchema: ${a}, jsonSchema }, { ...rest }]`},fix:o=>{let p=[o.replaceText(n,`{ zodSchema: ${a}, jsonSchema }`)];return i&&p.push(o.removeRange(m(i,e))),p}})},nextCall:t=>e.report({node:t,messageId:"change",data:{subject:"statement",from:"next()",to:"jsonSchema"},fix:n=>n.replaceText(t,"jsonSchema")}),zod:t=>e.report({node:t.source,messageId:"change",data:{subject:"import",from:"zod",to:"zod/v4"},fix:n=>n.replaceText(t.source,'"zod/v4"')})})}),g={rules:{v24:d}};export{g as default};
1
+ import{ESLintUtils as l,AST_NODE_TYPES as t}from"@typescript-eslint/utils";var u={numericRange:`${t.NewExpression}[callee.name='Documentation'] > ${t.ObjectExpression} > ${t.Property}[key.name='numericRange']`,optionalPropStyle:`${t.NewExpression}[callee.name='Integration'] > ${t.ObjectExpression} > ${t.Property}[key.name='optionalPropStyle']`,depicter:`${t.VariableDeclarator}[id.typeAnnotation.typeAnnotation.typeName.name='Depicter'] > ${t.ArrowFunctionExpression}`,nextCall:`${t.VariableDeclarator}[id.typeAnnotation.typeAnnotation.typeName.name='Depicter'] > ${t.ArrowFunctionExpression} ${t.CallExpression}[callee.name='next']`,zod:`${t.ImportDeclaration}[source.value='zod']`,ezFile:`${t.CallExpression}[arguments.0.type='${t.Literal}']:has( ${t.MemberExpression}[object.name='ez'][property.name='file'] )`},S=r=>Object.keys(r).reduce((e,n)=>Object.assign(e,{[u[n]]:r[n]}),{}),m=(r,e)=>[r.range[0],r.range[1]+(e.sourceCode.getTokenAfter(r)?.value===","?1:0)],c=r=>e=>r.report({node:e,messageId:"remove",data:{subject:e.key.name},fix:n=>n.removeRange(m(e,r))}),d=l.RuleCreator.withoutDocs({meta:{type:"problem",fixable:"code",schema:[],messages:{change:"change {{ subject }} from {{ from }} to {{ to }}",add:"add {{ subject }} to {{ to }}",move:"move {{ subject }} to {{ to }}",remove:"remove {{ subject }}"}},defaultOptions:[],create:r=>S({numericRange:c(r),optionalPropStyle:c(r),depicter:e=>{let[n,a]=e.params;if(n?.type!==t.Identifier)return;let s=n.name;if(a?.type!==t.ObjectPattern)return;let i=a.properties.find(o=>o.type===t.Property&&o.key.type===t.Identifier&&o.key.name==="next");r.report({node:e,messageId:"change",data:{subject:"arguments",from:`[${s}, { next, ...rest }]`,to:`[{ zodSchema: ${s}, jsonSchema }, { ...rest }]`},fix:o=>{let p=[o.replaceText(n,`{ zodSchema: ${s}, jsonSchema }`)];return i&&p.push(o.removeRange(m(i,r))),p}})},nextCall:e=>r.report({node:e,messageId:"change",data:{subject:"statement",from:"next()",to:"jsonSchema"},fix:n=>n.replaceText(e,"jsonSchema")}),zod:e=>r.report({node:e.source,messageId:"change",data:{subject:"import",from:"zod",to:"zod/v4"},fix:n=>n.replaceText(e.source,'"zod/v4"')}),ezFile:e=>{let[n]=e.arguments,a=n.value==="buffer"?"ez.buffer()":n.value==="base64"?"z.base64()":n.value==="binary"?"ez.buffer().or(z.string())":"z.string()";r.report({node:e,messageId:"change",data:{subject:"schema",from:"ez.file()",to:a},fix:s=>s.replaceText(e,a)})}})}),g={rules:{v24:d}};export{g as default};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "express-zod-api",
3
- "version": "24.0.0-beta.1",
3
+ "version": "24.0.0-beta.11",
4
4
  "description": "A Typescript framework to help you get an API server up and running with I/O schema validation and custom middlewares in minutes.",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -61,7 +61,7 @@
61
61
  "node": "^20.9.0 || ^22.0.0 || ^24.0.0"
62
62
  },
63
63
  "dependencies": {
64
- "ansis": "^4.0.0",
64
+ "ansis": "^4.1.0",
65
65
  "node-mocks-http": "^1.17.2",
66
66
  "openapi3-ts": "^4.4.0",
67
67
  "ramda": "^0.30.1"
@@ -76,7 +76,7 @@
76
76
  "express-fileupload": "^1.5.0",
77
77
  "http-errors": "^2.0.0",
78
78
  "typescript": "^5.1.3",
79
- "zod": "^3.25.1"
79
+ "zod": "^3.25.35"
80
80
  },
81
81
  "peerDependenciesMeta": {
82
82
  "@types/compression": {