express-zod-api 21.0.0-beta.3 → 21.0.0-beta.5

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
@@ -88,28 +88,27 @@ declare const defaultStatusCodes: {
88
88
  negative: number;
89
89
  };
90
90
  type ResponseVariant = keyof typeof defaultStatusCodes;
91
+ /** @public this is the user facing configuration */
91
92
  interface ApiResponse<S extends z.ZodTypeAny> {
92
93
  schema: S;
93
- /**
94
- * @default 200 for a positive response
95
- * @default 400 for a negative response
96
- * @override statusCodes
97
- * */
98
- statusCode?: number;
99
- /**
100
- * @default [200] for positive response
101
- * @default [400] for negative response
102
- * */
103
- statusCodes?: [number, ...number[]];
104
- /**
105
- * @default "application/json"
106
- * @override mimeTypes
107
- * */
108
- mimeType?: string;
109
- /** @default [ "application/json" ] */
110
- mimeTypes?: [string, ...string[]];
94
+ /** @default 200 for a positive and 400 for a negative response */
95
+ statusCode?: number | [number, ...number[]];
96
+ /** @default "application/json" */
97
+ mimeType?: string | [string, ...string[]];
98
+ /** @deprecated use statusCode */
99
+ statusCodes?: never;
100
+ /** @deprecated use mimeType */
101
+ mimeTypes?: never;
102
+ }
103
+ /**
104
+ * @private This is what the framework entities operate
105
+ * @see normalize
106
+ * */
107
+ interface NormalizedResponse {
108
+ schema: z.ZodTypeAny;
109
+ statusCodes: [number, ...number[]];
110
+ mimeTypes: [string, ...string[]];
111
111
  }
112
- type NormalizedResponse = Required<Pick<ApiResponse<z.ZodTypeAny>, "schema" | "statusCodes" | "mimeTypes">>;
113
112
 
114
113
  type LogicalOr<T> = {
115
114
  or: T[];
@@ -269,6 +268,20 @@ declare const contentTypes: {
269
268
  };
270
269
  type ContentType = keyof typeof contentTypes;
271
270
 
271
+ declare class DependsOnMethod extends Nesting {
272
+ /** @desc [method, endpoint, siblingMethods] */
273
+ readonly entries: ReadonlyArray<[Method, AbstractEndpoint, Method[]]>;
274
+ constructor(endpoints: Partial<Record<Method, AbstractEndpoint>>);
275
+ }
276
+
277
+ type OriginalStatic = typeof express__default.static;
278
+ type StaticHandler = ReturnType<OriginalStatic>;
279
+ declare class ServeStatic {
280
+ params: Parameters<OriginalStatic>;
281
+ constructor(...params: Parameters<OriginalStatic>);
282
+ apply(path: string, cb: (path: string, handler: StaticHandler) => void): void;
283
+ }
284
+
272
285
  type ResultSchema<R extends Result> = R extends Result<infer S> ? S : never;
273
286
  /**
274
287
  * @example InputValidationError —> BadRequest(400)
@@ -307,8 +320,8 @@ declare class ResultHandler<POS extends Result, NEG extends Result> extends Abst
307
320
  /** @desc The actual implementation to transmit the response in any case */
308
321
  handler: Handler$1<z.output<ResultSchema<POS> | ResultSchema<NEG>>>;
309
322
  });
310
- getPositiveResponse(output: IOSchema): Required<Pick<ApiResponse<z.ZodTypeAny>, "schema" | "statusCodes" | "mimeTypes">>[];
311
- getNegativeResponse(): Required<Pick<ApiResponse<z.ZodTypeAny>, "schema" | "statusCodes" | "mimeTypes">>[];
323
+ getPositiveResponse(output: IOSchema): NormalizedResponse[];
324
+ getNegativeResponse(): NormalizedResponse[];
312
325
  }
