express-zod-api 12.2.0 → 12.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,23 @@
2
2
 
3
3
  ## Version 12
4
4
 
5
+ ### v12.3.0
6
+
7
+ - Featuring the ability to customize the `operationId` in the generated documentation.
8
+ - Using the new property of `EndpointsFactory::build()` method you can now override the value of the
9
+ corresponding `operationId` of the endpoint in generated documentation.
10
+ - When using this feature, you must ensure the uniqness of the IDs you specified across your API endpoints.
11
+ - The feature is implemented by [@john-schmitz](https://github.com/john-schmitz).
12
+
13
+ ```typescript
14
+ import { defaultEndpointsFactory } from "express-zod-api";
15
+
16
+ defaultEndpointsFactory.build({
17
+ operationId: "SampleOperation",
18
+ // ...
19
+ });
20
+ ```
21
+
5
22
  ### v12.2.0
6
23
 
7
24
  - Featuring a new input source: `headers`.
package/dist/index.d.mts CHANGED
@@ -134,8 +134,8 @@ type MethodsDefinition<M extends Method> = {
134
134
  };
135
135
 
136
136
  type FlatObject = Record<string, any>;
137
- declare function getMessageFromError(error: Error): string;
138
- declare function getStatusCodeFromError(error: Error): number;
137
+ declare const getMessageFromError: (error: Error) => string;
138
+ declare const getStatusCodeFromError: (error: Error) => number;
139
139
  declare const getExamples: <T extends z.ZodTypeAny, V extends "original" | "parsed" | undefined>({ schema, variant, validate, }: {
140
140
  schema: T;
141
141
  /**
@@ -439,6 +439,7 @@ declare abstract class AbstractEndpoint {
439
439
  abstract getScopes(): string[];
440
440
  abstract getTags(): string[];
441
441
  abstract _setSiblingMethods(methods: Method[]): void;
442
+ abstract getOperationId(): string | undefined;
442
443
  }
443
444
  type EndpointProps<IN extends IOSchema, OUT extends IOSchema, OPT extends FlatObject, M extends Method, POS extends z.ZodTypeAny, NEG extends z.ZodTypeAny, SCO extends string, TAG extends string> = {
444
445
  middlewares: AnyMiddlewareDef[];
@@ -448,6 +449,7 @@ type EndpointProps<IN extends IOSchema, OUT extends IOSchema, OPT extends FlatOb
448
449
  resultHandler: ResultHandlerDefinition<POS, NEG>;
449
450
  description?: string;
450
451
  shortDescription?: string;
452
+ operationId?: string;
451
453
  } & ({
452
454
  scopes?: SCO[];
453
455
  } | {
@@ -476,6 +478,7 @@ declare class Endpoint<IN extends IOSchema, OUT extends IOSchema, OPT extends Fl
476
478
  getSecurity(): LogicalContainer<Security>;
477
479
  getScopes(): SCO[];
478
480
  getTags(): TAG[];
481
+ getOperationId(): string | undefined;
479
482
  execute({ request, response, logger, config, }: {
480
483
  request: Request;
481
484
  response: Response;
@@ -583,6 +586,7 @@ type BuildProps<IN extends IOSchema, OUT extends IOSchema, MIN extends IOSchema<
583
586
  handler: Handler<z.output<ProbableIntersection<MIN, IN>>, z.input<OUT>, OPT>;
584
587
  description?: string;
585
588
  shortDescription?: string;
589
+ operationId?: string;
586
590
  } & ({
587
591
  scopes?: SCO[];
588
592
  } | {
@@ -732,7 +736,7 @@ declare const arrayEndpointsFactory: EndpointsFactory<z.ZodArray<any, "many"> &
732
736
  example: (example: string) => z.ZodString & any;
733
737
  }, null, {}, string, string>;
734
738
 
735
- declare function createLogger(loggerConfig: LoggerConfig): winston.Logger;
739
+ declare const createLogger: (loggerConfig: LoggerConfig) => winston.Logger;
736
740
 
737
741
  declare class DependsOnMethod {
738
742
  readonly methods: {
@@ -755,11 +759,11 @@ interface Routing {
755
759
  [SEGMENT: string]: Routing | DependsOnMethod | AbstractEndpoint | ServeStatic;
756
760
  }
757
761
 
758
- declare function attachRouting(config: AppConfig & CommonConfig, routing: Routing): {
762
+ declare const attachRouting: (config: AppConfig & CommonConfig, routing: Routing) => {
759
763
  notFoundHandler: express.RequestHandler<express_serve_static_core.ParamsDictionary, any, any, qs.ParsedQs, Record<string, any>>;
760
764
  logger: Logger;
761
765
  };
762
- declare function createServer(config: ServerConfig & CommonConfig, routing: Routing): {
766
+ declare const createServer: (config: ServerConfig & CommonConfig, routing: Routing) => {
763
767
  app: express_serve_static_core.Express;
764
768
  httpServer: http.Server<typeof http.IncomingMessage, typeof http.ServerResponse>;
765
769
  httpsServer: https.Server<typeof http.IncomingMessage, typeof http.ServerResponse> | undefined;
@@ -791,7 +795,7 @@ declare class Documentation extends OpenApiBuilder {
791
795
  protected lastOperationIdSuffixes: Record<string, number>;
792
796
  protected makeRef(name: string, schema: SchemaObject | ReferenceObject): ReferenceObject;
793
797
  protected getRef(name: string): ReferenceObject | undefined;
794
- protected ensureUniqOperationId(path: string, method: Method): string;
798
+ protected ensureUniqOperationId(path: string, method: Method, userDefinedOperationId?: string): string;
795
799
  protected ensureUniqSecuritySchemaName(subject: SecuritySchemeObject): string;
796
800
  constructor({ routing, config, title, version, serverUrl, successfulResponseDescription, errorResponseDescription, hasSummaryFromDescription, composition, serializer, }: DocumentationParams);
797
801
  }
package/dist/index.d.ts CHANGED
@@ -134,8 +134,8 @@ type MethodsDefinition<M extends Method> = {
134
134
  };
135
135
 
136
136
  type FlatObject = Record<string, any>;
137
- declare function getMessageFromError(error: Error): string;
138
- declare function getStatusCodeFromError(error: Error): number;
137
+ declare const getMessageFromError: (error: Error) => string;
138
+ declare const getStatusCodeFromError: (error: Error) => number;
139
139
  declare const getExamples: <T extends z.ZodTypeAny, V extends "original" | "parsed" | undefined>({ schema, variant, validate, }: {
140
140
  schema: T;
141
141
  /**
@@ -439,6 +439,7 @@ declare abstract class AbstractEndpoint {
439
439
  abstract getScopes(): string[];
440
440
  abstract getTags(): string[];
441
441
  abstract _setSiblingMethods(methods: Method[]): void;
442
+ abstract getOperationId(): string | undefined;
442
443
  }
443
444
  type EndpointProps<IN extends IOSchema, OUT extends IOSchema, OPT extends FlatObject, M extends Method, POS extends z.ZodTypeAny, NEG extends z.ZodTypeAny, SCO extends string, TAG extends string> = {
444
445
  middlewares: AnyMiddlewareDef[];
@@ -448,6 +449,7 @@ type EndpointProps<IN extends IOSchema, OUT extends IOSchema, OPT extends FlatOb
448
449
  resultHandler: ResultHandlerDefinition<POS, NEG>;
449
450
  description?: string;
450
451
  shortDescription?: string;
452
+ operationId?: string;
451
453
  } & ({
452
454
  scopes?: SCO[];
453
455
  } | {
@@ -476,6 +478,7 @@ declare class Endpoint<IN extends IOSchema, OUT extends IOSchema, OPT extends Fl
476
478
  getSecurity(): LogicalContainer<Security>;
477
479
  getScopes(): SCO[];
478
480
  getTags(): TAG[];
481
+ getOperationId(): string | undefined;
479
482
  execute({ request, response, logger, config, }: {
480
483
  request: Request;
481
484
  response: Response;
@@ -583,6 +586,7 @@ type BuildProps<IN extends IOSchema, OUT extends IOSchema, MIN extends IOSchema<
583
586
  handler: Handler<z.output<ProbableIntersection<MIN, IN>>, z.input<OUT>, OPT>;
584
587
  description?: string;
585
588
  shortDescription?: string;
589
+ operationId?: string;
586
590
  } & ({
587
591
  scopes?: SCO[];
588
592
  } | {
@@ -732,7 +736,7 @@ declare const arrayEndpointsFactory: EndpointsFactory<z.ZodArray<any, "many"> &
732
736
  example: (example: string) => z.ZodString & any;
733
737
  }, null, {}, string, string>;
734
738
 
735
- declare function createLogger(loggerConfig: LoggerConfig): winston.Logger;
739
+ declare const createLogger: (loggerConfig: LoggerConfig) => winston.Logger;
736
740
 
737
741
  declare class DependsOnMethod {
738
742
  readonly methods: {
@@ -755,11 +759,11 @@ interface Routing {
755
759
  [SEGMENT: string]: Routing | DependsOnMethod | AbstractEndpoint | ServeStatic;
756
760
  }
757
761
 
758
- declare function attachRouting(config: AppConfig & CommonConfig, routing: Routing): {
762
+ declare const attachRouting: (config: AppConfig & CommonConfig, routing: Routing) => {
759
763
  notFoundHandler: express.RequestHandler<express_serve_static_core.ParamsDictionary, any, any, qs.ParsedQs, Record<string, any>>;
760
764
  logger: Logger;
761
765
  };
762
- declare function createServer(config: ServerConfig & CommonConfig, routing: Routing): {
766
+ declare const createServer: (config: ServerConfig & CommonConfig, routing: Routing) => {
763
767
  app: express_serve_static_core.Express;
764
768
  httpServer: http.Server<typeof http.IncomingMessage, typeof http.ServerResponse>;
765
769
  httpsServer: https.Server<typeof http.IncomingMessage, typeof http.ServerResponse> | undefined;
@@ -791,7 +795,7 @@ declare class Documentation extends OpenApiBuilder {
791
795
  protected lastOperationIdSuffixes: Record<string, number>;
792
796
  protected makeRef(name: string, schema: SchemaObject | ReferenceObject): ReferenceObject;
793
797
  protected getRef(name: string): ReferenceObject | undefined;
794
- protected ensureUniqOperationId(path: string, method: Method): string;
798
+ protected ensureUniqOperationId(path: string, method: Method, userDefinedOperationId?: string): string;
795
799
  protected ensureUniqSecuritySchemaName(subject: SecuritySchemeObject): string;
796
800
  constructor({ routing, config, title, version, serverUrl, successfulResponseDescription, errorResponseDescription, hasSummaryFromDescription, composition, serializer, }: DocumentationParams);
797
801
  }
package/dist/index.js CHANGED
@@ -1,8 +1,8 @@
1
- "use strict";var Er=Object.create;var Ze=Object.defineProperty;var Ar=Object.getOwnPropertyDescriptor;var Ir=Object.getOwnPropertyNames;var Cr=Object.getPrototypeOf,Nr=Object.prototype.hasOwnProperty;var Nt=(e,t)=>{for(var r in t)Ze(e,r,{get:t[r],enumerable:!0})},wt=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of Ir(t))!Nr.call(e,n)&&n!==r&&Ze(e,n,{get:()=>t[n],enumerable:!(o=Ar(t,n))||o.enumerable});return e};var R=(e,t,r)=>(r=e!=null?Er(Cr(e)):{},wt(t||!e||!e.__esModule?Ze(r,"default",{value:e,enumerable:!0}):r,e)),wr=e=>wt(Ze({},"__esModule",{value:!0}),e);var mn={};Nt(mn,{AbstractEndpoint:()=>X,DependsOnMethod:()=>le,DependsOnMethodError:()=>se,Documentation:()=>$e,DocumentationError:()=>C,EndpointsFactory:()=>pe,InputValidationError:()=>U,Integration:()=>Ye,OutputValidationError:()=>V,RoutingError:()=>Q,ServeStatic:()=>me,arrayEndpointsFactory:()=>_t,arrayResultHandler:()=>ve,attachRouting:()=>Wt,createConfig:()=>Dt,createHttpError:()=>Pr.default,createLogger:()=>Re,createMiddleware:()=>ke,createResultHandler:()=>ze,createServer:()=>Xt,defaultEndpointsFactory:()=>$t,defaultResultHandler:()=>W,ez:()=>It,getExamples:()=>k,getMessageFromError:()=>L,getStatusCodeFromError:()=>Se,testEndpoint:()=>lr,withMeta:()=>j});module.exports=wr(mn);var Mt={silent:!0,warn:!0,debug:!0},Dt=e=>e;var F=require("zod");var Lt=require("http-errors"),kt=require("crypto"),b=require("zod");var Ee=require("ramda"),Z="expressZodApiMeta",Mr=e=>{let t=e.constructor,r=(0,Ee.clone)(e._def);return r[Z]=r[Z]||{examples:[]},new t(r)},j=e=>{let t=Mr(e);return Object.defineProperties(t,{example:{get:()=>r=>{let o=j(t);return o._def[Z].examples.push(r),o}}}),t},zt=e=>Z in e._def?typeof e._def[Z]=="object"&&e._def[Z]!==null:!1;function vt(e,t){if(!zt(e))return;let r=e._def;return t in r[Z]?r[Z][t]:void 0}var Ae=(e,t)=>{if(!zt(e))return t;let r=j(t),o=he(r._def[Z].examples,e._def[Z].examples);if(r._def[Z].examples=[],o.type==="single")r._def[Z].examples=o.value;else for(let[n,s]of o.value)r._def[Z].examples.push((0,Ee.mergeDeepRight)({...n},{...s}));return r};var jt=R(require("mime")),J=jt.default.getType("json")||"application/json",xe="multipart/form-data";var I=require("zod"),Dr="ZodUpload",zr=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.mimetype=="string"&&typeof e.data=="object"&&typeof e.tempFilePath=="string"&&typeof e.truncated=="boolean"&&typeof e.size=="number"&&typeof e.md5=="string"&&typeof e.mv=="function",oe=class e extends I.ZodType{_parse(t){let{ctx:r}=this._processInputParams(t);return r.parsedType!==I.ZodParsedType.object||!zr(r.data)?((0,I.addIssueToContext)(r,{code:I.ZodIssueCode.custom,message:`Expected file upload, received ${r.parsedType}`}),I.INVALID):(0,I.OK)(r.data)}static create=()=>new e({typeName:Dr})};var Xe=/:([A-Za-z0-9_]+)/g;function vr(e){let r=(e.header("content-type")||"").slice(0,xe.length).toLowerCase()===xe;return"files"in e&&r}var Ie={get:["query","params"],post:["body","params","files"],put:["body","params"],patch:["body","params"],delete:["query","params"]},jr=["body","query","params"],et=e=>e.method.toLowerCase(),tt=e=>e.startsWith("x-"),Lr=e=>Object.entries(e.headers).reduce((t,[r,o])=>tt(r)?{...t,[r]:o}:t,{});function Ht(e,t){let r=et(e);if(r==="options")return{};let o=jr;return r in Ie&&(o=Ie[r]),t&&r in t&&(o=t[r]||o),o.filter(n=>n==="files"?vr(e):!0).reduce((n,s)=>({...n,...s==="headers"?Lr(e):e[s]}),{})}function rt(e){return typeof e=="object"&&"level"in e&&"color"in e&&Object.keys(Mt).includes(e.level)&&typeof e.color=="boolean"}function Ce(e){return!isNaN(e.getTime())}function ne(e){return e instanceof Error?e:new Error(typeof e=="symbol"?e.toString():`${e}`)}function L(e){return e instanceof b.z.ZodError?e.issues.map(({path:t,message:r})=>(t.length?[t.join("/")]:[]).concat(r).join(": ")).join("; "):e instanceof V?`output${e.originalError.issues[0]?.path.length>0?"/":": "}${e.message}`:e.message}function Se(e){return e instanceof Lt.HttpError?e.statusCode:e instanceof U?400:500}var ot=({logger:e,request:t,input:r,error:o,statusCode:n})=>{n===500&&e.error(`Internal server error
1
+ "use strict";var Ar=Object.create;var Pe=Object.defineProperty;var Ir=Object.getOwnPropertyDescriptor;var Cr=Object.getOwnPropertyNames;var Nr=Object.getPrototypeOf,wr=Object.prototype.hasOwnProperty;var wt=(e,t)=>{for(var r in t)Pe(e,r,{get:t[r],enumerable:!0})},Mt=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of Cr(t))!wr.call(e,n)&&n!==r&&Pe(e,n,{get:()=>t[n],enumerable:!(o=Ir(t,n))||o.enumerable});return e};var R=(e,t,r)=>(r=e!=null?Ar(Nr(e)):{},Mt(t||!e||!e.__esModule?Pe(r,"default",{value:e,enumerable:!0}):r,e)),Mr=e=>Mt(Pe({},"__esModule",{value:!0}),e);var un={};wt(un,{AbstractEndpoint:()=>X,DependsOnMethod:()=>le,DependsOnMethodError:()=>se,Documentation:()=>Fe,DocumentationError:()=>P,EndpointsFactory:()=>pe,InputValidationError:()=>U,Integration:()=>Be,OutputValidationError:()=>V,RoutingError:()=>Q,ServeStatic:()=>me,arrayEndpointsFactory:()=>Gt,arrayResultHandler:()=>ze,attachRouting:()=>Xt,createConfig:()=>zt,createHttpError:()=>Zr.default,createLogger:()=>Oe,createMiddleware:()=>Le,createResultHandler:()=>De,createServer:()=>er,defaultEndpointsFactory:()=>_t,defaultResultHandler:()=>W,ez:()=>Ct,getExamples:()=>k,getMessageFromError:()=>L,getStatusCodeFromError:()=>xe,testEndpoint:()=>mr,withMeta:()=>j});module.exports=Mr(un);var Dt={silent:!0,warn:!0,debug:!0},zt=e=>e;var F=require("zod");var kt=require("http-errors"),Ht=require("crypto"),b=require("zod");var Ze=require("ramda"),E="expressZodApiMeta",Dr=e=>{let t=e.constructor,r=(0,Ze.clone)(e._def);return r[E]=r[E]||{examples:[]},new t(r)},j=e=>{let t=Dr(e);return Object.defineProperties(t,{example:{get:()=>r=>{let o=j(t);return o._def[E].examples.push(r),o}}}),t},vt=e=>E in e._def?typeof e._def[E]=="object"&&e._def[E]!==null:!1,jt=(e,t)=>{if(!vt(e))return;let r=e._def;return t in r[E]?r[E][t]:void 0},Ee=(e,t)=>{if(!vt(e))return t;let r=j(t),o=ye(r._def[E].examples,e._def[E].examples);if(r._def[E].examples=[],o.type==="single")r._def[E].examples=o.value;else for(let[n,s]of o.value)r._def[E].examples.push((0,Ze.mergeDeepRight)({...n},{...s}));return r};var Lt=R(require("mime")),J=Lt.default.getType("json")||"application/json",ge="multipart/form-data";var C=require("zod"),zr="ZodUpload",vr=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.mimetype=="string"&&typeof e.data=="object"&&typeof e.tempFilePath=="string"&&typeof e.truncated=="boolean"&&typeof e.size=="number"&&typeof e.md5=="string"&&typeof e.mv=="function",oe=class e extends C.ZodType{_parse(t){let{ctx:r}=this._processInputParams(t);return r.parsedType!==C.ZodParsedType.object||!vr(r.data)?((0,C.addIssueToContext)(r,{code:C.ZodIssueCode.custom,message:`Expected file upload, received ${r.parsedType}`}),C.INVALID):(0,C.OK)(r.data)}static create=()=>new e({typeName:zr})};var et=/:([A-Za-z0-9_]+)/g,jr=e=>{let r=(e.header("content-type")||"").slice(0,ge.length).toLowerCase()===ge;return"files"in e&&r},Ae={get:["query","params"],post:["body","params","files"],put:["body","params"],patch:["body","params"],delete:["query","params"]},Lr=["body","query","params"],tt=e=>e.method.toLowerCase(),rt=e=>e.startsWith("x-"),kr=e=>Object.entries(e.headers).reduce((t,[r,o])=>rt(r)?{...t,[r]:o}:t,{}),Ut=(e,t)=>{let r=tt(e);if(r==="options")return{};let o=Lr;return r in Ae&&(o=Ae[r]),t&&r in t&&(o=t[r]||o),o.filter(n=>n==="files"?jr(e):!0).reduce((n,s)=>({...n,...s==="headers"?kr(e):e[s]}),{})},ot=e=>typeof e=="object"&&"level"in e&&"color"in e&&Object.keys(Dt).includes(e.level)&&typeof e.color=="boolean",Ie=e=>!isNaN(e.getTime()),ne=e=>e instanceof Error?e:new Error(typeof e=="symbol"?e.toString():`${e}`),L=e=>e instanceof b.z.ZodError?e.issues.map(({path:t,message:r})=>(t.length?[t.join("/")]:[]).concat(r).join(": ")).join("; "):e instanceof V?`output${e.originalError.issues[0]?.path.length>0?"/":": "}${e.message}`:e.message,xe=e=>e instanceof kt.HttpError?e.statusCode:e instanceof U?400:500,nt=({logger:e,request:t,input:r,error:o,statusCode:n})=>{n===500&&e.error(`Internal server error
2
2
  ${o.stack}
3
- `,{url:t.url,payload:r})},k=({schema:e,variant:t="original",validate:r=t==="parsed"})=>{let o=vt(e,"examples")||[];if(!r&&t==="original")return o;let n=[];for(let s of o){let a=e.safeParse(s);a.success&&n.push(t==="parsed"?a.data:s)}return n},he=(e,t)=>{if(e.length===0)return{type:"single",value:t};if(t.length===0)return{type:"single",value:e};let r=[];for(let o of e)for(let n of t)r.push([o,n]);return{type:"tuple",value:r}};function nt(e){let t=e.match(Xe);return t?t.map(r=>r.slice(1)):[]}var Te=e=>e.reduce((t,r)=>t||r,!1);function q(e){return e instanceof b.z.ZodEffects&&e._def.effect.type!=="refinement"?!0:e instanceof b.z.ZodUnion?Te(e.options.map(q)):e instanceof b.z.ZodIntersection?Te([e._def.left,e._def.right].map(q)):!1}function M(e){return e instanceof oe?!0:e instanceof b.z.ZodObject?Te(Object.values(e.shape).map(M)):e instanceof b.z.ZodUnion?Te(e.options.map(M)):e instanceof b.z.ZodIntersection?Te([e._def.left,e._def.right].map(M)):e instanceof b.z.ZodOptional||e instanceof b.z.ZodNullable?M(e.unwrap()):e instanceof b.z.ZodEffects||e instanceof b.z.ZodTransformer?M(e._def.schema):e instanceof b.z.ZodRecord?M(e._def.valueType):e instanceof b.z.ZodArray?M(e._def.type):e instanceof b.z.ZodDefault?M(e._def.innerType):!1}var Oe=e=>"coerce"in e._def&&typeof e._def.coerce=="boolean"?e._def.coerce:!1,H=(e,t,r)=>[t].concat(e.split("/")).concat(r||[]).flatMap(o=>o.split(/[^A-Z0-9]/gi)).map(o=>o.slice(0,1).toUpperCase()+o.slice(1).toLowerCase()).join(""),Ne=e=>(0,kt.createHash)("sha1").update(JSON.stringify(e),"utf8").digest("hex"),we=({effect:e,sample:t})=>{try{return typeof e.transform(t,{addIssue:()=>{},path:[]})}catch{return}},st=e=>typeof e=="string"?{message:e}:e||{};var Q=class extends Error{name="RoutingError"},se=class extends Q{name="DependsOnMethodError"},C=class extends Error{name="DocumentationError";constructor({message:t,method:r,path:o,isResponse:n}){let s=`${t}
4
- Caused by ${n?"response":"input"} schema of an Endpoint assigned to ${r.toUpperCase()} method of ${o} path.`;super(s)}},B=class extends Error{name="IOSchemaError"},V=class extends B{name="OutputValidationError";originalError;constructor(t){super(L(t)),this.originalError=t}},U=class extends B{name="InputValidationError";originalError;constructor(t){super(L(t)),this.originalError=t}},ie=class extends Error{name="ResultHandlerError";originalError;constructor(t,r){super(t),this.originalError=r||void 0}};var K=e=>typeof e=="object"&&e!==null,Me=e=>({and:e.reduce((t,r)=>t.concat(K(r)&&"and"in r?r.and:r),[])}),De=(e,t)=>{if(K(e)){if("and"in e)return{and:e.and.map(r=>K(r)&&"or"in r?{or:r.or.map(t)}:t(r))};if("or"in e)return{or:e.or.map(r=>K(r)&&"and"in r?{and:r.and.map(t)}:t(r))}}return t(e)},it=e=>e.and.reduce((t,r)=>{let o=he(t.or,K(r)&&"or"in r?r.or:[r]);return o.type==="single"?t.or.push(...o.value):t.or=o.value.map(Me),t},{or:[]}),ae=(e,t)=>{if(K(e)){if("and"in e){if(K(t)){if("and"in t)return Me([e,t]);if("or"in t)return ae(it(e),t)}return Me([e,t])}if("or"in e){if(K(t)){if("and"in t)return ae(t,e);if("or"in t){let r=he(e.or,t.or);return{or:r.type==="single"?r.value:r.value.map(Me)}}}return ae(e,{and:[t]})}}return K(t)&&("and"in t||"or"in t)?ae(t,e):{and:[e,t]}};var w=require("zod");var de={positive:200,negative:400},ze=e=>e,W=ze({getPositiveResponse:e=>{let t=k({schema:e}),r=j(w.z.object({status:w.z.literal("success"),data:e}));return t.reduce((o,n)=>o.example({status:"success",data:n}),r)},getNegativeResponse:()=>j(w.z.object({status:w.z.literal("error"),error:w.z.object({message:w.z.string()})})).example({status:"error",error:{message:L(new Error("Sample error message"))}}),handler:({error:e,input:t,output:r,request:o,response:n,logger:s})=>{if(!e){n.status(de.positive).json({status:"success",data:r});return}let a=Se(e);ot({logger:s,statusCode:a,request:o,error:e,input:t}),n.status(a).json({status:"error",error:{message:L(e)}})}}),ve=ze({getPositiveResponse:e=>{let t=k({schema:e}),r=j("shape"in e&&"items"in e.shape&&e.shape.items instanceof w.z.ZodArray?e.shape.items:w.z.array(w.z.any()));return t.reduce((o,n)=>typeof n=="object"&&n!==null&&"items"in n&&Array.isArray(n.items)?o.example(n.items):o,r)},getNegativeResponse:()=>j(w.z.string()).example(L(new Error("Sample error message"))),handler:({response:e,output:t,error:r,logger:o,request:n,input:s})=>{if(r){let a=Se(r);ot({logger:o,statusCode:a,request:n,error:r,input:s}),e.status(a).send(r.message);return}"items"in t&&Array.isArray(t.items)?e.status(200).json(t.items):e.status(500).send("Property 'items' is missing in the endpoint output")}}),je=({error:e,logger:t,response:r})=>{t.error(`Result handler failure: ${e.message}.`),r.status(500).end(`An error occurred while serving the result: ${e.message}.`+(e.originalError?`
5
- Original error: ${e.originalError.message}.`:""))};var Ut=(e,t=[J])=>{if(e instanceof F.z.ZodType)return t;let{mimeTypes:r,mimeType:o}=e;return o?[o]:r||t},X=class{},Le=class extends X{#e;#t=[];#i=[];#o=[];#a;#d;#p;#c;#r;#n=[];#s=[];constructor({middlewares:t,inputSchema:r,outputSchema:o,handler:n,resultHandler:s,description:a,shortDescription:p,...d}){super(),[{name:"input schema",schema:r},{name:"output schema",schema:o}].forEach(({name:l,schema:g})=>{if(q(g))throw new B(`Using transformations on the top level of endpoint ${l} is not allowed.`)}),this.#o=t;let c={positive:s.getPositiveResponse(o),negative:s.getNegativeResponse()};this.#a={input:M(r)?[xe]:[J],positive:Ut(c.positive),negative:Ut(c.negative)},this.#r={input:r,output:o,positive:c.positive instanceof F.z.ZodType?c.positive:c.positive.schema,negative:c.negative instanceof F.z.ZodType?c.negative:c.negative.schema},this.#d={positive:c.positive instanceof F.z.ZodType?de.positive:c.positive.statusCode||de.positive,negative:c.negative instanceof F.z.ZodType?de.negative:c.negative.statusCode||de.negative},this.#p=n,this.#c=s,this.#e={long:a,short:p},"scopes"in d&&d.scopes&&this.#n.push(...d.scopes),"scope"in d&&d.scope&&this.#n.push(d.scope),"tags"in d&&d.tags&&this.#s.push(...d.tags),"tag"in d&&d.tag&&this.#s.push(d.tag),"methods"in d?this.#t=d.methods:this.#t=[d.method]}_setSiblingMethods(t){this.#i=t}getDescription(t){return this.#e[t]}getMethods(){return this.#t}getSchema(t){return this.#r[t]}getMimeTypes(t){return this.#a[t]}getStatusCode(t){return this.#d[t]}getSecurity(){return this.#o.reduce((t,r)=>r.security?ae(t,r.security):t,{and:[]})}getScopes(){return this.#n}getTags(){return this.#s}#l(){return{"Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":this.#t.concat(this.#i).concat("options").join(", ").toUpperCase(),"Access-Control-Allow-Headers":"content-type"}}async#m(t){try{return await this.#r.output.parseAsync(t)}catch(r){throw r instanceof F.z.ZodError?new V(r):r}}async#u({method:t,input:r,request:o,response:n,logger:s}){let a={},p=!1;for(let d of this.#o){if(t==="options"&&d.type==="proprietary")continue;let c;try{c=await d.input.parseAsync(r)}catch(l){throw l instanceof F.z.ZodError?new U(l):l}if(Object.assign(a,await d.middleware({input:c,options:a,request:o,response:n,logger:s})),p="writableEnded"in n&&n.writableEnded,p){s.warn(`The middleware ${d.middleware.name} has closed the stream. Accumulated options:`,a);break}}return{options:a,isStreamClosed:p}}async#f({input:t,options:r,logger:o}){let n;try{n=await this.#r.input.parseAsync(t)}catch(s){throw s instanceof F.z.ZodError?new U(s):s}return this.#p({input:n,options:r,logger:o})}async#y({error:t,request:r,response:o,logger:n,input:s,output:a}){try{await this.#c.handler({error:t,output:a,request:r,response:o,logger:n,input:s})}catch(p){je({logger:n,response:o,error:new ie(ne(p).message,t)})}}async execute({request:t,response:r,logger:o,config:n}){let s=et(t),a,p=null;if(n.cors){let c=this.#l();typeof n.cors=="function"&&(c=await n.cors({request:t,logger:o,endpoint:this,defaultHeaders:c}));for(let l in c)r.set(l,c[l])}let d=Ht(t,n.inputSources);try{let{options:c,isStreamClosed:l}=await this.#u({method:s,input:d,request:t,response:r,logger:o});if(l)return;if(s==="options"){r.status(200).end();return}a=await this.#m(await this.#f({input:d,options:c,logger:o}))}catch(c){p=ne(c)}await this.#y({input:d,output:a,request:t,response:r,error:p,logger:o})}};var Kt=["get","post","put","delete","patch"];var at=require("zod");var Ft=(e,t)=>{let r=e.map(({input:n})=>n).concat(t),o=r.reduce((n,s)=>n.and(s));return r.reduce((n,s)=>Ae(s,n),o)};var ke=e=>{if(q(e.input))throw new B("Using transformations on the top level of middleware input schema is not allowed.");return{...e,type:"proprietary"}};var pe=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),this.resultHandler)}use=this.addExpressMiddleware;addExpressMiddleware(t,r){let o=r?.transformer||(a=>a),n=r?.provider||(()=>({})),s={type:"express",input:at.z.object({}),middleware:async({request:a,response:p})=>new Promise((d,c)=>{t(a,p,g=>{if(g&&g instanceof Error)return c(o(g));d(n(a,p))})})};return e.#e(this.middlewares.concat(s),this.resultHandler)}addOptions(t){return e.#e(this.middlewares.concat(ke({input:at.z.object({}),middleware:async()=>t})),this.resultHandler)}build({input:t,handler:r,output:o,...n}){let{middlewares:s,resultHandler:a}=this;return new Le({handler:r,middlewares:s,outputSchema:o,resultHandler:a,inputSchema:Ft(s,t),...n})}},$t=new pe(W),_t=new pe(ve);var Gt=require("util"),ce=require("triple-beam"),be=R(require("winston")),{combine:kr,colorize:Hr,timestamp:Ur,printf:Kr}=be.default.format;function Re(e){let t=s=>{let{[ce.LEVEL]:a,[ce.MESSAGE]:p,[ce.SPLAT]:d,...c}=s;return(0,Gt.inspect)(c,!1,1,e.color)},r=s=>Kr(({timestamp:a,message:p,level:d,durationMs:c,...l})=>(typeof p=="object"&&(l={...l,...p},p="[No message]"),`${a} ${d}: ${p}`+(c===void 0?"":` duration: ${c}ms`)+(Object.keys(l).length===0?"":" "+(s?t(l):JSON.stringify(l))))),o=[Ur()],n={handleExceptions:!0};switch(e.color&&o.push(Hr()),e.level){case"debug":n.level="debug",o.push(r(!0));break;case"silent":case"warn":default:n.level="warn",o.push(r())}return n.format=kr(...o),be.default.createLogger({silent:e.level==="silent",levels:be.default.config.npm.levels,transports:[new be.default.transports.Console(n)],exitOnError:!1})}var le=class{constructor(t){this.methods=t;Object.keys(t).forEach(r=>{if(r in t&&!(t[r]?.getMethods()||[]).includes(r))throw new se(`The endpoint assigned to the '${r}' parameter must have at least this method in its specification.
3
+ `,{url:t.url,payload:r})},k=({schema:e,variant:t="original",validate:r=t==="parsed"})=>{let o=jt(e,"examples")||[];if(!r&&t==="original")return o;let n=[];for(let s of o){let a=e.safeParse(s);a.success&&n.push(t==="parsed"?a.data:s)}return n},ye=(e,t)=>{if(e.length===0)return{type:"single",value:t};if(t.length===0)return{type:"single",value:e};let r=[];for(let o of e)for(let n of t)r.push([o,n]);return{type:"tuple",value:r}},st=e=>{let t=e.match(et);return t?t.map(r=>r.slice(1)):[]},he=e=>e.reduce((t,r)=>t||r,!1),q=e=>e instanceof b.z.ZodEffects&&e._def.effect.type!=="refinement"?!0:e instanceof b.z.ZodUnion?he(e.options.map(q)):e instanceof b.z.ZodIntersection?he([e._def.left,e._def.right].map(q)):!1,M=e=>e instanceof oe?!0:e instanceof b.z.ZodObject?he(Object.values(e.shape).map(M)):e instanceof b.z.ZodUnion?he(e.options.map(M)):e instanceof b.z.ZodIntersection?he([e._def.left,e._def.right].map(M)):e instanceof b.z.ZodOptional||e instanceof b.z.ZodNullable?M(e.unwrap()):e instanceof b.z.ZodEffects||e instanceof b.z.ZodTransformer?M(e._def.schema):e instanceof b.z.ZodRecord?M(e._def.valueType):e instanceof b.z.ZodArray?M(e._def.type):e instanceof b.z.ZodDefault?M(e._def.innerType):!1,Te=e=>"coerce"in e._def&&typeof e._def.coerce=="boolean"?e._def.coerce:!1,H=(e,t,r)=>[t].concat(e.split("/")).concat(r||[]).flatMap(o=>o.split(/[^A-Z0-9]/gi)).map(o=>o.slice(0,1).toUpperCase()+o.slice(1).toLowerCase()).join(""),Ce=e=>(0,Ht.createHash)("sha1").update(JSON.stringify(e),"utf8").digest("hex"),Ne=({effect:e,sample:t})=>{try{return typeof e.transform(t,{addIssue:()=>{},path:[]})}catch{return}},it=e=>typeof e=="string"?{message:e}:e||{};var Q=class extends Error{name="RoutingError"},se=class extends Q{name="DependsOnMethodError"},P=class extends Error{name="DocumentationError";constructor({message:t,method:r,path:o,isResponse:n}){let s=`${t}
4
+ Caused by ${n?"response":"input"} schema of an Endpoint assigned to ${r.toUpperCase()} method of ${o} path.`;super(s)}},B=class extends Error{name="IOSchemaError"},V=class extends B{name="OutputValidationError";originalError;constructor(t){super(L(t)),this.originalError=t}},U=class extends B{name="InputValidationError";originalError;constructor(t){super(L(t)),this.originalError=t}},ie=class extends Error{name="ResultHandlerError";originalError;constructor(t,r){super(t),this.originalError=r||void 0}};var K=e=>typeof e=="object"&&e!==null,we=e=>({and:e.reduce((t,r)=>t.concat(K(r)&&"and"in r?r.and:r),[])}),Me=(e,t)=>{if(K(e)){if("and"in e)return{and:e.and.map(r=>K(r)&&"or"in r?{or:r.or.map(t)}:t(r))};if("or"in e)return{or:e.or.map(r=>K(r)&&"and"in r?{and:r.and.map(t)}:t(r))}}return t(e)},at=e=>e.and.reduce((t,r)=>{let o=ye(t.or,K(r)&&"or"in r?r.or:[r]);return o.type==="single"?t.or.push(...o.value):t.or=o.value.map(we),t},{or:[]}),ae=(e,t)=>{if(K(e)){if("and"in e){if(K(t)){if("and"in t)return we([e,t]);if("or"in t)return ae(at(e),t)}return we([e,t])}if("or"in e){if(K(t)){if("and"in t)return ae(t,e);if("or"in t){let r=ye(e.or,t.or);return{or:r.type==="single"?r.value:r.value.map(we)}}}return ae(e,{and:[t]})}}return K(t)&&("and"in t||"or"in t)?ae(t,e):{and:[e,t]}};var w=require("zod");var de={positive:200,negative:400},De=e=>e,W=De({getPositiveResponse:e=>{let t=k({schema:e}),r=j(w.z.object({status:w.z.literal("success"),data:e}));return t.reduce((o,n)=>o.example({status:"success",data:n}),r)},getNegativeResponse:()=>j(w.z.object({status:w.z.literal("error"),error:w.z.object({message:w.z.string()})})).example({status:"error",error:{message:L(new Error("Sample error message"))}}),handler:({error:e,input:t,output:r,request:o,response:n,logger:s})=>{if(!e){n.status(de.positive).json({status:"success",data:r});return}let a=xe(e);nt({logger:s,statusCode:a,request:o,error:e,input:t}),n.status(a).json({status:"error",error:{message:L(e)}})}}),ze=De({getPositiveResponse:e=>{let t=k({schema:e}),r=j("shape"in e&&"items"in e.shape&&e.shape.items instanceof w.z.ZodArray?e.shape.items:w.z.array(w.z.any()));return t.reduce((o,n)=>typeof n=="object"&&n!==null&&"items"in n&&Array.isArray(n.items)?o.example(n.items):o,r)},getNegativeResponse:()=>j(w.z.string()).example(L(new Error("Sample error message"))),handler:({response:e,output:t,error:r,logger:o,request:n,input:s})=>{if(r){let a=xe(r);nt({logger:o,statusCode:a,request:n,error:r,input:s}),e.status(a).send(r.message);return}"items"in t&&Array.isArray(t.items)?e.status(200).json(t.items):e.status(500).send("Property 'items' is missing in the endpoint output")}}),ve=({error:e,logger:t,response:r})=>{t.error(`Result handler failure: ${e.message}.`),r.status(500).end(`An error occurred while serving the result: ${e.message}.`+(e.originalError?`
5
+ Original error: ${e.originalError.message}.`:""))};var Kt=(e,t=[J])=>{if(e instanceof F.z.ZodType)return t;let{mimeTypes:r,mimeType:o}=e;return o?[o]:r||t},X=class{},je=class extends X{#e;#t=[];#i=[];#o=[];#a;#d;#p;#c;#r;#n=[];#s=[];#l;constructor({middlewares:t,inputSchema:r,outputSchema:o,handler:n,resultHandler:s,description:a,shortDescription:p,...d}){super(),[{name:"input schema",schema:r},{name:"output schema",schema:o}].forEach(({name:l,schema:g})=>{if(q(g))throw new B(`Using transformations on the top level of endpoint ${l} is not allowed.`)}),this.#o=t,this.#l=d.operationId;let c={positive:s.getPositiveResponse(o),negative:s.getNegativeResponse()};this.#a={input:M(r)?[ge]:[J],positive:Kt(c.positive),negative:Kt(c.negative)},this.#r={input:r,output:o,positive:c.positive instanceof F.z.ZodType?c.positive:c.positive.schema,negative:c.negative instanceof F.z.ZodType?c.negative:c.negative.schema},this.#d={positive:c.positive instanceof F.z.ZodType?de.positive:c.positive.statusCode||de.positive,negative:c.negative instanceof F.z.ZodType?de.negative:c.negative.statusCode||de.negative},this.#p=n,this.#c=s,this.#e={long:a,short:p},"scopes"in d&&d.scopes&&this.#n.push(...d.scopes),"scope"in d&&d.scope&&this.#n.push(d.scope),"tags"in d&&d.tags&&this.#s.push(...d.tags),"tag"in d&&d.tag&&this.#s.push(d.tag),"methods"in d?this.#t=d.methods:this.#t=[d.method]}_setSiblingMethods(t){this.#i=t}getDescription(t){return this.#e[t]}getMethods(){return this.#t}getSchema(t){return this.#r[t]}getMimeTypes(t){return this.#a[t]}getStatusCode(t){return this.#d[t]}getSecurity(){return this.#o.reduce((t,r)=>r.security?ae(t,r.security):t,{and:[]})}getScopes(){return this.#n}getTags(){return this.#s}getOperationId(){return this.#l}#m(){return{"Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":this.#t.concat(this.#i).concat("options").join(", ").toUpperCase(),"Access-Control-Allow-Headers":"content-type"}}async#u(t){try{return await this.#r.output.parseAsync(t)}catch(r){throw r instanceof F.z.ZodError?new V(r):r}}async#f({method:t,input:r,request:o,response:n,logger:s}){let a={},p=!1;for(let d of this.#o){if(t==="options"&&d.type==="proprietary")continue;let c;try{c=await d.input.parseAsync(r)}catch(l){throw l instanceof F.z.ZodError?new U(l):l}if(Object.assign(a,await d.middleware({input:c,options:a,request:o,response:n,logger:s})),p="writableEnded"in n&&n.writableEnded,p){s.warn(`The middleware ${d.middleware.name} has closed the stream. Accumulated options:`,a);break}}return{options:a,isStreamClosed:p}}async#y({input:t,options:r,logger:o}){let n;try{n=await this.#r.input.parseAsync(t)}catch(s){throw s instanceof F.z.ZodError?new U(s):s}return this.#p({input:n,options:r,logger:o})}async#g({error:t,request:r,response:o,logger:n,input:s,output:a}){try{await this.#c.handler({error:t,output:a,request:r,response:o,logger:n,input:s})}catch(p){ve({logger:n,response:o,error:new ie(ne(p).message,t)})}}async execute({request:t,response:r,logger:o,config:n}){let s=tt(t),a,p=null;if(n.cors){let c=this.#m();typeof n.cors=="function"&&(c=await n.cors({request:t,logger:o,endpoint:this,defaultHeaders:c}));for(let l in c)r.set(l,c[l])}let d=Ut(t,n.inputSources);try{let{options:c,isStreamClosed:l}=await this.#f({method:s,input:d,request:t,response:r,logger:o});if(l)return;if(s==="options"){r.status(200).end();return}a=await this.#u(await this.#y({input:d,options:c,logger:o}))}catch(c){p=ne(c)}await this.#g({input:d,output:a,request:t,response:r,error:p,logger:o})}};var Ft=["get","post","put","delete","patch"];var dt=require("zod");var $t=(e,t)=>{let r=e.map(({input:n})=>n).concat(t),o=r.reduce((n,s)=>n.and(s));return r.reduce((n,s)=>Ee(s,n),o)};var Le=e=>{if(q(e.input))throw new B("Using transformations on the top level of middleware input schema is not allowed.");return{...e,type:"proprietary"}};var pe=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),this.resultHandler)}use=this.addExpressMiddleware;addExpressMiddleware(t,r){let o=r?.transformer||(a=>a),n=r?.provider||(()=>({})),s={type:"express",input:dt.z.object({}),middleware:async({request:a,response:p})=>new Promise((d,c)=>{t(a,p,g=>{if(g&&g instanceof Error)return c(o(g));d(n(a,p))})})};return e.#e(this.middlewares.concat(s),this.resultHandler)}addOptions(t){return e.#e(this.middlewares.concat(Le({input:dt.z.object({}),middleware:async()=>t})),this.resultHandler)}build({input:t,handler:r,output:o,...n}){let{middlewares:s,resultHandler:a}=this;return new je({handler:r,middlewares:s,outputSchema:o,resultHandler:a,inputSchema:$t(s,t),...n})}},_t=new pe(W),Gt=new pe(ze);var qt=require("util"),ce=require("triple-beam"),Se=R(require("winston")),{combine:Hr,colorize:Ur,timestamp:Kr,printf:Fr}=Se.default.format,Oe=e=>{let t=s=>{let{[ce.LEVEL]:a,[ce.MESSAGE]:p,[ce.SPLAT]:d,...c}=s;return(0,qt.inspect)(c,!1,1,e.color)},r=s=>Fr(({timestamp:a,message:p,level:d,durationMs:c,...l})=>(typeof p=="object"&&(l={...l,...p},p="[No message]"),`${a} ${d}: ${p}`+(c===void 0?"":` duration: ${c}ms`)+(Object.keys(l).length===0?"":" "+(s?t(l):JSON.stringify(l))))),o=[Kr()],n={handleExceptions:!0};switch(e.color&&o.push(Ur()),e.level){case"debug":n.level="debug",o.push(r(!0));break;case"silent":case"warn":default:n.level="warn",o.push(r())}return n.format=Hr(...o),Se.default.createLogger({silent:e.level==="silent",levels:Se.default.config.npm.levels,transports:[new Se.default.transports.Console(n)],exitOnError:!1})};var le=class{constructor(t){this.methods=t;Object.keys(t).forEach(r=>{if(r in t&&!(t[r]?.getMethods()||[]).includes(r))throw new se(`The endpoint assigned to the '${r}' parameter must have at least this method in its specification.
6
6
  This error should prevent mistakes during the development process.
7
7
  Example:
8
8
 
@@ -13,8 +13,8 @@ new ${this.constructor.name}({
13
13
  ...
14
14
  })
15
15
  });
16
- `)})}};var qt=R(require("express")),me=class{params;constructor(...t){this.params=t}apply(t,r){return r(t,qt.default.static(...this.params))}};var ee=({routing:e,onEndpoint:t,onStatic:r,parentPath:o,hasCors:n})=>{Object.entries(e).forEach(([s,a])=>{if(s=s.trim(),s.match(/\//))throw new Q(`Routing elements should not contain '/' character.
17
- The error caused by ${o?`'${o}' route that has a '${s}'`:`'${s}'`} entry.`);let p=`${o||""}${s?`/${s}`:""}`;if(a instanceof X){let d=a.getMethods().slice();n&&d.push("options"),d.forEach(c=>{t(a,p,c)})}else if(a instanceof me)r&&a.apply(p,r);else if(a instanceof le){if(Object.entries(a.methods).forEach(([d,c])=>{t(c,p,d)}),n&&Object.keys(a.methods).length>0){let[d,...c]=Object.keys(a.methods),l=a.methods[d];l._setSiblingMethods(c),t(l,p,"options")}}else ee({onEndpoint:t,onStatic:r,hasCors:n,routing:a,parentPath:p})})};var Vt=()=>`
16
+ `)})}};var Vt=R(require("express")),me=class{params;constructor(...t){this.params=t}apply(t,r){return r(t,Vt.default.static(...this.params))}};var ee=({routing:e,onEndpoint:t,onStatic:r,parentPath:o,hasCors:n})=>{Object.entries(e).forEach(([s,a])=>{if(s=s.trim(),s.match(/\//))throw new Q(`Routing elements should not contain '/' character.
17
+ The error caused by ${o?`'${o}' route that has a '${s}'`:`'${s}'`} entry.`);let p=`${o||""}${s?`/${s}`:""}`;if(a instanceof X){let d=a.getMethods().slice();n&&d.push("options"),d.forEach(c=>{t(a,p,c)})}else if(a instanceof me)r&&a.apply(p,r);else if(a instanceof le){if(Object.entries(a.methods).forEach(([d,c])=>{t(c,p,d)}),n&&Object.keys(a.methods).length>0){let[d,...c]=Object.keys(a.methods),l=a.methods[d];l._setSiblingMethods(c),t(l,p,"options")}}else ee({onEndpoint:t,onStatic:r,hasCors:n,routing:a,parentPath:p})})};var Bt=()=>`
18
18
  \x1B[94m\x1B[39m
19
19
  \x1B[94m\x1B[39m
20
20
  \x1B[94m8888888888 8888888888P 888 d8888 8888888b. 8888888 \x1B[39m
@@ -31,7 +31,7 @@ The error caused by ${o?`'${o}' route that has a '${s}'`:`'${s}'`} entry.`);let
31
31
  \x1B[90m\x1B[3m Thank you for choosing Express Zod API for your project.\x1B[23m\x1B[39m\x1B[0m\x1B[0m
32
32
  \x1B[0m\x1B[0m
33
33
  \x1B[0m\x1B[0m
34
- `.trim();var dt=({app:e,logger:t,config:r,routing:o})=>{r.startupLogo!==!1&&console.log(Vt()),ee({routing:o,hasCors:!!r.cors,onEndpoint:(n,s,a)=>{e[a](s,async(p,d)=>{t.info(`${p.method}: ${s}`),await n.execute({request:p,response:d,logger:t,config:r})})},onStatic:(n,s)=>{e.use(n,s)}})};var He=R(require("express")),Bt=R(require("compression")),Yt=R(require("express-fileupload")),Jt=R(require("https"));var pt=R(require("http-errors")),Fr=(e,t)=>(r,o,n,s)=>{if(!r)return s();e.handler({error:(0,pt.default)(400,ne(r).message),request:o,response:n,logger:t,input:o.body,output:null})},Qt=(e,t)=>(r,o)=>{let n=(0,pt.default)(404,`Can not ${r.method} ${r.path}`);try{e.handler({request:r,response:o,logger:t,error:n,input:null,output:null})}catch(s){je({response:o,logger:t,error:new ie(ne(s).message,n)})}};function Wt(e,t){let r=rt(e.logger)?Re(e.logger):e.logger;dt({app:e.app,routing:t,logger:r,config:e});let o=e.errorHandler||W;return{notFoundHandler:Qt(o,r),logger:r}}function Xt(e,t){let r=rt(e.logger)?Re(e.logger):e.logger,o=(0,He.default)();o.disable("x-powered-by");let n=e.errorHandler||W,s=e.server.compression?(0,Bt.default)({...typeof e.server.compression=="object"?e.server.compression:{}}):void 0,a=e.server.jsonParser||(0,He.json)(),p=e.server.upload?(0,Yt.default)({...typeof e.server.upload=="object"?e.server.upload:{},abortOnLimit:!1,parseNested:!0}):void 0,d=[].concat(s||[]).concat(a).concat(p||[]);o.use(d),o.use(Fr(n,r)),dt({app:o,routing:t,logger:r,config:e}),o.use(Qt(n,r));let c=o.listen(e.server.listen,()=>{r.info(`Listening ${e.server.listen}`)}),l;return e.https&&(l=Jt.default.createServer(e.https.options,o).listen(e.https.listen,()=>{r.info(`Listening ${e.https.listen}`)})),{app:o,httpServer:c,httpsServer:l,logger:r}}var cr=require("openapi3-ts/oas30");var $=require("openapi3-ts/oas30"),ue=require("ramda"),x=require("zod");var T=require("zod");var ct=/^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(\.\d+)?)?Z?$/,$r="ZodDateIn",Ue=class e extends T.ZodType{_parse(t){let{status:r,ctx:o}=this._processInputParams(t);if(o.parsedType!==T.ZodParsedType.string)return(0,T.addIssueToContext)(o,{code:T.ZodIssueCode.invalid_type,expected:T.ZodParsedType.string,received:o.parsedType}),T.INVALID;ct.test(o.data)||((0,T.addIssueToContext)(o,{code:T.ZodIssueCode.invalid_string,validation:"regex"}),r.dirty());let n=new Date(o.data);return Ce(n)?{status:r.value,value:n}:((0,T.addIssueToContext)(o,{code:T.ZodIssueCode.invalid_date}),T.INVALID)}static create=()=>new e({typeName:$r})};var te=({schema:e,onEach:t,rules:r,onMissing:o,...n})=>{let s="typeName"in e._def?r[e._def.typeName]:void 0,p=s?s({schema:e,...n,next:c=>te({...c,...n,onEach:t,rules:r,onMissing:o})}):o({schema:e,...n}),d=t&&t({schema:e,prev:p,...n});return d?{...p,...d}:p};var er=50,rr="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString",_r={integer:0,number:0,string:"",boolean:!1,object:{},null:null,array:[]},or=e=>e.replace(Xe,t=>`{${t.slice(1)}}`),Gr=({schema:{_def:{innerType:e,defaultValue:t}},next:r})=>({...r({schema:e}),default:t()}),qr=({schema:{_def:{innerType:e}},next:t})=>t({schema:e}),Vr=()=>({format:"any"}),Br=e=>{if(e.isResponse)throw new C({message:"Please use z.upload() only for input.",...e});return{type:"string",format:"binary"}},Yr=({schema:{isBinary:e,isBase64:t},...r})=>{if(!r.isResponse)throw new C({message:"Please use z.file() only within ResultHandler.",...r});return{type:"string",format:e?"binary":t?"byte":"file"}},Jr=({schema:{options:e},next:t})=>({oneOf:e.map(r=>t({schema:r}))}),Qr=({schema:{options:e,discriminator:t},next:r})=>({discriminator:{propertyName:t},oneOf:Array.from(e.values()).map(o=>r({schema:o}))}),Wr=({schema:{_def:{left:e,right:t}},next:r})=>({allOf:[e,t].map(o=>r({schema:o}))}),Xr=({schema:e,next:t})=>t({schema:e.unwrap()}),eo=({schema:e,next:t})=>t({schema:e._def.innerType}),to=({schema:e,next:t})=>({nullable:!0,...t({schema:e.unwrap()})}),tr=({schema:e})=>({type:typeof Object.values(e.enum)[0],enum:Object.values(e.enum)}),ro=({schema:{value:e}})=>({type:typeof e,enum:[e]}),oo=({schema:e,isResponse:t,...r})=>{let o=Object.keys(e.shape).filter(n=>{let s=e.shape[n];return!(t&&Oe(s)?s instanceof x.z.ZodOptional:s.isOptional())});return{type:"object",properties:Ke({schema:e,isResponse:t,...r}),...o.length?{required:o}:{}}},no=()=>({type:"string",nullable:!0,format:"null"}),so=e=>{if(e.isResponse)throw new C({message:"Please use z.dateOut() for output.",...e});return{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",pattern:ct.source,externalDocs:{url:rr}}},io=e=>{if(!e.isResponse)throw new C({message:"Please use z.dateIn() for input.",...e});return{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",externalDocs:{url:rr}}},ao=e=>{throw new C({message:`Using z.date() within ${e.isResponse?"output":"input"} schema is forbidden. Please use z.date${e.isResponse?"Out":"In"}() instead. Check out the documentation for details.`,...e})},po=()=>({type:"boolean"}),co=()=>({type:"integer",format:"bigint"}),lo=({schema:{keySchema:e,valueSchema:t},...r})=>{if(e instanceof x.z.ZodEnum||e instanceof x.z.ZodNativeEnum){let o=Object.values(e.enum),n=o.reduce((s,a)=>({...s,[a]:t}),{});return{type:"object",properties:Ke({schema:x.z.object(n),...r}),...o.length?{required:o}:{}}}if(e instanceof x.z.ZodLiteral)return{type:"object",properties:Ke({schema:x.z.object({[e.value]:t}),...r}),required:[e.value]};if(e instanceof x.z.ZodUnion&&e.options.reduce((n,s)=>n&&s instanceof x.z.ZodLiteral,!0)){let n=e.options.reduce((s,a)=>({...s,[a.value]:t}),{});return{type:"object",properties:Ke({schema:x.z.object(n),...r}),required:e.options.map(s=>s.value)}}return{type:"object",additionalProperties:r.next({schema:t})}},mo=({schema:{_def:e,element:t},next:r})=>({type:"array",items:r({schema:t}),...e.minLength!==null&&{minItems:e.minLength.value},...e.maxLength!==null&&{maxItems:e.maxLength.value}}),uo=({schema:{items:e},next:t})=>{let r=e.map(o=>t({schema:o}));return{type:"array",minItems:r.length,maxItems:r.length,items:{oneOf:r,format:"tuple",...r.length>0&&{description:r.map((o,n)=>`${n}: ${(0,$.isSchemaObject)(o)?o.type:o.$ref}`).join(", ")}}}},fo=({schema:{isEmail:e,isURL:t,minLength:r,maxLength:o,isUUID:n,isCUID:s,isCUID2:a,isULID:p,isIP:d,isEmoji:c,isDatetime:l,_def:{checks:g}}})=>{let y=g.find(h=>h.kind==="regex"),S=g.find(h=>h.kind==="datetime"),A=y?y.regex:S?S.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;return{type:"string",...l&&{format:"date-time"},...e&&{format:"email"},...t&&{format:"url"},...n&&{format:"uuid"},...s&&{format:"cuid"},...a&&{format:"cuid2"},...p&&{format:"ulid"},...d&&{format:"ip"},...c&&{format:"emoji"},...r!==null&&{minLength:r},...o!==null&&{maxLength:o},...A&&{pattern:`/${A.source}/${A.flags}`}}},yo=({schema:e})=>{let t=e._def.checks.find(({kind:s})=>s==="min"),r=t?t.inclusive:!0,o=e._def.checks.find(({kind:s})=>s==="max"),n=o?o.inclusive:!0;return{type:e.isInt?"integer":"number",format:e.isInt?"int64":"double",minimum:e.minValue===null?e.isInt?Number.MIN_SAFE_INTEGER:Number.MIN_VALUE:e.minValue,exclusiveMinimum:!r,maximum:e.maxValue===null?e.isInt?Number.MAX_SAFE_INTEGER:Number.MAX_VALUE:e.maxValue,exclusiveMaximum:!n}},Ke=({schema:{shape:e},next:t})=>Object.keys(e).reduce((r,o)=>({...r,[o]:t({schema:e[o]})}),{}),go=e=>{let t=Array.isArray(e.type)?e.type[0]:e.type;return _r?.[t]},ho=({schema:e,isResponse:t,next:r})=>{let o=r({schema:e.innerType()}),{effect:n}=e._def;if(t&&n.type==="transform"&&(0,$.isSchemaObject)(o)){let s=we({effect:n,sample:go(o)});return s&&["number","string","boolean"].includes(s)?{type:s}:r({schema:x.z.any()})}if(!t&&n.type==="preprocess"&&(0,$.isSchemaObject)(o)){let{type:s,...a}=o;return{...a,format:`${a.format||s} (preprocessed)`}}return o},xo=({schema:e,isResponse:t,next:r})=>r({schema:e._def[t?"out":"in"]}),To=({schema:e,next:t})=>t({schema:e.unwrap()}),So=({next:e,schema:t,serializer:r,getRef:o,makeRef:n})=>{let s=r(t.schema);return o(s)||(()=>(n(s,{}),n(s,e({schema:t.schema}))))()},nr=(e,t,r=[])=>{let o=k({schema:e,variant:t?"parsed":"original",validate:!0});return o.length===0?{}:{examples:o.reduce((n,s,a)=>({...n,[`example${a+1}`]:{value:typeof s=="object"&&!Array.isArray(s)?(0,ue.omit)(r,s):s}}),{})}},Oo=(e,t,r)=>{let o=k({schema:e,variant:t?"parsed":"original",validate:!0});return o.length===0?{}:{examples:o.reduce((n,s,a)=>r in s?{...n,[`example${a+1}`]:{value:s[r]}}:n,{})}};function Pe(e,t){if(e instanceof x.z.ZodObject)return e;let r;if(e instanceof x.z.ZodUnion||e instanceof x.z.ZodDiscriminatedUnion)r=Array.from(e.options.values()).map(o=>Pe(o,t)).reduce((o,n)=>o.merge(n.partial()),x.z.object({}));else if(e instanceof x.z.ZodEffects){if(q(e))throw new C({message:`Using transformations on the top level of ${t.isResponse?"response":"input"} schema is not allowed.`,...t});r=Pe(e._def.schema,t)}else r=Pe(e._def.left,t).merge(Pe(e._def.right,t));return Ae(e,r)}var sr=({path:e,method:t,endpoint:r,inputSources:o,serializer:n,getRef:s,makeRef:a,composition:p,clue:d="parameter"})=>{let c=r.getSchema("input"),l=Pe(c,{path:e,method:t,isResponse:!1}).shape,g=nt(e),y=o.includes("query"),S=o.includes("params"),A=o.includes("headers"),h=m=>S&&g.includes(m),z=m=>A&&tt(m);return Object.keys(l).filter(m=>y||h(m)).map(m=>{let O=te({schema:l[m],isResponse:!1,rules:mt,onEach:ut,onMissing:ft,serializer:n,getRef:s,makeRef:a,path:e,method:t}),v=p==="components"?a(H(e,t,`${d} ${m}`),O):O;return{name:m,in:h(m)?"path":z(m)?"header":"query",required:!l[m].isOptional(),description:(0,$.isSchemaObject)(O)&&O.description||`${t.toUpperCase()} ${e} ${d}`,schema:v,...Oo(c,!1,m)}})},mt={ZodString:fo,ZodNumber:yo,ZodBigInt:co,ZodBoolean:po,ZodDateIn:so,ZodDateOut:io,ZodNull:no,ZodArray:mo,ZodTuple:uo,ZodRecord:lo,ZodObject:oo,ZodLiteral:ro,ZodIntersection:Wr,ZodUnion:Jr,ZodFile:Yr,ZodUpload:Br,ZodAny:Vr,ZodDefault:Gr,ZodEnum:tr,ZodNativeEnum:tr,ZodEffects:ho,ZodOptional:Xr,ZodNullable:to,ZodDiscriminatedUnion:Qr,ZodBranded:To,ZodDate:ao,ZodCatch:qr,ZodPipeline:xo,ZodLazy:So,ZodReadonly:eo},ut=({schema:e,isResponse:t,prev:r})=>{if((0,$.isReferenceObject)(r))return{};let{description:o}=e,n=e instanceof x.z.ZodLazy,s=r.type!==void 0,a=t&&Oe(e),p=!n&&s&&!a&&e.isNullable(),d=n?[]:k({schema:e,variant:t?"parsed":"original",validate:!0});return{...o&&{description:o},...p&&{nullable:!0},...d.length>0&&{example:d[0]}}},ft=({schema:e,...t})=>{throw new C({message:`Zod type ${e.constructor.name} is unsupported.`,...t})},lt=(e,t)=>{if((0,$.isReferenceObject)(e))return e;let r=e.properties?(0,ue.omit)(t,e.properties):void 0,o=e.example?(0,ue.omit)(t,e.example):void 0,n=e.required?e.required.filter(p=>!t.includes(p)):void 0,s=e.allOf?e.allOf.map(p=>lt(p,t)):void 0,a=e.oneOf?e.oneOf.map(p=>lt(p,t)):void 0;return(0,ue.omit)(Object.entries({properties:r,required:n,example:o,allOf:s,oneOf:a}).filter(([{},p])=>p===void 0).map(([p])=>p),{...e,properties:r,required:n,example:o,allOf:s,oneOf:a})},ir=e=>(0,$.isSchemaObject)(e)?(0,ue.omit)(["example"],e):e,yt=({method:e,path:t,endpoint:r,isPositive:o,serializer:n,getRef:s,makeRef:a,composition:p,clue:d="response"})=>{let c=r.getSchema(o?"positive":"negative"),l=r.getMimeTypes(o?"positive":"negative"),g=ir(te({schema:c,isResponse:!0,rules:mt,onEach:ut,onMissing:ft,serializer:n,getRef:s,makeRef:a,path:t,method:e})),y=nr(c,!0),S=p==="components"?a(H(t,e,d),g):g;return{description:`${e.toUpperCase()} ${t} ${d}`,content:l.reduce((A,h)=>({...A,[h]:{schema:S,...y}}),{})}},bo=()=>({type:"http",scheme:"basic"}),Ro=({format:e})=>({type:"http",scheme:"bearer",...e&&{bearerFormat:e}}),Po=({name:e})=>({type:"apiKey",in:"query",name:e}),Zo=({name:e})=>({type:"apiKey",in:"header",name:e}),Eo=({name:e})=>({type:"apiKey",in:"cookie",name:e}),Ao=({url:e})=>({type:"openIdConnect",openIdConnectUrl:e}),Io=({flows:e={}})=>({type:"oauth2",flows:Object.keys(e).reduce((t,r)=>{let o=e[r];if(!o)return t;let{scopes:n={},...s}=o;return{...t,[r]:{...s,scopes:n}}},{})}),ar=e=>{let t={basic:bo,bearer:Ro,input:Po,header:Zo,cookie:Eo,openid:Ao,oauth2:Io};return De(e,r=>t[r.type](r))},Fe=e=>{if(typeof e=="object"){if("or"in e)return e.or.map(t=>("and"in t?t.and:[t]).reduce((r,{name:o,scopes:n})=>({...r,[o]:n}),{}));if("and"in e)return Fe(it(e))}return Fe({or:[e]})},dr=({method:e,path:t,endpoint:r,serializer:o,getRef:n,makeRef:s,composition:a,clue:p="request body"})=>{let d=nt(t),c=ir(lt(te({schema:r.getSchema("input"),isResponse:!1,rules:mt,onEach:ut,onMissing:ft,serializer:o,getRef:n,makeRef:s,path:t,method:e}),d)),l=nr(r.getSchema("input"),!1,d),g=a==="components"?s(H(t,e,p),c):c;return{description:`${e.toUpperCase()} ${t} ${p}`,content:r.getMimeTypes("input").reduce((y,S)=>({...y,[S]:{schema:g,...l}}),{})}},pr=e=>Object.keys(e).map(t=>{let r=e[t];return{name:t,description:typeof r=="string"?r:r.description,...typeof r=="object"&&r.url&&{externalDocs:{url:r.url}}}}),gt=e=>e.length<=er?e:e.slice(0,er-1)+"\u2026";var $e=class extends cr.OpenApiBuilder{lastSecuritySchemaIds={};lastOperationIdSuffixes={};makeRef(t,r){return this.addSchema(t,r),this.getRef(t)}getRef(t){return t in(this.rootDoc.components?.schemas||{})?{$ref:`#/components/schemas/${t}`}:void 0}ensureUniqOperationId(t,r){let o=H(t,r);return o in this.lastOperationIdSuffixes?(this.lastOperationIdSuffixes[o]++,`${o}${this.lastOperationIdSuffixes[o]}`):(this.lastOperationIdSuffixes[o]=1,o)}ensureUniqSecuritySchemaName(t){let r=JSON.stringify(t);for(let o in this.rootDoc.components?.securitySchemes||{})if(r===JSON.stringify(this.rootDoc.components?.securitySchemes?.[o]))return o;return this.lastSecuritySchemaIds[t.type]=(this.lastSecuritySchemaIds?.[t.type]||0)+1,`${t.type.toUpperCase()}_${this.lastSecuritySchemaIds[t.type]}`}constructor({routing:t,config:r,title:o,version:n,serverUrl:s,successfulResponseDescription:a="Successful response",errorResponseDescription:p="Error response",hasSummaryFromDescription:d=!0,composition:c="inline",serializer:l=Ne}){super(),this.addInfo({title:o,version:n}).addServer({url:s}),ee({routing:t,onEndpoint:(y,S,A)=>{let h=A,z={path:S,method:h,endpoint:y,composition:c,serializer:l,getRef:this.getRef.bind(this),makeRef:this.makeRef.bind(this)},[m,O]=["short","long"].map(y.getDescription.bind(y)),v=r.inputSources?.[h]||Ie[h],fe=sr({...z,inputSources:v}),N={operationId:this.ensureUniqOperationId(S,h),responses:{[y.getStatusCode("positive")]:yt({...z,clue:a,isPositive:!0}),[y.getStatusCode("negative")]:yt({...z,clue:p,isPositive:!1})}};O&&(N.description=O,d&&m===void 0&&(N.summary=gt(O))),m&&(N.summary=gt(m)),y.getTags().length>0&&(N.tags=y.getTags()),fe.length>0&&(N.parameters=fe),v.includes("body")&&(N.requestBody=dr(z));let ye=Fe(De(ar(y.getSecurity()),ge=>{let Ct=this.ensureUniqSecuritySchemaName(ge),Zr=["oauth2","openIdConnect"].includes(ge.type)?y.getScopes():[];return this.addSecurityScheme(Ct,ge),{name:Ct,scopes:Zr}}));ye.length>0&&(N.security=ye);let We=or(S);this.addPath(We,{[h]:N})}}),this.rootDoc.tags=r.tags?pr(r.tags):[]}};var ht=R(require("http"));var Co=e=>({method:"GET",header:jest.fn(()=>J),...e}),No=e=>{let t={writableEnded:!1,statusCode:200,statusMessage:ht.default.STATUS_CODES[200],set:jest.fn(()=>t),setHeader:jest.fn(()=>t),header:jest.fn(()=>t),status:jest.fn(r=>(t.statusCode=r,t.statusMessage=ht.default.STATUS_CODES[r],t)),json:jest.fn(()=>t),send:jest.fn(()=>t),end:jest.fn(()=>(t.writableEnded=!0,t)),...e};return t},lr=async({endpoint:e,requestProps:t,responseProps:r,configProps:o,loggerProps:n,__noJest:s})=>{if(!jest||s)throw new Error("You need to install Jest in order to use testEndpoint().");let a=Co(t),p=No(r),d={info:jest.fn(),warn:jest.fn(),error:jest.fn(),debug:jest.fn(),...n},c={cors:!1,logger:d,...o};return await e.execute({request:a,response:p,config:c,logger:d}),{requestMock:a,responseMock:p,loggerMock:d}};var G=R(require("typescript"));var D=R(require("typescript")),i=D.default.factory,re=[i.createModifier(D.default.SyntaxKind.ExportKeyword)],wo=[i.createModifier(D.default.SyntaxKind.AsyncKeyword)],Mo=[i.createModifier(D.default.SyntaxKind.PublicKeyword),i.createModifier(D.default.SyntaxKind.ReadonlyKeyword)],mr=[i.createModifier(D.default.SyntaxKind.ProtectedKeyword),i.createModifier(D.default.SyntaxKind.ReadonlyKeyword)],Do=i.createTemplateHead(""),zo=i.createTemplateTail(""),vo=i.createTemplateMiddle(" "),xt=e=>i.createTemplateLiteralType(Do,e.map((t,r)=>i.createTemplateLiteralTypeSpan(i.createTypeReferenceNode(t),r===e.length-1?zo:vo))),Tt=xt(["M","P"]),_e=(e,t,r)=>i.createParameterDeclaration(r,void 0,e,void 0,t,void 0),Ge=(e,t)=>Object.keys(e).reduce((r,o)=>r.concat(_e(o,e[o],t)),[]),St=(e,t)=>i.createExpressionWithTypeArguments(i.createIdentifier("Record"),[typeof e=="number"?i.createKeywordTypeNode(e):i.createTypeReferenceNode(e),i.createKeywordTypeNode(t)]),ur=e=>i.createConstructorDeclaration(void 0,e,i.createBlock([])),Ot=(e,t)=>i.createPropertySignature(void 0,`"${e}"`,void 0,i.createTypeReferenceNode(t)),bt=(e,t)=>i.createVariableDeclarationList([i.createVariableDeclaration(e,void 0,void 0,t)],D.default.NodeFlags.Const),Rt=(e,t)=>i.createTypeAliasDeclaration(re,e,void 0,i.createUnionTypeNode(t.map(r=>i.createLiteralTypeNode(i.createStringLiteral(r))))),qe=(e,t)=>i.createTypeAliasDeclaration(re,e,void 0,t),fr=(e,t,r)=>i.createPropertyDeclaration(Mo,e,void 0,t,r),yr=(e,t,r=[])=>i.createClassDeclaration(re,e,void 0,void 0,[t,...r]),gr=(e,t)=>i.createTypeReferenceNode("Promise",[i.createIndexedAccessTypeNode(i.createTypeReferenceNode(e),t)]),hr=()=>i.createTypeReferenceNode("Promise",[i.createKeywordTypeNode(D.default.SyntaxKind.AnyKeyword)]),Pt=(e,t,r)=>i.createInterfaceDeclaration(re,e,void 0,t,r),xr=e=>Object.keys(e).reduce((t,r)=>t.concat(i.createTypeParameterDeclaration([],r,i.createTypeReferenceNode(e[r]))),[]),Tr=(e,t)=>i.createArrowFunction(wo,void 0,e.map(r=>_e(r)),void 0,void 0,i.createCallExpression(i.createPropertyAccessExpression(i.createThis(),"implementation"),void 0,t)),Zt=(e,t,r)=>i.createCallExpression(i.createPropertyAccessExpression(i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("Object"),"keys"),void 0,[i.createIdentifier(e)]),"reduce"),void 0,[i.createArrowFunction(void 0,void 0,Ge({acc:void 0,key:void 0}),void 0,void 0,t),r]);var f=R(require("typescript")),Rr=require("zod");var _=R(require("typescript")),{factory:Ve}=_.default,Et=(e,t)=>{_.default.addSyntheticLeadingComment(e,_.default.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0)},Be=(e,t,r)=>{let o=Ve.createTypeAliasDeclaration(void 0,Ve.createIdentifier(t),void 0,e);return r&&Et(o,r),o},Sr=(e,t)=>{let r=_.default.createSourceFile("print.ts","",_.default.ScriptTarget.Latest,!1,_.default.ScriptKind.TS);return _.default.createPrinter(t).printNode(_.default.EmitHint.Unspecified,e,r)},jo=/^[A-Za-z_$][A-Za-z0-9_$]*$/,Or=e=>jo.test(e)?Ve.createIdentifier(e):Ve.createStringLiteral(e);var{factory:u}=f.default,Lo={[f.default.SyntaxKind.AnyKeyword]:"",[f.default.SyntaxKind.BigIntKeyword]:BigInt(0),[f.default.SyntaxKind.BooleanKeyword]:!1,[f.default.SyntaxKind.NumberKeyword]:0,[f.default.SyntaxKind.ObjectKeyword]:{},[f.default.SyntaxKind.StringKeyword]:"",[f.default.SyntaxKind.UndefinedKeyword]:void 0},ko=({schema:{value:e}})=>u.createLiteralTypeNode(typeof e=="number"?u.createNumericLiteral(e):typeof e=="boolean"?e?u.createTrue():u.createFalse():u.createStringLiteral(e)),Ho=({schema:{shape:e},isResponse:t,next:r,optionalPropStyle:{withQuestionMark:o}})=>{let n=Object.entries(e).map(([s,a])=>{let p=t&&Oe(a)?a instanceof Rr.z.ZodOptional:a.isOptional(),d=u.createPropertySignature(void 0,Or(s),p&&o?u.createToken(f.default.SyntaxKind.QuestionToken):void 0,r({schema:a}));return a.description&&Et(d,a.description),d});return u.createTypeLiteralNode(n)},Uo=({schema:{element:e},next:t})=>u.createArrayTypeNode(t({schema:e})),Ko=({schema:{options:e}})=>u.createUnionTypeNode(e.map(t=>u.createLiteralTypeNode(u.createStringLiteral(t)))),br=({schema:{options:e},next:t})=>u.createUnionTypeNode(e.map(r=>t({schema:r}))),Fo=e=>Lo?.[e.kind],$o=({schema:e,next:t,isResponse:r})=>{let o=t({schema:e.innerType()}),n=e._def.effect;if(r&&n.type==="transform"){let s=we({effect:n,sample:Fo(o)}),a={number:f.default.SyntaxKind.NumberKeyword,bigint:f.default.SyntaxKind.BigIntKeyword,boolean:f.default.SyntaxKind.BooleanKeyword,string:f.default.SyntaxKind.StringKeyword,undefined:f.default.SyntaxKind.UndefinedKeyword,object:f.default.SyntaxKind.ObjectKeyword};return u.createKeywordTypeNode(s&&a[s]||f.default.SyntaxKind.AnyKeyword)}return o},_o=({schema:e})=>u.createUnionTypeNode(Object.values(e.enum).map(t=>u.createLiteralTypeNode(typeof t=="number"?u.createNumericLiteral(t):u.createStringLiteral(t)))),Go=({next:e,schema:t,optionalPropStyle:{withUndefined:r}})=>{let o=e({schema:t.unwrap()});return r?u.createUnionTypeNode([o,u.createKeywordTypeNode(f.default.SyntaxKind.UndefinedKeyword)]):o},qo=({next:e,schema:t})=>u.createUnionTypeNode([e({schema:t.unwrap()}),u.createLiteralTypeNode(u.createNull())]),Vo=({next:e,schema:{items:t}})=>u.createTupleTypeNode(t.map(r=>e({schema:r}))),Bo=({next:e,schema:{keySchema:t,valueSchema:r}})=>u.createExpressionWithTypeArguments(u.createIdentifier("Record"),[e({schema:t}),e({schema:r})]),Yo=({next:e,schema:t})=>u.createIntersectionTypeNode([t._def.left,t._def.right].map(r=>e({schema:r}))),Jo=({next:e,schema:t})=>e({schema:t._def.innerType}),Y=e=>()=>u.createKeywordTypeNode(e),Qo=({next:e,schema:t})=>e({schema:t.unwrap()}),Wo=({next:e,schema:t})=>e({schema:t._def.innerType}),Xo=({next:e,schema:t})=>e({schema:t._def.innerType}),en=({schema:e,next:t,isResponse:r})=>t({schema:e._def[r?"out":"in"]}),tn=()=>u.createLiteralTypeNode(u.createNull()),rn=({getAlias:e,makeAlias:t,next:r,serializer:o,schema:n})=>{let s=`Type${o(n.schema)}`;return e(s)||(()=>(t(s,u.createLiteralTypeNode(u.createNull())),t(s,r({schema:n.schema}))))()},on={ZodString:Y(f.default.SyntaxKind.StringKeyword),ZodNumber:Y(f.default.SyntaxKind.NumberKeyword),ZodBigInt:Y(f.default.SyntaxKind.BigIntKeyword),ZodBoolean:Y(f.default.SyntaxKind.BooleanKeyword),ZodDateIn:Y(f.default.SyntaxKind.StringKeyword),ZodDateOut:Y(f.default.SyntaxKind.StringKeyword),ZodNull:tn,ZodArray:Uo,ZodTuple:Vo,ZodRecord:Bo,ZodObject:Ho,ZodLiteral:ko,ZodIntersection:Yo,ZodUnion:br,ZodFile:Y(f.default.SyntaxKind.StringKeyword),ZodAny:Y(f.default.SyntaxKind.AnyKeyword),ZodDefault:Jo,ZodEnum:Ko,ZodNativeEnum:_o,ZodEffects:$o,ZodOptional:Go,ZodNullable:qo,ZodDiscriminatedUnion:br,ZodBranded:Qo,ZodCatch:Xo,ZodPipeline:en,ZodLazy:rn,ZodReadonly:Wo},At=({schema:e,...t})=>te({schema:e,rules:on,onMissing:()=>u.createKeywordTypeNode(f.default.SyntaxKind.AnyKeyword),...t});var Ye=class{agg=[];registry={};paths=[];aliases={};getAlias(t){return t in this.aliases?i.createTypeReferenceNode(t):void 0}makeAlias(t,r){return this.aliases[t]=Be(r,t),this.getAlias(t)}constructor({routing:t,variant:r="client",serializer:o=Ne,optionalPropStyle:n={withQuestionMark:!0,withUndefined:!0}}){ee({routing:t,onEndpoint:(m,O,v)=>{let fe=H(O,v,"input"),N=H(O,v,"response"),ye={serializer:o,getAlias:this.getAlias.bind(this),makeAlias:this.makeAlias.bind(this),optionalPropStyle:n},We=At({...ye,schema:m.getSchema("input"),isResponse:!1}),ge=At({...ye,isResponse:!0,schema:m.getSchema("positive").or(m.getSchema("negative"))});this.agg.push(Be(We,fe),Be(ge,N)),v!=="options"&&(this.paths.push(O),this.registry[`${v} ${O}`]={in:fe,out:N,isJson:m.getMimeTypes("positive").includes(J),tags:m.getTags()})}}),this.agg=Object.values(this.aliases).concat(this.agg);let s=Rt("Path",this.paths),a=Rt("Method",Kt),p=qe("MethodPath",xt([a.name,s.name])),d=[i.createHeritageClause(G.default.SyntaxKind.ExtendsKeyword,[St(p.name,G.default.SyntaxKind.AnyKeyword)])],c=Pt("Input",d,Object.keys(this.registry).map(m=>Ot(m,this.registry[m].in))),l=Pt("Response",d,Object.keys(this.registry).map(m=>Ot(m,this.registry[m].out)));if(this.agg.push(s,a,p,c,l),r==="types")return;let g=i.createVariableStatement(re,bt("jsonEndpoints",i.createObjectLiteralExpression(Object.keys(this.registry).filter(m=>this.registry[m].isJson).map(m=>i.createPropertyAssignment(`"${m}"`,i.createTrue()))))),y=i.createVariableStatement(re,bt("endpointTags",i.createObjectLiteralExpression(Object.keys(this.registry).map(m=>i.createPropertyAssignment(`"${m}"`,i.createArrayLiteralExpression(this.registry[m].tags.map(O=>i.createStringLiteral(O)))))))),S=qe("Provider",i.createFunctionTypeNode(xr({M:a.name,P:s.name}),Ge({method:i.createTypeReferenceNode("M"),path:i.createTypeReferenceNode("P"),params:i.createIndexedAccessTypeNode(i.createTypeReferenceNode(c.name),Tt)}),gr(l.name,Tt))),A=qe("Implementation",i.createFunctionTypeNode(void 0,Ge({method:i.createTypeReferenceNode(a.name),path:i.createKeywordTypeNode(G.default.SyntaxKind.StringKeyword),params:St(G.default.SyntaxKind.StringKeyword,G.default.SyntaxKind.AnyKeyword)}),hr())),h=i.createTemplateExpression(i.createTemplateHead(":"),[i.createTemplateSpan(i.createIdentifier("key"),i.createTemplateTail(""))]),z=yr("ExpressZodAPIClient",ur([_e("implementation",i.createTypeReferenceNode(A.name),mr)]),[fr("provide",i.createTypeReferenceNode(S.name),Tr(["method","path","params"],[i.createIdentifier("method"),Zt("params",i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("acc"),"replace"),void 0,[h,i.createElementAccessExpression(i.createIdentifier("params"),i.createIdentifier("key"))]),i.createIdentifier("path")),Zt("params",i.createConditionalExpression(i.createBinaryExpression(i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("path"),"indexOf"),void 0,[h]),G.default.SyntaxKind.GreaterThanEqualsToken,i.createNumericLiteral(0)),void 0,i.createIdentifier("acc"),void 0,i.createObjectLiteralExpression([i.createSpreadAssignment(i.createIdentifier("acc")),i.createPropertyAssignment(i.createComputedPropertyName(i.createIdentifier("key")),i.createElementAccessExpression(i.createIdentifier("params"),i.createIdentifier("key")))])),i.createObjectLiteralExpression())]))]);G.default.addSyntheticLeadingComment(z,G.default.SyntaxKind.MultiLineCommentTrivia,`
34
+ `.trim();var pt=({app:e,logger:t,config:r,routing:o})=>{r.startupLogo!==!1&&console.log(Bt()),ee({routing:o,hasCors:!!r.cors,onEndpoint:(n,s,a)=>{e[a](s,async(p,d)=>{t.info(`${p.method}: ${s}`),await n.execute({request:p,response:d,logger:t,config:r})})},onStatic:(n,s)=>{e.use(n,s)}})};var ke=R(require("express")),Yt=R(require("compression")),Jt=R(require("express-fileupload")),Qt=R(require("https"));var ct=R(require("http-errors")),$r=(e,t)=>(r,o,n,s)=>{if(!r)return s();e.handler({error:(0,ct.default)(400,ne(r).message),request:o,response:n,logger:t,input:o.body,output:null})},Wt=(e,t)=>(r,o)=>{let n=(0,ct.default)(404,`Can not ${r.method} ${r.path}`);try{e.handler({request:r,response:o,logger:t,error:n,input:null,output:null})}catch(s){ve({response:o,logger:t,error:new ie(ne(s).message,n)})}},Xt=(e,t)=>{let r=ot(e.logger)?Oe(e.logger):e.logger;pt({app:e.app,routing:t,logger:r,config:e});let o=e.errorHandler||W;return{notFoundHandler:Wt(o,r),logger:r}},er=(e,t)=>{let r=ot(e.logger)?Oe(e.logger):e.logger,o=(0,ke.default)();o.disable("x-powered-by");let n=e.errorHandler||W,s=e.server.compression?(0,Yt.default)({...typeof e.server.compression=="object"?e.server.compression:{}}):void 0,a=e.server.jsonParser||(0,ke.json)(),p=e.server.upload?(0,Jt.default)({...typeof e.server.upload=="object"?e.server.upload:{},abortOnLimit:!1,parseNested:!0}):void 0,d=[].concat(s||[]).concat(a).concat(p||[]);o.use(d),o.use($r(n,r)),pt({app:o,routing:t,logger:r,config:e}),o.use(Wt(n,r));let c=o.listen(e.server.listen,()=>{r.info(`Listening ${e.server.listen}`)}),l;return e.https&&(l=Qt.default.createServer(e.https.options,o).listen(e.https.listen,()=>{r.info(`Listening ${e.https.listen}`)})),{app:o,httpServer:c,httpsServer:l,logger:r}};var lr=require("openapi3-ts/oas30");var $=require("openapi3-ts/oas30"),ue=require("ramda"),x=require("zod");var T=require("zod");var lt=/^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(\.\d+)?)?Z?$/,_r="ZodDateIn",He=class e extends T.ZodType{_parse(t){let{status:r,ctx:o}=this._processInputParams(t);if(o.parsedType!==T.ZodParsedType.string)return(0,T.addIssueToContext)(o,{code:T.ZodIssueCode.invalid_type,expected:T.ZodParsedType.string,received:o.parsedType}),T.INVALID;lt.test(o.data)||((0,T.addIssueToContext)(o,{code:T.ZodIssueCode.invalid_string,validation:"regex"}),r.dirty());let n=new Date(o.data);return Ie(n)?{status:r.value,value:n}:((0,T.addIssueToContext)(o,{code:T.ZodIssueCode.invalid_date}),T.INVALID)}static create=()=>new e({typeName:_r})};var te=({schema:e,onEach:t,rules:r,onMissing:o,...n})=>{let s="typeName"in e._def?r[e._def.typeName]:void 0,p=s?s({schema:e,...n,next:c=>te({...c,...n,onEach:t,rules:r,onMissing:o})}):o({schema:e,...n}),d=t&&t({schema:e,prev:p,...n});return d?{...p,...d}:p};var tr=50,or="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString",Gr={integer:0,number:0,string:"",boolean:!1,object:{},null:null,array:[]},nr=e=>e.replace(et,t=>`{${t.slice(1)}}`),qr=({schema:{_def:{innerType:e,defaultValue:t}},next:r})=>({...r({schema:e}),default:t()}),Vr=({schema:{_def:{innerType:e}},next:t})=>t({schema:e}),Br=()=>({format:"any"}),Yr=e=>{if(e.isResponse)throw new P({message:"Please use z.upload() only for input.",...e});return{type:"string",format:"binary"}},Jr=({schema:{isBinary:e,isBase64:t},...r})=>{if(!r.isResponse)throw new P({message:"Please use z.file() only within ResultHandler.",...r});return{type:"string",format:e?"binary":t?"byte":"file"}},Qr=({schema:{options:e},next:t})=>({oneOf:e.map(r=>t({schema:r}))}),Wr=({schema:{options:e,discriminator:t},next:r})=>({discriminator:{propertyName:t},oneOf:Array.from(e.values()).map(o=>r({schema:o}))}),Xr=({schema:{_def:{left:e,right:t}},next:r})=>({allOf:[e,t].map(o=>r({schema:o}))}),eo=({schema:e,next:t})=>t({schema:e.unwrap()}),to=({schema:e,next:t})=>t({schema:e._def.innerType}),ro=({schema:e,next:t})=>({nullable:!0,...t({schema:e.unwrap()})}),rr=({schema:e})=>({type:typeof Object.values(e.enum)[0],enum:Object.values(e.enum)}),oo=({schema:{value:e}})=>({type:typeof e,enum:[e]}),no=({schema:e,isResponse:t,...r})=>{let o=Object.keys(e.shape).filter(n=>{let s=e.shape[n];return!(t&&Te(s)?s instanceof x.z.ZodOptional:s.isOptional())});return{type:"object",properties:Ue({schema:e,isResponse:t,...r}),...o.length?{required:o}:{}}},so=()=>({type:"string",nullable:!0,format:"null"}),io=e=>{if(e.isResponse)throw new P({message:"Please use z.dateOut() for output.",...e});return{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",pattern:lt.source,externalDocs:{url:or}}},ao=e=>{if(!e.isResponse)throw new P({message:"Please use z.dateIn() for input.",...e});return{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",externalDocs:{url:or}}},po=e=>{throw new P({message:`Using z.date() within ${e.isResponse?"output":"input"} schema is forbidden. Please use z.date${e.isResponse?"Out":"In"}() instead. Check out the documentation for details.`,...e})},co=()=>({type:"boolean"}),lo=()=>({type:"integer",format:"bigint"}),mo=({schema:{keySchema:e,valueSchema:t},...r})=>{if(e instanceof x.z.ZodEnum||e instanceof x.z.ZodNativeEnum){let o=Object.values(e.enum),n=o.reduce((s,a)=>({...s,[a]:t}),{});return{type:"object",properties:Ue({schema:x.z.object(n),...r}),...o.length?{required:o}:{}}}if(e instanceof x.z.ZodLiteral)return{type:"object",properties:Ue({schema:x.z.object({[e.value]:t}),...r}),required:[e.value]};if(e instanceof x.z.ZodUnion&&e.options.reduce((n,s)=>n&&s instanceof x.z.ZodLiteral,!0)){let n=e.options.reduce((s,a)=>({...s,[a.value]:t}),{});return{type:"object",properties:Ue({schema:x.z.object(n),...r}),required:e.options.map(s=>s.value)}}return{type:"object",additionalProperties:r.next({schema:t})}},uo=({schema:{_def:e,element:t},next:r})=>({type:"array",items:r({schema:t}),...e.minLength!==null&&{minItems:e.minLength.value},...e.maxLength!==null&&{maxItems:e.maxLength.value}}),fo=({schema:{items:e},next:t})=>{let r=e.map(o=>t({schema:o}));return{type:"array",minItems:r.length,maxItems:r.length,items:{oneOf:r,format:"tuple",...r.length>0&&{description:r.map((o,n)=>`${n}: ${(0,$.isSchemaObject)(o)?o.type:o.$ref}`).join(", ")}}}},yo=({schema:{isEmail:e,isURL:t,minLength:r,maxLength:o,isUUID:n,isCUID:s,isCUID2:a,isULID:p,isIP:d,isEmoji:c,isDatetime:l,_def:{checks:g}}})=>{let y=g.find(h=>h.kind==="regex"),S=g.find(h=>h.kind==="datetime"),I=y?y.regex:S?S.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;return{type:"string",...l&&{format:"date-time"},...e&&{format:"email"},...t&&{format:"url"},...n&&{format:"uuid"},...s&&{format:"cuid"},...a&&{format:"cuid2"},...p&&{format:"ulid"},...d&&{format:"ip"},...c&&{format:"emoji"},...r!==null&&{minLength:r},...o!==null&&{maxLength:o},...I&&{pattern:`/${I.source}/${I.flags}`}}},go=({schema:e})=>{let t=e._def.checks.find(({kind:s})=>s==="min"),r=t?t.inclusive:!0,o=e._def.checks.find(({kind:s})=>s==="max"),n=o?o.inclusive:!0;return{type:e.isInt?"integer":"number",format:e.isInt?"int64":"double",minimum:e.minValue===null?e.isInt?Number.MIN_SAFE_INTEGER:Number.MIN_VALUE:e.minValue,exclusiveMinimum:!r,maximum:e.maxValue===null?e.isInt?Number.MAX_SAFE_INTEGER:Number.MAX_VALUE:e.maxValue,exclusiveMaximum:!n}},Ue=({schema:{shape:e},next:t})=>Object.keys(e).reduce((r,o)=>({...r,[o]:t({schema:e[o]})}),{}),ho=e=>{let t=Array.isArray(e.type)?e.type[0]:e.type;return Gr?.[t]},xo=({schema:e,isResponse:t,next:r})=>{let o=r({schema:e.innerType()}),{effect:n}=e._def;if(t&&n.type==="transform"&&(0,$.isSchemaObject)(o)){let s=Ne({effect:n,sample:ho(o)});return s&&["number","string","boolean"].includes(s)?{type:s}:r({schema:x.z.any()})}if(!t&&n.type==="preprocess"&&(0,$.isSchemaObject)(o)){let{type:s,...a}=o;return{...a,format:`${a.format||s} (preprocessed)`}}return o},To=({schema:e,isResponse:t,next:r})=>r({schema:e._def[t?"out":"in"]}),So=({schema:e,next:t})=>t({schema:e.unwrap()}),Oo=({next:e,schema:t,serializer:r,getRef:o,makeRef:n})=>{let s=r(t.schema);return o(s)||(()=>(n(s,{}),n(s,e({schema:t.schema}))))()},sr=(e,t,r=[])=>{let o=k({schema:e,variant:t?"parsed":"original",validate:!0});return o.length===0?{}:{examples:o.reduce((n,s,a)=>({...n,[`example${a+1}`]:{value:typeof s=="object"&&!Array.isArray(s)?(0,ue.omit)(r,s):s}}),{})}},bo=(e,t,r)=>{let o=k({schema:e,variant:t?"parsed":"original",validate:!0});return o.length===0?{}:{examples:o.reduce((n,s,a)=>r in s?{...n,[`example${a+1}`]:{value:s[r]}}:n,{})}},be=(e,t)=>{if(e instanceof x.z.ZodObject)return e;let r;if(e instanceof x.z.ZodUnion||e instanceof x.z.ZodDiscriminatedUnion)r=Array.from(e.options.values()).map(o=>be(o,t)).reduce((o,n)=>o.merge(n.partial()),x.z.object({}));else if(e instanceof x.z.ZodEffects){if(q(e))throw new P({message:`Using transformations on the top level of ${t.isResponse?"response":"input"} schema is not allowed.`,...t});r=be(e._def.schema,t)}else r=be(e._def.left,t).merge(be(e._def.right,t));return Ee(e,r)},ir=({path:e,method:t,endpoint:r,inputSources:o,serializer:n,getRef:s,makeRef:a,composition:p,clue:d="parameter"})=>{let c=r.getSchema("input"),l=be(c,{path:e,method:t,isResponse:!1}).shape,g=st(e),y=o.includes("query"),S=o.includes("params"),I=o.includes("headers"),h=m=>S&&g.includes(m),z=m=>I&&rt(m);return Object.keys(l).filter(m=>y||h(m)).map(m=>{let O=te({schema:l[m],isResponse:!1,rules:ut,onEach:ft,onMissing:yt,serializer:n,getRef:s,makeRef:a,path:e,method:t}),v=p==="components"?a(H(e,t,`${d} ${m}`),O):O;return{name:m,in:h(m)?"path":z(m)?"header":"query",required:!l[m].isOptional(),description:(0,$.isSchemaObject)(O)&&O.description||`${t.toUpperCase()} ${e} ${d}`,schema:v,...bo(c,!1,m)}})},ut={ZodString:yo,ZodNumber:go,ZodBigInt:lo,ZodBoolean:co,ZodDateIn:io,ZodDateOut:ao,ZodNull:so,ZodArray:uo,ZodTuple:fo,ZodRecord:mo,ZodObject:no,ZodLiteral:oo,ZodIntersection:Xr,ZodUnion:Qr,ZodFile:Jr,ZodUpload:Yr,ZodAny:Br,ZodDefault:qr,ZodEnum:rr,ZodNativeEnum:rr,ZodEffects:xo,ZodOptional:eo,ZodNullable:ro,ZodDiscriminatedUnion:Wr,ZodBranded:So,ZodDate:po,ZodCatch:Vr,ZodPipeline:To,ZodLazy:Oo,ZodReadonly:to},ft=({schema:e,isResponse:t,prev:r})=>{if((0,$.isReferenceObject)(r))return{};let{description:o}=e,n=e instanceof x.z.ZodLazy,s=r.type!==void 0,a=t&&Te(e),p=!n&&s&&!a&&e.isNullable(),d=n?[]:k({schema:e,variant:t?"parsed":"original",validate:!0});return{...o&&{description:o},...p&&{nullable:!0},...d.length>0&&{example:d[0]}}},yt=({schema:e,...t})=>{throw new P({message:`Zod type ${e.constructor.name} is unsupported.`,...t})},mt=(e,t)=>{if((0,$.isReferenceObject)(e))return e;let r=e.properties?(0,ue.omit)(t,e.properties):void 0,o=e.example?(0,ue.omit)(t,e.example):void 0,n=e.required?e.required.filter(p=>!t.includes(p)):void 0,s=e.allOf?e.allOf.map(p=>mt(p,t)):void 0,a=e.oneOf?e.oneOf.map(p=>mt(p,t)):void 0;return(0,ue.omit)(Object.entries({properties:r,required:n,example:o,allOf:s,oneOf:a}).filter(([{},p])=>p===void 0).map(([p])=>p),{...e,properties:r,required:n,example:o,allOf:s,oneOf:a})},ar=e=>(0,$.isSchemaObject)(e)?(0,ue.omit)(["example"],e):e,gt=({method:e,path:t,endpoint:r,isPositive:o,serializer:n,getRef:s,makeRef:a,composition:p,clue:d="response"})=>{let c=r.getSchema(o?"positive":"negative"),l=r.getMimeTypes(o?"positive":"negative"),g=ar(te({schema:c,isResponse:!0,rules:ut,onEach:ft,onMissing:yt,serializer:n,getRef:s,makeRef:a,path:t,method:e})),y=sr(c,!0),S=p==="components"?a(H(t,e,d),g):g;return{description:`${e.toUpperCase()} ${t} ${d}`,content:l.reduce((I,h)=>({...I,[h]:{schema:S,...y}}),{})}},Ro=()=>({type:"http",scheme:"basic"}),Po=({format:e})=>({type:"http",scheme:"bearer",...e&&{bearerFormat:e}}),Zo=({name:e})=>({type:"apiKey",in:"query",name:e}),Eo=({name:e})=>({type:"apiKey",in:"header",name:e}),Ao=({name:e})=>({type:"apiKey",in:"cookie",name:e}),Io=({url:e})=>({type:"openIdConnect",openIdConnectUrl:e}),Co=({flows:e={}})=>({type:"oauth2",flows:Object.keys(e).reduce((t,r)=>{let o=e[r];if(!o)return t;let{scopes:n={},...s}=o;return{...t,[r]:{...s,scopes:n}}},{})}),dr=e=>{let t={basic:Ro,bearer:Po,input:Zo,header:Eo,cookie:Ao,openid:Io,oauth2:Co};return Me(e,r=>t[r.type](r))},Ke=e=>{if(typeof e=="object"){if("or"in e)return e.or.map(t=>("and"in t?t.and:[t]).reduce((r,{name:o,scopes:n})=>({...r,[o]:n}),{}));if("and"in e)return Ke(at(e))}return Ke({or:[e]})},pr=({method:e,path:t,endpoint:r,serializer:o,getRef:n,makeRef:s,composition:a,clue:p="request body"})=>{let d=st(t),c=ar(mt(te({schema:r.getSchema("input"),isResponse:!1,rules:ut,onEach:ft,onMissing:yt,serializer:o,getRef:n,makeRef:s,path:t,method:e}),d)),l=sr(r.getSchema("input"),!1,d),g=a==="components"?s(H(t,e,p),c):c;return{description:`${e.toUpperCase()} ${t} ${p}`,content:r.getMimeTypes("input").reduce((y,S)=>({...y,[S]:{schema:g,...l}}),{})}},cr=e=>Object.keys(e).map(t=>{let r=e[t];return{name:t,description:typeof r=="string"?r:r.description,...typeof r=="object"&&r.url&&{externalDocs:{url:r.url}}}}),ht=e=>e.length<=tr?e:e.slice(0,tr-1)+"\u2026";var Fe=class extends lr.OpenApiBuilder{lastSecuritySchemaIds={};lastOperationIdSuffixes={};makeRef(t,r){return this.addSchema(t,r),this.getRef(t)}getRef(t){return t in(this.rootDoc.components?.schemas||{})?{$ref:`#/components/schemas/${t}`}:void 0}ensureUniqOperationId(t,r,o){if(o){if(o in this.lastOperationIdSuffixes)throw new P({message:`Duplicated operationId: "${o}"`,method:r,isResponse:!1,path:t});return this.lastOperationIdSuffixes[o]=1,o}let n=H(t,r);return n in this.lastOperationIdSuffixes?(this.lastOperationIdSuffixes[n]++,`${n}${this.lastOperationIdSuffixes[n]}`):(this.lastOperationIdSuffixes[n]=1,n)}ensureUniqSecuritySchemaName(t){let r=JSON.stringify(t);for(let o in this.rootDoc.components?.securitySchemes||{})if(r===JSON.stringify(this.rootDoc.components?.securitySchemes?.[o]))return o;return this.lastSecuritySchemaIds[t.type]=(this.lastSecuritySchemaIds?.[t.type]||0)+1,`${t.type.toUpperCase()}_${this.lastSecuritySchemaIds[t.type]}`}constructor({routing:t,config:r,title:o,version:n,serverUrl:s,successfulResponseDescription:a="Successful response",errorResponseDescription:p="Error response",hasSummaryFromDescription:d=!0,composition:c="inline",serializer:l=Ce}){super(),this.addInfo({title:o,version:n}).addServer({url:s}),ee({routing:t,onEndpoint:(y,S,I)=>{let h=I,z={path:S,method:h,endpoint:y,composition:c,serializer:l,getRef:this.getRef.bind(this),makeRef:this.makeRef.bind(this)},[m,O]=["short","long"].map(y.getDescription.bind(y)),v=r.inputSources?.[h]||Ae[h],fe=ir({...z,inputSources:v}),N={operationId:this.ensureUniqOperationId(S,h,y.getOperationId()),responses:{[y.getStatusCode("positive")]:gt({...z,clue:a,isPositive:!0}),[y.getStatusCode("negative")]:gt({...z,clue:p,isPositive:!1})}};O&&(N.description=O,d&&m===void 0&&(N.summary=ht(O))),m&&(N.summary=ht(m)),y.getTags().length>0&&(N.tags=y.getTags()),fe.length>0&&(N.parameters=fe),v.includes("body")&&(N.requestBody=pr(z));let Re=Ke(Me(dr(y.getSecurity()),Xe=>{let Nt=this.ensureUniqSecuritySchemaName(Xe),Er=["oauth2","openIdConnect"].includes(Xe.type)?y.getScopes():[];return this.addSecurityScheme(Nt,Xe),{name:Nt,scopes:Er}}));Re.length>0&&(N.security=Re);let We=nr(S);this.addPath(We,{[h]:N})}}),this.rootDoc.tags=r.tags?cr(r.tags):[]}};var xt=R(require("http"));var No=e=>({method:"GET",header:jest.fn(()=>J),...e}),wo=e=>{let t={writableEnded:!1,statusCode:200,statusMessage:xt.default.STATUS_CODES[200],set:jest.fn(()=>t),setHeader:jest.fn(()=>t),header:jest.fn(()=>t),status:jest.fn(r=>(t.statusCode=r,t.statusMessage=xt.default.STATUS_CODES[r],t)),json:jest.fn(()=>t),send:jest.fn(()=>t),end:jest.fn(()=>(t.writableEnded=!0,t)),...e};return t},mr=async({endpoint:e,requestProps:t,responseProps:r,configProps:o,loggerProps:n,__noJest:s})=>{if(!jest||s)throw new Error("You need to install Jest in order to use testEndpoint().");let a=No(t),p=wo(r),d={info:jest.fn(),warn:jest.fn(),error:jest.fn(),debug:jest.fn(),...n},c={cors:!1,logger:d,...o};return await e.execute({request:a,response:p,config:c,logger:d}),{requestMock:a,responseMock:p,loggerMock:d}};var G=R(require("typescript"));var D=R(require("typescript")),i=D.default.factory,re=[i.createModifier(D.default.SyntaxKind.ExportKeyword)],Mo=[i.createModifier(D.default.SyntaxKind.AsyncKeyword)],Do=[i.createModifier(D.default.SyntaxKind.PublicKeyword),i.createModifier(D.default.SyntaxKind.ReadonlyKeyword)],ur=[i.createModifier(D.default.SyntaxKind.ProtectedKeyword),i.createModifier(D.default.SyntaxKind.ReadonlyKeyword)],zo=i.createTemplateHead(""),vo=i.createTemplateTail(""),jo=i.createTemplateMiddle(" "),Tt=e=>i.createTemplateLiteralType(zo,e.map((t,r)=>i.createTemplateLiteralTypeSpan(i.createTypeReferenceNode(t),r===e.length-1?vo:jo))),St=Tt(["M","P"]),$e=(e,t,r)=>i.createParameterDeclaration(r,void 0,e,void 0,t,void 0),_e=(e,t)=>Object.keys(e).reduce((r,o)=>r.concat($e(o,e[o],t)),[]),Ot=(e,t)=>i.createExpressionWithTypeArguments(i.createIdentifier("Record"),[typeof e=="number"?i.createKeywordTypeNode(e):i.createTypeReferenceNode(e),i.createKeywordTypeNode(t)]),fr=e=>i.createConstructorDeclaration(void 0,e,i.createBlock([])),bt=(e,t)=>i.createPropertySignature(void 0,`"${e}"`,void 0,i.createTypeReferenceNode(t)),Rt=(e,t)=>i.createVariableDeclarationList([i.createVariableDeclaration(e,void 0,void 0,t)],D.default.NodeFlags.Const),Pt=(e,t)=>i.createTypeAliasDeclaration(re,e,void 0,i.createUnionTypeNode(t.map(r=>i.createLiteralTypeNode(i.createStringLiteral(r))))),Ge=(e,t)=>i.createTypeAliasDeclaration(re,e,void 0,t),yr=(e,t,r)=>i.createPropertyDeclaration(Do,e,void 0,t,r),gr=(e,t,r=[])=>i.createClassDeclaration(re,e,void 0,void 0,[t,...r]),hr=(e,t)=>i.createTypeReferenceNode("Promise",[i.createIndexedAccessTypeNode(i.createTypeReferenceNode(e),t)]),xr=()=>i.createTypeReferenceNode("Promise",[i.createKeywordTypeNode(D.default.SyntaxKind.AnyKeyword)]),Zt=(e,t,r)=>i.createInterfaceDeclaration(re,e,void 0,t,r),Tr=e=>Object.keys(e).reduce((t,r)=>t.concat(i.createTypeParameterDeclaration([],r,i.createTypeReferenceNode(e[r]))),[]),Sr=(e,t)=>i.createArrowFunction(Mo,void 0,e.map(r=>$e(r)),void 0,void 0,i.createCallExpression(i.createPropertyAccessExpression(i.createThis(),"implementation"),void 0,t)),Et=(e,t,r)=>i.createCallExpression(i.createPropertyAccessExpression(i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("Object"),"keys"),void 0,[i.createIdentifier(e)]),"reduce"),void 0,[i.createArrowFunction(void 0,void 0,_e({acc:void 0,key:void 0}),void 0,void 0,t),r]);var f=R(require("typescript")),Pr=require("zod");var _=R(require("typescript")),{factory:qe}=_.default,At=(e,t)=>{_.default.addSyntheticLeadingComment(e,_.default.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0)},Ve=(e,t,r)=>{let o=qe.createTypeAliasDeclaration(void 0,qe.createIdentifier(t),void 0,e);return r&&At(o,r),o},Or=(e,t)=>{let r=_.default.createSourceFile("print.ts","",_.default.ScriptTarget.Latest,!1,_.default.ScriptKind.TS);return _.default.createPrinter(t).printNode(_.default.EmitHint.Unspecified,e,r)},Lo=/^[A-Za-z_$][A-Za-z0-9_$]*$/,br=e=>Lo.test(e)?qe.createIdentifier(e):qe.createStringLiteral(e);var{factory:u}=f.default,ko={[f.default.SyntaxKind.AnyKeyword]:"",[f.default.SyntaxKind.BigIntKeyword]:BigInt(0),[f.default.SyntaxKind.BooleanKeyword]:!1,[f.default.SyntaxKind.NumberKeyword]:0,[f.default.SyntaxKind.ObjectKeyword]:{},[f.default.SyntaxKind.StringKeyword]:"",[f.default.SyntaxKind.UndefinedKeyword]:void 0},Ho=({schema:{value:e}})=>u.createLiteralTypeNode(typeof e=="number"?u.createNumericLiteral(e):typeof e=="boolean"?e?u.createTrue():u.createFalse():u.createStringLiteral(e)),Uo=({schema:{shape:e},isResponse:t,next:r,optionalPropStyle:{withQuestionMark:o}})=>{let n=Object.entries(e).map(([s,a])=>{let p=t&&Te(a)?a instanceof Pr.z.ZodOptional:a.isOptional(),d=u.createPropertySignature(void 0,br(s),p&&o?u.createToken(f.default.SyntaxKind.QuestionToken):void 0,r({schema:a}));return a.description&&At(d,a.description),d});return u.createTypeLiteralNode(n)},Ko=({schema:{element:e},next:t})=>u.createArrayTypeNode(t({schema:e})),Fo=({schema:{options:e}})=>u.createUnionTypeNode(e.map(t=>u.createLiteralTypeNode(u.createStringLiteral(t)))),Rr=({schema:{options:e},next:t})=>u.createUnionTypeNode(e.map(r=>t({schema:r}))),$o=e=>ko?.[e.kind],_o=({schema:e,next:t,isResponse:r})=>{let o=t({schema:e.innerType()}),n=e._def.effect;if(r&&n.type==="transform"){let s=Ne({effect:n,sample:$o(o)}),a={number:f.default.SyntaxKind.NumberKeyword,bigint:f.default.SyntaxKind.BigIntKeyword,boolean:f.default.SyntaxKind.BooleanKeyword,string:f.default.SyntaxKind.StringKeyword,undefined:f.default.SyntaxKind.UndefinedKeyword,object:f.default.SyntaxKind.ObjectKeyword};return u.createKeywordTypeNode(s&&a[s]||f.default.SyntaxKind.AnyKeyword)}return o},Go=({schema:e})=>u.createUnionTypeNode(Object.values(e.enum).map(t=>u.createLiteralTypeNode(typeof t=="number"?u.createNumericLiteral(t):u.createStringLiteral(t)))),qo=({next:e,schema:t,optionalPropStyle:{withUndefined:r}})=>{let o=e({schema:t.unwrap()});return r?u.createUnionTypeNode([o,u.createKeywordTypeNode(f.default.SyntaxKind.UndefinedKeyword)]):o},Vo=({next:e,schema:t})=>u.createUnionTypeNode([e({schema:t.unwrap()}),u.createLiteralTypeNode(u.createNull())]),Bo=({next:e,schema:{items:t}})=>u.createTupleTypeNode(t.map(r=>e({schema:r}))),Yo=({next:e,schema:{keySchema:t,valueSchema:r}})=>u.createExpressionWithTypeArguments(u.createIdentifier("Record"),[e({schema:t}),e({schema:r})]),Jo=({next:e,schema:t})=>u.createIntersectionTypeNode([t._def.left,t._def.right].map(r=>e({schema:r}))),Qo=({next:e,schema:t})=>e({schema:t._def.innerType}),Y=e=>()=>u.createKeywordTypeNode(e),Wo=({next:e,schema:t})=>e({schema:t.unwrap()}),Xo=({next:e,schema:t})=>e({schema:t._def.innerType}),en=({next:e,schema:t})=>e({schema:t._def.innerType}),tn=({schema:e,next:t,isResponse:r})=>t({schema:e._def[r?"out":"in"]}),rn=()=>u.createLiteralTypeNode(u.createNull()),on=({getAlias:e,makeAlias:t,next:r,serializer:o,schema:n})=>{let s=`Type${o(n.schema)}`;return e(s)||(()=>(t(s,u.createLiteralTypeNode(u.createNull())),t(s,r({schema:n.schema}))))()},nn={ZodString:Y(f.default.SyntaxKind.StringKeyword),ZodNumber:Y(f.default.SyntaxKind.NumberKeyword),ZodBigInt:Y(f.default.SyntaxKind.BigIntKeyword),ZodBoolean:Y(f.default.SyntaxKind.BooleanKeyword),ZodDateIn:Y(f.default.SyntaxKind.StringKeyword),ZodDateOut:Y(f.default.SyntaxKind.StringKeyword),ZodNull:rn,ZodArray:Ko,ZodTuple:Bo,ZodRecord:Yo,ZodObject:Uo,ZodLiteral:Ho,ZodIntersection:Jo,ZodUnion:Rr,ZodFile:Y(f.default.SyntaxKind.StringKeyword),ZodAny:Y(f.default.SyntaxKind.AnyKeyword),ZodDefault:Qo,ZodEnum:Fo,ZodNativeEnum:Go,ZodEffects:_o,ZodOptional:qo,ZodNullable:Vo,ZodDiscriminatedUnion:Rr,ZodBranded:Wo,ZodCatch:en,ZodPipeline:tn,ZodLazy:on,ZodReadonly:Xo},It=({schema:e,...t})=>te({schema:e,rules:nn,onMissing:()=>u.createKeywordTypeNode(f.default.SyntaxKind.AnyKeyword),...t});var Be=class{agg=[];registry={};paths=[];aliases={};getAlias(t){return t in this.aliases?i.createTypeReferenceNode(t):void 0}makeAlias(t,r){return this.aliases[t]=Ve(r,t),this.getAlias(t)}constructor({routing:t,variant:r="client",serializer:o=Ce,optionalPropStyle:n={withQuestionMark:!0,withUndefined:!0}}){ee({routing:t,onEndpoint:(m,O,v)=>{let fe=H(O,v,"input"),Qe=H(O,v,"response"),N={serializer:o,getAlias:this.getAlias.bind(this),makeAlias:this.makeAlias.bind(this),optionalPropStyle:n},Re=It({...N,schema:m.getSchema("input"),isResponse:!1}),We=It({...N,isResponse:!0,schema:m.getSchema("positive").or(m.getSchema("negative"))});this.agg.push(Ve(Re,fe),Ve(We,Qe)),v!=="options"&&(this.paths.push(O),this.registry[`${v} ${O}`]={in:fe,out:Qe,isJson:m.getMimeTypes("positive").includes(J),tags:m.getTags()})}}),this.agg=Object.values(this.aliases).concat(this.agg);let s=Pt("Path",this.paths),a=Pt("Method",Ft),p=Ge("MethodPath",Tt([a.name,s.name])),d=[i.createHeritageClause(G.default.SyntaxKind.ExtendsKeyword,[Ot(p.name,G.default.SyntaxKind.AnyKeyword)])],c=Zt("Input",d,Object.keys(this.registry).map(m=>bt(m,this.registry[m].in))),l=Zt("Response",d,Object.keys(this.registry).map(m=>bt(m,this.registry[m].out)));if(this.agg.push(s,a,p,c,l),r==="types")return;let g=i.createVariableStatement(re,Rt("jsonEndpoints",i.createObjectLiteralExpression(Object.keys(this.registry).filter(m=>this.registry[m].isJson).map(m=>i.createPropertyAssignment(`"${m}"`,i.createTrue()))))),y=i.createVariableStatement(re,Rt("endpointTags",i.createObjectLiteralExpression(Object.keys(this.registry).map(m=>i.createPropertyAssignment(`"${m}"`,i.createArrayLiteralExpression(this.registry[m].tags.map(O=>i.createStringLiteral(O)))))))),S=Ge("Provider",i.createFunctionTypeNode(Tr({M:a.name,P:s.name}),_e({method:i.createTypeReferenceNode("M"),path:i.createTypeReferenceNode("P"),params:i.createIndexedAccessTypeNode(i.createTypeReferenceNode(c.name),St)}),hr(l.name,St))),I=Ge("Implementation",i.createFunctionTypeNode(void 0,_e({method:i.createTypeReferenceNode(a.name),path:i.createKeywordTypeNode(G.default.SyntaxKind.StringKeyword),params:Ot(G.default.SyntaxKind.StringKeyword,G.default.SyntaxKind.AnyKeyword)}),xr())),h=i.createTemplateExpression(i.createTemplateHead(":"),[i.createTemplateSpan(i.createIdentifier("key"),i.createTemplateTail(""))]),z=gr("ExpressZodAPIClient",fr([$e("implementation",i.createTypeReferenceNode(I.name),ur)]),[yr("provide",i.createTypeReferenceNode(S.name),Sr(["method","path","params"],[i.createIdentifier("method"),Et("params",i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("acc"),"replace"),void 0,[h,i.createElementAccessExpression(i.createIdentifier("params"),i.createIdentifier("key"))]),i.createIdentifier("path")),Et("params",i.createConditionalExpression(i.createBinaryExpression(i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("path"),"indexOf"),void 0,[h]),G.default.SyntaxKind.GreaterThanEqualsToken,i.createNumericLiteral(0)),void 0,i.createIdentifier("acc"),void 0,i.createObjectLiteralExpression([i.createSpreadAssignment(i.createIdentifier("acc")),i.createPropertyAssignment(i.createComputedPropertyName(i.createIdentifier("key")),i.createElementAccessExpression(i.createIdentifier("params"),i.createIdentifier("key")))])),i.createObjectLiteralExpression())]))]);G.default.addSyntheticLeadingComment(z,G.default.SyntaxKind.MultiLineCommentTrivia,`
35
35
  export const exampleImplementation: Implementation = async (
36
36
  method,
37
37
  path,
@@ -52,6 +52,6 @@ export const exampleImplementation: Implementation = async (
52
52
 
53
53
  const client = new ExpressZodAPIClient(exampleImplementation);
54
54
  client.provide("get", "/v1/user/retrieve", { id: "10" });
55
- `,!0),this.agg.push(g,y,S,A,z)}print(t){return this.agg.map(r=>Sr(r,t)).join(`
55
+ `,!0),this.agg.push(g,y,S,I,z)}print(t){return this.agg.map(r=>Or(r,t)).join(`
56
56
 
57
- `)}};var It={};Nt(It,{dateIn:()=>cn,dateOut:()=>ln,file:()=>dn,upload:()=>pn});var P=require("zod");var nn="ZodDateOut",Je=class e extends P.ZodType{_parse(t){let{status:r,ctx:o}=this._processInputParams(t);return o.parsedType!==P.ZodParsedType.date?((0,P.addIssueToContext)(o,{code:P.ZodIssueCode.invalid_type,expected:P.ZodParsedType.date,received:o.parsedType}),P.INVALID):Ce(o.data)?{status:r.value,value:o.data.toISOString()}:((0,P.addIssueToContext)(o,{code:P.ZodIssueCode.invalid_date}),P.INVALID)}static create=()=>new e({typeName:nn})};var E=require("zod");var sn="ZodFile",an=/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/,Qe=class e extends E.ZodType{_parse(t){let{status:r,ctx:o}=this._processInputParams(t);if(o.parsedType!==E.ZodParsedType.string)return(0,E.addIssueToContext)(o,{code:E.ZodIssueCode.invalid_type,expected:E.ZodParsedType.string,received:o.parsedType}),E.INVALID;for(let n of this._def.checks)n.kind==="base64"&&(an.test(o.data)||((0,E.addIssueToContext)(o,{code:E.ZodIssueCode.custom,message:n.message}),r.dirty()));return{status:r.value,value:o.data}}binary=t=>new e({...this._def,checks:[...this._def.checks,{kind:"binary",...st(t)}]});base64=t=>new e({...this._def,checks:[...this._def.checks,{kind:"base64",...st(t)}]});get isBinary(){return!!this._def.checks.find(t=>t.kind==="binary")}get isBase64(){return!!this._def.checks.find(t=>t.kind==="base64")}static create=()=>new e({checks:[],typeName:sn})};var dn=Qe.create,pn=oe.create,cn=Ue.create,ln=Je.create;var Pr=R(require("http-errors"));0&&(module.exports={AbstractEndpoint,DependsOnMethod,DependsOnMethodError,Documentation,DocumentationError,EndpointsFactory,InputValidationError,Integration,OutputValidationError,RoutingError,ServeStatic,arrayEndpointsFactory,arrayResultHandler,attachRouting,createConfig,createHttpError,createLogger,createMiddleware,createResultHandler,createServer,defaultEndpointsFactory,defaultResultHandler,ez,getExamples,getMessageFromError,getStatusCodeFromError,testEndpoint,withMeta});
57
+ `)}};var Ct={};wt(Ct,{dateIn:()=>ln,dateOut:()=>mn,file:()=>pn,upload:()=>cn});var Z=require("zod");var sn="ZodDateOut",Ye=class e extends Z.ZodType{_parse(t){let{status:r,ctx:o}=this._processInputParams(t);return o.parsedType!==Z.ZodParsedType.date?((0,Z.addIssueToContext)(o,{code:Z.ZodIssueCode.invalid_type,expected:Z.ZodParsedType.date,received:o.parsedType}),Z.INVALID):Ie(o.data)?{status:r.value,value:o.data.toISOString()}:((0,Z.addIssueToContext)(o,{code:Z.ZodIssueCode.invalid_date}),Z.INVALID)}static create=()=>new e({typeName:sn})};var A=require("zod");var an="ZodFile",dn=/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/,Je=class e extends A.ZodType{_parse(t){let{status:r,ctx:o}=this._processInputParams(t);if(o.parsedType!==A.ZodParsedType.string)return(0,A.addIssueToContext)(o,{code:A.ZodIssueCode.invalid_type,expected:A.ZodParsedType.string,received:o.parsedType}),A.INVALID;for(let n of this._def.checks)n.kind==="base64"&&(dn.test(o.data)||((0,A.addIssueToContext)(o,{code:A.ZodIssueCode.custom,message:n.message}),r.dirty()));return{status:r.value,value:o.data}}binary=t=>new e({...this._def,checks:[...this._def.checks,{kind:"binary",...it(t)}]});base64=t=>new e({...this._def,checks:[...this._def.checks,{kind:"base64",...it(t)}]});get isBinary(){return!!this._def.checks.find(t=>t.kind==="binary")}get isBase64(){return!!this._def.checks.find(t=>t.kind==="base64")}static create=()=>new e({checks:[],typeName:an})};var pn=Je.create,cn=oe.create,ln=He.create,mn=Ye.create;var Zr=R(require("http-errors"));0&&(module.exports={AbstractEndpoint,DependsOnMethod,DependsOnMethodError,Documentation,DocumentationError,EndpointsFactory,InputValidationError,Integration,OutputValidationError,RoutingError,ServeStatic,arrayEndpointsFactory,arrayResultHandler,attachRouting,createConfig,createHttpError,createLogger,createMiddleware,createResultHandler,createServer,defaultEndpointsFactory,defaultResultHandler,ez,getExamples,getMessageFromError,getStatusCodeFromError,testEndpoint,withMeta});
package/dist/index.mjs CHANGED
@@ -1,8 +1,8 @@
1
- var cr=Object.defineProperty;var lr=(e,t)=>{for(var r in t)cr(e,r,{get:t[r],enumerable:!0})};var Tt={silent:!0,warn:!0,debug:!0},mr=e=>e;import{z as H}from"zod";import{HttpError as Zr}from"http-errors";import{createHash as Er}from"crypto";import{z as O}from"zod";import{clone as ur,mergeDeepRight as fr}from"ramda";var b="expressZodApiMeta",yr=e=>{let t=e.constructor,r=ur(e._def);return r[b]=r[b]||{examples:[]},new t(r)},D=e=>{let t=yr(e);return Object.defineProperties(t,{example:{get:()=>r=>{let o=D(t);return o._def[b].examples.push(r),o}}}),t},St=e=>b in e._def?typeof e._def[b]=="object"&&e._def[b]!==null:!1;function Ot(e,t){if(!St(e))return;let r=e._def;return t in r[b]?r[b][t]:void 0}var ge=(e,t)=>{if(!St(e))return t;let r=D(t),o=se(r._def[b].examples,e._def[b].examples);if(r._def[b].examples=[],o.type==="single")r._def[b].examples=o.value;else for(let[n,s]of o.value)r._def[b].examples.push(fr({...n},{...s}));return r};import gr from"mime";var $=gr.getType("json")||"application/json",ie="multipart/form-data";import{INVALID as hr,OK as xr,ZodIssueCode as Tr,ZodParsedType as Sr,ZodType as Or,addIssueToContext as br}from"zod";var Rr="ZodUpload",Pr=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.mimetype=="string"&&typeof e.data=="object"&&typeof e.tempFilePath=="string"&&typeof e.truncated=="boolean"&&typeof e.size=="number"&&typeof e.md5=="string"&&typeof e.mv=="function",B=class e extends Or{_parse(t){let{ctx:r}=this._processInputParams(t);return r.parsedType!==Sr.object||!Pr(r.data)?(br(r,{code:Tr.custom,message:`Expected file upload, received ${r.parsedType}`}),hr):xr(r.data)}static create=()=>new e({typeName:Rr})};var He=/:([A-Za-z0-9_]+)/g;function Ar(e){let r=(e.header("content-type")||"").slice(0,ie.length).toLowerCase()===ie;return"files"in e&&r}var he={get:["query","params"],post:["body","params","files"],put:["body","params"],patch:["body","params"],delete:["query","params"]},Ir=["body","query","params"],Ue=e=>e.method.toLowerCase(),Ke=e=>e.startsWith("x-"),Cr=e=>Object.entries(e.headers).reduce((t,[r,o])=>Ke(r)?{...t,[r]:o}:t,{});function bt(e,t){let r=Ue(e);if(r==="options")return{};let o=Ir;return r in he&&(o=he[r]),t&&r in t&&(o=t[r]||o),o.filter(n=>n==="files"?Ar(e):!0).reduce((n,s)=>({...n,...s==="headers"?Cr(e):e[s]}),{})}function Fe(e){return typeof e=="object"&&"level"in e&&"color"in e&&Object.keys(Tt).includes(e.level)&&typeof e.color=="boolean"}function xe(e){return!isNaN(e.getTime())}function Y(e){return e instanceof Error?e:new Error(typeof e=="symbol"?e.toString():`${e}`)}function v(e){return e instanceof O.ZodError?e.issues.map(({path:t,message:r})=>(t.length?[t.join("/")]:[]).concat(r).join(": ")).join("; "):e instanceof _?`output${e.originalError.issues[0]?.path.length>0?"/":": "}${e.message}`:e.message}function Te(e){return e instanceof Zr?e.statusCode:e instanceof L?400:500}var $e=({logger:e,request:t,input:r,error:o,statusCode:n})=>{n===500&&e.error(`Internal server error
1
+ var lr=Object.defineProperty;var mr=(e,t)=>{for(var r in t)lr(e,r,{get:t[r],enumerable:!0})};var St={silent:!0,warn:!0,debug:!0},ur=e=>e;import{z as H}from"zod";import{HttpError as Er}from"http-errors";import{createHash as Ar}from"crypto";import{z as O}from"zod";import{clone as fr,mergeDeepRight as yr}from"ramda";var b="expressZodApiMeta",gr=e=>{let t=e.constructor,r=fr(e._def);return r[b]=r[b]||{examples:[]},new t(r)},D=e=>{let t=gr(e);return Object.defineProperties(t,{example:{get:()=>r=>{let o=D(t);return o._def[b].examples.push(r),o}}}),t},Ot=e=>b in e._def?typeof e._def[b]=="object"&&e._def[b]!==null:!1,bt=(e,t)=>{if(!Ot(e))return;let r=e._def;return t in r[b]?r[b][t]:void 0},ye=(e,t)=>{if(!Ot(e))return t;let r=D(t),o=oe(r._def[b].examples,e._def[b].examples);if(r._def[b].examples=[],o.type==="single")r._def[b].examples=o.value;else for(let[n,s]of o.value)r._def[b].examples.push(yr({...n},{...s}));return r};import hr from"mime";var $=hr.getType("json")||"application/json",ne="multipart/form-data";import{INVALID as xr,OK as Tr,ZodIssueCode as Sr,ZodParsedType as Or,ZodType as br,addIssueToContext as Rr}from"zod";var Pr="ZodUpload",Zr=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.mimetype=="string"&&typeof e.data=="object"&&typeof e.tempFilePath=="string"&&typeof e.truncated=="boolean"&&typeof e.size=="number"&&typeof e.md5=="string"&&typeof e.mv=="function",B=class e extends br{_parse(t){let{ctx:r}=this._processInputParams(t);return r.parsedType!==Or.object||!Zr(r.data)?(Rr(r,{code:Sr.custom,message:`Expected file upload, received ${r.parsedType}`}),xr):Tr(r.data)}static create=()=>new e({typeName:Pr})};var Ue=/:([A-Za-z0-9_]+)/g,Ir=e=>{let r=(e.header("content-type")||"").slice(0,ne.length).toLowerCase()===ne;return"files"in e&&r},ge={get:["query","params"],post:["body","params","files"],put:["body","params"],patch:["body","params"],delete:["query","params"]},Cr=["body","query","params"],Ke=e=>e.method.toLowerCase(),Fe=e=>e.startsWith("x-"),Nr=e=>Object.entries(e.headers).reduce((t,[r,o])=>Fe(r)?{...t,[r]:o}:t,{}),Rt=(e,t)=>{let r=Ke(e);if(r==="options")return{};let o=Cr;return r in ge&&(o=ge[r]),t&&r in t&&(o=t[r]||o),o.filter(n=>n==="files"?Ir(e):!0).reduce((n,s)=>({...n,...s==="headers"?Nr(e):e[s]}),{})},$e=e=>typeof e=="object"&&"level"in e&&"color"in e&&Object.keys(St).includes(e.level)&&typeof e.color=="boolean",he=e=>!isNaN(e.getTime()),Y=e=>e instanceof Error?e:new Error(typeof e=="symbol"?e.toString():`${e}`),v=e=>e instanceof O.ZodError?e.issues.map(({path:t,message:r})=>(t.length?[t.join("/")]:[]).concat(r).join(": ")).join("; "):e instanceof _?`output${e.originalError.issues[0]?.path.length>0?"/":": "}${e.message}`:e.message,xe=e=>e instanceof Er?e.statusCode:e instanceof L?400:500,_e=({logger:e,request:t,input:r,error:o,statusCode:n})=>{n===500&&e.error(`Internal server error
2
2
  ${o.stack}
3
- `,{url:t.url,payload:r})},j=({schema:e,variant:t="original",validate:r=t==="parsed"})=>{let o=Ot(e,"examples")||[];if(!r&&t==="original")return o;let n=[];for(let s of o){let a=e.safeParse(s);a.success&&n.push(t==="parsed"?a.data:s)}return n},se=(e,t)=>{if(e.length===0)return{type:"single",value:t};if(t.length===0)return{type:"single",value:e};let r=[];for(let o of e)for(let n of t)r.push([o,n]);return{type:"tuple",value:r}};function _e(e){let t=e.match(He);return t?t.map(r=>r.slice(1)):[]}var ae=e=>e.reduce((t,r)=>t||r,!1);function z(e){return e instanceof O.ZodEffects&&e._def.effect.type!=="refinement"?!0:e instanceof O.ZodUnion?ae(e.options.map(z)):e instanceof O.ZodIntersection?ae([e._def.left,e._def.right].map(z)):!1}function E(e){return e instanceof B?!0:e instanceof O.ZodObject?ae(Object.values(e.shape).map(E)):e instanceof O.ZodUnion?ae(e.options.map(E)):e instanceof O.ZodIntersection?ae([e._def.left,e._def.right].map(E)):e instanceof O.ZodOptional||e instanceof O.ZodNullable?E(e.unwrap()):e instanceof O.ZodEffects||e instanceof O.ZodTransformer?E(e._def.schema):e instanceof O.ZodRecord?E(e._def.valueType):e instanceof O.ZodArray?E(e._def.type):e instanceof O.ZodDefault?E(e._def.innerType):!1}var de=e=>"coerce"in e._def&&typeof e._def.coerce=="boolean"?e._def.coerce:!1,N=(e,t,r)=>[t].concat(e.split("/")).concat(r||[]).flatMap(o=>o.split(/[^A-Z0-9]/gi)).map(o=>o.slice(0,1).toUpperCase()+o.slice(1).toLowerCase()).join(""),Se=e=>Er("sha1").update(JSON.stringify(e),"utf8").digest("hex"),Oe=({effect:e,sample:t})=>{try{return typeof e.transform(t,{addIssue:()=>{},path:[]})}catch{return}},Ge=e=>typeof e=="string"?{message:e}:e||{};var J=class extends Error{name="RoutingError"},pe=class extends J{name="DependsOnMethodError"},Z=class extends Error{name="DocumentationError";constructor({message:t,method:r,path:o,isResponse:n}){let s=`${t}
4
- Caused by ${n?"response":"input"} schema of an Endpoint assigned to ${r.toUpperCase()} method of ${o} path.`;super(s)}},k=class extends Error{name="IOSchemaError"},_=class extends k{name="OutputValidationError";originalError;constructor(t){super(v(t)),this.originalError=t}},L=class extends k{name="InputValidationError";originalError;constructor(t){super(v(t)),this.originalError=t}},Q=class extends Error{name="ResultHandlerError";originalError;constructor(t,r){super(t),this.originalError=r||void 0}};var w=e=>typeof e=="object"&&e!==null,be=e=>({and:e.reduce((t,r)=>t.concat(w(r)&&"and"in r?r.and:r),[])}),Re=(e,t)=>{if(w(e)){if("and"in e)return{and:e.and.map(r=>w(r)&&"or"in r?{or:r.or.map(t)}:t(r))};if("or"in e)return{or:e.or.map(r=>w(r)&&"and"in r?{and:r.and.map(t)}:t(r))}}return t(e)},qe=e=>e.and.reduce((t,r)=>{let o=se(t.or,w(r)&&"or"in r?r.or:[r]);return o.type==="single"?t.or.push(...o.value):t.or=o.value.map(be),t},{or:[]}),W=(e,t)=>{if(w(e)){if("and"in e){if(w(t)){if("and"in t)return be([e,t]);if("or"in t)return W(qe(e),t)}return be([e,t])}if("or"in e){if(w(t)){if("and"in t)return W(t,e);if("or"in t){let r=se(e.or,t.or);return{or:r.type==="single"?r.value:r.value.map(be)}}}return W(e,{and:[t]})}}return w(t)&&("and"in t||"or"in t)?W(t,e):{and:[e,t]}};import{z as A}from"zod";var X={positive:200,negative:400},Ve=e=>e,ee=Ve({getPositiveResponse:e=>{let t=j({schema:e}),r=D(A.object({status:A.literal("success"),data:e}));return t.reduce((o,n)=>o.example({status:"success",data:n}),r)},getNegativeResponse:()=>D(A.object({status:A.literal("error"),error:A.object({message:A.string()})})).example({status:"error",error:{message:v(new Error("Sample error message"))}}),handler:({error:e,input:t,output:r,request:o,response:n,logger:s})=>{if(!e){n.status(X.positive).json({status:"success",data:r});return}let a=Te(e);$e({logger:s,statusCode:a,request:o,error:e,input:t}),n.status(a).json({status:"error",error:{message:v(e)}})}}),Be=Ve({getPositiveResponse:e=>{let t=j({schema:e}),r=D("shape"in e&&"items"in e.shape&&e.shape.items instanceof A.ZodArray?e.shape.items:A.array(A.any()));return t.reduce((o,n)=>typeof n=="object"&&n!==null&&"items"in n&&Array.isArray(n.items)?o.example(n.items):o,r)},getNegativeResponse:()=>D(A.string()).example(v(new Error("Sample error message"))),handler:({response:e,output:t,error:r,logger:o,request:n,input:s})=>{if(r){let a=Te(r);$e({logger:o,statusCode:a,request:n,error:r,input:s}),e.status(a).send(r.message);return}"items"in t&&Array.isArray(t.items)?e.status(200).json(t.items):e.status(500).send("Property 'items' is missing in the endpoint output")}}),Pe=({error:e,logger:t,response:r})=>{t.error(`Result handler failure: ${e.message}.`),r.status(500).end(`An error occurred while serving the result: ${e.message}.`+(e.originalError?`
5
- Original error: ${e.originalError.message}.`:""))};var Rt=(e,t=[$])=>{if(e instanceof H.ZodType)return t;let{mimeTypes:r,mimeType:o}=e;return o?[o]:r||t},te=class{},Ze=class extends te{#e;#t=[];#i=[];#o=[];#a;#d;#p;#c;#r;#n=[];#s=[];constructor({middlewares:t,inputSchema:r,outputSchema:o,handler:n,resultHandler:s,description:a,shortDescription:p,...d}){super(),[{name:"input schema",schema:r},{name:"output schema",schema:o}].forEach(({name:l,schema:g})=>{if(z(g))throw new k(`Using transformations on the top level of endpoint ${l} is not allowed.`)}),this.#o=t;let c={positive:s.getPositiveResponse(o),negative:s.getNegativeResponse()};this.#a={input:E(r)?[ie]:[$],positive:Rt(c.positive),negative:Rt(c.negative)},this.#r={input:r,output:o,positive:c.positive instanceof H.ZodType?c.positive:c.positive.schema,negative:c.negative instanceof H.ZodType?c.negative:c.negative.schema},this.#d={positive:c.positive instanceof H.ZodType?X.positive:c.positive.statusCode||X.positive,negative:c.negative instanceof H.ZodType?X.negative:c.negative.statusCode||X.negative},this.#p=n,this.#c=s,this.#e={long:a,short:p},"scopes"in d&&d.scopes&&this.#n.push(...d.scopes),"scope"in d&&d.scope&&this.#n.push(d.scope),"tags"in d&&d.tags&&this.#s.push(...d.tags),"tag"in d&&d.tag&&this.#s.push(d.tag),"methods"in d?this.#t=d.methods:this.#t=[d.method]}_setSiblingMethods(t){this.#i=t}getDescription(t){return this.#e[t]}getMethods(){return this.#t}getSchema(t){return this.#r[t]}getMimeTypes(t){return this.#a[t]}getStatusCode(t){return this.#d[t]}getSecurity(){return this.#o.reduce((t,r)=>r.security?W(t,r.security):t,{and:[]})}getScopes(){return this.#n}getTags(){return this.#s}#l(){return{"Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":this.#t.concat(this.#i).concat("options").join(", ").toUpperCase(),"Access-Control-Allow-Headers":"content-type"}}async#m(t){try{return await this.#r.output.parseAsync(t)}catch(r){throw r instanceof H.ZodError?new _(r):r}}async#u({method:t,input:r,request:o,response:n,logger:s}){let a={},p=!1;for(let d of this.#o){if(t==="options"&&d.type==="proprietary")continue;let c;try{c=await d.input.parseAsync(r)}catch(l){throw l instanceof H.ZodError?new L(l):l}if(Object.assign(a,await d.middleware({input:c,options:a,request:o,response:n,logger:s})),p="writableEnded"in n&&n.writableEnded,p){s.warn(`The middleware ${d.middleware.name} has closed the stream. Accumulated options:`,a);break}}return{options:a,isStreamClosed:p}}async#f({input:t,options:r,logger:o}){let n;try{n=await this.#r.input.parseAsync(t)}catch(s){throw s instanceof H.ZodError?new L(s):s}return this.#p({input:n,options:r,logger:o})}async#y({error:t,request:r,response:o,logger:n,input:s,output:a}){try{await this.#c.handler({error:t,output:a,request:r,response:o,logger:n,input:s})}catch(p){Pe({logger:n,response:o,error:new Q(Y(p).message,t)})}}async execute({request:t,response:r,logger:o,config:n}){let s=Ue(t),a,p=null;if(n.cors){let c=this.#l();typeof n.cors=="function"&&(c=await n.cors({request:t,logger:o,endpoint:this,defaultHeaders:c}));for(let l in c)r.set(l,c[l])}let d=bt(t,n.inputSources);try{let{options:c,isStreamClosed:l}=await this.#u({method:s,input:d,request:t,response:r,logger:o});if(l)return;if(s==="options"){r.status(200).end();return}a=await this.#m(await this.#f({input:d,options:c,logger:o}))}catch(c){p=Y(c)}await this.#y({input:d,output:a,request:t,response:r,error:p,logger:o})}};var Pt=["get","post","put","delete","patch"];import{z as Et}from"zod";var Zt=(e,t)=>{let r=e.map(({input:n})=>n).concat(t),o=r.reduce((n,s)=>n.and(s));return r.reduce((n,s)=>ge(s,n),o)};var Ye=e=>{if(z(e.input))throw new k("Using transformations on the top level of middleware input schema is not allowed.");return{...e,type:"proprietary"}};var ce=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),this.resultHandler)}use=this.addExpressMiddleware;addExpressMiddleware(t,r){let o=r?.transformer||(a=>a),n=r?.provider||(()=>({})),s={type:"express",input:Et.object({}),middleware:async({request:a,response:p})=>new Promise((d,c)=>{t(a,p,g=>{if(g&&g instanceof Error)return c(o(g));d(n(a,p))})})};return e.#e(this.middlewares.concat(s),this.resultHandler)}addOptions(t){return e.#e(this.middlewares.concat(Ye({input:Et.object({}),middleware:async()=>t})),this.resultHandler)}build({input:t,handler:r,output:o,...n}){let{middlewares:s,resultHandler:a}=this;return new Ze({handler:r,middlewares:s,outputSchema:o,resultHandler:a,inputSchema:Zt(s,t),...n})}},Nr=new ce(ee),wr=new ce(Be);import{inspect as Mr}from"util";import{LEVEL as Dr,MESSAGE as zr,SPLAT as vr}from"triple-beam";import Ee from"winston";var{combine:jr,colorize:Lr,timestamp:kr,printf:Hr}=Ee.format;function Ae(e){let t=s=>{let{[Dr]:a,[zr]:p,[vr]:d,...c}=s;return Mr(c,!1,1,e.color)},r=s=>Hr(({timestamp:a,message:p,level:d,durationMs:c,...l})=>(typeof p=="object"&&(l={...l,...p},p="[No message]"),`${a} ${d}: ${p}`+(c===void 0?"":` duration: ${c}ms`)+(Object.keys(l).length===0?"":" "+(s?t(l):JSON.stringify(l))))),o=[kr()],n={handleExceptions:!0};switch(e.color&&o.push(Lr()),e.level){case"debug":n.level="debug",o.push(r(!0));break;case"silent":case"warn":default:n.level="warn",o.push(r())}return n.format=jr(...o),Ee.createLogger({silent:e.level==="silent",levels:Ee.config.npm.levels,transports:[new Ee.transports.Console(n)],exitOnError:!1})}var le=class{constructor(t){this.methods=t;Object.keys(t).forEach(r=>{if(r in t&&!(t[r]?.getMethods()||[]).includes(r))throw new pe(`The endpoint assigned to the '${r}' parameter must have at least this method in its specification.
3
+ `,{url:t.url,payload:r})},j=({schema:e,variant:t="original",validate:r=t==="parsed"})=>{let o=bt(e,"examples")||[];if(!r&&t==="original")return o;let n=[];for(let s of o){let a=e.safeParse(s);a.success&&n.push(t==="parsed"?a.data:s)}return n},oe=(e,t)=>{if(e.length===0)return{type:"single",value:t};if(t.length===0)return{type:"single",value:e};let r=[];for(let o of e)for(let n of t)r.push([o,n]);return{type:"tuple",value:r}},Ge=e=>{let t=e.match(Ue);return t?t.map(r=>r.slice(1)):[]},se=e=>e.reduce((t,r)=>t||r,!1),z=e=>e instanceof O.ZodEffects&&e._def.effect.type!=="refinement"?!0:e instanceof O.ZodUnion?se(e.options.map(z)):e instanceof O.ZodIntersection?se([e._def.left,e._def.right].map(z)):!1,E=e=>e instanceof B?!0:e instanceof O.ZodObject?se(Object.values(e.shape).map(E)):e instanceof O.ZodUnion?se(e.options.map(E)):e instanceof O.ZodIntersection?se([e._def.left,e._def.right].map(E)):e instanceof O.ZodOptional||e instanceof O.ZodNullable?E(e.unwrap()):e instanceof O.ZodEffects||e instanceof O.ZodTransformer?E(e._def.schema):e instanceof O.ZodRecord?E(e._def.valueType):e instanceof O.ZodArray?E(e._def.type):e instanceof O.ZodDefault?E(e._def.innerType):!1,ie=e=>"coerce"in e._def&&typeof e._def.coerce=="boolean"?e._def.coerce:!1,N=(e,t,r)=>[t].concat(e.split("/")).concat(r||[]).flatMap(o=>o.split(/[^A-Z0-9]/gi)).map(o=>o.slice(0,1).toUpperCase()+o.slice(1).toLowerCase()).join(""),Te=e=>Ar("sha1").update(JSON.stringify(e),"utf8").digest("hex"),Se=({effect:e,sample:t})=>{try{return typeof e.transform(t,{addIssue:()=>{},path:[]})}catch{return}},qe=e=>typeof e=="string"?{message:e}:e||{};var J=class extends Error{name="RoutingError"},ae=class extends J{name="DependsOnMethodError"},R=class extends Error{name="DocumentationError";constructor({message:t,method:r,path:o,isResponse:n}){let s=`${t}
4
+ Caused by ${n?"response":"input"} schema of an Endpoint assigned to ${r.toUpperCase()} method of ${o} path.`;super(s)}},k=class extends Error{name="IOSchemaError"},_=class extends k{name="OutputValidationError";originalError;constructor(t){super(v(t)),this.originalError=t}},L=class extends k{name="InputValidationError";originalError;constructor(t){super(v(t)),this.originalError=t}},Q=class extends Error{name="ResultHandlerError";originalError;constructor(t,r){super(t),this.originalError=r||void 0}};var w=e=>typeof e=="object"&&e!==null,Oe=e=>({and:e.reduce((t,r)=>t.concat(w(r)&&"and"in r?r.and:r),[])}),be=(e,t)=>{if(w(e)){if("and"in e)return{and:e.and.map(r=>w(r)&&"or"in r?{or:r.or.map(t)}:t(r))};if("or"in e)return{or:e.or.map(r=>w(r)&&"and"in r?{and:r.and.map(t)}:t(r))}}return t(e)},Ve=e=>e.and.reduce((t,r)=>{let o=oe(t.or,w(r)&&"or"in r?r.or:[r]);return o.type==="single"?t.or.push(...o.value):t.or=o.value.map(Oe),t},{or:[]}),W=(e,t)=>{if(w(e)){if("and"in e){if(w(t)){if("and"in t)return Oe([e,t]);if("or"in t)return W(Ve(e),t)}return Oe([e,t])}if("or"in e){if(w(t)){if("and"in t)return W(t,e);if("or"in t){let r=oe(e.or,t.or);return{or:r.type==="single"?r.value:r.value.map(Oe)}}}return W(e,{and:[t]})}}return w(t)&&("and"in t||"or"in t)?W(t,e):{and:[e,t]}};import{z as A}from"zod";var X={positive:200,negative:400},Be=e=>e,ee=Be({getPositiveResponse:e=>{let t=j({schema:e}),r=D(A.object({status:A.literal("success"),data:e}));return t.reduce((o,n)=>o.example({status:"success",data:n}),r)},getNegativeResponse:()=>D(A.object({status:A.literal("error"),error:A.object({message:A.string()})})).example({status:"error",error:{message:v(new Error("Sample error message"))}}),handler:({error:e,input:t,output:r,request:o,response:n,logger:s})=>{if(!e){n.status(X.positive).json({status:"success",data:r});return}let a=xe(e);_e({logger:s,statusCode:a,request:o,error:e,input:t}),n.status(a).json({status:"error",error:{message:v(e)}})}}),Ye=Be({getPositiveResponse:e=>{let t=j({schema:e}),r=D("shape"in e&&"items"in e.shape&&e.shape.items instanceof A.ZodArray?e.shape.items:A.array(A.any()));return t.reduce((o,n)=>typeof n=="object"&&n!==null&&"items"in n&&Array.isArray(n.items)?o.example(n.items):o,r)},getNegativeResponse:()=>D(A.string()).example(v(new Error("Sample error message"))),handler:({response:e,output:t,error:r,logger:o,request:n,input:s})=>{if(r){let a=xe(r);_e({logger:o,statusCode:a,request:n,error:r,input:s}),e.status(a).send(r.message);return}"items"in t&&Array.isArray(t.items)?e.status(200).json(t.items):e.status(500).send("Property 'items' is missing in the endpoint output")}}),Re=({error:e,logger:t,response:r})=>{t.error(`Result handler failure: ${e.message}.`),r.status(500).end(`An error occurred while serving the result: ${e.message}.`+(e.originalError?`
5
+ Original error: ${e.originalError.message}.`:""))};var Pt=(e,t=[$])=>{if(e instanceof H.ZodType)return t;let{mimeTypes:r,mimeType:o}=e;return o?[o]:r||t},te=class{},Pe=class extends te{#e;#t=[];#i=[];#o=[];#a;#d;#p;#c;#r;#n=[];#s=[];#l;constructor({middlewares:t,inputSchema:r,outputSchema:o,handler:n,resultHandler:s,description:a,shortDescription:p,...d}){super(),[{name:"input schema",schema:r},{name:"output schema",schema:o}].forEach(({name:l,schema:g})=>{if(z(g))throw new k(`Using transformations on the top level of endpoint ${l} is not allowed.`)}),this.#o=t,this.#l=d.operationId;let c={positive:s.getPositiveResponse(o),negative:s.getNegativeResponse()};this.#a={input:E(r)?[ne]:[$],positive:Pt(c.positive),negative:Pt(c.negative)},this.#r={input:r,output:o,positive:c.positive instanceof H.ZodType?c.positive:c.positive.schema,negative:c.negative instanceof H.ZodType?c.negative:c.negative.schema},this.#d={positive:c.positive instanceof H.ZodType?X.positive:c.positive.statusCode||X.positive,negative:c.negative instanceof H.ZodType?X.negative:c.negative.statusCode||X.negative},this.#p=n,this.#c=s,this.#e={long:a,short:p},"scopes"in d&&d.scopes&&this.#n.push(...d.scopes),"scope"in d&&d.scope&&this.#n.push(d.scope),"tags"in d&&d.tags&&this.#s.push(...d.tags),"tag"in d&&d.tag&&this.#s.push(d.tag),"methods"in d?this.#t=d.methods:this.#t=[d.method]}_setSiblingMethods(t){this.#i=t}getDescription(t){return this.#e[t]}getMethods(){return this.#t}getSchema(t){return this.#r[t]}getMimeTypes(t){return this.#a[t]}getStatusCode(t){return this.#d[t]}getSecurity(){return this.#o.reduce((t,r)=>r.security?W(t,r.security):t,{and:[]})}getScopes(){return this.#n}getTags(){return this.#s}getOperationId(){return this.#l}#m(){return{"Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":this.#t.concat(this.#i).concat("options").join(", ").toUpperCase(),"Access-Control-Allow-Headers":"content-type"}}async#u(t){try{return await this.#r.output.parseAsync(t)}catch(r){throw r instanceof H.ZodError?new _(r):r}}async#f({method:t,input:r,request:o,response:n,logger:s}){let a={},p=!1;for(let d of this.#o){if(t==="options"&&d.type==="proprietary")continue;let c;try{c=await d.input.parseAsync(r)}catch(l){throw l instanceof H.ZodError?new L(l):l}if(Object.assign(a,await d.middleware({input:c,options:a,request:o,response:n,logger:s})),p="writableEnded"in n&&n.writableEnded,p){s.warn(`The middleware ${d.middleware.name} has closed the stream. Accumulated options:`,a);break}}return{options:a,isStreamClosed:p}}async#y({input:t,options:r,logger:o}){let n;try{n=await this.#r.input.parseAsync(t)}catch(s){throw s instanceof H.ZodError?new L(s):s}return this.#p({input:n,options:r,logger:o})}async#g({error:t,request:r,response:o,logger:n,input:s,output:a}){try{await this.#c.handler({error:t,output:a,request:r,response:o,logger:n,input:s})}catch(p){Re({logger:n,response:o,error:new Q(Y(p).message,t)})}}async execute({request:t,response:r,logger:o,config:n}){let s=Ke(t),a,p=null;if(n.cors){let c=this.#m();typeof n.cors=="function"&&(c=await n.cors({request:t,logger:o,endpoint:this,defaultHeaders:c}));for(let l in c)r.set(l,c[l])}let d=Rt(t,n.inputSources);try{let{options:c,isStreamClosed:l}=await this.#f({method:s,input:d,request:t,response:r,logger:o});if(l)return;if(s==="options"){r.status(200).end();return}a=await this.#u(await this.#y({input:d,options:c,logger:o}))}catch(c){p=Y(c)}await this.#g({input:d,output:a,request:t,response:r,error:p,logger:o})}};var Zt=["get","post","put","delete","patch"];import{z as At}from"zod";var Et=(e,t)=>{let r=e.map(({input:n})=>n).concat(t),o=r.reduce((n,s)=>n.and(s));return r.reduce((n,s)=>ye(s,n),o)};var Je=e=>{if(z(e.input))throw new k("Using transformations on the top level of middleware input schema is not allowed.");return{...e,type:"proprietary"}};var de=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),this.resultHandler)}use=this.addExpressMiddleware;addExpressMiddleware(t,r){let o=r?.transformer||(a=>a),n=r?.provider||(()=>({})),s={type:"express",input:At.object({}),middleware:async({request:a,response:p})=>new Promise((d,c)=>{t(a,p,g=>{if(g&&g instanceof Error)return c(o(g));d(n(a,p))})})};return e.#e(this.middlewares.concat(s),this.resultHandler)}addOptions(t){return e.#e(this.middlewares.concat(Je({input:At.object({}),middleware:async()=>t})),this.resultHandler)}build({input:t,handler:r,output:o,...n}){let{middlewares:s,resultHandler:a}=this;return new Pe({handler:r,middlewares:s,outputSchema:o,resultHandler:a,inputSchema:Et(s,t),...n})}},wr=new de(ee),Mr=new de(Ye);import{inspect as Dr}from"util";import{LEVEL as zr,MESSAGE as vr,SPLAT as jr}from"triple-beam";import Ze from"winston";var{combine:Lr,colorize:kr,timestamp:Hr,printf:Ur}=Ze.format,Ee=e=>{let t=s=>{let{[zr]:a,[vr]:p,[jr]:d,...c}=s;return Dr(c,!1,1,e.color)},r=s=>Ur(({timestamp:a,message:p,level:d,durationMs:c,...l})=>(typeof p=="object"&&(l={...l,...p},p="[No message]"),`${a} ${d}: ${p}`+(c===void 0?"":` duration: ${c}ms`)+(Object.keys(l).length===0?"":" "+(s?t(l):JSON.stringify(l))))),o=[Hr()],n={handleExceptions:!0};switch(e.color&&o.push(kr()),e.level){case"debug":n.level="debug",o.push(r(!0));break;case"silent":case"warn":default:n.level="warn",o.push(r())}return n.format=Lr(...o),Ze.createLogger({silent:e.level==="silent",levels:Ze.config.npm.levels,transports:[new Ze.transports.Console(n)],exitOnError:!1})};var pe=class{constructor(t){this.methods=t;Object.keys(t).forEach(r=>{if(r in t&&!(t[r]?.getMethods()||[]).includes(r))throw new ae(`The endpoint assigned to the '${r}' parameter must have at least this method in its specification.
6
6
  This error should prevent mistakes during the development process.
7
7
  Example:
8
8
 
@@ -13,8 +13,8 @@ new ${this.constructor.name}({
13
13
  ...
14
14
  })
15
15
  });
16
- `)})}};import Ur from"express";var me=class{params;constructor(...t){this.params=t}apply(t,r){return r(t,Ur.static(...this.params))}};var G=({routing:e,onEndpoint:t,onStatic:r,parentPath:o,hasCors:n})=>{Object.entries(e).forEach(([s,a])=>{if(s=s.trim(),s.match(/\//))throw new J(`Routing elements should not contain '/' character.
17
- The error caused by ${o?`'${o}' route that has a '${s}'`:`'${s}'`} entry.`);let p=`${o||""}${s?`/${s}`:""}`;if(a instanceof te){let d=a.getMethods().slice();n&&d.push("options"),d.forEach(c=>{t(a,p,c)})}else if(a instanceof me)r&&a.apply(p,r);else if(a instanceof le){if(Object.entries(a.methods).forEach(([d,c])=>{t(c,p,d)}),n&&Object.keys(a.methods).length>0){let[d,...c]=Object.keys(a.methods),l=a.methods[d];l._setSiblingMethods(c),t(l,p,"options")}}else G({onEndpoint:t,onStatic:r,hasCors:n,routing:a,parentPath:p})})};var At=()=>`
16
+ `)})}};import Kr from"express";var ce=class{params;constructor(...t){this.params=t}apply(t,r){return r(t,Kr.static(...this.params))}};var G=({routing:e,onEndpoint:t,onStatic:r,parentPath:o,hasCors:n})=>{Object.entries(e).forEach(([s,a])=>{if(s=s.trim(),s.match(/\//))throw new J(`Routing elements should not contain '/' character.
17
+ The error caused by ${o?`'${o}' route that has a '${s}'`:`'${s}'`} entry.`);let p=`${o||""}${s?`/${s}`:""}`;if(a instanceof te){let d=a.getMethods().slice();n&&d.push("options"),d.forEach(c=>{t(a,p,c)})}else if(a instanceof ce)r&&a.apply(p,r);else if(a instanceof pe){if(Object.entries(a.methods).forEach(([d,c])=>{t(c,p,d)}),n&&Object.keys(a.methods).length>0){let[d,...c]=Object.keys(a.methods),l=a.methods[d];l._setSiblingMethods(c),t(l,p,"options")}}else G({onEndpoint:t,onStatic:r,hasCors:n,routing:a,parentPath:p})})};var It=()=>`
18
18
  \x1B[94m\x1B[39m
19
19
  \x1B[94m\x1B[39m
20
20
  \x1B[94m8888888888 8888888888P 888 d8888 8888888b. 8888888 \x1B[39m
@@ -31,7 +31,7 @@ The error caused by ${o?`'${o}' route that has a '${s}'`:`'${s}'`} entry.`);let
31
31
  \x1B[90m\x1B[3m Thank you for choosing Express Zod API for your project.\x1B[23m\x1B[39m\x1B[0m\x1B[0m
32
32
  \x1B[0m\x1B[0m
33
33
  \x1B[0m\x1B[0m
34
- `.trim();var Je=({app:e,logger:t,config:r,routing:o})=>{r.startupLogo!==!1&&console.log(At()),G({routing:o,hasCors:!!r.cors,onEndpoint:(n,s,a)=>{e[a](s,async(p,d)=>{t.info(`${p.method}: ${s}`),await n.execute({request:p,response:d,logger:t,config:r})})},onStatic:(n,s)=>{e.use(n,s)}})};import Kr,{json as Fr}from"express";import $r from"compression";import _r from"express-fileupload";import Gr from"https";import It from"http-errors";var qr=(e,t)=>(r,o,n,s)=>{if(!r)return s();e.handler({error:It(400,Y(r).message),request:o,response:n,logger:t,input:o.body,output:null})},Ct=(e,t)=>(r,o)=>{let n=It(404,`Can not ${r.method} ${r.path}`);try{e.handler({request:r,response:o,logger:t,error:n,input:null,output:null})}catch(s){Pe({response:o,logger:t,error:new Q(Y(s).message,n)})}};function Vr(e,t){let r=Fe(e.logger)?Ae(e.logger):e.logger;Je({app:e.app,routing:t,logger:r,config:e});let o=e.errorHandler||ee;return{notFoundHandler:Ct(o,r),logger:r}}function Br(e,t){let r=Fe(e.logger)?Ae(e.logger):e.logger,o=Kr();o.disable("x-powered-by");let n=e.errorHandler||ee,s=e.server.compression?$r({...typeof e.server.compression=="object"?e.server.compression:{}}):void 0,a=e.server.jsonParser||Fr(),p=e.server.upload?_r({...typeof e.server.upload=="object"?e.server.upload:{},abortOnLimit:!1,parseNested:!0}):void 0,d=[].concat(s||[]).concat(a).concat(p||[]);o.use(d),o.use(qr(n,r)),Je({app:o,routing:t,logger:r,config:e}),o.use(Ct(n,r));let c=o.listen(e.server.listen,()=>{r.info(`Listening ${e.server.listen}`)}),l;return e.https&&(l=Gr.createServer(e.https.options,o).listen(e.https.listen,()=>{r.info(`Listening ${e.https.listen}`)})),{app:o,httpServer:c,httpsServer:l,logger:r}}import{OpenApiBuilder as jo}from"openapi3-ts/oas30";import{isReferenceObject as zt,isSchemaObject as ye}from"openapi3-ts/oas30";import{omit as fe}from"ramda";import{z as x}from"zod";import{INVALID as Nt,ZodIssueCode as Qe,ZodParsedType as wt,ZodType as Yr,addIssueToContext as We}from"zod";var Xe=/^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(\.\d+)?)?Z?$/,Jr="ZodDateIn",Ie=class e extends Yr{_parse(t){let{status:r,ctx:o}=this._processInputParams(t);if(o.parsedType!==wt.string)return We(o,{code:Qe.invalid_type,expected:wt.string,received:o.parsedType}),Nt;Xe.test(o.data)||(We(o,{code:Qe.invalid_string,validation:"regex"}),r.dirty());let n=new Date(o.data);return xe(n)?{status:r.value,value:n}:(We(o,{code:Qe.invalid_date}),Nt)}static create=()=>new e({typeName:Jr})};var q=({schema:e,onEach:t,rules:r,onMissing:o,...n})=>{let s="typeName"in e._def?r[e._def.typeName]:void 0,p=s?s({schema:e,...n,next:c=>q({...c,...n,onEach:t,rules:r,onMissing:o})}):o({schema:e,...n}),d=t&&t({schema:e,prev:p,...n});return d?{...p,...d}:p};var Mt=50,vt="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString",Qr={integer:0,number:0,string:"",boolean:!1,object:{},null:null,array:[]},jt=e=>e.replace(He,t=>`{${t.slice(1)}}`),Wr=({schema:{_def:{innerType:e,defaultValue:t}},next:r})=>({...r({schema:e}),default:t()}),Xr=({schema:{_def:{innerType:e}},next:t})=>t({schema:e}),eo=()=>({format:"any"}),to=e=>{if(e.isResponse)throw new Z({message:"Please use z.upload() only for input.",...e});return{type:"string",format:"binary"}},ro=({schema:{isBinary:e,isBase64:t},...r})=>{if(!r.isResponse)throw new Z({message:"Please use z.file() only within ResultHandler.",...r});return{type:"string",format:e?"binary":t?"byte":"file"}},oo=({schema:{options:e},next:t})=>({oneOf:e.map(r=>t({schema:r}))}),no=({schema:{options:e,discriminator:t},next:r})=>({discriminator:{propertyName:t},oneOf:Array.from(e.values()).map(o=>r({schema:o}))}),so=({schema:{_def:{left:e,right:t}},next:r})=>({allOf:[e,t].map(o=>r({schema:o}))}),io=({schema:e,next:t})=>t({schema:e.unwrap()}),ao=({schema:e,next:t})=>t({schema:e._def.innerType}),po=({schema:e,next:t})=>({nullable:!0,...t({schema:e.unwrap()})}),Dt=({schema:e})=>({type:typeof Object.values(e.enum)[0],enum:Object.values(e.enum)}),co=({schema:{value:e}})=>({type:typeof e,enum:[e]}),lo=({schema:e,isResponse:t,...r})=>{let o=Object.keys(e.shape).filter(n=>{let s=e.shape[n];return!(t&&de(s)?s instanceof x.ZodOptional:s.isOptional())});return{type:"object",properties:Ce({schema:e,isResponse:t,...r}),...o.length?{required:o}:{}}},mo=()=>({type:"string",nullable:!0,format:"null"}),uo=e=>{if(e.isResponse)throw new Z({message:"Please use z.dateOut() for output.",...e});return{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",pattern:Xe.source,externalDocs:{url:vt}}},fo=e=>{if(!e.isResponse)throw new Z({message:"Please use z.dateIn() for input.",...e});return{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",externalDocs:{url:vt}}},yo=e=>{throw new Z({message:`Using z.date() within ${e.isResponse?"output":"input"} schema is forbidden. Please use z.date${e.isResponse?"Out":"In"}() instead. Check out the documentation for details.`,...e})},go=()=>({type:"boolean"}),ho=()=>({type:"integer",format:"bigint"}),xo=({schema:{keySchema:e,valueSchema:t},...r})=>{if(e instanceof x.ZodEnum||e instanceof x.ZodNativeEnum){let o=Object.values(e.enum),n=o.reduce((s,a)=>({...s,[a]:t}),{});return{type:"object",properties:Ce({schema:x.object(n),...r}),...o.length?{required:o}:{}}}if(e instanceof x.ZodLiteral)return{type:"object",properties:Ce({schema:x.object({[e.value]:t}),...r}),required:[e.value]};if(e instanceof x.ZodUnion&&e.options.reduce((n,s)=>n&&s instanceof x.ZodLiteral,!0)){let n=e.options.reduce((s,a)=>({...s,[a.value]:t}),{});return{type:"object",properties:Ce({schema:x.object(n),...r}),required:e.options.map(s=>s.value)}}return{type:"object",additionalProperties:r.next({schema:t})}},To=({schema:{_def:e,element:t},next:r})=>({type:"array",items:r({schema:t}),...e.minLength!==null&&{minItems:e.minLength.value},...e.maxLength!==null&&{maxItems:e.maxLength.value}}),So=({schema:{items:e},next:t})=>{let r=e.map(o=>t({schema:o}));return{type:"array",minItems:r.length,maxItems:r.length,items:{oneOf:r,format:"tuple",...r.length>0&&{description:r.map((o,n)=>`${n}: ${ye(o)?o.type:o.$ref}`).join(", ")}}}},Oo=({schema:{isEmail:e,isURL:t,minLength:r,maxLength:o,isUUID:n,isCUID:s,isCUID2:a,isULID:p,isIP:d,isEmoji:c,isDatetime:l,_def:{checks:g}}})=>{let y=g.find(h=>h.kind==="regex"),T=g.find(h=>h.kind==="datetime"),R=y?y.regex:T?T.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;return{type:"string",...l&&{format:"date-time"},...e&&{format:"email"},...t&&{format:"url"},...n&&{format:"uuid"},...s&&{format:"cuid"},...a&&{format:"cuid2"},...p&&{format:"ulid"},...d&&{format:"ip"},...c&&{format:"emoji"},...r!==null&&{minLength:r},...o!==null&&{maxLength:o},...R&&{pattern:`/${R.source}/${R.flags}`}}},bo=({schema:e})=>{let t=e._def.checks.find(({kind:s})=>s==="min"),r=t?t.inclusive:!0,o=e._def.checks.find(({kind:s})=>s==="max"),n=o?o.inclusive:!0;return{type:e.isInt?"integer":"number",format:e.isInt?"int64":"double",minimum:e.minValue===null?e.isInt?Number.MIN_SAFE_INTEGER:Number.MIN_VALUE:e.minValue,exclusiveMinimum:!r,maximum:e.maxValue===null?e.isInt?Number.MAX_SAFE_INTEGER:Number.MAX_VALUE:e.maxValue,exclusiveMaximum:!n}},Ce=({schema:{shape:e},next:t})=>Object.keys(e).reduce((r,o)=>({...r,[o]:t({schema:e[o]})}),{}),Ro=e=>{let t=Array.isArray(e.type)?e.type[0]:e.type;return Qr?.[t]},Po=({schema:e,isResponse:t,next:r})=>{let o=r({schema:e.innerType()}),{effect:n}=e._def;if(t&&n.type==="transform"&&ye(o)){let s=Oe({effect:n,sample:Ro(o)});return s&&["number","string","boolean"].includes(s)?{type:s}:r({schema:x.any()})}if(!t&&n.type==="preprocess"&&ye(o)){let{type:s,...a}=o;return{...a,format:`${a.format||s} (preprocessed)`}}return o},Zo=({schema:e,isResponse:t,next:r})=>r({schema:e._def[t?"out":"in"]}),Eo=({schema:e,next:t})=>t({schema:e.unwrap()}),Ao=({next:e,schema:t,serializer:r,getRef:o,makeRef:n})=>{let s=r(t.schema);return o(s)||(()=>(n(s,{}),n(s,e({schema:t.schema}))))()},Lt=(e,t,r=[])=>{let o=j({schema:e,variant:t?"parsed":"original",validate:!0});return o.length===0?{}:{examples:o.reduce((n,s,a)=>({...n,[`example${a+1}`]:{value:typeof s=="object"&&!Array.isArray(s)?fe(r,s):s}}),{})}},Io=(e,t,r)=>{let o=j({schema:e,variant:t?"parsed":"original",validate:!0});return o.length===0?{}:{examples:o.reduce((n,s,a)=>r in s?{...n,[`example${a+1}`]:{value:s[r]}}:n,{})}};function ue(e,t){if(e instanceof x.ZodObject)return e;let r;if(e instanceof x.ZodUnion||e instanceof x.ZodDiscriminatedUnion)r=Array.from(e.options.values()).map(o=>ue(o,t)).reduce((o,n)=>o.merge(n.partial()),x.object({}));else if(e instanceof x.ZodEffects){if(z(e))throw new Z({message:`Using transformations on the top level of ${t.isResponse?"response":"input"} schema is not allowed.`,...t});r=ue(e._def.schema,t)}else r=ue(e._def.left,t).merge(ue(e._def.right,t));return ge(e,r)}var kt=({path:e,method:t,endpoint:r,inputSources:o,serializer:n,getRef:s,makeRef:a,composition:p,clue:d="parameter"})=>{let c=r.getSchema("input"),l=ue(c,{path:e,method:t,isResponse:!1}).shape,g=_e(e),y=o.includes("query"),T=o.includes("params"),R=o.includes("headers"),h=m=>T&&g.includes(m),I=m=>R&&Ke(m);return Object.keys(l).filter(m=>y||h(m)).map(m=>{let S=q({schema:l[m],isResponse:!1,rules:tt,onEach:rt,onMissing:ot,serializer:n,getRef:s,makeRef:a,path:e,method:t}),C=p==="components"?a(N(e,t,`${d} ${m}`),S):S;return{name:m,in:h(m)?"path":I(m)?"header":"query",required:!l[m].isOptional(),description:ye(S)&&S.description||`${t.toUpperCase()} ${e} ${d}`,schema:C,...Io(c,!1,m)}})},tt={ZodString:Oo,ZodNumber:bo,ZodBigInt:ho,ZodBoolean:go,ZodDateIn:uo,ZodDateOut:fo,ZodNull:mo,ZodArray:To,ZodTuple:So,ZodRecord:xo,ZodObject:lo,ZodLiteral:co,ZodIntersection:so,ZodUnion:oo,ZodFile:ro,ZodUpload:to,ZodAny:eo,ZodDefault:Wr,ZodEnum:Dt,ZodNativeEnum:Dt,ZodEffects:Po,ZodOptional:io,ZodNullable:po,ZodDiscriminatedUnion:no,ZodBranded:Eo,ZodDate:yo,ZodCatch:Xr,ZodPipeline:Zo,ZodLazy:Ao,ZodReadonly:ao},rt=({schema:e,isResponse:t,prev:r})=>{if(zt(r))return{};let{description:o}=e,n=e instanceof x.ZodLazy,s=r.type!==void 0,a=t&&de(e),p=!n&&s&&!a&&e.isNullable(),d=n?[]:j({schema:e,variant:t?"parsed":"original",validate:!0});return{...o&&{description:o},...p&&{nullable:!0},...d.length>0&&{example:d[0]}}},ot=({schema:e,...t})=>{throw new Z({message:`Zod type ${e.constructor.name} is unsupported.`,...t})},et=(e,t)=>{if(zt(e))return e;let r=e.properties?fe(t,e.properties):void 0,o=e.example?fe(t,e.example):void 0,n=e.required?e.required.filter(p=>!t.includes(p)):void 0,s=e.allOf?e.allOf.map(p=>et(p,t)):void 0,a=e.oneOf?e.oneOf.map(p=>et(p,t)):void 0;return fe(Object.entries({properties:r,required:n,example:o,allOf:s,oneOf:a}).filter(([{},p])=>p===void 0).map(([p])=>p),{...e,properties:r,required:n,example:o,allOf:s,oneOf:a})},Ht=e=>ye(e)?fe(["example"],e):e,nt=({method:e,path:t,endpoint:r,isPositive:o,serializer:n,getRef:s,makeRef:a,composition:p,clue:d="response"})=>{let c=r.getSchema(o?"positive":"negative"),l=r.getMimeTypes(o?"positive":"negative"),g=Ht(q({schema:c,isResponse:!0,rules:tt,onEach:rt,onMissing:ot,serializer:n,getRef:s,makeRef:a,path:t,method:e})),y=Lt(c,!0),T=p==="components"?a(N(t,e,d),g):g;return{description:`${e.toUpperCase()} ${t} ${d}`,content:l.reduce((R,h)=>({...R,[h]:{schema:T,...y}}),{})}},Co=()=>({type:"http",scheme:"basic"}),No=({format:e})=>({type:"http",scheme:"bearer",...e&&{bearerFormat:e}}),wo=({name:e})=>({type:"apiKey",in:"query",name:e}),Mo=({name:e})=>({type:"apiKey",in:"header",name:e}),Do=({name:e})=>({type:"apiKey",in:"cookie",name:e}),zo=({url:e})=>({type:"openIdConnect",openIdConnectUrl:e}),vo=({flows:e={}})=>({type:"oauth2",flows:Object.keys(e).reduce((t,r)=>{let o=e[r];if(!o)return t;let{scopes:n={},...s}=o;return{...t,[r]:{...s,scopes:n}}},{})}),Ut=e=>{let t={basic:Co,bearer:No,input:wo,header:Mo,cookie:Do,openid:zo,oauth2:vo};return Re(e,r=>t[r.type](r))},Ne=e=>{if(typeof e=="object"){if("or"in e)return e.or.map(t=>("and"in t?t.and:[t]).reduce((r,{name:o,scopes:n})=>({...r,[o]:n}),{}));if("and"in e)return Ne(qe(e))}return Ne({or:[e]})},Kt=({method:e,path:t,endpoint:r,serializer:o,getRef:n,makeRef:s,composition:a,clue:p="request body"})=>{let d=_e(t),c=Ht(et(q({schema:r.getSchema("input"),isResponse:!1,rules:tt,onEach:rt,onMissing:ot,serializer:o,getRef:n,makeRef:s,path:t,method:e}),d)),l=Lt(r.getSchema("input"),!1,d),g=a==="components"?s(N(t,e,p),c):c;return{description:`${e.toUpperCase()} ${t} ${p}`,content:r.getMimeTypes("input").reduce((y,T)=>({...y,[T]:{schema:g,...l}}),{})}},Ft=e=>Object.keys(e).map(t=>{let r=e[t];return{name:t,description:typeof r=="string"?r:r.description,...typeof r=="object"&&r.url&&{externalDocs:{url:r.url}}}}),st=e=>e.length<=Mt?e:e.slice(0,Mt-1)+"\u2026";var it=class extends jo{lastSecuritySchemaIds={};lastOperationIdSuffixes={};makeRef(t,r){return this.addSchema(t,r),this.getRef(t)}getRef(t){return t in(this.rootDoc.components?.schemas||{})?{$ref:`#/components/schemas/${t}`}:void 0}ensureUniqOperationId(t,r){let o=N(t,r);return o in this.lastOperationIdSuffixes?(this.lastOperationIdSuffixes[o]++,`${o}${this.lastOperationIdSuffixes[o]}`):(this.lastOperationIdSuffixes[o]=1,o)}ensureUniqSecuritySchemaName(t){let r=JSON.stringify(t);for(let o in this.rootDoc.components?.securitySchemes||{})if(r===JSON.stringify(this.rootDoc.components?.securitySchemes?.[o]))return o;return this.lastSecuritySchemaIds[t.type]=(this.lastSecuritySchemaIds?.[t.type]||0)+1,`${t.type.toUpperCase()}_${this.lastSecuritySchemaIds[t.type]}`}constructor({routing:t,config:r,title:o,version:n,serverUrl:s,successfulResponseDescription:a="Successful response",errorResponseDescription:p="Error response",hasSummaryFromDescription:d=!0,composition:c="inline",serializer:l=Se}){super(),this.addInfo({title:o,version:n}).addServer({url:s}),G({routing:t,onEndpoint:(y,T,R)=>{let h=R,I={path:T,method:h,endpoint:y,composition:c,serializer:l,getRef:this.getRef.bind(this),makeRef:this.makeRef.bind(this)},[m,S]=["short","long"].map(y.getDescription.bind(y)),C=r.inputSources?.[h]||he[h],re=kt({...I,inputSources:C}),P={operationId:this.ensureUniqOperationId(T,h),responses:{[y.getStatusCode("positive")]:nt({...I,clue:a,isPositive:!0}),[y.getStatusCode("negative")]:nt({...I,clue:p,isPositive:!1})}};S&&(P.description=S,d&&m===void 0&&(P.summary=st(S))),m&&(P.summary=st(m)),y.getTags().length>0&&(P.tags=y.getTags()),re.length>0&&(P.parameters=re),C.includes("body")&&(P.requestBody=Kt(I));let oe=Ne(Re(Ut(y.getSecurity()),ne=>{let xt=this.ensureUniqSecuritySchemaName(ne),pr=["oauth2","openIdConnect"].includes(ne.type)?y.getScopes():[];return this.addSecurityScheme(xt,ne),{name:xt,scopes:pr}}));oe.length>0&&(P.security=oe);let ke=jt(T);this.addPath(ke,{[h]:P})}}),this.rootDoc.tags=r.tags?Ft(r.tags):[]}};import $t from"http";var Lo=e=>({method:"GET",header:jest.fn(()=>$),...e}),ko=e=>{let t={writableEnded:!1,statusCode:200,statusMessage:$t.STATUS_CODES[200],set:jest.fn(()=>t),setHeader:jest.fn(()=>t),header:jest.fn(()=>t),status:jest.fn(r=>(t.statusCode=r,t.statusMessage=$t.STATUS_CODES[r],t)),json:jest.fn(()=>t),send:jest.fn(()=>t),end:jest.fn(()=>(t.writableEnded=!0,t)),...e};return t},Ho=async({endpoint:e,requestProps:t,responseProps:r,configProps:o,loggerProps:n,__noJest:s})=>{if(!jest||s)throw new Error("You need to install Jest in order to use testEndpoint().");let a=Lo(t),p=ko(r),d={info:jest.fn(),warn:jest.fn(),error:jest.fn(),debug:jest.fn(),...n},c={cors:!1,logger:d,...o};return await e.execute({request:a,response:p,config:c,logger:d}),{requestMock:a,responseMock:p,loggerMock:d}};import F from"typescript";import M from"typescript";var i=M.factory,V=[i.createModifier(M.SyntaxKind.ExportKeyword)],Uo=[i.createModifier(M.SyntaxKind.AsyncKeyword)],Ko=[i.createModifier(M.SyntaxKind.PublicKeyword),i.createModifier(M.SyntaxKind.ReadonlyKeyword)],_t=[i.createModifier(M.SyntaxKind.ProtectedKeyword),i.createModifier(M.SyntaxKind.ReadonlyKeyword)],Fo=i.createTemplateHead(""),$o=i.createTemplateTail(""),_o=i.createTemplateMiddle(" "),at=e=>i.createTemplateLiteralType(Fo,e.map((t,r)=>i.createTemplateLiteralTypeSpan(i.createTypeReferenceNode(t),r===e.length-1?$o:_o))),dt=at(["M","P"]),we=(e,t,r)=>i.createParameterDeclaration(r,void 0,e,void 0,t,void 0),Me=(e,t)=>Object.keys(e).reduce((r,o)=>r.concat(we(o,e[o],t)),[]),pt=(e,t)=>i.createExpressionWithTypeArguments(i.createIdentifier("Record"),[typeof e=="number"?i.createKeywordTypeNode(e):i.createTypeReferenceNode(e),i.createKeywordTypeNode(t)]),Gt=e=>i.createConstructorDeclaration(void 0,e,i.createBlock([])),ct=(e,t)=>i.createPropertySignature(void 0,`"${e}"`,void 0,i.createTypeReferenceNode(t)),lt=(e,t)=>i.createVariableDeclarationList([i.createVariableDeclaration(e,void 0,void 0,t)],M.NodeFlags.Const),mt=(e,t)=>i.createTypeAliasDeclaration(V,e,void 0,i.createUnionTypeNode(t.map(r=>i.createLiteralTypeNode(i.createStringLiteral(r))))),De=(e,t)=>i.createTypeAliasDeclaration(V,e,void 0,t),qt=(e,t,r)=>i.createPropertyDeclaration(Ko,e,void 0,t,r),Vt=(e,t,r=[])=>i.createClassDeclaration(V,e,void 0,void 0,[t,...r]),Bt=(e,t)=>i.createTypeReferenceNode("Promise",[i.createIndexedAccessTypeNode(i.createTypeReferenceNode(e),t)]),Yt=()=>i.createTypeReferenceNode("Promise",[i.createKeywordTypeNode(M.SyntaxKind.AnyKeyword)]),ut=(e,t,r)=>i.createInterfaceDeclaration(V,e,void 0,t,r),Jt=e=>Object.keys(e).reduce((t,r)=>t.concat(i.createTypeParameterDeclaration([],r,i.createTypeReferenceNode(e[r]))),[]),Qt=(e,t)=>i.createArrowFunction(Uo,void 0,e.map(r=>we(r)),void 0,void 0,i.createCallExpression(i.createPropertyAccessExpression(i.createThis(),"implementation"),void 0,t)),ft=(e,t,r)=>i.createCallExpression(i.createPropertyAccessExpression(i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("Object"),"keys"),void 0,[i.createIdentifier(e)]),"reduce"),void 0,[i.createArrowFunction(void 0,void 0,Me({acc:void 0,key:void 0}),void 0,void 0,t),r]);import f from"typescript";import{z as qo}from"zod";import U from"typescript";var{factory:ze}=U,yt=(e,t)=>{U.addSyntheticLeadingComment(e,U.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0)},ve=(e,t,r)=>{let o=ze.createTypeAliasDeclaration(void 0,ze.createIdentifier(t),void 0,e);return r&&yt(o,r),o},Wt=(e,t)=>{let r=U.createSourceFile("print.ts","",U.ScriptTarget.Latest,!1,U.ScriptKind.TS);return U.createPrinter(t).printNode(U.EmitHint.Unspecified,e,r)},Go=/^[A-Za-z_$][A-Za-z0-9_$]*$/,Xt=e=>Go.test(e)?ze.createIdentifier(e):ze.createStringLiteral(e);var{factory:u}=f,Vo={[f.SyntaxKind.AnyKeyword]:"",[f.SyntaxKind.BigIntKeyword]:BigInt(0),[f.SyntaxKind.BooleanKeyword]:!1,[f.SyntaxKind.NumberKeyword]:0,[f.SyntaxKind.ObjectKeyword]:{},[f.SyntaxKind.StringKeyword]:"",[f.SyntaxKind.UndefinedKeyword]:void 0},Bo=({schema:{value:e}})=>u.createLiteralTypeNode(typeof e=="number"?u.createNumericLiteral(e):typeof e=="boolean"?e?u.createTrue():u.createFalse():u.createStringLiteral(e)),Yo=({schema:{shape:e},isResponse:t,next:r,optionalPropStyle:{withQuestionMark:o}})=>{let n=Object.entries(e).map(([s,a])=>{let p=t&&de(a)?a instanceof qo.ZodOptional:a.isOptional(),d=u.createPropertySignature(void 0,Xt(s),p&&o?u.createToken(f.SyntaxKind.QuestionToken):void 0,r({schema:a}));return a.description&&yt(d,a.description),d});return u.createTypeLiteralNode(n)},Jo=({schema:{element:e},next:t})=>u.createArrayTypeNode(t({schema:e})),Qo=({schema:{options:e}})=>u.createUnionTypeNode(e.map(t=>u.createLiteralTypeNode(u.createStringLiteral(t)))),er=({schema:{options:e},next:t})=>u.createUnionTypeNode(e.map(r=>t({schema:r}))),Wo=e=>Vo?.[e.kind],Xo=({schema:e,next:t,isResponse:r})=>{let o=t({schema:e.innerType()}),n=e._def.effect;if(r&&n.type==="transform"){let s=Oe({effect:n,sample:Wo(o)}),a={number:f.SyntaxKind.NumberKeyword,bigint:f.SyntaxKind.BigIntKeyword,boolean:f.SyntaxKind.BooleanKeyword,string:f.SyntaxKind.StringKeyword,undefined:f.SyntaxKind.UndefinedKeyword,object:f.SyntaxKind.ObjectKeyword};return u.createKeywordTypeNode(s&&a[s]||f.SyntaxKind.AnyKeyword)}return o},en=({schema:e})=>u.createUnionTypeNode(Object.values(e.enum).map(t=>u.createLiteralTypeNode(typeof t=="number"?u.createNumericLiteral(t):u.createStringLiteral(t)))),tn=({next:e,schema:t,optionalPropStyle:{withUndefined:r}})=>{let o=e({schema:t.unwrap()});return r?u.createUnionTypeNode([o,u.createKeywordTypeNode(f.SyntaxKind.UndefinedKeyword)]):o},rn=({next:e,schema:t})=>u.createUnionTypeNode([e({schema:t.unwrap()}),u.createLiteralTypeNode(u.createNull())]),on=({next:e,schema:{items:t}})=>u.createTupleTypeNode(t.map(r=>e({schema:r}))),nn=({next:e,schema:{keySchema:t,valueSchema:r}})=>u.createExpressionWithTypeArguments(u.createIdentifier("Record"),[e({schema:t}),e({schema:r})]),sn=({next:e,schema:t})=>u.createIntersectionTypeNode([t._def.left,t._def.right].map(r=>e({schema:r}))),an=({next:e,schema:t})=>e({schema:t._def.innerType}),K=e=>()=>u.createKeywordTypeNode(e),dn=({next:e,schema:t})=>e({schema:t.unwrap()}),pn=({next:e,schema:t})=>e({schema:t._def.innerType}),cn=({next:e,schema:t})=>e({schema:t._def.innerType}),ln=({schema:e,next:t,isResponse:r})=>t({schema:e._def[r?"out":"in"]}),mn=()=>u.createLiteralTypeNode(u.createNull()),un=({getAlias:e,makeAlias:t,next:r,serializer:o,schema:n})=>{let s=`Type${o(n.schema)}`;return e(s)||(()=>(t(s,u.createLiteralTypeNode(u.createNull())),t(s,r({schema:n.schema}))))()},fn={ZodString:K(f.SyntaxKind.StringKeyword),ZodNumber:K(f.SyntaxKind.NumberKeyword),ZodBigInt:K(f.SyntaxKind.BigIntKeyword),ZodBoolean:K(f.SyntaxKind.BooleanKeyword),ZodDateIn:K(f.SyntaxKind.StringKeyword),ZodDateOut:K(f.SyntaxKind.StringKeyword),ZodNull:mn,ZodArray:Jo,ZodTuple:on,ZodRecord:nn,ZodObject:Yo,ZodLiteral:Bo,ZodIntersection:sn,ZodUnion:er,ZodFile:K(f.SyntaxKind.StringKeyword),ZodAny:K(f.SyntaxKind.AnyKeyword),ZodDefault:an,ZodEnum:Qo,ZodNativeEnum:en,ZodEffects:Xo,ZodOptional:tn,ZodNullable:rn,ZodDiscriminatedUnion:er,ZodBranded:dn,ZodCatch:cn,ZodPipeline:ln,ZodLazy:un,ZodReadonly:pn},gt=({schema:e,...t})=>q({schema:e,rules:fn,onMissing:()=>u.createKeywordTypeNode(f.SyntaxKind.AnyKeyword),...t});var ht=class{agg=[];registry={};paths=[];aliases={};getAlias(t){return t in this.aliases?i.createTypeReferenceNode(t):void 0}makeAlias(t,r){return this.aliases[t]=ve(r,t),this.getAlias(t)}constructor({routing:t,variant:r="client",serializer:o=Se,optionalPropStyle:n={withQuestionMark:!0,withUndefined:!0}}){G({routing:t,onEndpoint:(m,S,C)=>{let re=N(S,C,"input"),P=N(S,C,"response"),oe={serializer:o,getAlias:this.getAlias.bind(this),makeAlias:this.makeAlias.bind(this),optionalPropStyle:n},ke=gt({...oe,schema:m.getSchema("input"),isResponse:!1}),ne=gt({...oe,isResponse:!0,schema:m.getSchema("positive").or(m.getSchema("negative"))});this.agg.push(ve(ke,re),ve(ne,P)),C!=="options"&&(this.paths.push(S),this.registry[`${C} ${S}`]={in:re,out:P,isJson:m.getMimeTypes("positive").includes($),tags:m.getTags()})}}),this.agg=Object.values(this.aliases).concat(this.agg);let s=mt("Path",this.paths),a=mt("Method",Pt),p=De("MethodPath",at([a.name,s.name])),d=[i.createHeritageClause(F.SyntaxKind.ExtendsKeyword,[pt(p.name,F.SyntaxKind.AnyKeyword)])],c=ut("Input",d,Object.keys(this.registry).map(m=>ct(m,this.registry[m].in))),l=ut("Response",d,Object.keys(this.registry).map(m=>ct(m,this.registry[m].out)));if(this.agg.push(s,a,p,c,l),r==="types")return;let g=i.createVariableStatement(V,lt("jsonEndpoints",i.createObjectLiteralExpression(Object.keys(this.registry).filter(m=>this.registry[m].isJson).map(m=>i.createPropertyAssignment(`"${m}"`,i.createTrue()))))),y=i.createVariableStatement(V,lt("endpointTags",i.createObjectLiteralExpression(Object.keys(this.registry).map(m=>i.createPropertyAssignment(`"${m}"`,i.createArrayLiteralExpression(this.registry[m].tags.map(S=>i.createStringLiteral(S)))))))),T=De("Provider",i.createFunctionTypeNode(Jt({M:a.name,P:s.name}),Me({method:i.createTypeReferenceNode("M"),path:i.createTypeReferenceNode("P"),params:i.createIndexedAccessTypeNode(i.createTypeReferenceNode(c.name),dt)}),Bt(l.name,dt))),R=De("Implementation",i.createFunctionTypeNode(void 0,Me({method:i.createTypeReferenceNode(a.name),path:i.createKeywordTypeNode(F.SyntaxKind.StringKeyword),params:pt(F.SyntaxKind.StringKeyword,F.SyntaxKind.AnyKeyword)}),Yt())),h=i.createTemplateExpression(i.createTemplateHead(":"),[i.createTemplateSpan(i.createIdentifier("key"),i.createTemplateTail(""))]),I=Vt("ExpressZodAPIClient",Gt([we("implementation",i.createTypeReferenceNode(R.name),_t)]),[qt("provide",i.createTypeReferenceNode(T.name),Qt(["method","path","params"],[i.createIdentifier("method"),ft("params",i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("acc"),"replace"),void 0,[h,i.createElementAccessExpression(i.createIdentifier("params"),i.createIdentifier("key"))]),i.createIdentifier("path")),ft("params",i.createConditionalExpression(i.createBinaryExpression(i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("path"),"indexOf"),void 0,[h]),F.SyntaxKind.GreaterThanEqualsToken,i.createNumericLiteral(0)),void 0,i.createIdentifier("acc"),void 0,i.createObjectLiteralExpression([i.createSpreadAssignment(i.createIdentifier("acc")),i.createPropertyAssignment(i.createComputedPropertyName(i.createIdentifier("key")),i.createElementAccessExpression(i.createIdentifier("params"),i.createIdentifier("key")))])),i.createObjectLiteralExpression())]))]);F.addSyntheticLeadingComment(I,F.SyntaxKind.MultiLineCommentTrivia,`
34
+ `.trim();var Qe=({app:e,logger:t,config:r,routing:o})=>{r.startupLogo!==!1&&console.log(It()),G({routing:o,hasCors:!!r.cors,onEndpoint:(n,s,a)=>{e[a](s,async(p,d)=>{t.info(`${p.method}: ${s}`),await n.execute({request:p,response:d,logger:t,config:r})})},onStatic:(n,s)=>{e.use(n,s)}})};import Fr,{json as $r}from"express";import _r from"compression";import Gr from"express-fileupload";import qr from"https";import Ct from"http-errors";var Vr=(e,t)=>(r,o,n,s)=>{if(!r)return s();e.handler({error:Ct(400,Y(r).message),request:o,response:n,logger:t,input:o.body,output:null})},Nt=(e,t)=>(r,o)=>{let n=Ct(404,`Can not ${r.method} ${r.path}`);try{e.handler({request:r,response:o,logger:t,error:n,input:null,output:null})}catch(s){Re({response:o,logger:t,error:new Q(Y(s).message,n)})}},Br=(e,t)=>{let r=$e(e.logger)?Ee(e.logger):e.logger;Qe({app:e.app,routing:t,logger:r,config:e});let o=e.errorHandler||ee;return{notFoundHandler:Nt(o,r),logger:r}},Yr=(e,t)=>{let r=$e(e.logger)?Ee(e.logger):e.logger,o=Fr();o.disable("x-powered-by");let n=e.errorHandler||ee,s=e.server.compression?_r({...typeof e.server.compression=="object"?e.server.compression:{}}):void 0,a=e.server.jsonParser||$r(),p=e.server.upload?Gr({...typeof e.server.upload=="object"?e.server.upload:{},abortOnLimit:!1,parseNested:!0}):void 0,d=[].concat(s||[]).concat(a).concat(p||[]);o.use(d),o.use(Vr(n,r)),Qe({app:o,routing:t,logger:r,config:e}),o.use(Nt(n,r));let c=o.listen(e.server.listen,()=>{r.info(`Listening ${e.server.listen}`)}),l;return e.https&&(l=qr.createServer(e.https.options,o).listen(e.https.listen,()=>{r.info(`Listening ${e.https.listen}`)})),{app:o,httpServer:c,httpsServer:l,logger:r}};import{OpenApiBuilder as Lo}from"openapi3-ts/oas30";import{isReferenceObject as vt,isSchemaObject as ue}from"openapi3-ts/oas30";import{omit as me}from"ramda";import{z as x}from"zod";import{INVALID as wt,ZodIssueCode as We,ZodParsedType as Mt,ZodType as Jr,addIssueToContext as Xe}from"zod";var et=/^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(\.\d+)?)?Z?$/,Qr="ZodDateIn",Ae=class e extends Jr{_parse(t){let{status:r,ctx:o}=this._processInputParams(t);if(o.parsedType!==Mt.string)return Xe(o,{code:We.invalid_type,expected:Mt.string,received:o.parsedType}),wt;et.test(o.data)||(Xe(o,{code:We.invalid_string,validation:"regex"}),r.dirty());let n=new Date(o.data);return he(n)?{status:r.value,value:n}:(Xe(o,{code:We.invalid_date}),wt)}static create=()=>new e({typeName:Qr})};var q=({schema:e,onEach:t,rules:r,onMissing:o,...n})=>{let s="typeName"in e._def?r[e._def.typeName]:void 0,p=s?s({schema:e,...n,next:c=>q({...c,...n,onEach:t,rules:r,onMissing:o})}):o({schema:e,...n}),d=t&&t({schema:e,prev:p,...n});return d?{...p,...d}:p};var Dt=50,jt="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString",Wr={integer:0,number:0,string:"",boolean:!1,object:{},null:null,array:[]},Lt=e=>e.replace(Ue,t=>`{${t.slice(1)}}`),Xr=({schema:{_def:{innerType:e,defaultValue:t}},next:r})=>({...r({schema:e}),default:t()}),eo=({schema:{_def:{innerType:e}},next:t})=>t({schema:e}),to=()=>({format:"any"}),ro=e=>{if(e.isResponse)throw new R({message:"Please use z.upload() only for input.",...e});return{type:"string",format:"binary"}},oo=({schema:{isBinary:e,isBase64:t},...r})=>{if(!r.isResponse)throw new R({message:"Please use z.file() only within ResultHandler.",...r});return{type:"string",format:e?"binary":t?"byte":"file"}},no=({schema:{options:e},next:t})=>({oneOf:e.map(r=>t({schema:r}))}),so=({schema:{options:e,discriminator:t},next:r})=>({discriminator:{propertyName:t},oneOf:Array.from(e.values()).map(o=>r({schema:o}))}),io=({schema:{_def:{left:e,right:t}},next:r})=>({allOf:[e,t].map(o=>r({schema:o}))}),ao=({schema:e,next:t})=>t({schema:e.unwrap()}),po=({schema:e,next:t})=>t({schema:e._def.innerType}),co=({schema:e,next:t})=>({nullable:!0,...t({schema:e.unwrap()})}),zt=({schema:e})=>({type:typeof Object.values(e.enum)[0],enum:Object.values(e.enum)}),lo=({schema:{value:e}})=>({type:typeof e,enum:[e]}),mo=({schema:e,isResponse:t,...r})=>{let o=Object.keys(e.shape).filter(n=>{let s=e.shape[n];return!(t&&ie(s)?s instanceof x.ZodOptional:s.isOptional())});return{type:"object",properties:Ie({schema:e,isResponse:t,...r}),...o.length?{required:o}:{}}},uo=()=>({type:"string",nullable:!0,format:"null"}),fo=e=>{if(e.isResponse)throw new R({message:"Please use z.dateOut() for output.",...e});return{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",pattern:et.source,externalDocs:{url:jt}}},yo=e=>{if(!e.isResponse)throw new R({message:"Please use z.dateIn() for input.",...e});return{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",externalDocs:{url:jt}}},go=e=>{throw new R({message:`Using z.date() within ${e.isResponse?"output":"input"} schema is forbidden. Please use z.date${e.isResponse?"Out":"In"}() instead. Check out the documentation for details.`,...e})},ho=()=>({type:"boolean"}),xo=()=>({type:"integer",format:"bigint"}),To=({schema:{keySchema:e,valueSchema:t},...r})=>{if(e instanceof x.ZodEnum||e instanceof x.ZodNativeEnum){let o=Object.values(e.enum),n=o.reduce((s,a)=>({...s,[a]:t}),{});return{type:"object",properties:Ie({schema:x.object(n),...r}),...o.length?{required:o}:{}}}if(e instanceof x.ZodLiteral)return{type:"object",properties:Ie({schema:x.object({[e.value]:t}),...r}),required:[e.value]};if(e instanceof x.ZodUnion&&e.options.reduce((n,s)=>n&&s instanceof x.ZodLiteral,!0)){let n=e.options.reduce((s,a)=>({...s,[a.value]:t}),{});return{type:"object",properties:Ie({schema:x.object(n),...r}),required:e.options.map(s=>s.value)}}return{type:"object",additionalProperties:r.next({schema:t})}},So=({schema:{_def:e,element:t},next:r})=>({type:"array",items:r({schema:t}),...e.minLength!==null&&{minItems:e.minLength.value},...e.maxLength!==null&&{maxItems:e.maxLength.value}}),Oo=({schema:{items:e},next:t})=>{let r=e.map(o=>t({schema:o}));return{type:"array",minItems:r.length,maxItems:r.length,items:{oneOf:r,format:"tuple",...r.length>0&&{description:r.map((o,n)=>`${n}: ${ue(o)?o.type:o.$ref}`).join(", ")}}}},bo=({schema:{isEmail:e,isURL:t,minLength:r,maxLength:o,isUUID:n,isCUID:s,isCUID2:a,isULID:p,isIP:d,isEmoji:c,isDatetime:l,_def:{checks:g}}})=>{let y=g.find(h=>h.kind==="regex"),T=g.find(h=>h.kind==="datetime"),P=y?y.regex:T?T.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;return{type:"string",...l&&{format:"date-time"},...e&&{format:"email"},...t&&{format:"url"},...n&&{format:"uuid"},...s&&{format:"cuid"},...a&&{format:"cuid2"},...p&&{format:"ulid"},...d&&{format:"ip"},...c&&{format:"emoji"},...r!==null&&{minLength:r},...o!==null&&{maxLength:o},...P&&{pattern:`/${P.source}/${P.flags}`}}},Ro=({schema:e})=>{let t=e._def.checks.find(({kind:s})=>s==="min"),r=t?t.inclusive:!0,o=e._def.checks.find(({kind:s})=>s==="max"),n=o?o.inclusive:!0;return{type:e.isInt?"integer":"number",format:e.isInt?"int64":"double",minimum:e.minValue===null?e.isInt?Number.MIN_SAFE_INTEGER:Number.MIN_VALUE:e.minValue,exclusiveMinimum:!r,maximum:e.maxValue===null?e.isInt?Number.MAX_SAFE_INTEGER:Number.MAX_VALUE:e.maxValue,exclusiveMaximum:!n}},Ie=({schema:{shape:e},next:t})=>Object.keys(e).reduce((r,o)=>({...r,[o]:t({schema:e[o]})}),{}),Po=e=>{let t=Array.isArray(e.type)?e.type[0]:e.type;return Wr?.[t]},Zo=({schema:e,isResponse:t,next:r})=>{let o=r({schema:e.innerType()}),{effect:n}=e._def;if(t&&n.type==="transform"&&ue(o)){let s=Se({effect:n,sample:Po(o)});return s&&["number","string","boolean"].includes(s)?{type:s}:r({schema:x.any()})}if(!t&&n.type==="preprocess"&&ue(o)){let{type:s,...a}=o;return{...a,format:`${a.format||s} (preprocessed)`}}return o},Eo=({schema:e,isResponse:t,next:r})=>r({schema:e._def[t?"out":"in"]}),Ao=({schema:e,next:t})=>t({schema:e.unwrap()}),Io=({next:e,schema:t,serializer:r,getRef:o,makeRef:n})=>{let s=r(t.schema);return o(s)||(()=>(n(s,{}),n(s,e({schema:t.schema}))))()},kt=(e,t,r=[])=>{let o=j({schema:e,variant:t?"parsed":"original",validate:!0});return o.length===0?{}:{examples:o.reduce((n,s,a)=>({...n,[`example${a+1}`]:{value:typeof s=="object"&&!Array.isArray(s)?me(r,s):s}}),{})}},Co=(e,t,r)=>{let o=j({schema:e,variant:t?"parsed":"original",validate:!0});return o.length===0?{}:{examples:o.reduce((n,s,a)=>r in s?{...n,[`example${a+1}`]:{value:s[r]}}:n,{})}},le=(e,t)=>{if(e instanceof x.ZodObject)return e;let r;if(e instanceof x.ZodUnion||e instanceof x.ZodDiscriminatedUnion)r=Array.from(e.options.values()).map(o=>le(o,t)).reduce((o,n)=>o.merge(n.partial()),x.object({}));else if(e instanceof x.ZodEffects){if(z(e))throw new R({message:`Using transformations on the top level of ${t.isResponse?"response":"input"} schema is not allowed.`,...t});r=le(e._def.schema,t)}else r=le(e._def.left,t).merge(le(e._def.right,t));return ye(e,r)},Ht=({path:e,method:t,endpoint:r,inputSources:o,serializer:n,getRef:s,makeRef:a,composition:p,clue:d="parameter"})=>{let c=r.getSchema("input"),l=le(c,{path:e,method:t,isResponse:!1}).shape,g=Ge(e),y=o.includes("query"),T=o.includes("params"),P=o.includes("headers"),h=m=>T&&g.includes(m),I=m=>P&&Fe(m);return Object.keys(l).filter(m=>y||h(m)).map(m=>{let S=q({schema:l[m],isResponse:!1,rules:rt,onEach:ot,onMissing:nt,serializer:n,getRef:s,makeRef:a,path:e,method:t}),C=p==="components"?a(N(e,t,`${d} ${m}`),S):S;return{name:m,in:h(m)?"path":I(m)?"header":"query",required:!l[m].isOptional(),description:ue(S)&&S.description||`${t.toUpperCase()} ${e} ${d}`,schema:C,...Co(c,!1,m)}})},rt={ZodString:bo,ZodNumber:Ro,ZodBigInt:xo,ZodBoolean:ho,ZodDateIn:fo,ZodDateOut:yo,ZodNull:uo,ZodArray:So,ZodTuple:Oo,ZodRecord:To,ZodObject:mo,ZodLiteral:lo,ZodIntersection:io,ZodUnion:no,ZodFile:oo,ZodUpload:ro,ZodAny:to,ZodDefault:Xr,ZodEnum:zt,ZodNativeEnum:zt,ZodEffects:Zo,ZodOptional:ao,ZodNullable:co,ZodDiscriminatedUnion:so,ZodBranded:Ao,ZodDate:go,ZodCatch:eo,ZodPipeline:Eo,ZodLazy:Io,ZodReadonly:po},ot=({schema:e,isResponse:t,prev:r})=>{if(vt(r))return{};let{description:o}=e,n=e instanceof x.ZodLazy,s=r.type!==void 0,a=t&&ie(e),p=!n&&s&&!a&&e.isNullable(),d=n?[]:j({schema:e,variant:t?"parsed":"original",validate:!0});return{...o&&{description:o},...p&&{nullable:!0},...d.length>0&&{example:d[0]}}},nt=({schema:e,...t})=>{throw new R({message:`Zod type ${e.constructor.name} is unsupported.`,...t})},tt=(e,t)=>{if(vt(e))return e;let r=e.properties?me(t,e.properties):void 0,o=e.example?me(t,e.example):void 0,n=e.required?e.required.filter(p=>!t.includes(p)):void 0,s=e.allOf?e.allOf.map(p=>tt(p,t)):void 0,a=e.oneOf?e.oneOf.map(p=>tt(p,t)):void 0;return me(Object.entries({properties:r,required:n,example:o,allOf:s,oneOf:a}).filter(([{},p])=>p===void 0).map(([p])=>p),{...e,properties:r,required:n,example:o,allOf:s,oneOf:a})},Ut=e=>ue(e)?me(["example"],e):e,st=({method:e,path:t,endpoint:r,isPositive:o,serializer:n,getRef:s,makeRef:a,composition:p,clue:d="response"})=>{let c=r.getSchema(o?"positive":"negative"),l=r.getMimeTypes(o?"positive":"negative"),g=Ut(q({schema:c,isResponse:!0,rules:rt,onEach:ot,onMissing:nt,serializer:n,getRef:s,makeRef:a,path:t,method:e})),y=kt(c,!0),T=p==="components"?a(N(t,e,d),g):g;return{description:`${e.toUpperCase()} ${t} ${d}`,content:l.reduce((P,h)=>({...P,[h]:{schema:T,...y}}),{})}},No=()=>({type:"http",scheme:"basic"}),wo=({format:e})=>({type:"http",scheme:"bearer",...e&&{bearerFormat:e}}),Mo=({name:e})=>({type:"apiKey",in:"query",name:e}),Do=({name:e})=>({type:"apiKey",in:"header",name:e}),zo=({name:e})=>({type:"apiKey",in:"cookie",name:e}),vo=({url:e})=>({type:"openIdConnect",openIdConnectUrl:e}),jo=({flows:e={}})=>({type:"oauth2",flows:Object.keys(e).reduce((t,r)=>{let o=e[r];if(!o)return t;let{scopes:n={},...s}=o;return{...t,[r]:{...s,scopes:n}}},{})}),Kt=e=>{let t={basic:No,bearer:wo,input:Mo,header:Do,cookie:zo,openid:vo,oauth2:jo};return be(e,r=>t[r.type](r))},Ce=e=>{if(typeof e=="object"){if("or"in e)return e.or.map(t=>("and"in t?t.and:[t]).reduce((r,{name:o,scopes:n})=>({...r,[o]:n}),{}));if("and"in e)return Ce(Ve(e))}return Ce({or:[e]})},Ft=({method:e,path:t,endpoint:r,serializer:o,getRef:n,makeRef:s,composition:a,clue:p="request body"})=>{let d=Ge(t),c=Ut(tt(q({schema:r.getSchema("input"),isResponse:!1,rules:rt,onEach:ot,onMissing:nt,serializer:o,getRef:n,makeRef:s,path:t,method:e}),d)),l=kt(r.getSchema("input"),!1,d),g=a==="components"?s(N(t,e,p),c):c;return{description:`${e.toUpperCase()} ${t} ${p}`,content:r.getMimeTypes("input").reduce((y,T)=>({...y,[T]:{schema:g,...l}}),{})}},$t=e=>Object.keys(e).map(t=>{let r=e[t];return{name:t,description:typeof r=="string"?r:r.description,...typeof r=="object"&&r.url&&{externalDocs:{url:r.url}}}}),it=e=>e.length<=Dt?e:e.slice(0,Dt-1)+"\u2026";var at=class extends Lo{lastSecuritySchemaIds={};lastOperationIdSuffixes={};makeRef(t,r){return this.addSchema(t,r),this.getRef(t)}getRef(t){return t in(this.rootDoc.components?.schemas||{})?{$ref:`#/components/schemas/${t}`}:void 0}ensureUniqOperationId(t,r,o){if(o){if(o in this.lastOperationIdSuffixes)throw new R({message:`Duplicated operationId: "${o}"`,method:r,isResponse:!1,path:t});return this.lastOperationIdSuffixes[o]=1,o}let n=N(t,r);return n in this.lastOperationIdSuffixes?(this.lastOperationIdSuffixes[n]++,`${n}${this.lastOperationIdSuffixes[n]}`):(this.lastOperationIdSuffixes[n]=1,n)}ensureUniqSecuritySchemaName(t){let r=JSON.stringify(t);for(let o in this.rootDoc.components?.securitySchemes||{})if(r===JSON.stringify(this.rootDoc.components?.securitySchemes?.[o]))return o;return this.lastSecuritySchemaIds[t.type]=(this.lastSecuritySchemaIds?.[t.type]||0)+1,`${t.type.toUpperCase()}_${this.lastSecuritySchemaIds[t.type]}`}constructor({routing:t,config:r,title:o,version:n,serverUrl:s,successfulResponseDescription:a="Successful response",errorResponseDescription:p="Error response",hasSummaryFromDescription:d=!0,composition:c="inline",serializer:l=Te}){super(),this.addInfo({title:o,version:n}).addServer({url:s}),G({routing:t,onEndpoint:(y,T,P)=>{let h=P,I={path:T,method:h,endpoint:y,composition:c,serializer:l,getRef:this.getRef.bind(this),makeRef:this.makeRef.bind(this)},[m,S]=["short","long"].map(y.getDescription.bind(y)),C=r.inputSources?.[h]||ge[h],re=Ht({...I,inputSources:C}),Z={operationId:this.ensureUniqOperationId(T,h,y.getOperationId()),responses:{[y.getStatusCode("positive")]:st({...I,clue:a,isPositive:!0}),[y.getStatusCode("negative")]:st({...I,clue:p,isPositive:!1})}};S&&(Z.description=S,d&&m===void 0&&(Z.summary=it(S))),m&&(Z.summary=it(m)),y.getTags().length>0&&(Z.tags=y.getTags()),re.length>0&&(Z.parameters=re),C.includes("body")&&(Z.requestBody=Ft(I));let fe=Ce(be(Kt(y.getSecurity()),He=>{let Tt=this.ensureUniqSecuritySchemaName(He),cr=["oauth2","openIdConnect"].includes(He.type)?y.getScopes():[];return this.addSecurityScheme(Tt,He),{name:Tt,scopes:cr}}));fe.length>0&&(Z.security=fe);let ke=Lt(T);this.addPath(ke,{[h]:Z})}}),this.rootDoc.tags=r.tags?$t(r.tags):[]}};import _t from"http";var ko=e=>({method:"GET",header:jest.fn(()=>$),...e}),Ho=e=>{let t={writableEnded:!1,statusCode:200,statusMessage:_t.STATUS_CODES[200],set:jest.fn(()=>t),setHeader:jest.fn(()=>t),header:jest.fn(()=>t),status:jest.fn(r=>(t.statusCode=r,t.statusMessage=_t.STATUS_CODES[r],t)),json:jest.fn(()=>t),send:jest.fn(()=>t),end:jest.fn(()=>(t.writableEnded=!0,t)),...e};return t},Uo=async({endpoint:e,requestProps:t,responseProps:r,configProps:o,loggerProps:n,__noJest:s})=>{if(!jest||s)throw new Error("You need to install Jest in order to use testEndpoint().");let a=ko(t),p=Ho(r),d={info:jest.fn(),warn:jest.fn(),error:jest.fn(),debug:jest.fn(),...n},c={cors:!1,logger:d,...o};return await e.execute({request:a,response:p,config:c,logger:d}),{requestMock:a,responseMock:p,loggerMock:d}};import F from"typescript";import M from"typescript";var i=M.factory,V=[i.createModifier(M.SyntaxKind.ExportKeyword)],Ko=[i.createModifier(M.SyntaxKind.AsyncKeyword)],Fo=[i.createModifier(M.SyntaxKind.PublicKeyword),i.createModifier(M.SyntaxKind.ReadonlyKeyword)],Gt=[i.createModifier(M.SyntaxKind.ProtectedKeyword),i.createModifier(M.SyntaxKind.ReadonlyKeyword)],$o=i.createTemplateHead(""),_o=i.createTemplateTail(""),Go=i.createTemplateMiddle(" "),dt=e=>i.createTemplateLiteralType($o,e.map((t,r)=>i.createTemplateLiteralTypeSpan(i.createTypeReferenceNode(t),r===e.length-1?_o:Go))),pt=dt(["M","P"]),Ne=(e,t,r)=>i.createParameterDeclaration(r,void 0,e,void 0,t,void 0),we=(e,t)=>Object.keys(e).reduce((r,o)=>r.concat(Ne(o,e[o],t)),[]),ct=(e,t)=>i.createExpressionWithTypeArguments(i.createIdentifier("Record"),[typeof e=="number"?i.createKeywordTypeNode(e):i.createTypeReferenceNode(e),i.createKeywordTypeNode(t)]),qt=e=>i.createConstructorDeclaration(void 0,e,i.createBlock([])),lt=(e,t)=>i.createPropertySignature(void 0,`"${e}"`,void 0,i.createTypeReferenceNode(t)),mt=(e,t)=>i.createVariableDeclarationList([i.createVariableDeclaration(e,void 0,void 0,t)],M.NodeFlags.Const),ut=(e,t)=>i.createTypeAliasDeclaration(V,e,void 0,i.createUnionTypeNode(t.map(r=>i.createLiteralTypeNode(i.createStringLiteral(r))))),Me=(e,t)=>i.createTypeAliasDeclaration(V,e,void 0,t),Vt=(e,t,r)=>i.createPropertyDeclaration(Fo,e,void 0,t,r),Bt=(e,t,r=[])=>i.createClassDeclaration(V,e,void 0,void 0,[t,...r]),Yt=(e,t)=>i.createTypeReferenceNode("Promise",[i.createIndexedAccessTypeNode(i.createTypeReferenceNode(e),t)]),Jt=()=>i.createTypeReferenceNode("Promise",[i.createKeywordTypeNode(M.SyntaxKind.AnyKeyword)]),ft=(e,t,r)=>i.createInterfaceDeclaration(V,e,void 0,t,r),Qt=e=>Object.keys(e).reduce((t,r)=>t.concat(i.createTypeParameterDeclaration([],r,i.createTypeReferenceNode(e[r]))),[]),Wt=(e,t)=>i.createArrowFunction(Ko,void 0,e.map(r=>Ne(r)),void 0,void 0,i.createCallExpression(i.createPropertyAccessExpression(i.createThis(),"implementation"),void 0,t)),yt=(e,t,r)=>i.createCallExpression(i.createPropertyAccessExpression(i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("Object"),"keys"),void 0,[i.createIdentifier(e)]),"reduce"),void 0,[i.createArrowFunction(void 0,void 0,we({acc:void 0,key:void 0}),void 0,void 0,t),r]);import f from"typescript";import{z as Vo}from"zod";import U from"typescript";var{factory:De}=U,gt=(e,t)=>{U.addSyntheticLeadingComment(e,U.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0)},ze=(e,t,r)=>{let o=De.createTypeAliasDeclaration(void 0,De.createIdentifier(t),void 0,e);return r&&gt(o,r),o},Xt=(e,t)=>{let r=U.createSourceFile("print.ts","",U.ScriptTarget.Latest,!1,U.ScriptKind.TS);return U.createPrinter(t).printNode(U.EmitHint.Unspecified,e,r)},qo=/^[A-Za-z_$][A-Za-z0-9_$]*$/,er=e=>qo.test(e)?De.createIdentifier(e):De.createStringLiteral(e);var{factory:u}=f,Bo={[f.SyntaxKind.AnyKeyword]:"",[f.SyntaxKind.BigIntKeyword]:BigInt(0),[f.SyntaxKind.BooleanKeyword]:!1,[f.SyntaxKind.NumberKeyword]:0,[f.SyntaxKind.ObjectKeyword]:{},[f.SyntaxKind.StringKeyword]:"",[f.SyntaxKind.UndefinedKeyword]:void 0},Yo=({schema:{value:e}})=>u.createLiteralTypeNode(typeof e=="number"?u.createNumericLiteral(e):typeof e=="boolean"?e?u.createTrue():u.createFalse():u.createStringLiteral(e)),Jo=({schema:{shape:e},isResponse:t,next:r,optionalPropStyle:{withQuestionMark:o}})=>{let n=Object.entries(e).map(([s,a])=>{let p=t&&ie(a)?a instanceof Vo.ZodOptional:a.isOptional(),d=u.createPropertySignature(void 0,er(s),p&&o?u.createToken(f.SyntaxKind.QuestionToken):void 0,r({schema:a}));return a.description&&gt(d,a.description),d});return u.createTypeLiteralNode(n)},Qo=({schema:{element:e},next:t})=>u.createArrayTypeNode(t({schema:e})),Wo=({schema:{options:e}})=>u.createUnionTypeNode(e.map(t=>u.createLiteralTypeNode(u.createStringLiteral(t)))),tr=({schema:{options:e},next:t})=>u.createUnionTypeNode(e.map(r=>t({schema:r}))),Xo=e=>Bo?.[e.kind],en=({schema:e,next:t,isResponse:r})=>{let o=t({schema:e.innerType()}),n=e._def.effect;if(r&&n.type==="transform"){let s=Se({effect:n,sample:Xo(o)}),a={number:f.SyntaxKind.NumberKeyword,bigint:f.SyntaxKind.BigIntKeyword,boolean:f.SyntaxKind.BooleanKeyword,string:f.SyntaxKind.StringKeyword,undefined:f.SyntaxKind.UndefinedKeyword,object:f.SyntaxKind.ObjectKeyword};return u.createKeywordTypeNode(s&&a[s]||f.SyntaxKind.AnyKeyword)}return o},tn=({schema:e})=>u.createUnionTypeNode(Object.values(e.enum).map(t=>u.createLiteralTypeNode(typeof t=="number"?u.createNumericLiteral(t):u.createStringLiteral(t)))),rn=({next:e,schema:t,optionalPropStyle:{withUndefined:r}})=>{let o=e({schema:t.unwrap()});return r?u.createUnionTypeNode([o,u.createKeywordTypeNode(f.SyntaxKind.UndefinedKeyword)]):o},on=({next:e,schema:t})=>u.createUnionTypeNode([e({schema:t.unwrap()}),u.createLiteralTypeNode(u.createNull())]),nn=({next:e,schema:{items:t}})=>u.createTupleTypeNode(t.map(r=>e({schema:r}))),sn=({next:e,schema:{keySchema:t,valueSchema:r}})=>u.createExpressionWithTypeArguments(u.createIdentifier("Record"),[e({schema:t}),e({schema:r})]),an=({next:e,schema:t})=>u.createIntersectionTypeNode([t._def.left,t._def.right].map(r=>e({schema:r}))),dn=({next:e,schema:t})=>e({schema:t._def.innerType}),K=e=>()=>u.createKeywordTypeNode(e),pn=({next:e,schema:t})=>e({schema:t.unwrap()}),cn=({next:e,schema:t})=>e({schema:t._def.innerType}),ln=({next:e,schema:t})=>e({schema:t._def.innerType}),mn=({schema:e,next:t,isResponse:r})=>t({schema:e._def[r?"out":"in"]}),un=()=>u.createLiteralTypeNode(u.createNull()),fn=({getAlias:e,makeAlias:t,next:r,serializer:o,schema:n})=>{let s=`Type${o(n.schema)}`;return e(s)||(()=>(t(s,u.createLiteralTypeNode(u.createNull())),t(s,r({schema:n.schema}))))()},yn={ZodString:K(f.SyntaxKind.StringKeyword),ZodNumber:K(f.SyntaxKind.NumberKeyword),ZodBigInt:K(f.SyntaxKind.BigIntKeyword),ZodBoolean:K(f.SyntaxKind.BooleanKeyword),ZodDateIn:K(f.SyntaxKind.StringKeyword),ZodDateOut:K(f.SyntaxKind.StringKeyword),ZodNull:un,ZodArray:Qo,ZodTuple:nn,ZodRecord:sn,ZodObject:Jo,ZodLiteral:Yo,ZodIntersection:an,ZodUnion:tr,ZodFile:K(f.SyntaxKind.StringKeyword),ZodAny:K(f.SyntaxKind.AnyKeyword),ZodDefault:dn,ZodEnum:Wo,ZodNativeEnum:tn,ZodEffects:en,ZodOptional:rn,ZodNullable:on,ZodDiscriminatedUnion:tr,ZodBranded:pn,ZodCatch:ln,ZodPipeline:mn,ZodLazy:fn,ZodReadonly:cn},ht=({schema:e,...t})=>q({schema:e,rules:yn,onMissing:()=>u.createKeywordTypeNode(f.SyntaxKind.AnyKeyword),...t});var xt=class{agg=[];registry={};paths=[];aliases={};getAlias(t){return t in this.aliases?i.createTypeReferenceNode(t):void 0}makeAlias(t,r){return this.aliases[t]=ze(r,t),this.getAlias(t)}constructor({routing:t,variant:r="client",serializer:o=Te,optionalPropStyle:n={withQuestionMark:!0,withUndefined:!0}}){G({routing:t,onEndpoint:(m,S,C)=>{let re=N(S,C,"input"),Le=N(S,C,"response"),Z={serializer:o,getAlias:this.getAlias.bind(this),makeAlias:this.makeAlias.bind(this),optionalPropStyle:n},fe=ht({...Z,schema:m.getSchema("input"),isResponse:!1}),ke=ht({...Z,isResponse:!0,schema:m.getSchema("positive").or(m.getSchema("negative"))});this.agg.push(ze(fe,re),ze(ke,Le)),C!=="options"&&(this.paths.push(S),this.registry[`${C} ${S}`]={in:re,out:Le,isJson:m.getMimeTypes("positive").includes($),tags:m.getTags()})}}),this.agg=Object.values(this.aliases).concat(this.agg);let s=ut("Path",this.paths),a=ut("Method",Zt),p=Me("MethodPath",dt([a.name,s.name])),d=[i.createHeritageClause(F.SyntaxKind.ExtendsKeyword,[ct(p.name,F.SyntaxKind.AnyKeyword)])],c=ft("Input",d,Object.keys(this.registry).map(m=>lt(m,this.registry[m].in))),l=ft("Response",d,Object.keys(this.registry).map(m=>lt(m,this.registry[m].out)));if(this.agg.push(s,a,p,c,l),r==="types")return;let g=i.createVariableStatement(V,mt("jsonEndpoints",i.createObjectLiteralExpression(Object.keys(this.registry).filter(m=>this.registry[m].isJson).map(m=>i.createPropertyAssignment(`"${m}"`,i.createTrue()))))),y=i.createVariableStatement(V,mt("endpointTags",i.createObjectLiteralExpression(Object.keys(this.registry).map(m=>i.createPropertyAssignment(`"${m}"`,i.createArrayLiteralExpression(this.registry[m].tags.map(S=>i.createStringLiteral(S)))))))),T=Me("Provider",i.createFunctionTypeNode(Qt({M:a.name,P:s.name}),we({method:i.createTypeReferenceNode("M"),path:i.createTypeReferenceNode("P"),params:i.createIndexedAccessTypeNode(i.createTypeReferenceNode(c.name),pt)}),Yt(l.name,pt))),P=Me("Implementation",i.createFunctionTypeNode(void 0,we({method:i.createTypeReferenceNode(a.name),path:i.createKeywordTypeNode(F.SyntaxKind.StringKeyword),params:ct(F.SyntaxKind.StringKeyword,F.SyntaxKind.AnyKeyword)}),Jt())),h=i.createTemplateExpression(i.createTemplateHead(":"),[i.createTemplateSpan(i.createIdentifier("key"),i.createTemplateTail(""))]),I=Bt("ExpressZodAPIClient",qt([Ne("implementation",i.createTypeReferenceNode(P.name),Gt)]),[Vt("provide",i.createTypeReferenceNode(T.name),Wt(["method","path","params"],[i.createIdentifier("method"),yt("params",i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("acc"),"replace"),void 0,[h,i.createElementAccessExpression(i.createIdentifier("params"),i.createIdentifier("key"))]),i.createIdentifier("path")),yt("params",i.createConditionalExpression(i.createBinaryExpression(i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("path"),"indexOf"),void 0,[h]),F.SyntaxKind.GreaterThanEqualsToken,i.createNumericLiteral(0)),void 0,i.createIdentifier("acc"),void 0,i.createObjectLiteralExpression([i.createSpreadAssignment(i.createIdentifier("acc")),i.createPropertyAssignment(i.createComputedPropertyName(i.createIdentifier("key")),i.createElementAccessExpression(i.createIdentifier("params"),i.createIdentifier("key")))])),i.createObjectLiteralExpression())]))]);F.addSyntheticLeadingComment(I,F.SyntaxKind.MultiLineCommentTrivia,`
35
35
  export const exampleImplementation: Implementation = async (
36
36
  method,
37
37
  path,
@@ -52,6 +52,6 @@ export const exampleImplementation: Implementation = async (
52
52
 
53
53
  const client = new ExpressZodAPIClient(exampleImplementation);
54
54
  client.provide("get", "/v1/user/retrieve", { id: "10" });
55
- `,!0),this.agg.push(g,y,T,R,I)}print(t){return this.agg.map(r=>Wt(r,t)).join(`
55
+ `,!0),this.agg.push(g,y,T,P,I)}print(t){return this.agg.map(r=>Xt(r,t)).join(`
56
56
 
57
- `)}};var dr={};lr(dr,{dateIn:()=>Rn,dateOut:()=>Pn,file:()=>On,upload:()=>bn});import{INVALID as tr,ZodIssueCode as rr,ZodParsedType as or,ZodType as yn,addIssueToContext as nr}from"zod";var gn="ZodDateOut",je=class e extends yn{_parse(t){let{status:r,ctx:o}=this._processInputParams(t);return o.parsedType!==or.date?(nr(o,{code:rr.invalid_type,expected:or.date,received:o.parsedType}),tr):xe(o.data)?{status:r.value,value:o.data.toISOString()}:(nr(o,{code:rr.invalid_date}),tr)}static create=()=>new e({typeName:gn})};import{INVALID as hn,ZodIssueCode as sr,ZodParsedType as ir,ZodType as xn,addIssueToContext as ar}from"zod";var Tn="ZodFile",Sn=/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/,Le=class e extends xn{_parse(t){let{status:r,ctx:o}=this._processInputParams(t);if(o.parsedType!==ir.string)return ar(o,{code:sr.invalid_type,expected:ir.string,received:o.parsedType}),hn;for(let n of this._def.checks)n.kind==="base64"&&(Sn.test(o.data)||(ar(o,{code:sr.custom,message:n.message}),r.dirty()));return{status:r.value,value:o.data}}binary=t=>new e({...this._def,checks:[...this._def.checks,{kind:"binary",...Ge(t)}]});base64=t=>new e({...this._def,checks:[...this._def.checks,{kind:"base64",...Ge(t)}]});get isBinary(){return!!this._def.checks.find(t=>t.kind==="binary")}get isBase64(){return!!this._def.checks.find(t=>t.kind==="base64")}static create=()=>new e({checks:[],typeName:Tn})};var On=Le.create,bn=B.create,Rn=Ie.create,Pn=je.create;import Qa from"http-errors";export{te as AbstractEndpoint,le as DependsOnMethod,pe as DependsOnMethodError,it as Documentation,Z as DocumentationError,ce as EndpointsFactory,L as InputValidationError,ht as Integration,_ as OutputValidationError,J as RoutingError,me as ServeStatic,wr as arrayEndpointsFactory,Be as arrayResultHandler,Vr as attachRouting,mr as createConfig,Qa as createHttpError,Ae as createLogger,Ye as createMiddleware,Ve as createResultHandler,Br as createServer,Nr as defaultEndpointsFactory,ee as defaultResultHandler,dr as ez,j as getExamples,v as getMessageFromError,Te as getStatusCodeFromError,Ho as testEndpoint,D as withMeta};
57
+ `)}};var pr={};mr(pr,{dateIn:()=>Pn,dateOut:()=>Zn,file:()=>bn,upload:()=>Rn});import{INVALID as rr,ZodIssueCode as or,ZodParsedType as nr,ZodType as gn,addIssueToContext as sr}from"zod";var hn="ZodDateOut",ve=class e extends gn{_parse(t){let{status:r,ctx:o}=this._processInputParams(t);return o.parsedType!==nr.date?(sr(o,{code:or.invalid_type,expected:nr.date,received:o.parsedType}),rr):he(o.data)?{status:r.value,value:o.data.toISOString()}:(sr(o,{code:or.invalid_date}),rr)}static create=()=>new e({typeName:hn})};import{INVALID as xn,ZodIssueCode as ir,ZodParsedType as ar,ZodType as Tn,addIssueToContext as dr}from"zod";var Sn="ZodFile",On=/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/,je=class e extends Tn{_parse(t){let{status:r,ctx:o}=this._processInputParams(t);if(o.parsedType!==ar.string)return dr(o,{code:ir.invalid_type,expected:ar.string,received:o.parsedType}),xn;for(let n of this._def.checks)n.kind==="base64"&&(On.test(o.data)||(dr(o,{code:ir.custom,message:n.message}),r.dirty()));return{status:r.value,value:o.data}}binary=t=>new e({...this._def,checks:[...this._def.checks,{kind:"binary",...qe(t)}]});base64=t=>new e({...this._def,checks:[...this._def.checks,{kind:"base64",...qe(t)}]});get isBinary(){return!!this._def.checks.find(t=>t.kind==="binary")}get isBase64(){return!!this._def.checks.find(t=>t.kind==="base64")}static create=()=>new e({checks:[],typeName:Sn})};var bn=je.create,Rn=B.create,Pn=Ae.create,Zn=ve.create;import Xa from"http-errors";export{te as AbstractEndpoint,pe as DependsOnMethod,ae as DependsOnMethodError,at as Documentation,R as DocumentationError,de as EndpointsFactory,L as InputValidationError,xt as Integration,_ as OutputValidationError,J as RoutingError,ce as ServeStatic,Mr as arrayEndpointsFactory,Ye as arrayResultHandler,Br as attachRouting,ur as createConfig,Xa as createHttpError,Ee as createLogger,Je as createMiddleware,Be as createResultHandler,Yr as createServer,wr as defaultEndpointsFactory,ee as defaultResultHandler,pr as ez,j as getExamples,v as getMessageFromError,xe as getStatusCodeFromError,Uo as testEndpoint,D as withMeta};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "express-zod-api",
3
- "version": "12.2.0",
3
+ "version": "12.3.0",
4
4
  "description": "A Typescript library to help you get an API server up and running with I/O schema validation and custom middlewares in minutes.",
5
5
  "license": "MIT",
6
6
  "scripts": {