313
326
  declare const defaultResultHandler: ResultHandler<z.ZodObject<{
314
327
  status: z.ZodLiteral<"success">;
@@ -346,6 +359,18 @@ declare const defaultResultHandler: ResultHandler<z.ZodObject<{
346
359
  * */
347
360
  declare const arrayResultHandler: ResultHandler<z.ZodArray<z.ZodTypeAny, "many">, z.ZodString>;
348
361
 
362
+ /** @desc Returns child logger for the given request (if configured) or the configured logger otherwise */
363
+ type GetLogger = (request?: Request) => ActualLogger;
364
+
365
+ interface Routing {
366
+ [SEGMENT: string]: Routing | DependsOnMethod | AbstractEndpoint | ServeStatic;
367
+ }
368
+
369
+ declare abstract class Nesting {
370
+ /** @desc Enables nested routes within the path assigned to the subject */
371
+ nest(routing: Routing): Routing;
372
+ }
373
+
349
374
  type Handler<IN, OUT, OPT> = (params: {
350
375
  input: IN;
351
376
  options: OPT;
@@ -353,8 +378,7 @@ type Handler<IN, OUT, OPT> = (params: {
353
378
  }) => Promise<OUT>;
354
379
  type DescriptionVariant = "short" | "long";
355
380
  type IOVariant = "input" | "output";
356
- type MimeVariant = Extract<IOVariant, "input"> | ResponseVariant;
357
- declare abstract class AbstractEndpoint {
381
+ declare abstract class AbstractEndpoint extends Nesting {
358
382
  abstract execute(params: {
359
383
  request: Request;
360
384
  response: Response;
@@ -364,8 +388,6 @@ declare abstract class AbstractEndpoint {
364
388
  abstract getDescription(variant: DescriptionVariant): string | undefined;
365
389
  abstract getMethods(): ReadonlyArray<Method> | undefined;
366
390
  abstract getSchema(variant: IOVariant): IOSchema;
367
- abstract getSchema(variant: ResponseVariant): z.ZodTypeAny;
368
- abstract getMimeTypes(variant: MimeVariant): ReadonlyArray<string>;
369
391
  abstract getResponses(variant: ResponseVariant): ReadonlyArray<NormalizedResponse>;
370
392
  abstract getSecurity(): LogicalContainer<Security>;
371
393
  abstract getScopes(): ReadonlyArray<string>;
@@ -392,10 +414,8 @@ declare class Endpoint<IN extends IOSchema, OUT extends IOSchema, OPT extends Fl
392
414
  getMethods(): readonly ("get" | "post" | "put" | "delete" | "patch")[] | undefined;
393
415
  getSchema(variant: "input"): IN;
394
416
  getSchema(variant: "output"): OUT;
395
- getSchema(variant: ResponseVariant): z.ZodTypeAny;
396
- getMimeTypes(variant: MimeVariant): readonly string[];
397
417
  getRequestType(): "raw" | "json" | "upload";
398
- getResponses(variant: ResponseVariant): readonly Required<Pick<ApiResponse<z.ZodTypeAny>, "schema" | "statusCodes" | "mimeTypes">>[];
418
+ getResponses(variant: ResponseVariant): readonly NormalizedResponse[];
399
419
  getSecurity(): LogicalContainer<Security>;
400
420
  getScopes(): readonly SCO[];
401
421
  getTags(): readonly TAG[];
@@ -408,9 +428,6 @@ declare class Endpoint<IN extends IOSchema, OUT extends IOSchema, OPT extends Fl
408
428
  }): Promise<undefined>;
409
429
  }
410
430
 
411
- /** @desc Returns child logger for the given request (if configured) or the configured logger otherwise */
412
- type GetLogger = (request?: Request) => ActualLogger;
413
-
414
431
  type InputSource = keyof Pick<Request, "query" | "body" | "files" | "params" | "headers">;
415
432
  type InputSources = Record<Method, InputSource[]>;
416
433
  type Headers = Record<string, string>;
@@ -641,19 +658,10 @@ type BuildProps<IN extends IOSchema, OUT extends IOSchema, MIN extends IOSchema<
641
658
  description?: string;
642
659
  shortDescription?: string;
643
660
  operationId?: string | ((method: Method) => string);
644
- } & ({
645
- method?: Method;
646
- } | {
647
- methods?: [Method, ...Method[]];
648
- }) & ({
649
- scopes?: SCO[];
650
- } | {
651
- scope?: SCO;
652
- }) & ({
653
- tags?: TAG[];
654
- } | {
655
- tag?: TAG;
656
- });
661
+ method?: Method | [Method, ...Method[]];
662
+ scope?: SCO | SCO[];
663
+ tag?: TAG | TAG[];
664
+ };
657
665
  declare class EndpointsFactory<IN extends IOSchema<"strip"> = EmptySchema, OUT extends FlatObject = EmptyObject, SCO extends string = string, TAG extends string = string> {
658
666
  #private;
659
667
  protected resultHandler: AbstractResultHandler;
@@ -671,7 +679,7 @@ declare class EndpointsFactory<IN extends IOSchema<"strip"> = EmptySchema, OUT e
671
679
  } | undefined) => EndpointsFactory<IN, OUT & AOUT, SCO, TAG>;
672
680
  addExpressMiddleware<R extends Request, S extends Response, AOUT extends FlatObject = EmptyObject>(...params: ConstructorParameters<typeof ExpressMiddleware<R, S, AOUT>>): EndpointsFactory<IN, OUT & AOUT, SCO, TAG>;
673
681
  addOptions<AOUT extends FlatObject>(getOptions: () => Promise<AOUT>): EndpointsFactory<IN, OUT & AOUT, SCO, TAG>;
674
- build<BOUT extends IOSchema, BIN extends IOSchema = EmptySchema>({ input, handler, output: outputSchema, description, shortDescription, operationId, ...rest }: BuildProps<BIN, BOUT, IN, OUT, SCO, TAG>): Endpoint<z.ZodIntersection<IN, BIN>, BOUT, OUT, SCO, TAG>;
682
+ build<BOUT extends IOSchema, BIN extends IOSchema = EmptySchema>({ input, handler, output: outputSchema, description, shortDescription, operationId, scope, tag, method, }: BuildProps<BIN, BOUT, IN, OUT, SCO, TAG>): Endpoint<z.ZodIntersection<IN, BIN>, BOUT, OUT, SCO, TAG>;
675
683
  }
676
684
  declare const defaultEndpointsFactory: EndpointsFactory<EmptySchema, EmptyObject, string, string>;
677
685
  /**
@@ -681,24 +689,6 @@ declare const defaultEndpointsFactory: EndpointsFactory<EmptySchema, EmptyObject
681
689
  */
682
690
  declare const arrayEndpointsFactory: EndpointsFactory<EmptySchema, EmptyObject, string, string>;
683
691
 
684
- declare class DependsOnMethod {
685
- /** @desc [method, endpoint, siblingMethods] */
686
- readonly entries: ReadonlyArray<[Method, AbstractEndpoint, Method[]]>;
687
- constructor(endpoints: Partial<Record<Method, AbstractEndpoint>>);
688
- }
689
-
690
- type OriginalStatic = typeof express__default.static;
691
- type StaticHandler = ReturnType<OriginalStatic>;
692
- declare class ServeStatic {
693
- params: Parameters<OriginalStatic>;
694
- constructor(...params: Parameters<OriginalStatic>);
695
- apply(path: string, cb: (path: string, handler: StaticHandler) => void): void;
696
- }
697
-
698
- interface Routing {
699
- [SEGMENT: string]: Routing | DependsOnMethod | AbstractEndpoint | ServeStatic;
700
- }
701
-
702
692
  declare const attachRouting: (config: AppConfig, routing: Routing) => {
703
693
  notFoundHandler: express__default.RequestHandler<express_serve_static_core.ParamsDictionary, any, any, qs.ParsedQs, Record<string, any>>;
704
694
  logger: AbstractLogger | BuiltinLogger;
@@ -806,9 +796,7 @@ declare class RoutingError extends Error {
806
796
  declare class DocumentationError extends Error {
807
797
  name: string;
808
798
  readonly cause: string;
809
- constructor({ message, method, path, isResponse, }: {
810
- message: string;
811
- } & Pick<OpenAPIContext, "path" | "method" | "isResponse">);
799
+ constructor(message: string, { method, path, isResponse, }: Pick<OpenAPIContext, "path" | "method" | "isResponse">);
812
800
  }
813
801
  /** @desc An error related to the input and output schemas declaration */
814
802
  declare class IOSchemaError extends Error {
@@ -1003,7 +991,7 @@ declare class Integration {
1003
991
  searchParamsConst: ts.Identifier;
1004
992
  exampleImplementationConst: ts.Identifier;
1005
993
  clientConst: ts.Identifier;
1006
- parserConst: ts.Identifier;
994
+ isJsonConst: ts.Identifier;
1007
995
  };
1008
996
  protected interfaces: Array<{
1009
997
  id: ts.Identifier;
@@ -1017,4 +1005,4 @@ declare class Integration {
1017
1005
  printFormatted({ printerOptions, format: userDefined, }?: FormattedPrintingOptions): Promise<string>;
1018
1006
  }
1019
1007
 
1020
- export { type ApiResponse, type AppConfig, type BasicSecurity, type BearerSecurity, BuiltinLogger, type CommonConfig, type CookieSecurity, type CustomHeaderSecurity, DependsOnMethod, type Depicter, Documentation, DocumentationError, EndpointsFactory, type FlatObject, 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, arrayEndpointsFactory, arrayResultHandler, attachRouting, createConfig, createServer, defaultEndpointsFactory, defaultResultHandler, ensureHttpError, ez, getExamples, getMessageFromError, testEndpoint, testMiddleware };
1008
+ export { type ApiResponse, type AppConfig, type BasicSecurity, type BearerSecurity, BuiltinLogger, type CommonConfig, type CookieSecurity, type CustomHeaderSecurity, DependsOnMethod, type Depicter, Documentation, DocumentationError, EndpointsFactory, type FlatObject, type IOSchema, type InputSecurity, InputValidationError, Integration, type LoggerOverrides, type Method, Middleware, MissingPeerError, type NormalizedResponse, type OAuth2Security, type OpenIdSecurity, OutputValidationError, type Producer, ResultHandler, type Routing, RoutingError, ServeStatic, type ServerConfig, arrayEndpointsFactory, arrayResultHandler, attachRouting, createConfig, createServer, defaultEndpointsFactory, defaultResultHandler, ensureHttpError, ez, getExamples, getMessageFromError, testEndpoint, testMiddleware };
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
- import{clone as Wt,fromPairs as Io,map as Co,pipe as Zo,toPairs as Eo,pair as vo}from"ramda";import{z as ce}from"zod";import{memoizeWith as bo,pickBy as So,xprod as To}from"ramda";import{z as Oo}from"zod";var R={json:"application/json",upload:"multipart/form-data",raw:"application/octet-stream"};var pe=class extends Error{name="RoutingError"},E=class extends Error{name="DocumentationError";cause;constructor({message: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"},Y=class extends He{constructor(r){super(Q(r),{cause:r});this.cause=r}name="OutputValidationError"},K=class extends He{constructor(r){super(Q(r),{cause:r});this.cause=r}name="InputValidationError"},F=class extends Error{constructor(r,o){super(Q(r),{cause:r});this.cause=r;this.handled=o}name="ResultHandlerError"},Re=class extends Error{name="MissingPeerError";constructor(t){super(`Missing peer dependency: ${t}. Please install it to use the feature.`)}};var Ro=e=>{let r=(e.header("content-type")||"").toLowerCase().startsWith(R.upload);return"files"in e&&r},mt={get:["query","params"],post:["body","params","files"],put:["body","params"],patch:["body","params"],delete:["query","params"]},Ao=["body","query","params"],ut=e=>e.method.toLowerCase(),ft=e=>e.startsWith("x-"),Po=e=>So((t,r)=>ft(r),e),Ue=(e,t={})=>{let r=ut(e);return r==="options"?{}:(t[r]||mt[r]||Ao).filter(o=>o==="files"?Ro(e):!0).map(o=>o==="headers"?Po(e[o]):e[o]).reduce((o,n)=>Object.assign(o,n),{})},B=e=>e instanceof Error?e:new Error(String(e)),Q=e=>e instanceof Oo.ZodError?e.issues.map(({path:t,message:r})=>(t.length?[t.join("/")]:[]).concat(r).join(": ")).join("; "):e instanceof Y?`output${e.cause.issues[0]?.path.length>0?"/":": "}${e.message}`:e.message,q=({schema:e,variant:t="original",validate:r=t==="parsed"})=>{let o=e._def[h]?.examples||[];if(!r&&t==="original")return o;let n=[];for(let i of o){let a=e.safeParse(i);a.success&&n.push(t==="parsed"?a.data:i)}return n},W=(e,t,r)=>e.length&&t.length?To(e,t).map(r):e.concat(t),Ae=e=>"coerce"in e._def&&typeof e._def.coerce=="boolean"?e._def.coerce:!1,yt=e=>e.charAt(0).toUpperCase()+e.slice(1).toLowerCase(),v=(...e)=>e.flatMap(t=>t.split(/[^A-Z0-9]/gi)).flatMap(t=>t.replaceAll(/[A-Z]+/g,r=>`/${r}`).split("/")).map(yt).join(""),Ke=(e,t)=>{try{return typeof e.parse(t)}catch{return}},J=e=>typeof e=="object"&&e!==null,De=bo(()=>"static",()=>process.env.NODE_ENV==="production");import{clone as wo,mergeDeepRight as zo}from"ramda";var h=Symbol.for("express-zod-api"),Fe=e=>{let t=e.describe(e.description);return t._def[h]=wo(t._def[h])||{examples:[]},t},Qt=(e,t)=>{if(!(h in e._def))return t;let r=Fe(t);return r._def[h].examples=W(r._def[h].examples,e._def[h].examples,([o,n])=>typeof o=="object"&&typeof n=="object"?zo({...o},{...n}):n),r};var jo=function(e){let t=Fe(this);return t._def[h].examples.push(e),t},No=function(e){let t=Fe(this);return t._def[h].defaultLabel=e,t},Lo=function(e){return new ce.ZodBranded({typeName:ce.ZodFirstPartyTypeKind.ZodBranded,type:this,description:this._def.description,errorMap:this._def.errorMap,[h]:{examples:[],...Wt(this._def[h]),brand:e}})},ko=function(e){let t=typeof e=="function"?e:Zo(Eo,Co(([n,i])=>vo(e[String(n)]||n,i)),Io),r=t(Wt(this.shape)),o=ce.object(r)[this._def.unknownKeys]();return this.transform(t).pipe(o)};h in globalThis||(globalThis[h]=!0,Object.defineProperties(ce.ZodType.prototype,{example:{get(){return jo.bind(this)}},brand:{set(){},get(){return Lo.bind(this)}}}),Object.defineProperty(ce.ZodDefault.prototype,"label",{get(){return No.bind(this)}}),Object.defineProperty(ce.ZodObject.prototype,"remap",{get(){return ko.bind(this)}}));function Mo(e){return e}import{z as _o}from"zod";import{z as pr}from"zod";import{fail as A}from"node:assert/strict";import{z as Pe}from"zod";var Be=e=>!isNaN(e.getTime());var X=Symbol("DateIn"),Jt=()=>Pe.union([Pe.string().date(),Pe.string().datetime(),Pe.string().datetime({local:!0})]).transform(t=>new Date(t)).pipe(Pe.date().refine(Be)).brand(X);import{z as Ho}from"zod";var ee=Symbol("DateOut"),Xt=()=>Ho.date().refine(Be).transform(e=>e.toISOString()).brand(ee);import{z as qe}from"zod";var k=Symbol("File"),er=qe.custom(e=>Buffer.isBuffer(e),{message:"Expected Buffer"}),Uo={buffer:()=>er.brand(k),string:()=>qe.string().brand(k),binary:()=>er.or(qe.string()).brand(k),base64:()=>qe.string().base64().brand(k)};function Ve(e){return Uo[e||"string"]()}import{z as Ko}from"zod";var V=Symbol("Raw"),tr=(e={})=>Ko.object({raw:Ve("buffer")}).extend(e).brand(V);import{z as Do}from"zod";var de=Symbol("Upload"),rr=()=>Do.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",e=>({message:`Expected file upload, received ${typeof e}`})).brand(de);var or=(e,{next:t})=>e.options.some(t),Fo=({_def:e},{next:t})=>[e.left,e.right].some(t),$e=(e,{next:t})=>t(e.unwrap()),gt={ZodObject:({shape:e},{next:t})=>Object.values(e).some(t),ZodUnion:or,ZodDiscriminatedUnion:or,ZodIntersection:Fo,ZodEffects:(e,{next:t})=>t(e.innerType()),ZodOptional:$e,ZodNullable:$e,ZodRecord:({valueSchema:e},{next:t})=>t(e),ZodArray:({element:e},{next:t})=>t(e),ZodDefault:({_def:e},{next:t})=>t(e.innerType)},Ge=(e,{condition:t,rules:r=gt,depth:o=1,maxDepth:n=Number.POSITIVE_INFINITY})=>{if(t?.(e))return!0;let i=o<n?r[e._def[h]?.brand]||r[e._def.typeName]:void 0;return i?i(e,{next:a=>Ge(a,{condition:t,rules:r,maxDepth:n,depth:o+1})}):!1},nr=e=>Ge(e,{condition:t=>t._def[h]?.brand===de}),sr=e=>Ge(e,{condition:t=>t._def[h]?.brand===V,maxDepth:3}),ht=(e,t)=>{let r=new WeakSet;return Ge(e,{maxDepth:300,rules:{...gt,ZodBranded:$e,ZodReadonly:$e,ZodCatch:({_def:{innerType:o}},{next:n})=>n(o),ZodPipeline:({_def:o},{next:n})=>n(o[t]),ZodLazy:(o,{next:n})=>r.has(o)?!1:r.add(o)&&n(o.schema),ZodTuple:({items:o,_def:{rest:n}},{next:i})=>[...o].concat(n??[]).some(i),ZodEffects:{out:void 0,in:gt.ZodEffects}[t],ZodNaN:()=>A("z.nan()"),ZodSymbol:()=>A("z.symbol()"),ZodFunction:()=>A("z.function()"),ZodMap:()=>A("z.map()"),ZodSet:()=>A("z.set()"),ZodBigInt:()=>A("z.bigint()"),ZodVoid:()=>A("z.void()"),ZodPromise:()=>A("z.promise()"),ZodNever:()=>A("z.never()"),ZodDate:()=>t==="in"&&A("z.date()"),[ee]:()=>t==="in"&&A("ez.dateOut()"),[X]:()=>t==="out"&&A("ez.dateIn()"),[V]:()=>t==="out"&&A("ez.raw()"),[de]:()=>t==="out"&&A("ez.upload()"),[k]:()=>!1}})};import Vo,{isHttpError as $o}from"http-errors";import ir,{isHttpError as Bo}from"http-errors";import{z as qo}from"zod";var _e=(e,t)=>{if(typeof e=="function")return _e(e(...t.arguments),t);if(e instanceof qo.ZodType)return[{...t,schema:e}];if(Array.isArray(e)&&!e.length)throw new F(new Error(`At least one ${t.variant} response schema required.`));return(Array.isArray(e)?e:[e]).map(({schema:r,statusCodes:o,statusCode:n,mimeTypes:i,mimeType:a})=>({schema:r,statusCodes:n?[n]:o||t.statusCodes,mimeTypes:a?[a]:i||t.mimeTypes}))},xt=(e,t,{url:r},o)=>!e.expose&&t.error("Server side error",{error:e,url:r,payload:o}),Ye=e=>Bo(e)?e:ir(e instanceof K?400:500,Q(e),{cause:e.cause||e}),we=e=>De()&&!e.expose?ir(e.statusCode).message:e.message;var Qe=({error:e,logger:t,response:r})=>{t.error("Result handler failure",e);let o=we(Vo(500,`An error occurred while serving the result: ${e.message}.`+(e.handled?`
2
- Original error: ${e.handled.message}.`:""),{expose:$o(e.cause)?e.cause.expose:!1}));r.status(500).type("text/plain").end(o)};import{chain as Go}from"ramda";var te=e=>J(e)&&"or"in e,me=e=>J(e)&&"and"in e,bt=e=>({and:Go(t=>me(t)?t.and:[t],e)}),We=(e,t)=>me(e)?{and:e.and.map(r=>te(r)?{or:r.or.map(t)}:t(r))}:te(e)?{or:e.or.map(r=>me(r)?{and:r.and.map(t)}:t(r))}:t(e),St=e=>e.and.reduce((t,r)=>({or:W(t.or,te(r)?r.or:[r],bt)}),{or:[]}),le=(e,t)=>me(e)?te(t)?le(St(e),t):bt([e,t]):te(e)?me(t)?le(t,e):te(t)?{or:W(e.or,t.or,bt)}:le(e,{and:[t]}):me(t)||te(t)?le(t,e):{and:[e,t]};import{z as ar}from"zod";var Tt=class{},$=class extends Tt{#e;#t;#r;constructor({input:t=ar.object({}),security:r,handler:o}){super(),this.#e=t,this.#t=r,this.#r=o}getSecurity(){return this.#t}getSchema(){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 ar.ZodError?new K(o):o}}},ue=class extends ${constructor(t,{provider:r=()=>({}),transformer:o=n=>n}={}){super({handler:async({request:n,response:i})=>new Promise((a,p)=>{let d=c=>{if(c&&c instanceof Error)return p(o(c));a(r(n,i))};t(n,i,d)?.catch(d)})})}};var ze=class{},Je=class extends ze{#e;#t;#r;#i;#o;#a;#p;#n;#c;#d;#l;#s;constructor({methods:t,inputSchema:r,outputSchema:o,handler:n,resultHandler:i,getOperationId:a=()=>{},scopes:p=[],middlewares:d=[],tags:c=[],description:f,shortDescription:l}){super(),this.#a=n,this.#p=i,this.#r=d,this.#l=a,this.#t=Object.freeze(t),this.#c=Object.freeze(p),this.#d=Object.freeze(c),this.#e={long:f,short:l},this.#n={input:r,output:o},this.#o={positive:Object.freeze(i.getPositiveResponse(o)),negative:Object.freeze(i.getNegativeResponse())},this.#s=nr(r)?"upload":sr(r)?"raw":"json",this.#i={input:Object.freeze([R[this.#s]]),positive:Object.freeze(this.#o.positive.flatMap(({mimeTypes:y})=>y)),negative:Object.freeze(this.#o.negative.flatMap(({mimeTypes:y})=>y))}}getDescription(t){return this.#e[t]}getMethods(){return this.#t}getSchema(t){return t==="input"||t==="output"?this.#n[t]:this.getResponses(t).map(({schema:r})=>r).reduce((r,o)=>r.or(o))}getMimeTypes(t){return this.#i[t]}getRequestType(){return this.#s}getResponses(t){return this.#o[t]}getSecurity(){return this.#r.reduce((t,r)=>{let o=r.getSecurity();return o?le(t,o):t},{and:[]})}getScopes(){return this.#c}getTags(){return this.#d}getOperationId(t){return this.#l(t)}async#m(t){try{return await this.#n.output.parseAsync(t)}catch(r){throw r instanceof pr.ZodError?new Y(r):r}}async#u({method:t,logger:r,options:o,response:n,...i}){for(let a of this.#r)if(!(t==="options"&&!(a instanceof ue))&&(Object.assign(o,await a.execute({...i,options:o,response:n,logger:r})),n.writableEnded)){r.warn("A middleware has closed the stream. Accumulated options:",o);break}}async#f({input:t,...r}){let o;try{o=await this.#n.input.parseAsync(t)}catch(n){throw n instanceof pr.ZodError?new K(n):n}return this.#a({...r,input:o})}async#y({error:t,...r}){try{await this.#p.execute({...r,error:t})}catch(o){Qe({...r,error:new F(B(o),t||void 0)})}}async execute({request:t,response:r,logger:o,config:n}){let i=ut(t),a={},p=null,d=null,c=Ue(t,n.inputSources);try{if(await this.#u({method:i,input:c,request:t,response:r,logger:o,options:a}),r.writableEnded)return;if(i==="options")return void r.status(200).end();p=await this.#m(await this.#f({input:c,logger:o,options:a}))}catch(f){d=B(f)}await this.#y({input:c,output:p,request:t,response:r,error:d,logger:o,options:a})}};var cr=(e,t)=>{let r=e.map(n=>n.getSchema()).concat(t),o=r.reduce((n,i)=>n.and(i));return r.reduce((n,i)=>Qt(i,n),o)};import{z as M}from"zod";var re={positive:200,negative:400};var Ot=class{#e;constructor(t){this.#e=t}execute(...t){return this.#e(...t)}},Ie=class extends Ot{#e;#t;constructor(t){super(t.handler),this.#e=t.positive,this.#t=t.negative}getPositiveResponse(t){return _e(this.#e,{variant:"positive",arguments:[t],statusCodes:[re.positive],mimeTypes:[R.json]})}getNegativeResponse(){return _e(this.#t,{variant:"negative",arguments:[],statusCodes:[re.negative],mimeTypes:[R.json]})}},Ce=new Ie({positive:e=>{let t=q({schema:e}),r=M.object({status:M.literal("success"),data:e});return t.reduce((o,n)=>o.example({status:"success",data:n}),r)},negative:M.object({status:M.literal("error"),error:M.object({message:M.string()})}).example({status:"error",error:{message:"Sample error message"}}),handler:({error:e,input:t,output:r,request:o,response:n,logger:i})=>{if(e){let a=Ye(e);return xt(a,i,o,t),void n.status(a.statusCode).json({status:"error",error:{message:we(a)}})}n.status(re.positive).json({status:"success",data:r})}}),Rt=new Ie({positive:e=>{let t=q({schema:e}),r="shape"in e&&"items"in e.shape&&e.shape.items instanceof M.ZodArray?e.shape.items:M.array(M.any());return t.reduce((o,n)=>J(n)&&"items"in n&&Array.isArray(n.items)?o.example(n.items):o,r)},negative:M.string().example("Sample error message"),handler:({response:e,output:t,error:r,logger:o,request:n,input:i})=>{if(r){let a=Ye(r);return xt(a,o,n,i),void e.status(a.statusCode).type("text/plain").send(we(a))}if(t&&"items"in t&&Array.isArray(t.items))return void e.status(re.positive).json(t.items);throw new Error("Property 'items' is missing in the endpoint output")}});var Ze=class e{resultHandler;middlewares=[];constructor(t){this.resultHandler="resultHandler"in t?t.resultHandler:t}static#e(t,r){let o=new e(r);return o.middlewares=t,o}addMiddleware(t){return e.#e(this.middlewares.concat(t instanceof $?t:new $(t)),this.resultHandler)}use=this.addExpressMiddleware;addExpressMiddleware(...t){return e.#e(this.middlewares.concat(new ue(...t)),this.resultHandler)}addOptions(t){return e.#e(this.middlewares.concat(new $({handler:t})),this.resultHandler)}build({input:t=_o.object({}),handler:r,output:o,description:n,shortDescription:i,operationId:a,...p}){let{middlewares:d,resultHandler:c}=this,f="method"in p&&p.method?[p.method]:"methods"in p&&p.methods||void 0,l=typeof a=="function"?a:()=>a,y="scopes"in p?p.scopes:"scope"in p&&p.scope?[p.scope]:[],x="tags"in p?p.tags:"tag"in p&&p.tag?[p.tag]:[];return new Je({handler:r,middlewares:d,outputSchema:o,resultHandler:c,scopes:y,tags:x,methods:f,getOperationId:l,description:n,shortDescription:i,inputSchema:cr(d,t)})}},Yo=new Ze(Ce),Qo=new Ze(Rt);import{Ansis as Jo,blue as Xo,cyanBright as en,green as tn,hex as rn,red as on}from"ansis";import{inspect as nn}from"node:util";import{performance as gr}from"node:perf_hooks";var et={debug:10,info:20,warn:30,error:40},lr=e=>J(e)&&Object.keys(et).some(t=>t in e),mr=e=>e in et,ur=(e,t)=>et[e]<et[t],fr=(e=0)=>Intl.NumberFormat(void 0,{useGrouping:!1,minimumFractionDigits:0,maximumFractionDigits:e}),Xe=fr(),dr=fr(2),Wo=e=>e<1e-6?["picosecond",e/1e-9,Xe]:e<.001?["nanosecond",e/1e-6,Xe]:e<1?["microsecond",e/.001,Xe]:e<1e3?["millisecond",e,Xe]:e<6e4?["second",e/1e3,dr]:["minute",e/6e4,dr],yr=e=>{let[t,r,o]=Wo(e);return`${o.format(r)} ${t}${r>1?"s":""}`};var Ee=class e{config;styles={debug:Xo,info:tn,warn:rn("#FFA500"),error:on};constructor(t={}){let{color:r=new Jo().isSupported(),level:o=De()?"warn":"debug",depth:n=2,ctx:i={}}=t;this.config={color:r,level:o,depth:n,ctx:i}}prettyPrint(t){let{depth:r,color:o,level:n}=this.config;return nn(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:i,...a},color:p}=this.config;if(n==="silent"||ur(t,n))return;let d=[new Date().toISOString()];i&&d.push(p?en(i):i),d.push(p?`${this.styles[t](t)}:`:`${t}:`,r),o!==void 0&&d.push(this.prettyPrint(o)),Object.keys(a).length>0&&d.push(this.prettyPrint(a)),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})}profile(t){let r=gr.now();return()=>{let o=gr.now()-r,{message:n,severity:i="debug",formatter:a=yr}=typeof t=="object"?t:{message:t};this.print(typeof i=="function"?i(o):i,n,a(o))}}};import{keys as sn,reject as an,equals as pn}from"ramda";var ve=class{entries;constructor(t){let r=[],o=sn(t);for(let n of o){let i=t[n];i&&r.push([n,i,an(pn(n),o)])}this.entries=Object.freeze(r)}};import cn from"express";var je=class{params;constructor(...t){this.params=t}apply(t,r){return r(t,cn.static(...this.params))}};import Pt from"express";import gn from"node:http";import hn from"node:https";var fe=async(e,t="default")=>{try{return(await import(e))[t]}catch{}throw new Re(e)};var hr=(e,t)=>Object.entries(e).map(([r,o])=>{if(r.includes("/"))throw new pe(`The entry '${r}' must avoid having slashes \u2014 use nesting instead.`);let n=r.trim();return[`${t||""}${n?`/${n}`:""}`,o]}),ye=({routing:e,onEndpoint:t,onStatic:r})=>{let o=hr(e);for(;o.length;){let[n,i]=o.shift();if(i instanceof ze){let a=i.getMethods()||["get"];for(let p of a)t(i,n,p)}else if(i instanceof je)r&&i.apply(n,r);else if(i instanceof ve)for(let[a,p,d]of i.entries){let c=p.getMethods();if(c&&!c.includes(a))throw new pe(`Endpoint assigned to ${a} method of ${n} must support ${a} method.`);t(p,n,a,d)}else o.push(...hr(i,n))}};var At=({app:e,getLogger:t,config:r,routing:o,parsers:n})=>{let i=new WeakSet,a=new Set;ye({routing:o,onStatic:(p,d)=>void e.use(p,d),onEndpoint:(p,d,c,f)=>{let l=p.getRequestType();if(!i.has(p)){if(l==="json")try{ht(p.getSchema("input"),"in")}catch(u){t().warn("The final input schema of the endpoint contains an unsupported JSON payload type.",{path:d,method:c,reason:u})}for(let u of["positive","negative"])if(p.getMimeTypes(u).includes(R.json))try{ht(p.getSchema(u),"out")}catch(T){t().warn(`The final ${u} response schema of the endpoint contains an unsupported JSON payload type.`,{path:d,method:c,reason:T})}i.add(p)}let x={"Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":[c,...f||[],"options"].join(", ").toUpperCase(),"Access-Control-Allow-Headers":"content-type"},P=n?.[l]||[],O=async(u,T)=>{let z=t(u);if(r.cors){let L=typeof r.cors=="function"?await r.cors({request:u,endpoint:p,logger:z,defaultHeaders:x}):x;for(let H in L)T.set(H,L[H])}return p.execute({request:u,response:T,logger:z,config:r})};r.cors&&!a.has(d)&&(e.options(d,...P,O),a.add(d)),e[c](d,...P,O)}})};import Ar,{isHttpError as ln}from"http-errors";import{setInterval as dn}from"node:timers/promises";var xr=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",br=e=>"server"in e&&typeof e.server=="object"&&e.server!==null&&"close"in e.server&&typeof e.server.close=="function",Sr=e=>"encrypted"in e&&typeof e.encrypted=="boolean"&&e.encrypted,Tr=({},e)=>void(!e.headersSent&&e.setHeader("connection","close")),Or=e=>new Promise((t,r)=>void e.close(o=>o?r(o):t()));var Rr=(e,{timeout:t=1e3,logger:r}={})=>{let o,n=new Set,i=c=>void n.delete(c.destroy()),a=c=>void(xr(c)?!c._httpMessage.headersSent&&c._httpMessage.setHeader("connection","close"):i(c)),p=c=>void(o?c.destroy():n.add(c.once("close",()=>void n.delete(c))));for(let c of e)for(let f of["connection","secureConnection"])c.on(f,p);let d=async()=>{for(let c of e)c.on("request",Tr);r?.info("Graceful shutdown",{sockets:n.size,timeout:t});for(let c of n)(Sr(c)||br(c))&&a(c);for await(let c of dn(10,Date.now()))if(n.size===0||Date.now()-c>=t)break;for(let c of n)i(c);return Promise.allSettled(e.map(Or))};return{sockets:n,shutdown:()=>o??=d()}};var Pr=({errorHandler:e,getLogger:t})=>async(r,o,n,i)=>r?e.execute({error:ln(r)?r:Ar(400,B(r).message),request:o,response:n,input:null,output:null,options:{},logger:t(o)}):i(),wr=({errorHandler:e,getLogger:t})=>async(r,o)=>{let n=Ar(404,`Can not ${r.method} ${r.path}`),i=t(r);try{e.execute({request:r,response:o,logger:i,error:n,input:null,output:null,options:{}})}catch(a){Qe({response:o,logger:i,error:new F(B(a),n)})}},mn=e=>(t,{},r)=>{if(Object.values(t?.files||[]).flat().find(({truncated:n})=>n))return r(e);r()},un=e=>({log:e.debug.bind(e)}),zr=async({getLogger:e,config:t})=>{let r=await fe("express-fileupload"),{limitError:o,beforeUpload:n,...i}={...typeof t.upload=="object"&&t.upload},a=[];return a.push(async(p,d,c)=>{let f=e(p);try{await n?.({request:p,logger:f})}catch(l){return c(l)}return r({debug:!0,...i,abortOnLimit:!1,parseNested:!0,logger:un(f)})(p,d,c)}),o&&a.push(mn(o)),a},Ir=(e,{},t)=>{Buffer.isBuffer(e.body)&&(e.body={raw:e.body}),t()},Cr=({logger:e,config:t})=>async(r,o,n)=>{let i=await t.childLoggerProvider?.({request:r,parent:e})||e;i.debug(`${r.method}: ${r.path}`),r.res&&(r.res.locals[h]={logger:i}),n()},Zr=e=>t=>t?.res?.locals[h]?.logger||e,Er=e=>process.on("deprecation",({message:t,namespace:r,name:o,stack:n})=>e.warn(`${o} (${r}): ${t}`,n.split(`
3
- `).slice(1))),vr=({servers:e,logger:t,options:{timeout:r,events:o=["SIGINT","SIGTERM"]}})=>{let n=Rr(e,{logger:t,timeout:r}),i=()=>n.shutdown().then(()=>process.exit());for(let a of o)process.on(a,i)};import{gray as fn,hex as jr,italic as tt,whiteBright as yn}from"ansis";var Nr=()=>{let e=tt("Proudly supports transgender community.".padStart(109)),t=tt("Start your API server with I/O schema validation and custom middlewares in minutes.".padStart(109)),r=tt("Thank you for choosing Express Zod API for your project.".padStart(132)),o=tt("for Kesaria".padEnd(20)),n=jr("#F5A9B8"),i=jr("#5BCEFA"),a=new Array(14).fill(i,1,3).fill(n,3,5).fill(yn,5,7).fill(n,7,9).fill(i,9,12).fill(fn,12,13);return`
1
+ import{clone as Wt,fromPairs as Co,map as Zo,pipe as Eo,toPairs as vo,pair as jo}from"ramda";import{z as de}from"zod";import{memoizeWith as So,pickBy as To,xprod as Oo}from"ramda";import{z as Ro}from"zod";var A={json:"application/json",upload:"multipart/form-data",raw:"application/octet-stream"};var ce=class extends Error{name="RoutingError"},v=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.`}},Ue=class extends Error{name="IOSchemaError"},Q=class extends Ue{constructor(r){super(J(r),{cause:r});this.cause=r}name="OutputValidationError"},K=class extends Ue{constructor(r){super(J(r),{cause:r});this.cause=r}name="InputValidationError"},B=class extends Error{constructor(r,o){super(J(r),{cause:r});this.cause=r;this.handled=o}name="ResultHandlerError"},Ae=class extends Error{name="MissingPeerError";constructor(t){super(`Missing peer dependency: ${t}. Please install it to use the feature.`)}};var Ao=e=>{let r=(e.header("content-type")||"").toLowerCase().startsWith(A.upload);return"files"in e&&r},ut={get:["query","params"],post:["body","params","files"],put:["body","params"],patch:["body","params"],delete:["query","params"]},Po=["body","query","params"],ft=e=>e.method.toLowerCase(),yt=e=>e.startsWith("x-"),wo=e=>To((t,r)=>yt(r),e),De=(e,t={})=>{let r=ft(e);return r==="options"?{}:(t[r]||ut[r]||Po).filter(o=>o==="files"?Ao(e):!0).map(o=>o==="headers"?wo(e[o]):e[o]).reduce((o,n)=>Object.assign(o,n),{})},q=e=>e instanceof Error?e:new Error(String(e)),J=e=>e instanceof Ro.ZodError?e.issues.map(({path:t,message:r})=>(t.length?[t.join("/")]:[]).concat(r).join(": ")).join("; "):e instanceof Q?`output${e.cause.issues[0]?.path.length>0?"/":": "}${e.message}`:e.message,$=({schema:e,variant:t="original",validate:r=t==="parsed"})=>{let o=e._def[h]?.examples||[];if(!r&&t==="original")return o;let n=[];for(let i of o){let a=e.safeParse(i);a.success&&n.push(t==="parsed"?a.data:i)}return n},W=(e,t,r)=>e.length&&t.length?Oo(e,t).map(r):e.concat(t),Pe=e=>"coerce"in e._def&&typeof e._def.coerce=="boolean"?e._def.coerce:!1,gt=e=>e.charAt(0).toUpperCase()+e.slice(1).toLowerCase(),j=(...e)=>e.flatMap(t=>t.split(/[^A-Z0-9]/gi)).flatMap(t=>t.replaceAll(/[A-Z]+/g,r=>`/${r}`).split("/")).map(gt).join(""),Ke=(e,t)=>{try{return typeof e.parse(t)}catch{return}},X=e=>typeof e=="object"&&e!==null,Fe=So(()=>"static",()=>process.env.NODE_ENV==="production");import{clone as zo,mergeDeepRight as Io}from"ramda";var h=Symbol.for("express-zod-api"),Be=e=>{let t=e.describe(e.description);return t._def[h]=zo(t._def[h])||{examples:[]},t},Jt=(e,t)=>{if(!(h in e._def))return t;let r=Be(t);return r._def[h].examples=W(r._def[h].examples,e._def[h].examples,([o,n])=>typeof o=="object"&&typeof n=="object"?Io({...o},{...n}):n),r};var No=function(e){let t=Be(this);return t._def[h].examples.push(e),t},Lo=function(e){let t=Be(this);return t._def[h].defaultLabel=e,t},ko=function(e){return new de.ZodBranded({typeName:de.ZodFirstPartyTypeKind.ZodBranded,type:this,description:this._def.description,errorMap:this._def.errorMap,[h]:{examples:[],...Wt(this._def[h]),brand:e}})},Mo=function(e){let t=typeof e=="function"?e:Eo(vo,Zo(([n,i])=>jo(e[String(n)]||n,i)),Co),r=t(Wt(this.shape)),o=de.object(r)[this._def.unknownKeys]();return this.transform(t).pipe(o)};h in globalThis||(globalThis[h]=!0,Object.defineProperties(de.ZodType.prototype,{example:{get(){return No.bind(this)}},brand:{set(){},get(){return ko.bind(this)}}}),Object.defineProperty(de.ZodDefault.prototype,"label",{get(){return Lo.bind(this)}}),Object.defineProperty(de.ZodObject.prototype,"remap",{get(){return Mo.bind(this)}}));function Ho(e){return e}import{z as Yo}from"zod";import{z as cr}from"zod";import{fail as P}from"node:assert/strict";import{z as we}from"zod";var qe=e=>!isNaN(e.getTime());var ee=Symbol("DateIn"),Xt=()=>we.union([we.string().date(),we.string().datetime(),we.string().datetime({local:!0})]).transform(t=>new Date(t)).pipe(we.date().refine(qe)).brand(ee);import{z as Uo}from"zod";var te=Symbol("DateOut"),er=()=>Uo.date().refine(qe).transform(e=>e.toISOString()).brand(te);import{z as $e}from"zod";var k=Symbol("File"),tr=$e.custom(e=>Buffer.isBuffer(e),{message:"Expected Buffer"}),Do={buffer:()=>tr.brand(k),string:()=>$e.string().brand(k),binary:()=>tr.or($e.string()).brand(k),base64:()=>$e.string().base64().brand(k)};function Ge(e){return Do[e||"string"]()}import{z as Ko}from"zod";var G=Symbol("Raw"),rr=(e={})=>Ko.object({raw:Ge("buffer")}).extend(e).brand(G);import{z as Fo}from"zod";var le=Symbol("Upload"),or=()=>Fo.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",e=>({message:`Expected file upload, received ${typeof e}`})).brand(le);var nr=(e,{next:t})=>e.options.some(t),Bo=({_def:e},{next:t})=>[e.left,e.right].some(t),Ve=(e,{next:t})=>t(e.unwrap()),ht={ZodObject:({shape:e},{next:t})=>Object.values(e).some(t),ZodUnion:nr,ZodDiscriminatedUnion:nr,ZodIntersection:Bo,ZodEffects:(e,{next:t})=>t(e.innerType()),ZodOptional:Ve,ZodNullable:Ve,ZodRecord:({valueSchema:e},{next:t})=>t(e),ZodArray:({element:e},{next:t})=>t(e),ZodDefault:({_def:e},{next:t})=>t(e.innerType)},_e=(e,{condition:t,rules:r=ht,depth:o=1,maxDepth:n=Number.POSITIVE_INFINITY})=>{if(t?.(e))return!0;let i=o<n?r[e._def[h]?.brand]||r[e._def.typeName]:void 0;return i?i(e,{next:a=>_e(a,{condition:t,rules:r,maxDepth:n,depth:o+1})}):!1},sr=e=>_e(e,{condition:t=>t._def[h]?.brand===le}),ir=e=>_e(e,{condition:t=>t._def[h]?.brand===G,maxDepth:3}),xt=(e,t)=>{let r=new WeakSet;return _e(e,{maxDepth:300,rules:{...ht,ZodBranded:Ve,ZodReadonly:Ve,ZodCatch:({_def:{innerType:o}},{next:n})=>n(o),ZodPipeline:({_def:o},{next:n})=>n(o[t]),ZodLazy:(o,{next:n})=>r.has(o)?!1:r.add(o)&&n(o.schema),ZodTuple:({items:o,_def:{rest:n}},{next:i})=>[...o].concat(n??[]).some(i),ZodEffects:{out:void 0,in:ht.ZodEffects}[t],ZodNaN:()=>P("z.nan()"),ZodSymbol:()=>P("z.symbol()"),ZodFunction:()=>P("z.function()"),ZodMap:()=>P("z.map()"),ZodSet:()=>P("z.set()"),ZodBigInt:()=>P("z.bigint()"),ZodVoid:()=>P("z.void()"),ZodPromise:()=>P("z.promise()"),ZodNever:()=>P("z.never()"),ZodDate:()=>t==="in"&&P("z.date()"),[te]:()=>t==="in"&&P("ez.dateOut()"),[ee]:()=>t==="out"&&P("ez.dateIn()"),[G]:()=>t==="out"&&P("ez.raw()"),[le]:()=>t==="out"&&P("ez.upload()"),[k]:()=>!1}})};import Go,{isHttpError as Vo}from"http-errors";import ar,{isHttpError as qo}from"http-errors";import{z as $o}from"zod";var bt=(e,{variant:t,args:r,...o})=>{if(typeof e=="function"&&(e=e(...r)),e instanceof $o.ZodType)return[{schema:e,...o}];if(Array.isArray(e)&&!e.length){let n=new Error(`At least one ${t} response schema required.`);throw new B(n)}return(Array.isArray(e)?e:[e]).map(({schema:n,statusCode:i,mimeType:a})=>({schema:n,statusCodes:typeof i=="number"?[i]:i||o.statusCodes,mimeTypes:typeof a=="string"?[a]:a||o.mimeTypes}))},St=(e,t,{url:r},o)=>!e.expose&&t.error("Server side error",{error:e,url:r,payload:o}),Ye=e=>qo(e)?e:ar(e instanceof K?400:500,J(e),{cause:e.cause||e}),ze=e=>Fe()&&!e.expose?ar(e.statusCode).message:e.message;var Qe=({error:e,logger:t,response:r})=>{t.error("Result handler failure",e);let o=ze(Go(500,`An error occurred while serving the result: ${e.message}.`+(e.handled?`
2
+ Original error: ${e.handled.message}.`:""),{expose:Vo(e.cause)?e.cause.expose:!1}));r.status(500).type("text/plain").end(o)};import{chain as _o}from"ramda";var re=e=>X(e)&&"or"in e,ue=e=>X(e)&&"and"in e,Tt=e=>({and:_o(t=>ue(t)?t.and:[t],e)}),Je=(e,t)=>ue(e)?{and:e.and.map(r=>re(r)?{or:r.or.map(t)}:t(r))}:re(e)?{or:e.or.map(r=>ue(r)?{and:r.and.map(t)}:t(r))}:t(e),Ot=e=>e.and.reduce((t,r)=>({or:W(t.or,re(r)?r.or:[r],Tt)}),{or:[]}),me=(e,t)=>ue(e)?re(t)?me(Ot(e),t):Tt([e,t]):re(e)?ue(t)?me(t,e):re(t)?{or:W(e.or,t.or,Tt)}:me(e,{and:[t]}):ue(t)||re(t)?me(t,e):{and:[e,t]};import{z as pr}from"zod";var Rt=class{},V=class extends Rt{#e;#t;#r;constructor({input:t=pr.object({}),security:r,handler:o}){super(),this.#e=t,this.#t=r,this.#r=o}getSecurity(){return this.#t}getSchema(){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 pr.ZodError?new K(o):o}}},fe=class extends V{constructor(t,{provider:r=()=>({}),transformer:o=n=>n}={}){super({handler:async({request:n,response:i})=>new Promise((a,p)=>{let d=c=>{if(c&&c instanceof Error)return p(o(c));a(r(n,i))};t(n,i,d)?.catch(d)})})}};var ye=class{nest(t){return Object.assign(t,{"":this})}};var Ie=class extends ye{},We=class extends Ie{#e;#t;#r;#n;#s;#i;#o;#a;#p;#c;#d;constructor({methods:t,inputSchema:r,outputSchema:o,handler:n,resultHandler:i,getOperationId:a=()=>{},scopes:p=[],middlewares:d=[],tags:c=[],description:u,shortDescription:l}){super(),this.#s=n,this.#i=i,this.#r=d,this.#c=a,this.#t=Object.freeze(t),this.#a=Object.freeze(p),this.#p=Object.freeze(c),this.#e={long:u,short:l},this.#o={input:r,output:o},this.#n={positive:Object.freeze(i.getPositiveResponse(o)),negative:Object.freeze(i.getNegativeResponse())},this.#d=sr(r)?"upload":ir(r)?"raw":"json"}getDescription(t){return this.#e[t]}getMethods(){return this.#t}getSchema(t){return this.#o[t]}getRequestType(){return this.#d}getResponses(t){return this.#n[t]}getSecurity(){return this.#r.reduce((t,r)=>{let o=r.getSecurity();return o?me(t,o):t},{and:[]})}getScopes(){return this.#a}getTags(){return this.#p}getOperationId(t){return this.#c(t)}async#l(t){try{return await this.#o.output.parseAsync(t)}catch(r){throw r instanceof cr.ZodError?new Q(r):r}}async#m({method:t,logger:r,options:o,response:n,...i}){for(let a of this.#r)if(!(t==="options"&&!(a instanceof fe))&&(Object.assign(o,await a.execute({...i,options:o,response:n,logger:r})),n.writableEnded)){r.warn("A middleware has closed the stream. Accumulated options:",o);break}}async#u({input:t,...r}){let o;try{o=await this.#o.input.parseAsync(t)}catch(n){throw n instanceof cr.ZodError?new K(n):n}return this.#s({...r,input:o})}async#f({error:t,...r}){try{await this.#i.execute({...r,error:t})}catch(o){Qe({...r,error:new B(q(o),t||void 0)})}}async execute({request:t,response:r,logger:o,config:n}){let i=ft(t),a={},p=null,d=null,c=De(t,n.inputSources);try{if(await this.#m({method:i,input:c,request:t,response:r,logger:o,options:a}),r.writableEnded)return;if(i==="options")return void r.status(200).end();p=await this.#l(await this.#u({input:c,logger:o,options:a}))}catch(u){d=q(u)}await this.#f({input:c,output:p,request:t,response:r,error:d,logger:o,options:a})}};var dr=(e,t)=>{let r=e.map(n=>n.getSchema()).concat(t),o=r.reduce((n,i)=>n.and(i));return r.reduce((n,i)=>Jt(i,n),o)};import{z as M}from"zod";var oe={positive:200,negative:400};var At=class{#e;constructor(t){this.#e=t}execute(...t){return this.#e(...t)}},Ce=class extends At{#e;#t;constructor(t){super(t.handler),this.#e=t.positive,this.#t=t.negative}getPositiveResponse(t){return bt(this.#e,{variant:"positive",args:[t],statusCodes:[oe.positive],mimeTypes:[A.json]})}getNegativeResponse(){return bt(this.#t,{variant:"negative",args:[],statusCodes:[oe.negative],mimeTypes:[A.json]})}},Ze=new Ce({positive:e=>{let t=$({schema:e}),r=M.object({status:M.literal("success"),data:e});return t.reduce((o,n)=>o.example({status:"success",data:n}),r)},negative:M.object({status:M.literal("error"),error:M.object({message:M.string()})}).example({status:"error",error:{message:"Sample error message"}}),handler:({error:e,input:t,output:r,request:o,response:n,logger:i})=>{if(e){let a=Ye(e);return St(a,i,o,t),void n.status(a.statusCode).json({status:"error",error:{message:ze(a)}})}n.status(oe.positive).json({status:"success",data:r})}}),Pt=new Ce({positive:e=>{let t=$({schema:e}),r="shape"in e&&"items"in e.shape&&e.shape.items instanceof M.ZodArray?e.shape.items:M.array(M.any());return t.reduce((o,n)=>X(n)&&"items"in n&&Array.isArray(n.items)?o.example(n.items):o,r)},negative:M.string().example("Sample error message"),handler:({response:e,output:t,error:r,logger:o,request:n,input:i})=>{if(r){let a=Ye(r);return St(a,o,n,i),void e.status(a.statusCode).type("text/plain").send(ze(a))}if(t&&"items"in t&&Array.isArray(t.items))return void e.status(oe.positive).json(t.items);throw new Error("Property 'items' is missing in the endpoint output")}});var Ee=class e{resultHandler;middlewares=[];constructor(t){this.resultHandler="resultHandler"in t?t.resultHandler:t}static#e(t,r){let o=new e(r);return o.middlewares=t,o}addMiddleware(t){return e.#e(this.middlewares.concat(t instanceof V?t:new V(t)),this.resultHandler)}use=this.addExpressMiddleware;addExpressMiddleware(...t){return e.#e(this.middlewares.concat(new fe(...t)),this.resultHandler)}addOptions(t){return e.#e(this.middlewares.concat(new V({handler:t})),this.resultHandler)}build({input:t=Yo.object({}),handler:r,output:o,description:n,shortDescription:i,operationId:a,scope:p,tag:d,method:c}){let{middlewares:u,resultHandler:l}=this,y=typeof c=="string"?[c]:c,x=typeof a=="function"?a:()=>a,R=typeof p=="string"?[p]:p||[],O=typeof d=="string"?[d]:d||[];return new We({handler:r,middlewares:u,outputSchema:o,resultHandler:l,scopes:R,tags:O,methods:y,getOperationId:x,description:n,shortDescription:i,inputSchema:dr(u,t)})}},Qo=new Ee(Ze),Jo=new Ee(Pt);import{Ansis as Xo,blue as en,cyanBright as tn,green as rn,hex as on,red as nn}from"ansis";import{inspect as sn}from"node:util";import{performance as hr}from"node:perf_hooks";var et={debug:10,info:20,warn:30,error:40},mr=e=>X(e)&&Object.keys(et).some(t=>t in e),ur=e=>e in et,fr=(e,t)=>et[e]<et[t],yr=(e=0)=>Intl.NumberFormat(void 0,{useGrouping:!1,minimumFractionDigits:0,maximumFractionDigits:e}),Xe=yr(),lr=yr(2),Wo=e=>e<1e-6?["picosecond",e/1e-9,Xe]:e<.001?["nanosecond",e/1e-6,Xe]:e<1?["microsecond",e/.001,Xe]:e<1e3?["millisecond",e,Xe]:e<6e4?["second",e/1e3,lr]:["minute",e/6e4,lr],gr=e=>{let[t,r,o]=Wo(e);return`${o.format(r)} ${t}${r>1?"s":""}`};var ve=class e{config;styles={debug:en,info:rn,warn:on("#FFA500"),error:nn};constructor(t={}){let{color:r=new Xo().isSupported(),level:o=Fe()?"warn":"debug",depth:n=2,ctx:i={}}=t;this.config={color:r,level:o,depth:n,ctx:i}}prettyPrint(t){let{depth:r,color:o,level:n}=this.config;return sn(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:i,...a},color:p}=this.config;if(n==="silent"||fr(t,n))return;let d=[new Date().toISOString()];i&&d.push(p?tn(i):i),d.push(p?`${this.styles[t](t)}:`:`${t}:`,r),o!==void 0&&d.push(this.prettyPrint(o)),Object.keys(a).length>0&&d.push(this.prettyPrint(a)),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})}profile(t){let r=hr.now();return()=>{let o=hr.now()-r,{message:n,severity:i="debug",formatter:a=gr}=typeof t=="object"?t:{message:t};this.print(typeof i=="function"?i(o):i,n,a(o))}}};import{keys as an,reject as pn,equals as cn}from"ramda";var je=class extends ye{entries;constructor(t){super();let r=[],o=an(t);for(let n of o){let i=t[n];i&&r.push([n,i,pn(cn(n),o)])}this.entries=Object.freeze(r)}};import dn from"express";var Ne=class{params;constructor(...t){this.params=t}apply(t,r){return r(t,dn.static(...this.params))}};import zt from"express";import hn from"node:http";import xn from"node:https";var ge=async(e,t="default")=>{try{return(await import(e))[t]}catch{}throw new Ae(e)};var xr=(e,t)=>Object.entries(e).map(([r,o])=>{if(r.includes("/"))throw new ce(`The entry '${r}' must avoid having slashes \u2014 use nesting instead.`);let n=r.trim();return[`${t||""}${n?`/${n}`:""}`,o]}),he=({routing:e,onEndpoint:t,onStatic:r})=>{let o=xr(e);for(;o.length;){let[n,i]=o.shift();if(i instanceof Ie){let a=i.getMethods()||["get"];for(let p of a)t(i,n,p)}else if(i instanceof Ne)r&&i.apply(n,r);else if(i instanceof je)for(let[a,p,d]of i.entries){let c=p.getMethods();if(c&&!c.includes(a))throw new ce(`Endpoint assigned to ${a} method of ${n} must support ${a} method.`);t(p,n,a,d)}else o.unshift(...xr(i,n))}};var wt=({app:e,getLogger:t,config:r,routing:o,parsers:n})=>{let i=new WeakSet,a=new Set;he({routing:o,onStatic:(p,d)=>void e.use(p,d),onEndpoint:(p,d,c,u)=>{let l=p.getRequestType();if(!i.has(p)){if(l==="json")try{xt(p.getSchema("input"),"in")}catch(f){t().warn("The final input schema of the endpoint contains an unsupported JSON payload type.",{path:d,method:c,reason:f})}for(let f of["positive","negative"])for(let{mimeTypes:T,schema:w}of p.getResponses(f))if(T.includes(A.json))try{xt(w,"out")}catch(I){t().warn(`The final ${f} response schema of the endpoint contains an unsupported JSON payload type.`,{path:d,method:c,reason:I})}i.add(p)}let x={"Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":[c,...u||[],"options"].join(", ").toUpperCase(),"Access-Control-Allow-Headers":"content-type"},R=n?.[l]||[],O=async(f,T)=>{let w=t(f);if(r.cors){let I=typeof r.cors=="function"?await r.cors({request:f,endpoint:p,logger:w,defaultHeaders:x}):x;for(let H in I)T.set(H,I[H])}return p.execute({request:f,response:T,logger:w,config:r})};r.cors&&!a.has(d)&&(e.options(d,...R,O),a.add(d)),e[c](d,...R,O)}})};import Pr,{isHttpError as mn}from"http-errors";import{setInterval as ln}from"node:timers/promises";var br=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",Sr=e=>"server"in e&&typeof e.server=="object"&&e.server!==null&&"close"in e.server&&typeof e.server.close=="function",Tr=e=>"encrypted"in e&&typeof e.encrypted=="boolean"&&e.encrypted,Or=({},e)=>void(!e.headersSent&&e.setHeader("connection","close")),Rr=e=>new Promise((t,r)=>void e.close(o=>o?r(o):t()));var Ar=(e,{timeout:t=1e3,logger:r}={})=>{let o,n=new Set,i=c=>void n.delete(c.destroy()),a=c=>void(br(c)?!c._httpMessage.headersSent&&c._httpMessage.setHeader("connection","close"):i(c)),p=c=>void(o?c.destroy():n.add(c.once("close",()=>void n.delete(c))));for(let c of e)for(let u of["connection","secureConnection"])c.on(u,p);let d=async()=>{for(let c of e)c.on("request",Or);r?.info("Graceful shutdown",{sockets:n.size,timeout:t});for(let c of n)(Tr(c)||Sr(c))&&a(c);for await(let c of ln(10,Date.now()))if(n.size===0||Date.now()-c>=t)break;for(let c of n)i(c);return Promise.allSettled(e.map(Rr))};return{sockets:n,shutdown:()=>o??=d()}};var wr=({errorHandler:e,getLogger:t})=>async(r,o,n,i)=>r?e.execute({error:mn(r)?r:Pr(400,q(r).message),request:o,response:n,input:null,output:null,options:{},logger:t(o)}):i(),zr=({errorHandler:e,getLogger:t})=>async(r,o)=>{let n=Pr(404,`Can not ${r.method} ${r.path}`),i=t(r);try{e.execute({request:r,response:o,logger:i,error:n,input:null,output:null,options:{}})}catch(a){Qe({response:o,logger:i,error:new B(q(a),n)})}},un=e=>(t,{},r)=>{if(Object.values(t?.files||[]).flat().find(({truncated:n})=>n))return r(e);r()},fn=e=>({log:e.debug.bind(e)}),Ir=async({getLogger:e,config:t})=>{let r=await ge("express-fileupload"),{limitError:o,beforeUpload:n,...i}={...typeof t.upload=="object"&&t.upload},a=[];return a.push(async(p,d,c)=>{let u=e(p);try{await n?.({request:p,logger:u})}catch(l){return c(l)}return r({debug:!0,...i,abortOnLimit:!1,parseNested:!0,logger:fn(u)})(p,d,c)}),o&&a.push(un(o)),a},Cr=(e,{},t)=>{Buffer.isBuffer(e.body)&&(e.body={raw:e.body}),t()},Zr=({logger:e,config:t})=>async(r,o,n)=>{let i=await t.childLoggerProvider?.({request:r,parent:e})||e;i.debug(`${r.method}: ${r.path}`),r.res&&(r.res.locals[h]={logger:i}),n()},Er=e=>t=>t?.res?.locals[h]?.logger||e,vr=e=>process.on("deprecation",({message:t,namespace:r,name:o,stack:n})=>e.warn(`${o} (${r}): ${t}`,n.split(`
3
+ `).slice(1))),jr=({servers:e,logger:t,options:{timeout:r,events:o=["SIGINT","SIGTERM"]}})=>{let n=Ar(e,{logger:t,timeout:r}),i=()=>n.shutdown().then(()=>process.exit());for(let a of o)process.on(a,i)};import{gray as yn,hex as Nr,italic as tt,whiteBright as gn}from"ansis";var Lr=()=>{let e=tt("Proudly supports transgender community.".padStart(109)),t=tt("Start your API server with I/O schema validation and custom middlewares in minutes.".padStart(109)),r=tt("Thank you for choosing Express Zod API for your project.".padStart(132)),o=tt("for Kesaria".padEnd(20)),n=Nr("#F5A9B8"),i=Nr("#5BCEFA"),a=new Array(14).fill(i,1,3).fill(n,3,5).fill(gn,5,7).fill(n,7,9).fill(i,9,12).fill(yn,12,13);return`
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,8 +15,8 @@ ${o}888${t}
15
15
  ${r}
16
16
  `.split(`
17
17
  `).map((d,c)=>a[c]?a[c](d):d).join(`
18
- `)};var Lr=e=>{e.startupLogo!==!1&&console.log(Nr());let t=e.errorHandler||Ce,r=lr(e.logger)?e.logger:new Ee(e.logger);r.debug("Running",{build:"v21.0.0-beta.3 (ESM)",env:process.env.NODE_ENV||"development"}),Er(r);let o=Cr({logger:r,config:e}),i={getLogger:Zr(r),errorHandler:t},a=wr(i),p=Pr(i);return{...i,logger:r,notFoundHandler:a,parserFailureHandler:p,loggingMiddleware:o}},xn=(e,t)=>{let{logger:r,getLogger:o,notFoundHandler:n,loggingMiddleware:i}=Lr(e);return At({app:e.app.use(i),routing:t,getLogger:o,config:e}),{notFoundHandler:n,logger:r}},bn=async(e,t)=>{let{logger:r,getLogger:o,notFoundHandler:n,parserFailureHandler:i,loggingMiddleware:a}=Lr(e),p=Pt().disable("x-powered-by").use(a);if(e.compression){let y=await fe("compression");p.use(y(typeof e.compression=="object"?e.compression:void 0))}let d={json:[e.jsonParser||Pt.json()],raw:[e.rawParser||Pt.raw(),Ir],upload:e.upload?await zr({config:e,getLogger:o}):[]};await e.beforeRouting?.({app:p,getLogger:o}),At({app:p,routing:t,getLogger:o,config:e,parsers:d}),p.use(i,n);let c=(y,x)=>()=>y.listen(x,()=>r.info("Listening",x)),f=[],l=[];if(e.http){let y=gn.createServer(p);f.push(y),l.push(c(y,e.http.listen))}if(e.https){let y=hn.createServer(e.https.options,p);f.push(y),l.push(c(y,e.https.listen))}return e.gracefulShutdown&&vr({logger:r,servers:f,options:e.gracefulShutdown===!0?{}:e.gracefulShutdown}),{app:p,logger:r,servers:l.map(y=>y())}};import{OpenApiBuilder as Rs}from"openapi3-ts/oas31";import{keys as As,pluck as Ps}from"ramda";import{isReferenceObject as zt,isSchemaObject as ot}from"openapi3-ts/oas31";import{concat as Sn,type as Hr,filter as Tn,fromPairs as Ne,has as On,isNil as Rn,map as ge,mergeAll as An,mergeDeepRight as Pn,mergeDeepWith as wn,objOf as Ur,omit as nt,pipe as Kr,pluck as zn,range as In,reject as Cn,toLower as Zn,union as En,when as vn,xprod as st,zip as jn}from"ramda";import{z as b}from"zod";var oe=(e,{onEach:t,rules:r,onMissing:o,ctx:n={}})=>{let i=r[e._def[h]?.brand]||r[e._def.typeName],p=i?i(e,{...n,next:c=>oe(c,{ctx:n,onEach:t,rules:r,onMissing:o})}):o(e,n),d=t&&t(e,{prev:p,...n});return d?{...p,...d}:p};var kr=50,Dr="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString",Nn={integer:0,number:0,string:"",boolean:!1,object:{},null:null,array:[]},Fr=/:([A-Za-z0-9_]+)/g,Ln=e=>e.match(Fr)?.map(t=>t.slice(1))||[],Br=e=>e.replace(Fr,t=>`{${t.slice(1)}}`),kn=({_def:e},{next:t})=>({...t(e.innerType),default:e[h]?.defaultLabel||e.defaultValue()}),Mn=({_def:{innerType:e}},{next:t})=>t(e),Hn=()=>({format:"any"}),Un=({},e)=>{if(e.isResponse)throw new E({message:"Please use ez.upload() only for input.",...e});return{type:"string",format:"binary"}},Kn=e=>{let t=e.unwrap();return{type:"string",format:t instanceof b.ZodString?t._def.checks.find(r=>r.kind==="base64")?"byte":"file":"binary"}},Dn=({options:e},{next:t})=>({oneOf:e.map(t)}),Fn=({options:e,discriminator:t},{next:r})=>({discriminator:{propertyName:t},oneOf:e.map(r)}),Bn=(e,t)=>{if(Array.isArray(e)&&Array.isArray(t))return Sn(e,t);if(e===t)return t;throw new Error("Can not flatten properties")},qn=e=>{let[t,r]=e.filter(ot).filter(n=>n.type==="object"&&Object.keys(n).every(i=>["type","properties","required","examples"].includes(i)));if(!t||!r)throw new Error("Can not flatten objects");let o={type:"object"};return(t.properties||r.properties)&&(o.properties=wn(Bn,t.properties||{},r.properties||{})),(t.required||r.required)&&(o.required=En(t.required||[],r.required||[])),(t.examples||r.examples)&&(o.examples=W(t.examples||[],r.examples||[],([n,i])=>Pn(n,i))),o},Vn=({_def:{left:e,right:t}},{next:r})=>{let o=[e,t].map(r);try{return qn(o)}catch{}return{allOf:o}},$n=(e,{next:t})=>t(e.unwrap()),Gn=(e,{next:t})=>t(e.unwrap()),_n=(e,{next:t})=>{let r=t(e.unwrap());return ot(r)&&(r.type=Vr(r)),r},qr=e=>{let t=Zn(Hr(e));return typeof e=="bigint"?"integer":t==="number"||t==="string"||t==="boolean"||t==="object"||t==="null"||t==="array"?t:void 0},Mr=e=>({type:qr(Object.values(e.enum)[0]),enum:Object.values(e.enum)}),Yn=({value:e})=>({type:qr(e),const:e}),Qn=(e,{isResponse:t,next:r})=>{let o=Object.keys(e.shape),n=p=>t&&Ae(p)?p instanceof b.ZodOptional:p.isOptional(),i=o.filter(p=>!n(e.shape[p])),a={type:"object"};return o.length&&(a.properties=rt(e,r)),i.length&&(a.required=i),a},Wn=()=>({type:"null"}),Jn=({},e)=>{if(e.isResponse)throw new E({message:"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:Dr}}},Xn=({},e)=>{if(!e.isResponse)throw new E({message:"Please use ez.dateIn() for input.",...e});return{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",externalDocs:{url:Dr}}},es=({},e)=>{throw new E({message:`Using z.date() within ${e.isResponse?"output":"input"} schema is forbidden. Please use ez.date${e.isResponse?"Out":"In"}() instead. Check out the documentation for details.`,...e})},ts=()=>({type:"boolean"}),rs=()=>({type:"integer",format:"bigint"}),os=e=>e.every(t=>t instanceof b.ZodLiteral),ns=({keySchema:e,valueSchema:t},{next:r})=>{if(e instanceof b.ZodEnum||e instanceof b.ZodNativeEnum){let o=Object.values(e.enum),n={type:"object"};return o.length&&(n.properties=rt(b.object(Ne(st(o,[t]))),r),n.required=o),n}if(e instanceof b.ZodLiteral)return{type:"object",properties:rt(b.object({[e.value]:t}),r),required:[e.value]};if(e instanceof b.ZodUnion&&os(e.options)){let o=ge(i=>`${i.value}`,e.options),n=Ne(st(o,[t]));return{type:"object",properties:rt(b.object(n),r),required:o}}return{type:"object",additionalProperties:r(t)}},ss=({_def:{minLength:e,maxLength:t},element:r},{next:o})=>{let n={type:"array",items:o(r)};return e&&(n.minItems=e.value),t&&(n.maxItems=t.value),n},is=({items:e,_def:{rest:t}},{next:r})=>({type:"array",prefixItems:e.map(r),items:t===null?{not:{}}:r(t)}),as=({isEmail:e,isURL:t,minLength:r,maxLength:o,isUUID:n,isCUID:i,isCUID2:a,isULID:p,isIP:d,isEmoji:c,isDatetime:f,_def:{checks:l}})=>{let y=l.find(T=>T.kind==="regex"),x=l.find(T=>T.kind==="datetime"),P=y?y.regex:x?x.offset?new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(([+-]\\d{2}:\\d{2})|Z)$"):new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?Z$"):void 0,O={type:"string"},u={"date-time":f,email:e,url:t,uuid:n,cuid:i,cuid2:a,ulid:p,ip:d,emoji:c};for(let T in u)if(u[T]){O.format=T;break}return r!==null&&(O.minLength=r),o!==null&&(O.maxLength=o),P&&(O.pattern=P.source),O},ps=({isInt:e,maxValue:t,minValue:r,_def:{checks:o}})=>{let n=o.find(l=>l.kind==="min"),i=r===null?e?Number.MIN_SAFE_INTEGER:-Number.MAX_VALUE:r,a=n?n.inclusive:!0,p=o.find(l=>l.kind==="max"),d=t===null?e?Number.MAX_SAFE_INTEGER:Number.MAX_VALUE:t,c=p?p.inclusive:!0,f={type:e?"integer":"number",format:e?"int64":"double"};return a?f.minimum=i:f.exclusiveMinimum=i,c?f.maximum=d:f.exclusiveMaximum=d,f},rt=({shape:e},t)=>ge(t,e),cs=e=>{let t=Array.isArray(e.type)?e.type[0]:e.type;return Nn?.[t]},Vr=({type:e})=>e==="null"?e:typeof e=="string"?[e,"null"]:e?[...new Set(e).add("null")]:"null",ds=(e,{isResponse:t,next:r})=>{let o=r(e.innerType()),{effect:n}=e._def;if(t&&n.type==="transform"&&ot(o)){let i=Ke(e,cs(o));return i&&["number","string","boolean"].includes(i)?{type:i}:r(b.any())}if(!t&&n.type==="preprocess"&&ot(o)){let{type:i,...a}=o;return{...a,format:`${a.format||i} (preprocessed)`}}return o},ls=({_def:e},{isResponse:t,next:r})=>r(e[t?"out":"in"]),ms=(e,{next:t})=>t(e.unwrap()),us=(e,{next:t,makeRef:r})=>r(e,()=>t(e.schema)),fs=(e,{next:t})=>t(e.unwrap().shape.raw),$r=e=>e.length?Ne(jn(In(1,e.length+1).map(t=>`example${t}`),ge(Ur("value"),e))):void 0,Gr=(e,t,r=[])=>Kr(q,ge(vn(o=>Hr(o)==="Object",nt(r))),$r)({schema:e,variant:t?"parsed":"original",validate:!0}),ys=(e,t)=>Kr(q,Tn(On(t)),zn(t),$r)({schema:e,variant:"original",validate:!0}),ne=e=>e instanceof b.ZodObject?e:e instanceof b.ZodBranded?ne(e.unwrap()):e instanceof b.ZodUnion||e instanceof b.ZodDiscriminatedUnion?e.options.map(t=>ne(t)).reduce((t,r)=>t.merge(r.partial()),b.object({})):e instanceof b.ZodEffects?ne(e._def.schema):e instanceof b.ZodPipeline?ne(e._def.in):ne(e._def.left).merge(ne(e._def.right)),_r=({path:e,method:t,schema:r,inputSources:o,makeRef:n,composition:i,brandHandling:a,description:p=`${t.toUpperCase()} ${e} Parameter`})=>{let{shape:d}=ne(r),c=Ln(e),f=o.includes("query"),l=o.includes("params"),y=o.includes("headers"),x=u=>l&&c.includes(u),P=u=>y&&ft(u);return Object.keys(d).map(u=>({name:u,location:x(u)?"path":P(u)?"header":f?"query":void 0})).filter(u=>u.location!==void 0).map(({name:u,location:T})=>{let z=oe(d[u],{rules:{...a,...It},onEach:Ct,onMissing:Zt,ctx:{isResponse:!1,makeRef:n,path:e,method:t}}),L=i==="components"?n(d[u],z,v(p,u)):z;return{name:u,in:T,required:!d[u].isOptional(),description:z.description||p,schema:L,examples:ys(r,u)}})},It={ZodString:as,ZodNumber:ps,ZodBigInt:rs,ZodBoolean:ts,ZodNull:Wn,ZodArray:ss,ZodTuple:is,ZodRecord:ns,ZodObject:Qn,ZodLiteral:Yn,ZodIntersection:Vn,ZodUnion:Dn,ZodAny:Hn,ZodDefault:kn,ZodEnum:Mr,ZodNativeEnum:Mr,ZodEffects:ds,ZodOptional:$n,ZodNullable:_n,ZodDiscriminatedUnion:Fn,ZodBranded:ms,ZodDate:es,ZodCatch:Mn,ZodPipeline:ls,ZodLazy:us,ZodReadonly:Gn,[k]:Kn,[de]:Un,[ee]:Xn,[X]:Jn,[V]:fs},Ct=(e,{isResponse:t,prev:r})=>{if(zt(r))return{};let{description:o}=e,n=e instanceof b.ZodLazy,i=r.type!==void 0,a=t&&Ae(e),p=!n&&i&&!a&&e.isNullable(),d={};if(o&&(d.description=o),p&&(d.type=Vr(r)),!n){let c=q({schema:e,variant:t?"parsed":"original",validate:!0});c.length&&(d.examples=c.slice())}return d},Zt=(e,t)=>{throw new E({message:`Zod type ${e.constructor.name} is unsupported.`,...t})},wt=(e,t)=>{if(zt(e))return e;let r={...e};return r.properties&&(r.properties=nt(t,r.properties)),r.examples&&(r.examples=r.examples.map(o=>nt(t,o))),r.required&&(r.required=r.required.filter(o=>!t.includes(o))),r.allOf&&(r.allOf=r.allOf.map(o=>wt(o,t))),r.oneOf&&(r.oneOf=r.oneOf.map(o=>wt(o,t))),r},Yr=e=>zt(e)?e:nt(["examples"],e),Qr=({method:e,path:t,schema:r,mimeTypes:o,variant:n,makeRef:i,composition:a,hasMultipleStatusCodes:p,statusCode:d,brandHandling:c,description:f=`${e.toUpperCase()} ${t} ${yt(n)} response ${p?d:""}`.trim()})=>{let l=Yr(oe(r,{rules:{...c,...It},onEach:Ct,onMissing:Zt,ctx:{isResponse:!0,makeRef:i,path:t,method:e}})),y={schema:a==="components"?i(r,l,v(f)):l,examples:Gr(r,!0)};return{description:f,content:Ne(st(o,[y]))}},gs=()=>({type:"http",scheme:"basic"}),hs=({format:e})=>{let t={type:"http",scheme:"bearer"};return e&&(t.bearerFormat=e),t},xs=({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},bs=({name:e})=>({type:"apiKey",in:"header",name:e}),Ss=({name:e})=>({type:"apiKey",in:"cookie",name:e}),Ts=({url:e})=>({type:"openIdConnect",openIdConnectUrl:e}),Os=({flows:e={}})=>({type:"oauth2",flows:ge(t=>({...t,scopes:t.scopes||{}}),Cn(Rn,e))}),Wr=(e,t)=>{let r={basic:gs,bearer:hs,input:xs,header:bs,cookie:Ss,openid:Ts,oauth2:Os};return We(e,o=>r[o.type](o,t))},it=e=>"or"in e?e.or.map(t=>"and"in t?An(ge(({name:r,scopes:o})=>Ur(r,o),t.and)):{[t.name]:t.scopes}):"and"in e?it(St(e)):it({or:[e]}),Jr=({method:e,path:t,schema:r,mimeTypes:o,makeRef:n,composition:i,brandHandling:a,paramNames:p,description:d=`${e.toUpperCase()} ${t} Request body`})=>{let c=Yr(wt(oe(r,{rules:{...a,...It},onEach:Ct,onMissing:Zt,ctx:{isResponse:!1,makeRef:n,path:t,method:e}}),p)),f={schema:i==="components"?n(r,c,v(d)):c,examples:Gr(r,!1,p)};return{description:d,content:Ne(st(o,[f]))}},Xr=e=>Object.keys(e).map(t=>{let r=e[t],o={name:t,description:typeof r=="string"?r:r.description};return typeof r=="object"&&r.url&&(o.externalDocs={url:r.url}),o}),Et=e=>e.length<=kr?e:e.slice(0,kr-1)+"\u2026";var vt=class extends Rs{lastSecuritySchemaIds=new Map;lastOperationIdSuffixes=new Map;responseVariants=As(re);references=new Map;makeRef(t,r,o=this.references.get(t)){return o||(o=`Schema${this.references.size+1}`,this.references.set(t,o),typeof r=="function"&&(r=r())),typeof r=="object"&&this.addSchema(o,r),{$ref:`#/components/schemas/${o}`}}ensureUniqOperationId(t,r,o){let n=o||v(r,t),i=this.lastOperationIdSuffixes.get(n);if(i===void 0)return this.lastOperationIdSuffixes.set(n,1),n;if(o)throw new E({message:`Duplicated operationId: "${o}"`,method:r,isResponse:!1,path:t});return i++,this.lastOperationIdSuffixes.set(n,i),`${n}${i}`}ensureUniqSecuritySchemaName(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.lastSecuritySchemaIds.get(t.type)||0)+1;return this.lastSecuritySchemaIds.set(t.type,o),`${t.type.toUpperCase()}_${o}`}constructor({routing:t,config:r,title:o,version:n,serverUrl:i,descriptions:a,brandHandling:p,hasSummaryFromDescription:d=!0,composition:c="inline"}){super(),this.addInfo({title:o,version:n});for(let l of typeof i=="string"?[i]:i)this.addServer({url:l});ye({routing:t,onEndpoint:(l,y,x)=>{let P={path:y,method:x,endpoint:l,composition:c,brandHandling:p,makeRef:this.makeRef.bind(this)},[O,u]=["short","long"].map(l.getDescription.bind(l)),T=O?Et(O):d&&u?Et(u):void 0,z=l.getTags(),L=r.inputSources?.[x]||mt[x],H=this.ensureUniqOperationId(y,x,l.getOperationId(x)),xe=_r({...P,inputSources:L,schema:l.getSchema("input"),description:a?.requestParameter?.call(null,{method:x,path:y,operationId:H})}),ke={};for(let U of this.responseVariants){let _=l.getResponses(U);for(let{mimeTypes:be,schema:I,statusCodes:w}of _)for(let C of w)ke[C]=Qr({...P,variant:U,schema:I,mimeTypes:be,statusCode:C,hasMultipleStatusCodes:_.length>1||w.length>1,description:a?.[`${U}Response`]?.call(null,{method:x,path:y,operationId:H,statusCode:C})})}let lt=L.includes("body")?Jr({...P,paramNames:Ps("name",xe),schema:l.getSchema("input"),mimeTypes:l.getMimeTypes("input"),description:a?.requestBody?.call(null,{method:x,path:y,operationId:H})}):void 0,Me=it(We(Wr(l.getSecurity(),L),U=>{let _=this.ensureUniqSecuritySchemaName(U),be=["oauth2","openIdConnect"].includes(U.type)?l.getScopes().slice():[];return this.addSecurityScheme(_,U),{name:_,scopes:be}}));this.addPath(Br(y),{[x]:{operationId:H,summary:T,description:u,tags:z.length>0?z:void 0,parameters:xe.length>0?xe:void 0,requestBody:lt,security:Me.length>0?Me:void 0,responses:ke}})}}),this.rootDoc.tags=r.tags?Xr(r.tags):[]}};import{createRequest as ws,createResponse as zs}from"node-mocks-http";var Is=e=>ws({...e,headers:{"content-type":R.json,...e?.headers}}),Cs=e=>zs(e),Zs=e=>{let t={warn:[],error:[],info:[],debug:[]};return new Proxy(e||{},{get(r,o,n){return o==="_getLogs"?()=>t:mr(o)?(...i)=>t[o].push(i):Reflect.get(r,o,n)}})},eo=({requestProps:e,responseOptions:t,configProps:r,loggerProps:o})=>{let n=Is(e),i=Cs({req:n,...t});i.req=t?.req||n,n.res=i;let a=Zs(o),p={cors:!1,logger:a,...r};return{requestMock:n,responseMock:i,loggerMock:a,configMock:p}},Es=async({endpoint:e,...t})=>{let{requestMock:r,responseMock:o,loggerMock:n,configMock:i}=eo(t);return await e.execute({request:r,response:o,config:i,logger:n}),{requestMock:r,responseMock:o,loggerMock:n}},vs=async({middleware:e,options:t={},errorHandler:r,...o})=>{let{requestMock:n,responseMock:i,loggerMock:a,configMock:p}=eo(o),d=Ue(n,p.inputSources);try{let c=await e.execute({request:n,response:i,logger:a,input:d,options:t});return{requestMock:n,responseMock:i,loggerMock:a,output:c}}catch(c){if(!r)throw c;return r(B(c),i),{requestMock:n,responseMock:i,loggerMock:a,output:{}}}};import N from"typescript";import j from"typescript";import{chain as to}from"ramda";var s=j.factory,G=[s.createModifier(j.SyntaxKind.ExportKeyword)],js=[s.createModifier(j.SyntaxKind.AsyncKeyword)],Ns=[s.createModifier(j.SyntaxKind.PublicKeyword),s.createModifier(j.SyntaxKind.ReadonlyKeyword)],ro=[s.createModifier(j.SyntaxKind.ProtectedKeyword),s.createModifier(j.SyntaxKind.ReadonlyKeyword)],jt=s.createTemplateHead(""),he=s.createTemplateTail(""),Nt=s.createTemplateMiddle(" "),Lt=e=>s.createTemplateLiteralType(jt,e.map((t,r)=>s.createTemplateLiteralTypeSpan(s.createTypeReferenceNode(t),r===e.length-1?he:Nt))),kt=Lt(["M","P"]),at=(e,t,r)=>s.createParameterDeclaration(r,void 0,e,void 0,t,void 0),pt=(e,t)=>to(([r,o])=>[at(s.createIdentifier(r),o,t)],Object.entries(e)),Mt=(e,t)=>s.createExpressionWithTypeArguments(s.createIdentifier("Record"),[typeof e=="number"?s.createKeywordTypeNode(e):s.createTypeReferenceNode(e),s.createKeywordTypeNode(t)]),oo=e=>s.createConstructorDeclaration(void 0,e,s.createBlock([])),no=(e,t)=>s.createPropertySignature(void 0,e,void 0,s.createTypeReferenceNode(t)),D=(e,t,r)=>s.createVariableDeclarationList([s.createVariableDeclaration(e,void 0,r,t)],j.NodeFlags.Const),Ht=(e,t)=>s.createTypeAliasDeclaration(G,e,void 0,s.createUnionTypeNode(t.map(r=>s.createLiteralTypeNode(s.createStringLiteral(r))))),ct=(e,t)=>s.createTypeAliasDeclaration(G,e,void 0,t),so=(e,t,r)=>s.createPropertyDeclaration(Ns,e,void 0,t,r),io=(e,t,r)=>s.createClassDeclaration(G,e,void 0,void 0,[t,...r]),ao=(e,t)=>s.createTypeReferenceNode("Promise",[s.createIndexedAccessTypeNode(s.createTypeReferenceNode(e),t)]),po=()=>s.createTypeReferenceNode("Promise",[s.createKeywordTypeNode(j.SyntaxKind.AnyKeyword)]),co=(e,t,r)=>s.createInterfaceDeclaration(G,e,void 0,t,r),Ls=to(([e,t])=>[s.createTypeParameterDeclaration([],e,s.createTypeReferenceNode(t))]),lo=e=>Ls(Object.entries(e)),Ut=(e,t,r)=>s.createArrowFunction(r?js:void 0,void 0,e.map(o=>at(o)),void 0,void 0,t),Kt=(e,t,r)=>s.createCallExpression(s.createPropertyAccessExpression(s.createCallExpression(s.createPropertyAccessExpression(s.createIdentifier("Object"),"keys"),void 0,[e]),"reduce"),void 0,[s.createArrowFunction(void 0,void 0,pt({acc:void 0,key:void 0}),void 0,void 0,t),r]),mo=(...e)=>`"${e.join(" ")}"`,uo=(e,t,r)=>s.createConditionalExpression(e,s.createToken(j.SyntaxKind.QuestionToken),t,s.createToken(j.SyntaxKind.ColonToken),r);var fo=["get","post","put","delete","patch"];import g from"typescript";import{z as Bt}from"zod";import S from"typescript";var{factory:dt}=S,Dt=(e,t)=>S.addSyntheticLeadingComment(e,S.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0),se=(e,t,r)=>{let o=dt.createTypeAliasDeclaration(void 0,dt.createIdentifier(t),void 0,e);return r?Dt(o,r):o},Ft=(e,t)=>{let r=S.createSourceFile("print.ts","",S.ScriptTarget.Latest,!1,S.ScriptKind.TS);return S.createPrinter(t).printNode(S.EmitHint.Unspecified,e,r)},ks=/^[A-Za-z_$][A-Za-z0-9_$]*$/,yo=e=>ks.test(e)?dt.createIdentifier(e):dt.createStringLiteral(e),Ms=[S.SyntaxKind.AnyKeyword,S.SyntaxKind.BigIntKeyword,S.SyntaxKind.BooleanKeyword,S.SyntaxKind.NeverKeyword,S.SyntaxKind.NumberKeyword,S.SyntaxKind.ObjectKeyword,S.SyntaxKind.StringKeyword,S.SyntaxKind.SymbolKeyword,S.SyntaxKind.UndefinedKeyword,S.SyntaxKind.UnknownKeyword,S.SyntaxKind.VoidKeyword],go=e=>Ms.includes(e.kind);var{factory:m}=g,Hs={[g.SyntaxKind.AnyKeyword]:"",[g.SyntaxKind.BigIntKeyword]:BigInt(0),[g.SyntaxKind.BooleanKeyword]:!1,[g.SyntaxKind.NumberKeyword]:0,[g.SyntaxKind.ObjectKeyword]:{},[g.SyntaxKind.StringKeyword]:"",[g.SyntaxKind.UndefinedKeyword]:void 0},Us=({value:e})=>m.createLiteralTypeNode(typeof e=="number"?m.createNumericLiteral(e):typeof e=="boolean"?e?m.createTrue():m.createFalse():m.createStringLiteral(e)),Ks=({shape:e},{isResponse:t,next:r,optionalPropStyle:{withQuestionMark:o}})=>{let n=Object.entries(e).map(([i,a])=>{let p=t&&Ae(a)?a instanceof Bt.ZodOptional:a.isOptional(),d=m.createPropertySignature(void 0,yo(i),p&&o?m.createToken(g.SyntaxKind.QuestionToken):void 0,r(a));return a.description?Dt(d,a.description):d});return m.createTypeLiteralNode(n)},Ds=({element:e},{next:t})=>m.createArrayTypeNode(t(e)),Fs=({options:e})=>m.createUnionTypeNode(e.map(t=>m.createLiteralTypeNode(m.createStringLiteral(t)))),ho=({options:e},{next:t})=>{let r=new Map;for(let o of e){let n=t(o);r.set(go(n)?n.kind:n,n)}return m.createUnionTypeNode(Array.from(r.values()))},Bs=e=>Hs?.[e.kind],qs=(e,{next:t,isResponse:r})=>{let o=t(e.innerType());if(r&&e._def.effect.type==="transform"){let n=Ke(e,Bs(o)),i={number:g.SyntaxKind.NumberKeyword,bigint:g.SyntaxKind.BigIntKeyword,boolean:g.SyntaxKind.BooleanKeyword,string:g.SyntaxKind.StringKeyword,undefined:g.SyntaxKind.UndefinedKeyword,object:g.SyntaxKind.ObjectKeyword};return m.createKeywordTypeNode(n&&i[n]||g.SyntaxKind.AnyKeyword)}return o},Vs=e=>m.createUnionTypeNode(Object.values(e.enum).map(t=>m.createLiteralTypeNode(typeof t=="number"?m.createNumericLiteral(t):m.createStringLiteral(t)))),$s=(e,{next:t,optionalPropStyle:{withUndefined:r}})=>{let o=t(e.unwrap());return r?m.createUnionTypeNode([o,m.createKeywordTypeNode(g.SyntaxKind.UndefinedKeyword)]):o},Gs=(e,{next:t})=>m.createUnionTypeNode([t(e.unwrap()),m.createLiteralTypeNode(m.createNull())]),_s=({items:e,_def:{rest:t}},{next:r})=>m.createTupleTypeNode(e.map(r).concat(t===null?[]:m.createRestTypeNode(r(t)))),Ys=({keySchema:e,valueSchema:t},{next:r})=>m.createExpressionWithTypeArguments(m.createIdentifier("Record"),[e,t].map(r)),Qs=({_def:{left:e,right:t}},{next:r})=>{let o=[e,t].map(r);return o.every(g.isTypeLiteralNode)?m.createTypeLiteralNode(o.flatMap(({members:i})=>i)):m.createIntersectionTypeNode(o)},Ws=({_def:e},{next:t})=>t(e.innerType),ie=e=>()=>m.createKeywordTypeNode(e),Js=(e,{next:t})=>t(e.unwrap()),Xs=(e,{next:t})=>t(e.unwrap()),ei=({_def:e},{next:t})=>t(e.innerType),ti=({_def:e},{next:t,isResponse:r})=>t(e[r?"out":"in"]),ri=()=>m.createLiteralTypeNode(m.createNull()),oi=(e,{makeAlias:t,next:r})=>t(e,()=>r(e.schema)),ni=e=>{let t=e.unwrap(),r=m.createKeywordTypeNode(g.SyntaxKind.StringKeyword),o=m.createTypeReferenceNode("Buffer"),n=m.createUnionTypeNode([r,o]);return t instanceof Bt.ZodString?r:t instanceof Bt.ZodUnion?n:o},si=(e,{next:t})=>t(e.unwrap().shape.raw),ii={ZodString:ie(g.SyntaxKind.StringKeyword),ZodNumber:ie(g.SyntaxKind.NumberKeyword),ZodBigInt:ie(g.SyntaxKind.BigIntKeyword),ZodBoolean:ie(g.SyntaxKind.BooleanKeyword),ZodAny:ie(g.SyntaxKind.AnyKeyword),[X]:ie(g.SyntaxKind.StringKeyword),[ee]:ie(g.SyntaxKind.StringKeyword),ZodNull:ri,ZodArray:Ds,ZodTuple:_s,ZodRecord:Ys,ZodObject:Ks,ZodLiteral:Us,ZodIntersection:Qs,ZodUnion:ho,ZodDefault:Ws,ZodEnum:Fs,ZodNativeEnum:Vs,ZodEffects:qs,ZodOptional:$s,ZodNullable:Gs,ZodDiscriminatedUnion:ho,ZodBranded:Js,ZodCatch:ei,ZodPipeline:ti,ZodLazy:oi,ZodReadonly:Xs,[k]:ni,[V]:si},Le=(e,{brandHandling:t,ctx:r})=>oe(e,{rules:{...t,...ii},onMissing:()=>m.createKeywordTypeNode(g.SyntaxKind.AnyKeyword),ctx:r});var qt=class{program=[];usage=[];registry=new Map;paths=[];aliases=new Map;ids={pathType:s.createIdentifier("Path"),methodType:s.createIdentifier("Method"),methodPathType:s.createIdentifier("MethodPath"),inputInterface:s.createIdentifier("Input"),posResponseInterface:s.createIdentifier("PositiveResponse"),negResponseInterface:s.createIdentifier("NegativeResponse"),responseInterface:s.createIdentifier("Response"),jsonEndpointsConst:s.createIdentifier("jsonEndpoints"),endpointTagsConst:s.createIdentifier("endpointTags"),providerType:s.createIdentifier("Provider"),implementationType:s.createIdentifier("Implementation"),clientClass:s.createIdentifier("ExpressZodAPIClient"),keyParameter:s.createIdentifier("key"),pathParameter:s.createIdentifier("path"),paramsArgument:s.createIdentifier("params"),methodParameter:s.createIdentifier("method"),accumulator:s.createIdentifier("acc"),provideMethod:s.createIdentifier("provide"),implementationArgument:s.createIdentifier("implementation"),headersProperty:s.createIdentifier("headers"),hasBodyConst:s.createIdentifier("hasBody"),undefinedValue:s.createIdentifier("undefined"),bodyProperty:s.createIdentifier("body"),responseConst:s.createIdentifier("response"),searchParamsConst:s.createIdentifier("searchParams"),exampleImplementationConst:s.createIdentifier("exampleImplementation"),clientConst:s.createIdentifier("client"),parserConst:s.createIdentifier("parser")};interfaces=[];makeAlias(t,r){let o=this.aliases.get(t)?.name?.text;if(!o){o=`Type${this.aliases.size+1}`;let n=s.createLiteralTypeNode(s.createNull());this.aliases.set(t,se(n,o)),this.aliases.set(t,se(r(),o))}return s.createTypeReferenceNode(o)}constructor({routing:t,brandHandling:r,variant:o="client",splitResponse:n=!1,optionalPropStyle:i={withQuestionMark:!0,withUndefined:!0}}){ye({routing:t,onEndpoint:(I,w,C)=>{let ae={makeAlias:this.makeAlias.bind(this),optionalPropStyle:i},Se=v(C,w,"input"),Te=Le(I.getSchema("input"),{brandHandling:r,ctx:{...ae,isResponse:!1}}),Z=n?v(C,w,"positive.response"):void 0,Vt=I.getSchema("positive"),$t=n?Le(Vt,{brandHandling:r,ctx:{...ae,isResponse:!0}}):void 0,Oe=n?v(C,w,"negative.response"):void 0,Gt=I.getSchema("negative"),_t=n?Le(Gt,{brandHandling:r,ctx:{...ae,isResponse:!0}}):void 0,Yt=v(C,w,"response"),xo=Z&&Oe?s.createUnionTypeNode([s.createTypeReferenceNode(Z),s.createTypeReferenceNode(Oe)]):Le(Vt.or(Gt),{brandHandling:r,ctx:{...ae,isResponse:!0}});this.program.push(se(Te,Se)),$t&&Z&&this.program.push(se($t,Z)),_t&&Oe&&this.program.push(se(_t,Oe)),this.program.push(se(xo,Yt)),this.paths.push(w),this.registry.set({method:C,path:w},{input:Se,positive:Z,negative:Oe,response:Yt,isJson:I.getMimeTypes("positive").includes(R.json),tags:I.getTags()})}}),this.program.unshift(...this.aliases.values()),this.program.push(Ht(this.ids.pathType,this.paths)),this.program.push(Ht(this.ids.methodType,fo)),this.program.push(ct(this.ids.methodPathType,Lt([this.ids.methodType,this.ids.pathType])));let a=[s.createHeritageClause(N.SyntaxKind.ExtendsKeyword,[Mt(this.ids.methodPathType,N.SyntaxKind.AnyKeyword)])];this.interfaces.push({id:this.ids.inputInterface,kind:"input",props:[]}),n&&this.interfaces.push({id:this.ids.posResponseInterface,kind:"positive",props:[]},{id:this.ids.negResponseInterface,kind:"negative",props:[]}),this.interfaces.push({id:this.ids.responseInterface,kind:"response",props:[]});let p=[],d=[];for(let[{method:I,path:w},{isJson:C,tags:ae,...Se}]of this.registry){let Te=mo(I,w);for(let Z of this.interfaces)Z.kind in Se&&Z.props.push(no(Te,Se[Z.kind]));o!=="types"&&(C&&p.push(s.createPropertyAssignment(Te,s.createTrue())),d.push(s.createPropertyAssignment(Te,s.createArrayLiteralExpression(ae.map(Z=>s.createStringLiteral(Z))))))}for(let{id:I,props:w}of this.interfaces)this.program.push(co(I,a,w));if(o==="types")return;let c=s.createVariableStatement(G,D(this.ids.jsonEndpointsConst,s.createObjectLiteralExpression(p))),f=s.createVariableStatement(G,D(this.ids.endpointTagsConst,s.createObjectLiteralExpression(d))),l=ct(this.ids.providerType,s.createFunctionTypeNode(lo({M:this.ids.methodType,P:this.ids.pathType}),pt({method:s.createTypeReferenceNode("M"),path:s.createTypeReferenceNode("P"),params:s.createIndexedAccessTypeNode(s.createTypeReferenceNode(this.ids.inputInterface),kt)}),ao(this.ids.responseInterface,kt))),y=ct(this.ids.implementationType,s.createFunctionTypeNode(void 0,pt({method:s.createTypeReferenceNode(this.ids.methodType),path:s.createKeywordTypeNode(N.SyntaxKind.StringKeyword),params:Mt(N.SyntaxKind.StringKeyword,N.SyntaxKind.AnyKeyword)}),po())),x=s.createTemplateExpression(s.createTemplateHead(":"),[s.createTemplateSpan(this.ids.keyParameter,he)]),P=Kt(this.ids.paramsArgument,s.createCallExpression(s.createPropertyAccessExpression(this.ids.accumulator,"replace"),void 0,[x,s.createElementAccessExpression(this.ids.paramsArgument,this.ids.keyParameter)]),this.ids.pathParameter),O=Kt(this.ids.paramsArgument,s.createConditionalExpression(s.createBinaryExpression(s.createCallExpression(s.createPropertyAccessExpression(this.ids.pathParameter,"indexOf"),void 0,[x]),N.SyntaxKind.GreaterThanEqualsToken,s.createNumericLiteral(0)),void 0,this.ids.accumulator,void 0,s.createObjectLiteralExpression([s.createSpreadAssignment(this.ids.accumulator),s.createPropertyAssignment(s.createComputedPropertyName(this.ids.keyParameter),s.createElementAccessExpression(this.ids.paramsArgument,this.ids.keyParameter))])),s.createObjectLiteralExpression()),u=io(this.ids.clientClass,oo([at(this.ids.implementationArgument,s.createTypeReferenceNode(this.ids.implementationType),ro)]),[so(this.ids.provideMethod,s.createTypeReferenceNode(this.ids.providerType),Ut([this.ids.methodParameter,this.ids.pathParameter,this.ids.paramsArgument],s.createCallExpression(s.createPropertyAccessExpression(s.createThis(),this.ids.implementationArgument),void 0,[this.ids.methodParameter,P,O]),!0))]);this.program.push(c,f,l,y,u);let T=s.createPropertyAssignment(this.ids.methodParameter,s.createCallExpression(s.createPropertyAccessExpression(this.ids.methodParameter,"toUpperCase"),void 0,void 0)),z=s.createPropertyAssignment(this.ids.headersProperty,s.createConditionalExpression(this.ids.hasBodyConst,void 0,s.createObjectLiteralExpression([s.createPropertyAssignment(s.createStringLiteral("Content-Type"),s.createStringLiteral(R.json))]),void 0,this.ids.undefinedValue)),L=s.createPropertyAssignment(this.ids.bodyProperty,s.createConditionalExpression(this.ids.hasBodyConst,void 0,s.createCallExpression(s.createPropertyAccessExpression(s.createIdentifier("JSON"),"stringify"),void 0,[this.ids.paramsArgument]),void 0,this.ids.undefinedValue)),H=s.createVariableStatement(void 0,D(this.ids.responseConst,s.createAwaitExpression(s.createCallExpression(s.createIdentifier("fetch"),void 0,[s.createTemplateExpression(s.createTemplateHead("https://example.com"),[s.createTemplateSpan(this.ids.pathParameter,s.createTemplateMiddle("")),s.createTemplateSpan(this.ids.searchParamsConst,he)]),s.createObjectLiteralExpression([T,z,L])])))),xe=s.createVariableStatement(void 0,D(this.ids.hasBodyConst,s.createLogicalNot(s.createCallExpression(s.createPropertyAccessExpression(s.createArrayLiteralExpression([s.createStringLiteral("get"),s.createStringLiteral("delete")]),"includes"),void 0,[this.ids.methodParameter])))),ke=s.createVariableStatement(void 0,D(this.ids.searchParamsConst,s.createConditionalExpression(this.ids.hasBodyConst,void 0,s.createStringLiteral(""),void 0,s.createTemplateExpression(s.createTemplateHead("?"),[s.createTemplateSpan(s.createNewExpression(s.createIdentifier("URLSearchParams"),void 0,[this.ids.paramsArgument]),he)])))),lt=s.createVariableStatement(void 0,D(this.ids.parserConst,uo(s.createBinaryExpression(s.createTemplateExpression(jt,[s.createTemplateSpan(this.ids.methodParameter,Nt),s.createTemplateSpan(this.ids.pathParameter,he)]),N.SyntaxKind.InKeyword,this.ids.jsonEndpointsConst),s.createStringLiteral("json"),s.createStringLiteral("text")))),Me=s.createReturnStatement(s.createCallExpression(s.createElementAccessExpression(this.ids.responseConst,this.ids.parserConst),void 0,[])),U=s.createVariableStatement(G,D(this.ids.exampleImplementationConst,Ut([this.ids.methodParameter,this.ids.pathParameter,this.ids.paramsArgument],s.createBlock([xe,ke,H,lt,Me]),!0),s.createTypeReferenceNode(this.ids.implementationType))),_=s.createExpressionStatement(s.createCallExpression(s.createPropertyAccessExpression(this.ids.clientConst,this.ids.provideMethod),void 0,[s.createStringLiteral("get"),s.createStringLiteral("/v1/user/retrieve"),s.createObjectLiteralExpression([s.createPropertyAssignment("id",s.createStringLiteral("10"))])])),be=s.createVariableStatement(void 0,D(this.ids.clientConst,s.createNewExpression(this.ids.clientClass,void 0,[this.ids.exampleImplementationConst])));this.usage.push(U,be,_)}printUsage(t){return this.usage.length?this.usage.map(r=>typeof r=="string"?r:Ft(r,t)).join(`
19
- `):void 0}print(t){let r=this.printUsage(t),o=r&&N.addSyntheticLeadingComment(N.addSyntheticLeadingComment(s.createEmptyStatement(),N.SyntaxKind.SingleLineCommentTrivia," Usage example:"),N.SyntaxKind.MultiLineCommentTrivia,`
20
- ${r}`);return this.program.concat(o||[]).map((n,i)=>Ft(n,i<this.program.length?t:{...t,omitTrailingSemicolon:!0})).join(`
18
+ `)};var kr=e=>{e.startupLogo!==!1&&console.log(Lr());let t=e.errorHandler||Ze,r=mr(e.logger)?e.logger:new ve(e.logger);r.debug("Running",{build:"v21.0.0-beta.5 (ESM)",env:process.env.NODE_ENV||"development"}),vr(r);let o=Zr({logger:r,config:e}),i={getLogger:Er(r),errorHandler:t},a=zr(i),p=wr(i);return{...i,logger:r,notFoundHandler:a,parserFailureHandler:p,loggingMiddleware:o}},bn=(e,t)=>{let{logger:r,getLogger:o,notFoundHandler:n,loggingMiddleware:i}=kr(e);return wt({app:e.app.use(i),routing:t,getLogger:o,config:e}),{notFoundHandler:n,logger:r}},Sn=async(e,t)=>{let{logger:r,getLogger:o,notFoundHandler:n,parserFailureHandler:i,loggingMiddleware:a}=kr(e),p=zt().disable("x-powered-by").use(a);if(e.compression){let y=await ge("compression");p.use(y(typeof e.compression=="object"?e.compression:void 0))}let d={json:[e.jsonParser||zt.json()],raw:[e.rawParser||zt.raw(),Cr],upload:e.upload?await Ir({config:e,getLogger:o}):[]};await e.beforeRouting?.({app:p,getLogger:o}),wt({app:p,routing:t,getLogger:o,config:e,parsers:d}),p.use(i,n);let c=[],u=(y,x)=>()=>y.listen(x,()=>r.info("Listening",x)),l=[];if(e.http){let y=hn.createServer(p);c.push(y),l.push(u(y,e.http.listen))}if(e.https){let y=xn.createServer(e.https.options,p);c.push(y),l.push(u(y,e.https.listen))}return e.gracefulShutdown&&jr({logger:r,servers:c,options:e.gracefulShutdown===!0?{}:e.gracefulShutdown}),{app:p,logger:r,servers:l.map(y=>y())}};import{OpenApiBuilder as As}from"openapi3-ts/oas31";import{keys as Ps,pluck as ws}from"ramda";import{isReferenceObject as Zt,isSchemaObject as ot}from"openapi3-ts/oas31";import{concat as Tn,type as Ur,filter as On,fromPairs as nt,has as Rn,isNil as An,map as xe,mergeAll as Pn,mergeDeepRight as wn,mergeDeepWith as zn,objOf as Dr,omit as st,pipe as Kr,pluck as In,range as Cn,reject as Zn,toLower as En,union as vn,when as jn,xprod as It,zip as Nn}from"ramda";import{z as b}from"zod";var ne=(e,{onEach:t,rules:r,onMissing:o,ctx:n={}})=>{let i=r[e._def[h]?.brand]||r[e._def.typeName],p=i?i(e,{...n,next:c=>ne(c,{ctx:n,onEach:t,rules:r,onMissing:o})}):o(e,n),d=t&&t(e,{prev:p,...n});return d?{...p,...d}:p};var Mr=50,Fr="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString",Ln={integer:0,number:0,string:"",boolean:!1,object:{},null:null,array:[]},Br=/:([A-Za-z0-9_]+)/g,kn=e=>e.match(Br)?.map(t=>t.slice(1))||[],qr=e=>e.replace(Br,t=>`{${t.slice(1)}}`),Mn=({_def:e},{next:t})=>({...t(e.innerType),default:e[h]?.defaultLabel||e.defaultValue()}),Hn=({_def:{innerType:e}},{next:t})=>t(e),Un=()=>({format:"any"}),Dn=({},e)=>{if(e.isResponse)throw new v("Please use ez.upload() only for input.",e);return{type:"string",format:"binary"}},Kn=e=>{let t=e.unwrap();return{type:"string",format:t instanceof b.ZodString?t._def.checks.find(r=>r.kind==="base64")?"byte":"file":"binary"}},Fn=({options:e},{next:t})=>({oneOf:e.map(t)}),Bn=({options:e,discriminator:t},{next:r})=>({discriminator:{propertyName:t},oneOf:e.map(r)}),qn=(e,t)=>{if(Array.isArray(e)&&Array.isArray(t))return Tn(e,t);if(e===t)return t;throw new Error("Can not flatten properties")},$n=e=>{let[t,r]=e.filter(ot).filter(n=>n.type==="object"&&Object.keys(n).every(i=>["type","properties","required","examples"].includes(i)));if(!t||!r)throw new Error("Can not flatten objects");let o={type:"object"};return(t.properties||r.properties)&&(o.properties=zn(qn,t.properties||{},r.properties||{})),(t.required||r.required)&&(o.required=vn(t.required||[],r.required||[])),(t.examples||r.examples)&&(o.examples=W(t.examples||[],r.examples||[],([n,i])=>wn(n,i))),o},Gn=({_def:{left:e,right:t}},{next:r})=>{let o=[e,t].map(r);try{return $n(o)}catch{}return{allOf:o}},Vn=(e,{next:t})=>t(e.unwrap()),_n=(e,{next:t})=>t(e.unwrap()),Yn=(e,{next:t})=>{let r=t(e.unwrap());return ot(r)&&(r.type=Gr(r)),r},$r=e=>{let t=En(Ur(e));return typeof e=="bigint"?"integer":t==="number"||t==="string"||t==="boolean"||t==="object"||t==="null"||t==="array"?t:void 0},Hr=e=>({type:$r(Object.values(e.enum)[0]),enum:Object.values(e.enum)}),Qn=({value:e})=>({type:$r(e),const:e}),Jn=(e,{isResponse:t,next:r})=>{let o=Object.keys(e.shape),n=p=>t&&Pe(p)?p instanceof b.ZodOptional:p.isOptional(),i=o.filter(p=>!n(e.shape[p])),a={type:"object"};return o.length&&(a.properties=rt(e,r)),i.length&&(a.required=i),a},Wn=()=>({type:"null"}),Xn=({},e)=>{if(e.isResponse)throw new v("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:Fr}}},es=({},e)=>{if(!e.isResponse)throw new v("Please use ez.dateIn() for input.",e);return{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",externalDocs:{url:Fr}}},ts=({},e)=>{throw new v(`Using z.date() within ${e.isResponse?"output":"input"} schema is forbidden. Please use ez.date${e.isResponse?"Out":"In"}() instead. Check out the documentation for details.`,e)},rs=()=>({type:"boolean"}),os=()=>({type:"integer",format:"bigint"}),ns=e=>e.every(t=>t instanceof b.ZodLiteral),ss=({keySchema:e,valueSchema:t},{next:r})=>{if(e instanceof b.ZodEnum||e instanceof b.ZodNativeEnum){let o=Object.values(e.enum),n={type:"object"};return o.length&&(n.properties=rt(b.object(nt(It(o,[t]))),r),n.required=o),n}if(e instanceof b.ZodLiteral)return{type:"object",properties:rt(b.object({[e.value]:t}),r),required:[e.value]};if(e instanceof b.ZodUnion&&ns(e.options)){let o=xe(i=>`${i.value}`,e.options),n=nt(It(o,[t]));return{type:"object",properties:rt(b.object(n),r),required:o}}return{type:"object",additionalProperties:r(t)}},is=({_def:{minLength:e,maxLength:t},element:r},{next:o})=>{let n={type:"array",items:o(r)};return e&&(n.minItems=e.value),t&&(n.maxItems=t.value),n},as=({items:e,_def:{rest:t}},{next:r})=>({type:"array",prefixItems:e.map(r),items:t===null?{not:{}}:r(t)}),ps=({isEmail:e,isURL:t,minLength:r,maxLength:o,isUUID:n,isCUID:i,isCUID2:a,isULID:p,isIP:d,isEmoji:c,isDatetime:u,_def:{checks:l}})=>{let y=l.find(T=>T.kind==="regex"),x=l.find(T=>T.kind==="datetime"),R=y?y.regex:x?x.offset?new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(([+-]\\d{2}:\\d{2})|Z)$"):new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?Z$"):void 0,O={type:"string"},f={"date-time":u,email:e,url:t,uuid:n,cuid:i,cuid2:a,ulid:p,ip:d,emoji:c};for(let T in f)if(f[T]){O.format=T;break}return r!==null&&(O.minLength=r),o!==null&&(O.maxLength=o),R&&(O.pattern=R.source),O},cs=({isInt:e,maxValue:t,minValue:r,_def:{checks:o}})=>{let n=o.find(l=>l.kind==="min"),i=r===null?e?Number.MIN_SAFE_INTEGER:-Number.MAX_VALUE:r,a=n?n.inclusive:!0,p=o.find(l=>l.kind==="max"),d=t===null?e?Number.MAX_SAFE_INTEGER:Number.MAX_VALUE:t,c=p?p.inclusive:!0,u={type:e?"integer":"number",format:e?"int64":"double"};return a?u.minimum=i:u.exclusiveMinimum=i,c?u.maximum=d:u.exclusiveMaximum=d,u},rt=({shape:e},t)=>xe(t,e),ds=e=>{let t=Array.isArray(e.type)?e.type[0]:e.type;return Ln?.[t]},Gr=({type:e})=>e==="null"?e:typeof e=="string"?[e,"null"]:e?[...new Set(e).add("null")]:"null",ls=(e,{isResponse:t,next:r})=>{let o=r(e.innerType()),{effect:n}=e._def;if(t&&n.type==="transform"&&ot(o)){let i=Ke(e,ds(o));return i&&["number","string","boolean"].includes(i)?{type:i}:r(b.any())}if(!t&&n.type==="preprocess"&&ot(o)){let{type:i,...a}=o;return{...a,format:`${a.format||i} (preprocessed)`}}return o},ms=({_def:e},{isResponse:t,next:r})=>r(e[t?"out":"in"]),us=(e,{next:t})=>t(e.unwrap()),fs=(e,{next:t,makeRef:r})=>r(e,()=>t(e.schema)),ys=(e,{next:t})=>t(e.unwrap().shape.raw),Vr=e=>e.length?nt(Nn(Cn(1,e.length+1).map(t=>`example${t}`),xe(Dr("value"),e))):void 0,_r=(e,t,r=[])=>Kr($,xe(jn(o=>Ur(o)==="Object",st(r))),Vr)({schema:e,variant:t?"parsed":"original",validate:!0}),gs=(e,t)=>Kr($,On(Rn(t)),In(t),Vr)({schema:e,variant:"original",validate:!0}),se=e=>e instanceof b.ZodObject?e:e instanceof b.ZodBranded?se(e.unwrap()):e instanceof b.ZodUnion||e instanceof b.ZodDiscriminatedUnion?e.options.map(t=>se(t)).reduce((t,r)=>t.merge(r.partial()),b.object({})):e instanceof b.ZodEffects?se(e._def.schema):e instanceof b.ZodPipeline?se(e._def.in):se(e._def.left).merge(se(e._def.right)),Yr=({path:e,method:t,schema:r,inputSources:o,makeRef:n,composition:i,brandHandling:a,description:p=`${t.toUpperCase()} ${e} Parameter`})=>{let{shape:d}=se(r),c=kn(e),u=o.includes("query"),l=o.includes("params"),y=o.includes("headers"),x=f=>l&&c.includes(f),R=f=>y&&yt(f);return Object.keys(d).map(f=>({name:f,location:x(f)?"path":R(f)?"header":u?"query":void 0})).filter(f=>f.location!==void 0).map(({name:f,location:T})=>{let w=ne(d[f],{rules:{...a,...Et},onEach:vt,onMissing:jt,ctx:{isResponse:!1,makeRef:n,path:e,method:t}}),I=i==="components"?n(d[f],w,j(p,f)):w;return{name:f,in:T,required:!d[f].isOptional(),description:w.description||p,schema:I,examples:gs(r,f)}})},Et={ZodString:ps,ZodNumber:cs,ZodBigInt:os,ZodBoolean:rs,ZodNull:Wn,ZodArray:is,ZodTuple:as,ZodRecord:ss,ZodObject:Jn,ZodLiteral:Qn,ZodIntersection:Gn,ZodUnion:Fn,ZodAny:Un,ZodDefault:Mn,ZodEnum:Hr,ZodNativeEnum:Hr,ZodEffects:ls,ZodOptional:Vn,ZodNullable:Yn,ZodDiscriminatedUnion:Bn,ZodBranded:us,ZodDate:ts,ZodCatch:Hn,ZodPipeline:ms,ZodLazy:fs,ZodReadonly:_n,[k]:Kn,[le]:Dn,[te]:es,[ee]:Xn,[G]:ys},vt=(e,{isResponse:t,prev:r})=>{if(Zt(r))return{};let{description:o}=e,n=e instanceof b.ZodLazy,i=r.type!==void 0,a=t&&Pe(e),p=!n&&i&&!a&&e.isNullable(),d={};if(o&&(d.description=o),p&&(d.type=Gr(r)),!n){let c=$({schema:e,variant:t?"parsed":"original",validate:!0});c.length&&(d.examples=c.slice())}return d},jt=(e,t)=>{throw new v(`Zod type ${e.constructor.name} is unsupported.`,t)},Ct=(e,t)=>{if(Zt(e))return e;let r={...e};return r.properties&&(r.properties=st(t,r.properties)),r.examples&&(r.examples=r.examples.map(o=>st(t,o))),r.required&&(r.required=r.required.filter(o=>!t.includes(o))),r.allOf&&(r.allOf=r.allOf.map(o=>Ct(o,t))),r.oneOf&&(r.oneOf=r.oneOf.map(o=>Ct(o,t))),r},Qr=e=>Zt(e)?e:st(["examples"],e),Jr=({method:e,path:t,schema:r,mimeTypes:o,variant:n,makeRef:i,composition:a,hasMultipleStatusCodes:p,statusCode:d,brandHandling:c,description:u=`${e.toUpperCase()} ${t} ${gt(n)} response ${p?d:""}`.trim()})=>{let l=Qr(ne(r,{rules:{...c,...Et},onEach:vt,onMissing:jt,ctx:{isResponse:!0,makeRef:i,path:t,method:e}})),y={schema:a==="components"?i(r,l,j(u)):l,examples:_r(r,!0)};return{description:u,content:nt(It(o,[y]))}},hs=()=>({type:"http",scheme:"basic"}),xs=({format:e})=>{let t={type:"http",scheme:"bearer"};return e&&(t.bearerFormat=e),t},bs=({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}),Ts=({name:e})=>({type:"apiKey",in:"cookie",name:e}),Os=({url:e})=>({type:"openIdConnect",openIdConnectUrl:e}),Rs=({flows:e={}})=>({type:"oauth2",flows:xe(t=>({...t,scopes:t.scopes||{}}),Zn(An,e))}),Wr=(e,t)=>{let r={basic:hs,bearer:xs,input:bs,header:Ss,cookie:Ts,openid:Os,oauth2:Rs};return Je(e,o=>r[o.type](o,t))},it=e=>"or"in e?e.or.map(t=>"and"in t?Pn(xe(({name:r,scopes:o})=>Dr(r,o),t.and)):{[t.name]:t.scopes}):"and"in e?it(Ot(e)):it({or:[e]}),Xr=({method:e,path:t,schema:r,mimeType:o,makeRef:n,composition:i,brandHandling:a,paramNames:p,description:d=`${e.toUpperCase()} ${t} Request body`})=>{let c=Qr(Ct(ne(r,{rules:{...a,...Et},onEach:vt,onMissing:jt,ctx:{isResponse:!1,makeRef:n,path:t,method:e}}),p)),u={schema:i==="components"?n(r,c,j(d)):c,examples:_r(r,!1,p)};return{description:d,content:{[o]:u}}},eo=e=>Object.keys(e).map(t=>{let r=e[t],o={name:t,description:typeof r=="string"?r:r.description};return typeof r=="object"&&r.url&&(o.externalDocs={url:r.url}),o}),Nt=e=>e.length<=Mr?e:e.slice(0,Mr-1)+"\u2026";var Lt=class extends As{lastSecuritySchemaIds=new Map;lastOperationIdSuffixes=new Map;responseVariants=Ps(oe);references=new Map;makeRef(t,r,o=this.references.get(t)){return o||(o=`Schema${this.references.size+1}`,this.references.set(t,o),typeof r=="function"&&(r=r())),typeof r=="object"&&this.addSchema(o,r),{$ref:`#/components/schemas/${o}`}}ensureUniqOperationId(t,r,o){let n=o||j(r,t),i=this.lastOperationIdSuffixes.get(n);if(i===void 0)return this.lastOperationIdSuffixes.set(n,1),n;if(o)throw new v(`Duplicated operationId: "${o}"`,{method:r,isResponse:!1,path:t});return i++,this.lastOperationIdSuffixes.set(n,i),`${n}${i}`}ensureUniqSecuritySchemaName(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.lastSecuritySchemaIds.get(t.type)||0)+1;return this.lastSecuritySchemaIds.set(t.type,o),`${t.type.toUpperCase()}_${o}`}constructor({routing:t,config:r,title:o,version:n,serverUrl:i,descriptions:a,brandHandling:p,hasSummaryFromDescription:d=!0,composition:c="inline"}){super(),this.addInfo({title:o,version:n});for(let l of typeof i=="string"?[i]:i)this.addServer({url:l});he({routing:t,onEndpoint:(l,y,x)=>{let R={path:y,method:x,endpoint:l,composition:c,brandHandling:p,makeRef:this.makeRef.bind(this)},[O,f]=["short","long"].map(l.getDescription.bind(l)),T=O?Nt(O):d&&f?Nt(f):void 0,w=l.getTags(),I=r.inputSources?.[x]||ut[x],H=this.ensureUniqOperationId(y,x,l.getOperationId(x)),be=Yr({...R,inputSources:I,schema:l.getSchema("input"),description:a?.requestParameter?.call(null,{method:x,path:y,operationId:H})}),Me={};for(let U of this.responseVariants){let Y=l.getResponses(U);for(let{mimeTypes:Se,schema:C,statusCodes:z}of Y)for(let Z of z)Me[Z]=Jr({...R,variant:U,schema:C,mimeTypes:Se,statusCode:Z,hasMultipleStatusCodes:Y.length>1||z.length>1,description:a?.[`${U}Response`]?.call(null,{method:x,path:y,operationId:H,statusCode:Z})})}let lt=I.includes("body")?Xr({...R,paramNames:ws("name",be),schema:l.getSchema("input"),mimeType:A[l.getRequestType()],description:a?.requestBody?.call(null,{method:x,path:y,operationId:H})}):void 0,He=it(Je(Wr(l.getSecurity(),I),U=>{let Y=this.ensureUniqSecuritySchemaName(U),Se=["oauth2","openIdConnect"].includes(U.type)?l.getScopes().slice():[];return this.addSecurityScheme(Y,U),{name:Y,scopes:Se}}));this.addPath(qr(y),{[x]:{operationId:H,summary:T,description:f,tags:w.length>0?w:void 0,parameters:be.length>0?be:void 0,requestBody:lt,security:He.length>0?He:void 0,responses:Me}})}}),this.rootDoc.tags=r.tags?eo(r.tags):[]}};import{createRequest as zs,createResponse as Is}from"node-mocks-http";var Cs=e=>zs({...e,headers:{"content-type":A.json,...e?.headers}}),Zs=e=>Is(e),Es=e=>{let t={warn:[],error:[],info:[],debug:[]};return new Proxy(e||{},{get(r,o,n){return o==="_getLogs"?()=>t:ur(o)?(...i)=>t[o].push(i):Reflect.get(r,o,n)}})},to=({requestProps:e,responseOptions:t,configProps:r,loggerProps:o})=>{let n=Cs(e),i=Zs({req:n,...t});i.req=t?.req||n,n.res=i;let a=Es(o),p={cors:!1,logger:a,...r};return{requestMock:n,responseMock:i,loggerMock:a,configMock:p}},vs=async({endpoint:e,...t})=>{let{requestMock:r,responseMock:o,loggerMock:n,configMock:i}=to(t);return await e.execute({request:r,response:o,config:i,logger:n}),{requestMock:r,responseMock:o,loggerMock:n}},js=async({middleware:e,options:t={},errorHandler:r,...o})=>{let{requestMock:n,responseMock:i,loggerMock:a,configMock:p}=to(o),d=De(n,p.inputSources);try{let c=await e.execute({request:n,response:i,logger:a,input:d,options:t});return{requestMock:n,responseMock:i,loggerMock:a,output:c}}catch(c){if(!r)throw c;return r(q(c),i),{requestMock:n,responseMock:i,loggerMock:a,output:{}}}};import L from"typescript";import N from"typescript";import{chain as ro}from"ramda";var s=N.factory,_=[s.createModifier(N.SyntaxKind.ExportKeyword)],Ns=[s.createModifier(N.SyntaxKind.AsyncKeyword)],Ls=[s.createModifier(N.SyntaxKind.PublicKeyword),s.createModifier(N.SyntaxKind.ReadonlyKeyword)],oo=[s.createModifier(N.SyntaxKind.ProtectedKeyword),s.createModifier(N.SyntaxKind.ReadonlyKeyword)],ks=s.createTemplateHead(""),Ms=s.createTemplateMiddle(" "),Le=s.createTemplateTail(""),kt=e=>s.createTemplateLiteralType(ks,e.map((t,r)=>s.createTemplateLiteralTypeSpan(s.createTypeReferenceNode(t),r===e.length-1?Le:Ms))),Mt=kt(["M","P"]),at=(e,t,r)=>s.createParameterDeclaration(r,void 0,e,void 0,t,void 0),pt=(e,t)=>ro(([r,o])=>[at(s.createIdentifier(r),o,t)],Object.entries(e)),Ht=(e,t)=>s.createExpressionWithTypeArguments(s.createIdentifier("Record"),[typeof e=="number"?s.createKeywordTypeNode(e):s.createTypeReferenceNode(e),s.createKeywordTypeNode(t)]),no=e=>s.createConstructorDeclaration(void 0,e,s.createBlock([])),so=(e,t)=>s.createPropertySignature(void 0,e,void 0,s.createTypeReferenceNode(t)),F=(e,t,r)=>s.createVariableDeclarationList([s.createVariableDeclaration(e,void 0,r,t)],N.NodeFlags.Const),Ut=(e,t)=>s.createTypeAliasDeclaration(_,e,void 0,s.createUnionTypeNode(t.map(r=>s.createLiteralTypeNode(s.createStringLiteral(r))))),ct=(e,t)=>s.createTypeAliasDeclaration(_,e,void 0,t),io=(e,t,r)=>s.createPropertyDeclaration(Ls,e,void 0,t,r),ao=(e,t,r)=>s.createClassDeclaration(_,e,void 0,void 0,[t,...r]),po=(e,t)=>s.createTypeReferenceNode("Promise",[s.createIndexedAccessTypeNode(s.createTypeReferenceNode(e),t)]),co=()=>s.createTypeReferenceNode("Promise",[s.createKeywordTypeNode(N.SyntaxKind.AnyKeyword)]),lo=(e,t,r)=>s.createInterfaceDeclaration(_,e,void 0,t,r),Hs=ro(([e,t])=>[s.createTypeParameterDeclaration([],e,s.createTypeReferenceNode(t))]),mo=e=>Hs(Object.entries(e)),Dt=(e,t,r)=>s.createArrowFunction(r?Ns:void 0,void 0,e.map(o=>at(o)),void 0,void 0,t),Kt=(e,t,r)=>s.createCallExpression(s.createPropertyAccessExpression(s.createCallExpression(s.createPropertyAccessExpression(s.createIdentifier("Object"),"keys"),void 0,[e]),"reduce"),void 0,[s.createArrowFunction(void 0,void 0,pt({acc:void 0,key:void 0}),void 0,void 0,t),r]),uo=(...e)=>`"${e.join(" ")}"`,fo=(e,t,r)=>s.createConditionalExpression(e,s.createToken(N.SyntaxKind.QuestionToken),t,s.createToken(N.SyntaxKind.ColonToken),r);var yo=["get","post","put","delete","patch"];import g from"typescript";import{z as qt}from"zod";import S from"typescript";var{factory:dt}=S,Ft=(e,t)=>S.addSyntheticLeadingComment(e,S.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0),ie=(e,t,r)=>{let o=dt.createTypeAliasDeclaration(void 0,dt.createIdentifier(t),void 0,e);return r?Ft(o,r):o},Bt=(e,t)=>{let r=S.createSourceFile("print.ts","",S.ScriptTarget.Latest,!1,S.ScriptKind.TS);return S.createPrinter(t).printNode(S.EmitHint.Unspecified,e,r)},Us=/^[A-Za-z_$][A-Za-z0-9_$]*$/,go=e=>Us.test(e)?dt.createIdentifier(e):dt.createStringLiteral(e),Ds=[S.SyntaxKind.AnyKeyword,S.SyntaxKind.BigIntKeyword,S.SyntaxKind.BooleanKeyword,S.SyntaxKind.NeverKeyword,S.SyntaxKind.NumberKeyword,S.SyntaxKind.ObjectKeyword,S.SyntaxKind.StringKeyword,S.SyntaxKind.SymbolKeyword,S.SyntaxKind.UndefinedKeyword,S.SyntaxKind.UnknownKeyword,S.SyntaxKind.VoidKeyword],ho=e=>Ds.includes(e.kind);var{factory:m}=g,Ks={[g.SyntaxKind.AnyKeyword]:"",[g.SyntaxKind.BigIntKeyword]:BigInt(0),[g.SyntaxKind.BooleanKeyword]:!1,[g.SyntaxKind.NumberKeyword]:0,[g.SyntaxKind.ObjectKeyword]:{},[g.SyntaxKind.StringKeyword]:"",[g.SyntaxKind.UndefinedKeyword]:void 0},Fs=({value:e})=>m.createLiteralTypeNode(typeof e=="number"?m.createNumericLiteral(e):typeof e=="boolean"?e?m.createTrue():m.createFalse():m.createStringLiteral(e)),Bs=({shape:e},{isResponse:t,next:r,optionalPropStyle:{withQuestionMark:o}})=>{let n=Object.entries(e).map(([i,a])=>{let p=t&&Pe(a)?a instanceof qt.ZodOptional:a.isOptional(),d=m.createPropertySignature(void 0,go(i),p&&o?m.createToken(g.SyntaxKind.QuestionToken):void 0,r(a));return a.description?Ft(d,a.description):d});return m.createTypeLiteralNode(n)},qs=({element:e},{next:t})=>m.createArrayTypeNode(t(e)),$s=({options:e})=>m.createUnionTypeNode(e.map(t=>m.createLiteralTypeNode(m.createStringLiteral(t)))),xo=({options:e},{next:t})=>{let r=new Map;for(let o of e){let n=t(o);r.set(ho(n)?n.kind:n,n)}return m.createUnionTypeNode(Array.from(r.values()))},Gs=e=>Ks?.[e.kind],Vs=(e,{next:t,isResponse:r})=>{let o=t(e.innerType());if(r&&e._def.effect.type==="transform"){let n=Ke(e,Gs(o)),i={number:g.SyntaxKind.NumberKeyword,bigint:g.SyntaxKind.BigIntKeyword,boolean:g.SyntaxKind.BooleanKeyword,string:g.SyntaxKind.StringKeyword,undefined:g.SyntaxKind.UndefinedKeyword,object:g.SyntaxKind.ObjectKeyword};return m.createKeywordTypeNode(n&&i[n]||g.SyntaxKind.AnyKeyword)}return o},_s=e=>m.createUnionTypeNode(Object.values(e.enum).map(t=>m.createLiteralTypeNode(typeof t=="number"?m.createNumericLiteral(t):m.createStringLiteral(t)))),Ys=(e,{next:t,optionalPropStyle:{withUndefined:r}})=>{let o=t(e.unwrap());return r?m.createUnionTypeNode([o,m.createKeywordTypeNode(g.SyntaxKind.UndefinedKeyword)]):o},Qs=(e,{next:t})=>m.createUnionTypeNode([t(e.unwrap()),m.createLiteralTypeNode(m.createNull())]),Js=({items:e,_def:{rest:t}},{next:r})=>m.createTupleTypeNode(e.map(r).concat(t===null?[]:m.createRestTypeNode(r(t)))),Ws=({keySchema:e,valueSchema:t},{next:r})=>m.createExpressionWithTypeArguments(m.createIdentifier("Record"),[e,t].map(r)),Xs=({_def:{left:e,right:t}},{next:r})=>{let o=[e,t].map(r);return o.every(g.isTypeLiteralNode)?m.createTypeLiteralNode(o.flatMap(({members:i})=>i)):m.createIntersectionTypeNode(o)},ei=({_def:e},{next:t})=>t(e.innerType),ae=e=>()=>m.createKeywordTypeNode(e),ti=(e,{next:t})=>t(e.unwrap()),ri=(e,{next:t})=>t(e.unwrap()),oi=({_def:e},{next:t})=>t(e.innerType),ni=({_def:e},{next:t,isResponse:r})=>t(e[r?"out":"in"]),si=()=>m.createLiteralTypeNode(m.createNull()),ii=(e,{makeAlias:t,next:r})=>t(e,()=>r(e.schema)),ai=e=>{let t=e.unwrap(),r=m.createKeywordTypeNode(g.SyntaxKind.StringKeyword),o=m.createTypeReferenceNode("Buffer"),n=m.createUnionTypeNode([r,o]);return t instanceof qt.ZodString?r:t instanceof qt.ZodUnion?n:o},pi=(e,{next:t})=>t(e.unwrap().shape.raw),ci={ZodString:ae(g.SyntaxKind.StringKeyword),ZodNumber:ae(g.SyntaxKind.NumberKeyword),ZodBigInt:ae(g.SyntaxKind.BigIntKeyword),ZodBoolean:ae(g.SyntaxKind.BooleanKeyword),ZodAny:ae(g.SyntaxKind.AnyKeyword),[ee]:ae(g.SyntaxKind.StringKeyword),[te]:ae(g.SyntaxKind.StringKeyword),ZodNull:si,ZodArray:qs,ZodTuple:Js,ZodRecord:Ws,ZodObject:Bs,ZodLiteral:Fs,ZodIntersection:Xs,ZodUnion:xo,ZodDefault:ei,ZodEnum:$s,ZodNativeEnum:_s,ZodEffects:Vs,ZodOptional:Ys,ZodNullable:Qs,ZodDiscriminatedUnion:xo,ZodBranded:ti,ZodCatch:oi,ZodPipeline:ni,ZodLazy:ii,ZodReadonly:ri,[k]:ai,[G]:pi},ke=(e,{brandHandling:t,ctx:r})=>ne(e,{rules:{...t,...ci},onMissing:()=>m.createKeywordTypeNode(g.SyntaxKind.AnyKeyword),ctx:r});var $t=class{program=[];usage=[];registry=new Map;paths=[];aliases=new Map;ids={pathType:s.createIdentifier("Path"),methodType:s.createIdentifier("Method"),methodPathType:s.createIdentifier("MethodPath"),inputInterface:s.createIdentifier("Input"),posResponseInterface:s.createIdentifier("PositiveResponse"),negResponseInterface:s.createIdentifier("NegativeResponse"),responseInterface:s.createIdentifier("Response"),jsonEndpointsConst:s.createIdentifier("jsonEndpoints"),endpointTagsConst:s.createIdentifier("endpointTags"),providerType:s.createIdentifier("Provider"),implementationType:s.createIdentifier("Implementation"),clientClass:s.createIdentifier("ExpressZodAPIClient"),keyParameter:s.createIdentifier("key"),pathParameter:s.createIdentifier("path"),paramsArgument:s.createIdentifier("params"),methodParameter:s.createIdentifier("method"),accumulator:s.createIdentifier("acc"),provideMethod:s.createIdentifier("provide"),implementationArgument:s.createIdentifier("implementation"),headersProperty:s.createIdentifier("headers"),hasBodyConst:s.createIdentifier("hasBody"),undefinedValue:s.createIdentifier("undefined"),bodyProperty:s.createIdentifier("body"),responseConst:s.createIdentifier("response"),searchParamsConst:s.createIdentifier("searchParams"),exampleImplementationConst:s.createIdentifier("exampleImplementation"),clientConst:s.createIdentifier("client"),isJsonConst:s.createIdentifier("isJSON")};interfaces=[];makeAlias(t,r){let o=this.aliases.get(t)?.name?.text;if(!o){o=`Type${this.aliases.size+1}`;let n=s.createLiteralTypeNode(s.createNull());this.aliases.set(t,ie(n,o)),this.aliases.set(t,ie(r(),o))}return s.createTypeReferenceNode(o)}constructor({routing:t,brandHandling:r,variant:o="client",splitResponse:n=!1,optionalPropStyle:i={withQuestionMark:!0,withUndefined:!0}}){he({routing:t,onEndpoint:(C,z,Z)=>{let pe={makeAlias:this.makeAlias.bind(this),optionalPropStyle:i},Te=j(Z,z,"input"),Oe=ke(C.getSchema("input"),{brandHandling:r,ctx:{...pe,isResponse:!1}}),E=n?j(Z,z,"positive.response"):void 0,Gt=C.getResponses("positive").map(({schema:D})=>D).reduce((D,mt)=>D.or(mt)),Vt=n?ke(Gt,{brandHandling:r,ctx:{...pe,isResponse:!0}}):void 0,Re=n?j(Z,z,"negative.response"):void 0,_t=C.getResponses("negative").map(({schema:D})=>D).reduce((D,mt)=>D.or(mt)),Yt=n?ke(_t,{brandHandling:r,ctx:{...pe,isResponse:!0}}):void 0,Qt=j(Z,z,"response"),bo=E&&Re?s.createUnionTypeNode([s.createTypeReferenceNode(E),s.createTypeReferenceNode(Re)]):ke(Gt.or(_t),{brandHandling:r,ctx:{...pe,isResponse:!0}});this.program.push(ie(Oe,Te)),Vt&&E&&this.program.push(ie(Vt,E)),Yt&&Re&&this.program.push(ie(Yt,Re)),this.program.push(ie(bo,Qt)),this.paths.push(z),this.registry.set({method:Z,path:z},{input:Te,positive:E,negative:Re,response:Qt,isJson:C.getResponses("positive").some(D=>D.mimeTypes.includes(A.json)),tags:C.getTags()})}}),this.program.unshift(...this.aliases.values()),this.program.push(Ut(this.ids.pathType,this.paths)),this.program.push(Ut(this.ids.methodType,yo)),this.program.push(ct(this.ids.methodPathType,kt([this.ids.methodType,this.ids.pathType])));let a=[s.createHeritageClause(L.SyntaxKind.ExtendsKeyword,[Ht(this.ids.methodPathType,L.SyntaxKind.AnyKeyword)])];this.interfaces.push({id:this.ids.inputInterface,kind:"input",props:[]}),n&&this.interfaces.push({id:this.ids.posResponseInterface,kind:"positive",props:[]},{id:this.ids.negResponseInterface,kind:"negative",props:[]}),this.interfaces.push({id:this.ids.responseInterface,kind:"response",props:[]});let p=[],d=[];for(let[{method:C,path:z},{isJson:Z,tags:pe,...Te}]of this.registry){let Oe=uo(C,z);for(let E of this.interfaces)E.kind in Te&&E.props.push(so(Oe,Te[E.kind]));o!=="types"&&(Z&&p.push(s.createPropertyAssignment(Oe,s.createTrue())),d.push(s.createPropertyAssignment(Oe,s.createArrayLiteralExpression(pe.map(E=>s.createStringLiteral(E))))))}for(let{id:C,props:z}of this.interfaces)this.program.push(lo(C,a,z));if(o==="types")return;let c=s.createVariableStatement(_,F(this.ids.jsonEndpointsConst,s.createObjectLiteralExpression(p))),u=s.createVariableStatement(_,F(this.ids.endpointTagsConst,s.createObjectLiteralExpression(d))),l=ct(this.ids.providerType,s.createFunctionTypeNode(mo({M:this.ids.methodType,P:this.ids.pathType}),pt({method:s.createTypeReferenceNode("M"),path:s.createTypeReferenceNode("P"),params:s.createIndexedAccessTypeNode(s.createTypeReferenceNode(this.ids.inputInterface),Mt)}),po(this.ids.responseInterface,Mt))),y=ct(this.ids.implementationType,s.createFunctionTypeNode(void 0,pt({method:s.createTypeReferenceNode(this.ids.methodType),path:s.createKeywordTypeNode(L.SyntaxKind.StringKeyword),params:Ht(L.SyntaxKind.StringKeyword,L.SyntaxKind.AnyKeyword)}),co())),x=s.createTemplateExpression(s.createTemplateHead(":"),[s.createTemplateSpan(this.ids.keyParameter,Le)]),R=Kt(this.ids.paramsArgument,s.createCallExpression(s.createPropertyAccessExpression(this.ids.accumulator,"replace"),void 0,[x,s.createElementAccessExpression(this.ids.paramsArgument,this.ids.keyParameter)]),this.ids.pathParameter),O=Kt(this.ids.paramsArgument,s.createConditionalExpression(s.createBinaryExpression(s.createCallExpression(s.createPropertyAccessExpression(this.ids.pathParameter,"indexOf"),void 0,[x]),L.SyntaxKind.GreaterThanEqualsToken,s.createNumericLiteral(0)),void 0,this.ids.accumulator,void 0,s.createObjectLiteralExpression([s.createSpreadAssignment(this.ids.accumulator),s.createPropertyAssignment(s.createComputedPropertyName(this.ids.keyParameter),s.createElementAccessExpression(this.ids.paramsArgument,this.ids.keyParameter))])),s.createObjectLiteralExpression()),f=ao(this.ids.clientClass,no([at(this.ids.implementationArgument,s.createTypeReferenceNode(this.ids.implementationType),oo)]),[io(this.ids.provideMethod,s.createTypeReferenceNode(this.ids.providerType),Dt([this.ids.methodParameter,this.ids.pathParameter,this.ids.paramsArgument],s.createCallExpression(s.createPropertyAccessExpression(s.createThis(),this.ids.implementationArgument),void 0,[this.ids.methodParameter,R,O]),!0))]);this.program.push(c,u,l,y,f);let T=s.createPropertyAssignment(this.ids.methodParameter,s.createCallExpression(s.createPropertyAccessExpression(this.ids.methodParameter,"toUpperCase"),void 0,void 0)),w=s.createPropertyAssignment(this.ids.headersProperty,s.createConditionalExpression(this.ids.hasBodyConst,void 0,s.createObjectLiteralExpression([s.createPropertyAssignment(s.createStringLiteral("Content-Type"),s.createStringLiteral(A.json))]),void 0,this.ids.undefinedValue)),I=s.createPropertyAssignment(this.ids.bodyProperty,s.createConditionalExpression(this.ids.hasBodyConst,void 0,s.createCallExpression(s.createPropertyAccessExpression(s.createIdentifier("JSON"),"stringify"),void 0,[this.ids.paramsArgument]),void 0,this.ids.undefinedValue)),H=s.createVariableStatement(void 0,F(this.ids.responseConst,s.createAwaitExpression(s.createCallExpression(s.createIdentifier("fetch"),void 0,[s.createTemplateExpression(s.createTemplateHead("https://example.com"),[s.createTemplateSpan(this.ids.pathParameter,s.createTemplateMiddle("")),s.createTemplateSpan(this.ids.searchParamsConst,Le)]),s.createObjectLiteralExpression([T,w,I])])))),be=s.createVariableStatement(void 0,F(this.ids.hasBodyConst,s.createLogicalNot(s.createCallExpression(s.createPropertyAccessExpression(s.createArrayLiteralExpression([s.createStringLiteral("get"),s.createStringLiteral("delete")]),"includes"),void 0,[this.ids.methodParameter])))),Me=s.createVariableStatement(void 0,F(this.ids.searchParamsConst,s.createConditionalExpression(this.ids.hasBodyConst,void 0,s.createStringLiteral(""),void 0,s.createTemplateExpression(s.createTemplateHead("?"),[s.createTemplateSpan(s.createNewExpression(s.createIdentifier("URLSearchParams"),void 0,[this.ids.paramsArgument]),Le)])))),lt=s.createVariableStatement(void 0,F(this.ids.isJsonConst,s.createCallChain(s.createPropertyAccessChain(s.createCallExpression(s.createPropertyAccessExpression(s.createPropertyAccessExpression(this.ids.responseConst,this.ids.headersProperty),s.createIdentifier("get")),void 0,[s.createStringLiteral("content-type")]),s.createToken(L.SyntaxKind.QuestionDotToken),s.createIdentifier("startsWith")),void 0,void 0,[s.createStringLiteral(A.json)]))),He=s.createReturnStatement(s.createCallExpression(s.createElementAccessExpression(this.ids.responseConst,fo(this.ids.isJsonConst,s.createStringLiteral("json"),s.createStringLiteral("text"))),void 0,[])),U=s.createVariableStatement(_,F(this.ids.exampleImplementationConst,Dt([this.ids.methodParameter,this.ids.pathParameter,this.ids.paramsArgument],s.createBlock([be,Me,H,lt,He]),!0),s.createTypeReferenceNode(this.ids.implementationType))),Y=s.createExpressionStatement(s.createCallExpression(s.createPropertyAccessExpression(this.ids.clientConst,this.ids.provideMethod),void 0,[s.createStringLiteral("get"),s.createStringLiteral("/v1/user/retrieve"),s.createObjectLiteralExpression([s.createPropertyAssignment("id",s.createStringLiteral("10"))])])),Se=s.createVariableStatement(void 0,F(this.ids.clientConst,s.createNewExpression(this.ids.clientClass,void 0,[this.ids.exampleImplementationConst])));this.usage.push(U,Se,Y)}printUsage(t){return this.usage.length?this.usage.map(r=>typeof r=="string"?r:Bt(r,t)).join(`
19
+ `):void 0}print(t){let r=this.printUsage(t),o=r&&L.addSyntheticLeadingComment(L.addSyntheticLeadingComment(s.createEmptyStatement(),L.SyntaxKind.SingleLineCommentTrivia," Usage example:"),L.SyntaxKind.MultiLineCommentTrivia,`
20
+ ${r}`);return this.program.concat(o||[]).map((n,i)=>Bt(n,i<this.program.length?t:{...t,omitTrailingSemicolon:!0})).join(`
21
21
 
22
- `)}async printFormatted({printerOptions:t,format:r}={}){let o=r;if(!o)try{let a=(await fe("prettier")).format;o=p=>a(p,{filepath:"client.ts"})}catch{}let n=this.printUsage(t);this.usage=n&&o?[await o(n)]:this.usage;let i=this.print(t);return o?o(i):i}};var ai={dateIn:Jt,dateOut:Xt,file:Ve,upload:rr,raw:tr};export{Ee as BuiltinLogger,ve as DependsOnMethod,vt as Documentation,E as DocumentationError,Ze as EndpointsFactory,K as InputValidationError,qt as Integration,$ as Middleware,Re as MissingPeerError,Y as OutputValidationError,Ie as ResultHandler,pe as RoutingError,je as ServeStatic,Qo as arrayEndpointsFactory,Rt as arrayResultHandler,xn as attachRouting,Mo as createConfig,bn as createServer,Yo as defaultEndpointsFactory,Ce as defaultResultHandler,Ye as ensureHttpError,ai as ez,q as getExamples,Q as getMessageFromError,Es as testEndpoint,vs as testMiddleware};
22
+ `)}async printFormatted({printerOptions:t,format:r}={}){let o=r;if(!o)try{let a=(await ge("prettier")).format;o=p=>a(p,{filepath:"client.ts"})}catch{}let n=this.printUsage(t);this.usage=n&&o?[await o(n)]:this.usage;let i=this.print(t);return o?o(i):i}};var di={dateIn:Xt,dateOut:er,file:Ge,upload:or,raw:rr};export{ve as BuiltinLogger,je as DependsOnMethod,Lt as Documentation,v as DocumentationError,Ee as EndpointsFactory,K as InputValidationError,$t as Integration,V as Middleware,Ae as MissingPeerError,Q as OutputValidationError,Ce as ResultHandler,ce as RoutingError,Ne as ServeStatic,Jo as arrayEndpointsFactory,Pt as arrayResultHandler,bn as attachRouting,Ho as createConfig,Sn as createServer,Qo as defaultEndpointsFactory,Ze as defaultResultHandler,Ye as ensureHttpError,di as ez,$ as getExamples,J as getMessageFromError,vs as testEndpoint,js as testMiddleware};
@@ -1 +1 @@
1
- "use strict";var l=Object.defineProperty;var I=Object.getOwnPropertyDescriptor;var j=Object.getOwnPropertyNames;var w=Object.prototype.hasOwnProperty;var N=(s,e)=>{for(var t in e)l(s,t,{get:e[t],enumerable:!0})},C=(s,e,t,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of j(e))!w.call(s,r)&&r!==t&&l(s,r,{get:()=>e[r],enumerable:!(o=I(e,r))||o.enumerable});return s};var $=s=>C(l({},"__esModule",{value:!0}),s);var F={};N(F,{default:()=>M});module.exports=$(F);var i=require("@typescript-eslint/utils");var f="express-zod-api";var z="createConfig",L="createServer",x="server",h="beforeRouting",b="httpServer",v="httpsServer",T="originalError",S="getStatusCodeFromError",k="logger",E="getChildLogger",p={[x]:"http",[b]:"servers",[v]:"servers",[T]:"cause",[k]:"getLogger",[E]:"getLogger"},u={[S]:"ensureHttpError"},R=["jsonParser","upload","compression","rawParser","beforeRouting"],m=s=>s.type===i.AST_NODE_TYPES.Property&&s.key.type===i.AST_NODE_TYPES.Identifier,D=s=>s.type===i.AST_NODE_TYPES.VariableDeclarator&&s.id.type===i.AST_NODE_TYPES.ObjectPattern,c=s=>e=>m(e)&&(Array.isArray(s)?s.includes(e.key.name):e.key.name===s),O=i.ESLintUtils.RuleCreator.withoutDocs({meta:{type:"problem",fixable:"code",schema:[],messages:{change:"Change {{subject}} {{from}} to {{to}}.",move:"Move {{subject}} from {{from}} to {{to}}."}},defaultOptions:[],create:s=>({[i.AST_NODE_TYPES.ImportDeclaration]:e=>{if(e.source.value===f){for(let t of e.specifiers)if(t.type==="ImportSpecifier"&&t.imported.type==="Identifier"&&t.imported.name in u){let o=u[t.imported.name];s.report({node:t.imported,messageId:"change",data:{subject:"import",from:t.imported.name,to:o},fix:r=>r.replaceText(t,o)})}}},[i.AST_NODE_TYPES.MemberExpression]:e=>{if(e.property.type===i.AST_NODE_TYPES.Identifier&&e.property.name===T&&e.object.type===i.AST_NODE_TYPES.Identifier&&e.object.name.match(/err/i)){let t=p[e.property.name];s.report({node:e.property,messageId:"change",data:{subject:"property",from:e.property.name,to:t}})}},[i.AST_NODE_TYPES.CallExpression]:e=>{if(e.callee.type===i.AST_NODE_TYPES.Identifier){if(e.callee.name===z&&e.arguments.length===1){let t=e.arguments[0];if(t.type===i.AST_NODE_TYPES.ObjectExpression){let o=t.properties.find(c(x));if(o){let a=p[o.key.name];s.report({node:o,messageId:"change",data:{subject:"property",from:o.key.name,to:a},fix:d=>d.replaceText(o.key,a)})}let r=t.properties.find(c(p.server));if(r&&r.value.type===i.AST_NODE_TYPES.ObjectExpression){let d=r.value.properties.filter(c(R));for(let n of d){let P=s.sourceCode.text.slice(...n.range),g=s.sourceCode.getTokenAfter(n);s.report({node:r,messageId:"move",data:{subject:m(n)?n.key.name:"the property",from:r.key.name,to:`the top level of ${e.callee.name} argument`},fix:y=>[y.insertTextAfter(r,`, ${P}`),y.removeRange([n.range[0],g?.value===","?g.range[1]:n.range[1]])]})}}}}if(e.callee.name===L){let t=s.sourceCode.getAncestors(e).findLast(D);if(t){let o=t.id.properties.filter(c([b,v]));for(let r of o)s.report({node:r,messageId:"change",data:{subject:"property",from:r.key.name,to:p[r.key.name]}})}}if(e.callee.name===S){let t=u[e.callee.name];s.report({node:e.callee,messageId:"change",data:{subject:"method",from:e.callee.name,to:`${t}().statusCode`},fix:o=>[o.replaceText(e.callee,t),o.insertTextAfter(e,".statusCode")]})}}},[`${i.AST_NODE_TYPES.Property}[key.name="${h}"] ${i.AST_NODE_TYPES.ArrowFunctionExpression} ${i.AST_NODE_TYPES.Identifier}[name="${k}"]`]:e=>{let{parent:t}=e,o=m(t);if(o&&t.value===e)return;let r=`${p[e.name]}${o?"":"()"}`;s.report({node:e,messageId:"change",data:{subject:o?"property":"const",from:e.name,to:r},fix:a=>a.replaceText(e,r)})},[`${i.AST_NODE_TYPES.Property}[key.name="${h}"] ${i.AST_NODE_TYPES.ArrowFunctionExpression} ${i.AST_NODE_TYPES.Identifier}[name="${E}"]`]:e=>{let{parent:t}=e,o=m(t);if(o&&t.value===e)return;let r=p[e.name];s.report({node:e,messageId:"change",data:{subject:o?"property":"method",from:e.name,to:r},fix:a=>a.replaceText(e,r)})}})}),M={rules:{v21:O}};
1
+ "use strict";var d=Object.defineProperty;var A=Object.getOwnPropertyDescriptor;var L=Object.getOwnPropertyNames;var z=Object.prototype.hasOwnProperty;var M=(s,e)=>{for(var t in e)d(s,t,{get:e[t],enumerable:!0})},O=(s,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of L(e))!z.call(s,a)&&a!==t&&d(s,a,{get:()=>e[a],enumerable:!(r=A(e,a))||r.enumerable});return s};var R=s=>O(d({},"__esModule",{value:!0}),s);var Y={};M(Y,{default:()=>U});module.exports=R(Y);var o=require("@typescript-eslint/utils");var h="express-zod-api";var F="createConfig",W="createServer",x="server",b="beforeRouting",v="httpServer",T="httpsServer",k="originalError",P="getStatusCodeFromError",S="logger",E="getChildLogger",I="methods",j="tags",w="scopes",N="statusCodes",$="mimeTypes",H="build",_="ResultHandler",q="handler",i={[x]:"http",[v]:"servers",[T]:"servers",[k]:"cause",[S]:"getLogger",[E]:"getLogger",[I]:"method",[j]:"tag",[w]:"scope",[N]:"statusCode",[$]:"mimeType"},g={[P]:"ensureHttpError"},B=["jsonParser","upload","compression","rawParser","beforeRouting"],u={loggerArgument:`${o.AST_NODE_TYPES.Property}[key.name="${b}"] ${o.AST_NODE_TYPES.ArrowFunctionExpression} ${o.AST_NODE_TYPES.Identifier}[name="${S}"]`,getChildLoggerArgument:`${o.AST_NODE_TYPES.Property}[key.name="${b}"] ${o.AST_NODE_TYPES.ArrowFunctionExpression} ${o.AST_NODE_TYPES.Identifier}[name="${E}"]`,responseFeatures:`${o.AST_NODE_TYPES.NewExpression}[callee.name='${_}'] > ${o.AST_NODE_TYPES.ObjectExpression} > ${o.AST_NODE_TYPES.Property}[key.name!='${q}'] ${o.AST_NODE_TYPES.Property}[key.name=/(${N}|${$})/]`},m=s=>s.type===o.AST_NODE_TYPES.Property&&s.key.type===o.AST_NODE_TYPES.Identifier,V=s=>s.type===o.AST_NODE_TYPES.VariableDeclarator&&s.id.type===o.AST_NODE_TYPES.ObjectPattern,c=s=>e=>m(e)&&(Array.isArray(s)?s.includes(e.key.name):e.key.name===s),Q=o.ESLintUtils.RuleCreator.withoutDocs({meta:{type:"problem",fixable:"code",schema:[],messages:{change:"Change {{subject}} {{from}} to {{to}}.",move:"Move {{subject}} from {{from}} to {{to}}."}},defaultOptions:[],create:s=>({[o.AST_NODE_TYPES.ImportDeclaration]:e=>{if(e.source.value===h){for(let t of e.specifiers)if(t.type===o.AST_NODE_TYPES.ImportSpecifier&&t.imported.type===o.AST_NODE_TYPES.Identifier&&t.imported.name in g){let r=g[t.imported.name];s.report({node:t.imported,messageId:"change",data:{subject:"import",from:t.imported.name,to:r},fix:a=>a.replaceText(t,r)})}}},[o.AST_NODE_TYPES.MemberExpression]:e=>{if(e.property.type===o.AST_NODE_TYPES.Identifier&&e.property.name===k&&e.object.type===o.AST_NODE_TYPES.Identifier&&e.object.name.match(/err/i)){let t=i[e.property.name];s.report({node:e.property,messageId:"change",data:{subject:"property",from:e.property.name,to:t}})}},[o.AST_NODE_TYPES.CallExpression]:e=>{if(e.callee.type===o.AST_NODE_TYPES.MemberExpression&&e.callee.property.type===o.AST_NODE_TYPES.Identifier&&e.callee.property.name===H&&e.arguments.length===1&&e.arguments[0].type===o.AST_NODE_TYPES.ObjectExpression){let t=e.arguments[0].properties.filter(c([I,j,w]));for(let r of t){let a=i[r.key.name];s.report({node:r,messageId:"change",data:{subject:"property",from:r.key.name,to:a},fix:n=>n.replaceText(r.key,a)})}}if(e.callee.type===o.AST_NODE_TYPES.Identifier){if(e.callee.name===F&&e.arguments.length===1){let t=e.arguments[0];if(t.type===o.AST_NODE_TYPES.ObjectExpression){let r=t.properties.find(c(x));if(r){let n=i[r.key.name];s.report({node:r,messageId:"change",data:{subject:"property",from:r.key.name,to:n},fix:l=>l.replaceText(r.key,n)})}let a=t.properties.find(c(i.server));if(a&&a.value.type===o.AST_NODE_TYPES.ObjectExpression){let l=a.value.properties.filter(c(B));for(let p of l){let C=s.sourceCode.text.slice(...p.range),y=s.sourceCode.getTokenAfter(p);s.report({node:a,messageId:"move",data:{subject:m(p)?p.key.name:"the property",from:a.key.name,to:`the top level of ${e.callee.name} argument`},fix:f=>[f.insertTextAfter(a,`, ${C}`),f.removeRange([p.range[0],y?.value===","?y.range[1]:p.range[1]])]})}}}}if(e.callee.name===W){let t=s.sourceCode.getAncestors(e).findLast(V);if(t){let r=t.id.properties.filter(c([v,T]));for(let a of r)s.report({node:a,messageId:"change",data:{subject:"property",from:a.key.name,to:i[a.key.name]}})}}if(e.callee.name===P){let t=g[e.callee.name];s.report({node:e.callee,messageId:"change",data:{subject:"method",from:e.callee.name,to:`${t}().statusCode`},fix:r=>[r.replaceText(e.callee,t),r.insertTextAfter(e,".statusCode")]})}}},[u.loggerArgument]:e=>{let{parent:t}=e,r=m(t);if(r&&t.value===e)return;let a=`${i[e.name]}${r?"":"()"}`;s.report({node:e,messageId:"change",data:{subject:r?"property":"const",from:e.name,to:a},fix:n=>n.replaceText(e,a)})},[u.getChildLoggerArgument]:e=>{let{parent:t}=e,r=m(t);if(r&&t.value===e)return;let a=i[e.name];s.report({node:e,messageId:"change",data:{subject:r?"property":"method",from:e.name,to:a},fix:n=>n.replaceText(e,a)})},[u.responseFeatures]:e=>{if(!m(e))return;let t=i[e.key.name];s.report({node:e,messageId:"change",data:{subject:"property",from:e.key.name,to:t},fix:r=>r.replaceText(e.key,t)})}})}),U={rules:{v21:Q}};
@@ -1 +1 @@
1
- import{ESLintUtils as I,AST_NODE_TYPES as i}from"@typescript-eslint/utils";var y="express-zod-api";var j="createConfig",w="createServer",h="server",f="beforeRouting",x="httpServer",b="httpsServer",v="originalError",T="getStatusCodeFromError",S="logger",k="getChildLogger",p={[h]:"http",[x]:"servers",[b]:"servers",[v]:"cause",[S]:"getLogger",[k]:"getLogger"},l={[T]:"ensureHttpError"},N=["jsonParser","upload","compression","rawParser","beforeRouting"],m=s=>s.type===i.Property&&s.key.type===i.Identifier,C=s=>s.type===i.VariableDeclarator&&s.id.type===i.ObjectPattern,c=s=>e=>m(e)&&(Array.isArray(s)?s.includes(e.key.name):e.key.name===s),$=I.RuleCreator.withoutDocs({meta:{type:"problem",fixable:"code",schema:[],messages:{change:"Change {{subject}} {{from}} to {{to}}.",move:"Move {{subject}} from {{from}} to {{to}}."}},defaultOptions:[],create:s=>({[i.ImportDeclaration]:e=>{if(e.source.value===y){for(let t of e.specifiers)if(t.type==="ImportSpecifier"&&t.imported.type==="Identifier"&&t.imported.name in l){let r=l[t.imported.name];s.report({node:t.imported,messageId:"change",data:{subject:"import",from:t.imported.name,to:r},fix:o=>o.replaceText(t,r)})}}},[i.MemberExpression]:e=>{if(e.property.type===i.Identifier&&e.property.name===v&&e.object.type===i.Identifier&&e.object.name.match(/err/i)){let t=p[e.property.name];s.report({node:e.property,messageId:"change",data:{subject:"property",from:e.property.name,to:t}})}},[i.CallExpression]:e=>{if(e.callee.type===i.Identifier){if(e.callee.name===j&&e.arguments.length===1){let t=e.arguments[0];if(t.type===i.ObjectExpression){let r=t.properties.find(c(h));if(r){let a=p[r.key.name];s.report({node:r,messageId:"change",data:{subject:"property",from:r.key.name,to:a},fix:d=>d.replaceText(r.key,a)})}let o=t.properties.find(c(p.server));if(o&&o.value.type===i.ObjectExpression){let d=o.value.properties.filter(c(N));for(let n of d){let E=s.sourceCode.text.slice(...n.range),u=s.sourceCode.getTokenAfter(n);s.report({node:o,messageId:"move",data:{subject:m(n)?n.key.name:"the property",from:o.key.name,to:`the top level of ${e.callee.name} argument`},fix:g=>[g.insertTextAfter(o,`, ${E}`),g.removeRange([n.range[0],u?.value===","?u.range[1]:n.range[1]])]})}}}}if(e.callee.name===w){let t=s.sourceCode.getAncestors(e).findLast(C);if(t){let r=t.id.properties.filter(c([x,b]));for(let o of r)s.report({node:o,messageId:"change",data:{subject:"property",from:o.key.name,to:p[o.key.name]}})}}if(e.callee.name===T){let t=l[e.callee.name];s.report({node:e.callee,messageId:"change",data:{subject:"method",from:e.callee.name,to:`${t}().statusCode`},fix:r=>[r.replaceText(e.callee,t),r.insertTextAfter(e,".statusCode")]})}}},[`${i.Property}[key.name="${f}"] ${i.ArrowFunctionExpression} ${i.Identifier}[name="${S}"]`]:e=>{let{parent:t}=e,r=m(t);if(r&&t.value===e)return;let o=`${p[e.name]}${r?"":"()"}`;s.report({node:e,messageId:"change",data:{subject:r?"property":"const",from:e.name,to:o},fix:a=>a.replaceText(e,o)})},[`${i.Property}[key.name="${f}"] ${i.ArrowFunctionExpression} ${i.Identifier}[name="${k}"]`]:e=>{let{parent:t}=e,r=m(t);if(r&&t.value===e)return;let o=p[e.name];s.report({node:e,messageId:"change",data:{subject:r?"property":"method",from:e.name,to:o},fix:a=>a.replaceText(e,o)})}})}),R={rules:{v21:$}};export{R as default};
1
+ import{ESLintUtils as A,AST_NODE_TYPES as r}from"@typescript-eslint/utils";var f="express-zod-api";var L="createConfig",z="createServer",b="server",h="beforeRouting",x="httpServer",v="httpsServer",T="originalError",k="getStatusCodeFromError",P="logger",S="getChildLogger",E="methods",I="tags",j="scopes",w="statusCodes",N="mimeTypes",M="build",O="ResultHandler",R="handler",i={[b]:"http",[x]:"servers",[v]:"servers",[T]:"cause",[P]:"getLogger",[S]:"getLogger",[E]:"method",[I]:"tag",[j]:"scope",[w]:"statusCode",[N]:"mimeType"},d={[k]:"ensureHttpError"},D=["jsonParser","upload","compression","rawParser","beforeRouting"],g={loggerArgument:`${r.Property}[key.name="${h}"] ${r.ArrowFunctionExpression} ${r.Identifier}[name="${P}"]`,getChildLoggerArgument:`${r.Property}[key.name="${h}"] ${r.ArrowFunctionExpression} ${r.Identifier}[name="${S}"]`,responseFeatures:`${r.NewExpression}[callee.name='${O}'] > ${r.ObjectExpression} > ${r.Property}[key.name!='${R}'] ${r.Property}[key.name=/(${w}|${N})/]`},m=o=>o.type===r.Property&&o.key.type===r.Identifier,F=o=>o.type===r.VariableDeclarator&&o.id.type===r.ObjectPattern,c=o=>e=>m(e)&&(Array.isArray(o)?o.includes(e.key.name):e.key.name===o),W=A.RuleCreator.withoutDocs({meta:{type:"problem",fixable:"code",schema:[],messages:{change:"Change {{subject}} {{from}} to {{to}}.",move:"Move {{subject}} from {{from}} to {{to}}."}},defaultOptions:[],create:o=>({[r.ImportDeclaration]:e=>{if(e.source.value===f){for(let t of e.specifiers)if(t.type===r.ImportSpecifier&&t.imported.type===r.Identifier&&t.imported.name in d){let s=d[t.imported.name];o.report({node:t.imported,messageId:"change",data:{subject:"import",from:t.imported.name,to:s},fix:a=>a.replaceText(t,s)})}}},[r.MemberExpression]:e=>{if(e.property.type===r.Identifier&&e.property.name===T&&e.object.type===r.Identifier&&e.object.name.match(/err/i)){let t=i[e.property.name];o.report({node:e.property,messageId:"change",data:{subject:"property",from:e.property.name,to:t}})}},[r.CallExpression]:e=>{if(e.callee.type===r.MemberExpression&&e.callee.property.type===r.Identifier&&e.callee.property.name===M&&e.arguments.length===1&&e.arguments[0].type===r.ObjectExpression){let t=e.arguments[0].properties.filter(c([E,I,j]));for(let s of t){let a=i[s.key.name];o.report({node:s,messageId:"change",data:{subject:"property",from:s.key.name,to:a},fix:n=>n.replaceText(s.key,a)})}}if(e.callee.type===r.Identifier){if(e.callee.name===L&&e.arguments.length===1){let t=e.arguments[0];if(t.type===r.ObjectExpression){let s=t.properties.find(c(b));if(s){let n=i[s.key.name];o.report({node:s,messageId:"change",data:{subject:"property",from:s.key.name,to:n},fix:l=>l.replaceText(s.key,n)})}let a=t.properties.find(c(i.server));if(a&&a.value.type===r.ObjectExpression){let l=a.value.properties.filter(c(D));for(let p of l){let $=o.sourceCode.text.slice(...p.range),u=o.sourceCode.getTokenAfter(p);o.report({node:a,messageId:"move",data:{subject:m(p)?p.key.name:"the property",from:a.key.name,to:`the top level of ${e.callee.name} argument`},fix:y=>[y.insertTextAfter(a,`, ${$}`),y.removeRange([p.range[0],u?.value===","?u.range[1]:p.range[1]])]})}}}}if(e.callee.name===z){let t=o.sourceCode.getAncestors(e).findLast(F);if(t){let s=t.id.properties.filter(c([x,v]));for(let a of s)o.report({node:a,messageId:"change",data:{subject:"property",from:a.key.name,to:i[a.key.name]}})}}if(e.callee.name===k){let t=d[e.callee.name];o.report({node:e.callee,messageId:"change",data:{subject:"method",from:e.callee.name,to:`${t}().statusCode`},fix:s=>[s.replaceText(e.callee,t),s.insertTextAfter(e,".statusCode")]})}}},[g.loggerArgument]:e=>{let{parent:t}=e,s=m(t);if(s&&t.value===e)return;let a=`${i[e.name]}${s?"":"()"}`;o.report({node:e,messageId:"change",data:{subject:s?"property":"const",from:e.name,to:a},fix:n=>n.replaceText(e,a)})},[g.getChildLoggerArgument]:e=>{let{parent:t}=e,s=m(t);if(s&&t.value===e)return;let a=i[e.name];o.report({node:e,messageId:"change",data:{subject:s?"property":"method",from:e.name,to:a},fix:n=>n.replaceText(e,a)})},[g.responseFeatures]:e=>{if(!m(e))return;let t=i[e.key.name];o.report({node:e,messageId:"change",data:{subject:"property",from:e.key.name,to:t},fix:s=>s.replaceText(e.key,t)})}})}),B={rules:{v21:W}};export{B as default};