express-zod-api 14.2.2 → 15.0.0-beta1
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 +60 -0
- package/README.md +62 -37
- package/SECURITY.md +3 -2
- package/dist/index.d.mts +71 -35
- package/dist/index.d.ts +71 -35
- package/dist/index.js +8 -8
- package/dist/index.mjs +8 -8
- package/package.json +34 -8
package/dist/index.d.ts
CHANGED
|
@@ -2,7 +2,6 @@ import compression from 'compression';
|
|
|
2
2
|
import express, { Request, Response, NextFunction, RequestHandler, Express } from 'express';
|
|
3
3
|
import fileUpload, { UploadedFile } from 'express-fileupload';
|
|
4
4
|
import https, { ServerOptions } from 'node:https';
|
|
5
|
-
import winston, { Logger } from 'winston';
|
|
6
5
|
import { z, ZodTypeDef, ZodType, ParseInput, ParseReturnType, ZodError } from 'zod';
|
|
7
6
|
import { HttpError } from 'http-errors';
|
|
8
7
|
import { ListenOptions } from 'node:net';
|
|
@@ -93,12 +92,26 @@ interface OAuth2Security<S extends string> {
|
|
|
93
92
|
* */
|
|
94
93
|
type Security<K extends string = string, S extends string = string> = BasicSecurity | BearerSecurity | InputSecurity<K> | CustomHeaderSecurity | CookieSecurity | OpenIdSecurity | OAuth2Security<S>;
|
|
95
94
|
|
|
95
|
+
/**
|
|
96
|
+
* @desc Using module augmentation approach you can set the type of the actual logger used
|
|
97
|
+
* @example declare module "express-zod-api" { interface LoggerOverrides extends winston.Logger {} }
|
|
98
|
+
* @link https://www.typescriptlang.org/docs/handbook/declaration-merging.html#module-augmentation
|
|
99
|
+
* */
|
|
100
|
+
interface LoggerOverrides {
|
|
101
|
+
}
|
|
102
|
+
/** @desc You can use any logger compatible with this type. */
|
|
103
|
+
type AbstractLogger = Record<"info" | "debug" | "warn" | "error", (message: string, meta?: any) => any> & LoggerOverrides;
|
|
104
|
+
interface SimplifiedWinstonConfig {
|
|
105
|
+
level: "silent" | "warn" | "debug";
|
|
106
|
+
color: boolean;
|
|
107
|
+
}
|
|
108
|
+
|
|
96
109
|
interface MiddlewareParams<IN, OPT> {
|
|
97
110
|
input: IN;
|
|
98
111
|
options: OPT;
|
|
99
112
|
request: Request;
|
|
100
113
|
response: Response;
|
|
101
|
-
logger:
|
|
114
|
+
logger: AbstractLogger;
|
|
102
115
|
}
|
|
103
116
|
type Middleware<IN, OPT, OUT> = (params: MiddlewareParams<IN, OPT>) => Promise<OUT>;
|
|
104
117
|
interface MiddlewareCreationProps<IN extends IOSchema<"strip">, OPT, OUT extends FlatObject, SCO extends string> {
|
|
@@ -261,6 +274,10 @@ declare class InputValidationError extends IOSchemaError {
|
|
|
261
274
|
readonly originalError: ZodError;
|
|
262
275
|
constructor(originalError: ZodError);
|
|
263
276
|
}
|
|
277
|
+
declare class MissingPeerError extends Error {
|
|
278
|
+
name: string;
|
|
279
|
+
constructor(module: string);
|
|
280
|
+
}
|
|
264
281
|
|
|
265
282
|
interface ResultHandlerParams<RES> {
|
|
266
283
|
/** null in case of failure to parse or to find the matching endpoint (error: not found) */
|
|
@@ -270,7 +287,7 @@ interface ResultHandlerParams<RES> {
|
|
|
270
287
|
error: Error | null;
|
|
271
288
|
request: Request;
|
|
272
289
|
response: Response<RES>;
|
|
273
|
-
logger:
|
|
290
|
+
logger: AbstractLogger;
|
|
274
291
|
}
|
|
275
292
|
type ResultHandler<RES> = (params: ResultHandlerParams<RES>) => void | Promise<void>;
|
|
276
293
|
interface ResultHandlerDefinition<POS extends z.ZodTypeAny, NEG extends z.ZodTypeAny> {
|
|
@@ -407,7 +424,7 @@ declare const arrayResultHandler: ResultHandlerDefinition<z.ZodArray<z.ZodTypeAn
|
|
|
407
424
|
type Handler<IN, OUT, OPT> = (params: {
|
|
408
425
|
input: IN;
|
|
409
426
|
options: OPT;
|
|
410
|
-
logger:
|
|
427
|
+
logger: AbstractLogger;
|
|
411
428
|
}) => Promise<OUT>;
|
|
412
429
|
type DescriptionVariant = "short" | "long";
|
|
413
430
|
type IOVariant = "input" | "output";
|
|
@@ -417,7 +434,7 @@ declare abstract class AbstractEndpoint {
|
|
|
417
434
|
abstract execute(params: {
|
|
418
435
|
request: Request;
|
|
419
436
|
response: Response;
|
|
420
|
-
logger:
|
|
437
|
+
logger: AbstractLogger;
|
|
421
438
|
config: CommonConfig;
|
|
422
439
|
}): Promise<void>;
|
|
423
440
|
abstract getDescription(variant: DescriptionVariant): string | undefined;
|
|
@@ -467,15 +484,11 @@ declare class Endpoint<IN extends IOSchema, OUT extends IOSchema, OPT extends Fl
|
|
|
467
484
|
execute({ request, response, logger, config, }: {
|
|
468
485
|
request: Request;
|
|
469
486
|
response: Response;
|
|
470
|
-
logger:
|
|
487
|
+
logger: AbstractLogger;
|
|
471
488
|
config: CommonConfig;
|
|
472
489
|
}): Promise<void>;
|
|
473
490
|
}
|
|
474
491
|
|
|
475
|
-
interface LoggerConfig {
|
|
476
|
-
level: "silent" | "warn" | "debug";
|
|
477
|
-
color: boolean;
|
|
478
|
-
}
|
|
479
492
|
type InputSource = keyof Pick<Request, "query" | "body" | "files" | "params" | "headers">;
|
|
480
493
|
type InputSources = Record<Method, InputSource[]>;
|
|
481
494
|
type Headers = Record<string, string>;
|
|
@@ -484,7 +497,7 @@ type HeadersProvider = (params: {
|
|
|
484
497
|
defaultHeaders: Headers;
|
|
485
498
|
request: Request;
|
|
486
499
|
endpoint: AbstractEndpoint;
|
|
487
|
-
logger:
|
|
500
|
+
logger: AbstractLogger;
|
|
488
501
|
}) => Headers | Promise<Headers>;
|
|
489
502
|
type TagsConfig<TAG extends string> = Record<TAG, string | {
|
|
490
503
|
description: string;
|
|
@@ -503,8 +516,11 @@ interface CommonConfig<TAG extends string = string> {
|
|
|
503
516
|
* @see defaultResultHandler
|
|
504
517
|
*/
|
|
505
518
|
errorHandler?: AnyResultHandlerDefinition;
|
|
506
|
-
/**
|
|
507
|
-
|
|
519
|
+
/**
|
|
520
|
+
* @desc Logger configuration (winston) or instance of any other logger.
|
|
521
|
+
* @example { level: "debug", color: true }
|
|
522
|
+
* */
|
|
523
|
+
logger: SimplifiedWinstonConfig | AbstractLogger;
|
|
508
524
|
/**
|
|
509
525
|
* @desc You can disable the startup logo.
|
|
510
526
|
* @default true
|
|
@@ -539,11 +555,13 @@ interface ServerConfig<TAG extends string = string> extends CommonConfig<TAG> {
|
|
|
539
555
|
/**
|
|
540
556
|
* @desc Enable or configure uploads handling.
|
|
541
557
|
* @default false
|
|
558
|
+
* @requires express-fileupload
|
|
542
559
|
* */
|
|
543
560
|
upload?: boolean | UploadOptions;
|
|
544
561
|
/**
|
|
545
562
|
* @desc Enable or configure response compression.
|
|
546
563
|
* @default false
|
|
564
|
+
* @requires compression
|
|
547
565
|
*/
|
|
548
566
|
compression?: boolean | CompressionOptions;
|
|
549
567
|
/**
|
|
@@ -594,11 +612,8 @@ declare class EndpointsFactory<POS extends z.ZodTypeAny, NEG extends z.ZodTypeAn
|
|
|
594
612
|
#private;
|
|
595
613
|
protected resultHandler: ResultHandlerDefinition<POS, NEG>;
|
|
596
614
|
protected middlewares: AnyMiddlewareDef[];
|
|
615
|
+
/** @desc Consider using the "config" prop with the "tags" option to enforce constraints on tagging the endpoints */
|
|
597
616
|
constructor(resultHandler: ResultHandlerDefinition<POS, NEG>);
|
|
598
|
-
/**
|
|
599
|
-
* @desc Consider using the "config" prop with the "tags" option to enforce constraints on tagging the endpoints
|
|
600
|
-
* @todo in next major release consider making config required for using in Endpoint::constructor
|
|
601
|
-
* */
|
|
602
617
|
constructor(params: {
|
|
603
618
|
resultHandler: ResultHandlerDefinition<POS, NEG>;
|
|
604
619
|
config?: CommonConfig<TAG>;
|
|
@@ -733,8 +748,6 @@ declare const arrayEndpointsFactory: EndpointsFactory<z.ZodArray<z.ZodTypeAny, "
|
|
|
733
748
|
example: (example: string) => z.ZodString & any;
|
|
734
749
|
}, null, {}, string, string>;
|
|
735
750
|
|
|
736
|
-
declare const createLogger: (loggerConfig: LoggerConfig) => winston.Logger;
|
|
737
|
-
|
|
738
751
|
declare class DependsOnMethod {
|
|
739
752
|
readonly endpoints: Partial<Record<Method, AbstractEndpoint>>;
|
|
740
753
|
constructor(endpoints: Partial<Record<Method, AbstractEndpoint>>);
|
|
@@ -752,16 +765,16 @@ interface Routing {
|
|
|
752
765
|
[SEGMENT: string]: Routing | DependsOnMethod | AbstractEndpoint | ServeStatic;
|
|
753
766
|
}
|
|
754
767
|
|
|
755
|
-
declare const attachRouting: (config: AppConfig, routing: Routing) => {
|
|
768
|
+
declare const attachRouting: (config: AppConfig, routing: Routing) => Promise<{
|
|
756
769
|
notFoundHandler: express.RequestHandler<express_serve_static_core.ParamsDictionary, any, any, qs.ParsedQs, Record<string, any>>;
|
|
757
|
-
logger:
|
|
758
|
-
}
|
|
759
|
-
declare const createServer: (config: ServerConfig, routing: Routing) => {
|
|
760
|
-
logger:
|
|
770
|
+
logger: AbstractLogger;
|
|
771
|
+
}>;
|
|
772
|
+
declare const createServer: (config: ServerConfig, routing: Routing) => Promise<{
|
|
773
|
+
logger: AbstractLogger;
|
|
761
774
|
httpServer: http.Server<typeof http.IncomingMessage, typeof http.ServerResponse>;
|
|
762
775
|
httpsServer: https.Server<typeof http.IncomingMessage, typeof http.ServerResponse> | undefined;
|
|
763
776
|
app: express_serve_static_core.Express;
|
|
764
|
-
}
|
|
777
|
+
}>;
|
|
765
778
|
|
|
766
779
|
interface DocumentationParams {
|
|
767
780
|
title: string;
|
|
@@ -793,28 +806,51 @@ declare class Documentation extends OpenApiBuilder {
|
|
|
793
806
|
constructor({ routing, config, title, version, serverUrl, successfulResponseDescription, errorResponseDescription, hasSummaryFromDescription, composition, serializer, }: DocumentationParams);
|
|
794
807
|
}
|
|
795
808
|
|
|
796
|
-
|
|
809
|
+
type MockFunction = <S>(implementation?: (...args: any[]) => any) => S;
|
|
810
|
+
interface TestEndpointProps<REQ, RES, LOG, FN> {
|
|
811
|
+
/** @desc The endpoint to test */
|
|
797
812
|
endpoint: AbstractEndpoint;
|
|
813
|
+
/**
|
|
814
|
+
* @desc Additional properties to set on Request mock
|
|
815
|
+
* @default { method: "GET", header: () => "application/json" }
|
|
816
|
+
* */
|
|
798
817
|
requestProps?: REQ;
|
|
818
|
+
/**
|
|
819
|
+
* @desc Additional properties to set on Response mock
|
|
820
|
+
* @default { writableEnded, statusCode, statusMessage, set, setHeader, header, status, json, send, end }
|
|
821
|
+
* */
|
|
799
822
|
responseProps?: RES;
|
|
823
|
+
/**
|
|
824
|
+
* @desc Additional properties to set on config mock
|
|
825
|
+
* @default { cors: false, logger }
|
|
826
|
+
* */
|
|
800
827
|
configProps?: Partial<CommonConfig>;
|
|
828
|
+
/**
|
|
829
|
+
* @desc Additional properties to set on logger mock
|
|
830
|
+
* @default { info, warn, error, debug }
|
|
831
|
+
* */
|
|
801
832
|
loggerProps?: LOG;
|
|
802
|
-
/**
|
|
803
|
-
|
|
833
|
+
/**
|
|
834
|
+
* @example jest.fn
|
|
835
|
+
* @example vi.fn
|
|
836
|
+
* */
|
|
837
|
+
fnMethod: FN;
|
|
804
838
|
}
|
|
805
839
|
/**
|
|
806
|
-
* @
|
|
807
|
-
|
|
808
|
-
|
|
840
|
+
* @desc You need to install either jest (with @types/jest) or vitest in order to use this method
|
|
841
|
+
* @requires jest
|
|
842
|
+
* @requires vitest
|
|
843
|
+
* */
|
|
844
|
+
declare const testEndpoint: <FN extends MockFunction, LOG extends Record<string, any>, REQ extends Record<string, any>, RES extends Record<string, any>>({ endpoint, requestProps, responseProps, configProps, loggerProps, fnMethod, }: TestEndpointProps<REQ, RES, LOG, FN>) => Promise<{
|
|
809
845
|
requestMock: {
|
|
810
846
|
method: string;
|
|
811
|
-
} & Record<"header",
|
|
847
|
+
} & Record<"header", ReturnType<FN>> & REQ;
|
|
812
848
|
responseMock: {
|
|
813
849
|
writableEnded: boolean;
|
|
814
850
|
statusCode: number;
|
|
815
851
|
statusMessage: string;
|
|
816
|
-
} & Record<"status" | "set" | "header" | "end" | "
|
|
817
|
-
loggerMock: Record<"
|
|
852
|
+
} & Record<"status" | "set" | "header" | "end" | "setHeader" | "json" | "send", ReturnType<FN>> & RES;
|
|
853
|
+
loggerMock: Record<"info" | "debug" | "warn" | "error", ReturnType<FN>> & LOG;
|
|
818
854
|
}>;
|
|
819
855
|
|
|
820
856
|
interface Registry {
|
|
@@ -887,4 +923,4 @@ declare namespace proprietarySchemas {
|
|
|
887
923
|
export { proprietarySchemas_dateIn as dateIn, proprietarySchemas_dateOut as dateOut, proprietarySchemas_file as file, proprietarySchemas_raw as raw, proprietarySchemas_upload as upload };
|
|
888
924
|
}
|
|
889
925
|
|
|
890
|
-
export { AbstractEndpoint, type AppConfig, type BasicSecurity, type BearerSecurity, type CommonConfig, type CookieSecurity, type CustomHeaderSecurity, DependsOnMethod, Documentation, DocumentationError, EndpointsFactory, type FlatObject, type IOSchema, type InputSecurity, InputValidationError, Integration, type
|
|
926
|
+
export { AbstractEndpoint, type AppConfig, type BasicSecurity, type BearerSecurity, type CommonConfig, type CookieSecurity, type CustomHeaderSecurity, DependsOnMethod, Documentation, DocumentationError, EndpointsFactory, type FlatObject, type IOSchema, type InputSecurity, InputValidationError, Integration, type LoggerOverrides, type Metadata, type Method, type MiddlewareDefinition, MissingPeerError, type OAuth2Security, type OpenIdSecurity, OutputValidationError, type ResultHandlerDefinition, type Routing, RoutingError, ServeStatic, type ServerConfig, type ZodDateInDef, type ZodDateOutDef, type ZodFileDef, type ZodUploadDef, arrayEndpointsFactory, arrayResultHandler, attachRouting, createConfig, createMiddleware, createResultHandler, createServer, defaultEndpointsFactory, defaultResultHandler, proprietarySchemas as ez, getExamples, getMessageFromError, getStatusCodeFromError, testEndpoint, withMeta };
|
package/dist/index.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var Ir=Object.create;var Ee=Object.defineProperty;var Cr=Object.getOwnPropertyDescriptor;var wr=Object.getOwnPropertyNames;var Nr=Object.getPrototypeOf,vr=Object.prototype.hasOwnProperty;var Ct=(e,t)=>{for(var r in t)Ee(e,r,{get:t[r],enumerable:!0})},wt=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of wr(t))!vr.call(e,n)&&n!==r&&Ee(e,n,{get:()=>t[n],enumerable:!(o=Cr(t,n))||o.enumerable});return e};var z=(e,t,r)=>(r=e!=null?Ir(Nr(e)):{},wt(t||!e||!e.__esModule?Ee(r,"default",{value:e,enumerable:!0}):r,e)),zr=e=>wt(Ee({},"__esModule",{value:!0}),e);var fn={};Ct(fn,{AbstractEndpoint:()=>X,DependsOnMethod:()=>ue,Documentation:()=>Be,DocumentationError:()=>I,EndpointsFactory:()=>me,InputValidationError:()=>F,Integration:()=>Ye,MissingPeerError:()=>ae,OutputValidationError:()=>q,RoutingError:()=>Y,ServeStatic:()=>fe,arrayEndpointsFactory:()=>Bt,arrayResultHandler:()=>Le,attachRouting:()=>Qt,createConfig:()=>Nt,createMiddleware:()=>He,createResultHandler:()=>je,createServer:()=>Xt,defaultEndpointsFactory:()=>$t,defaultResultHandler:()=>le,ez:()=>Et,getExamples:()=>k,getMessageFromError:()=>U,getStatusCodeFromError:()=>Re,testEndpoint:()=>ur,withMeta:()=>L});module.exports=zr(fn);function Nt(e){return e}var K=require("zod");var Mt=require("http-errors"),jt=require("crypto"),A=require("zod");var b=require("zod");var Dr="ZodFile",Mr=/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/,N=class e extends b.ZodType{_parse(t){let{status:r,ctx:o}=this._processInputParams(t),n=o.parsedType===b.ZodParsedType.string&&typeof o.data=="string";if(this.isString&&!n)return(0,b.addIssueToContext)(o,{code:b.ZodIssueCode.invalid_type,expected:b.ZodParsedType.string,received:o.parsedType}),b.INVALID;let s=o.parsedType===b.ZodParsedType.object&&Buffer.isBuffer(o.data);return this.isBuffer&&!s?((0,b.addIssueToContext)(o,{code:b.ZodIssueCode.invalid_type,expected:b.ZodParsedType.object,received:o.parsedType,message:"Expected Buffer"}),b.INVALID):(n&&this.isBase64&&!Mr.test(o.data)&&((0,b.addIssueToContext)(o,{code:b.ZodIssueCode.custom,message:this._def.message||"Does not match base64 encoding"}),r.dirty()),{status:r.value,value:o.data})}string=t=>new e({...this._def,...Te(t),type:""});buffer=t=>new e({...this._def,...Te(t),type:Buffer.from([])});binary=t=>new e({...this._def,...Te(t),encoding:"binary"});base64=t=>new e({...this._def,...Te(t),encoding:"base64"});get isBinary(){return this._def.encoding==="binary"}get isBase64(){return this._def.encoding==="base64"}get isString(){return typeof this._def.type=="string"}get isBuffer(){return Buffer.isBuffer(this._def.type)}static create=()=>new e({typeName:Dr,type:""})};var Ie=require("ramda"),E="expressZodApiMeta",jr=e=>{let t=e.constructor,r=(0,Ie.clone)(e._def);return r[E]=r[E]||{examples:[]},new t(r)},L=e=>{let t=jr(e);return Object.defineProperties(t,{example:{get:()=>r=>{let o=L(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,zt=(e,t)=>{if(!vt(e))return;let r=e._def;return t in r[E]?r[E][t]:void 0},Ce=(e,t)=>{if(!vt(e))return t;let r=L(t),o=be(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,Ie.mergeDeepRight)({...n},{...s}));return r};var W="application/json",Se="multipart/form-data",Dt="application/octet-stream";var C=require("zod"),Lr="ZodUpload",Ur=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",ne=class e extends C.ZodType{_parse(t){let{ctx:r}=this._processInputParams(t);return r.parsedType!==C.ZodParsedType.object||!Ur(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:Lr})};var kr=e=>{let r=(e.header("content-type")||"").slice(0,Se.length).toLowerCase()===Se;return"files"in e&&r},we={get:["query","params"],post:["body","params","files"],put:["body","params"],patch:["body","params"],delete:["query","params"]},Hr=["body","query","params"],et=e=>e.method.toLowerCase(),tt=e=>e.startsWith("x-"),Fr=e=>Object.entries(e.headers).reduce((t,[r,o])=>tt(r)?{...t,[r]:o}:t,{}),Lt=(e,t)=>{let r=et(e);if(r==="options")return{};let o=Hr;return r in we&&(o=we[r]),t&&r in t&&(o=t[r]||o),o.filter(n=>n==="files"?kr(e):!0).reduce((n,s)=>({...n,...s==="headers"?Fr(e):e[s]}),{})},Ne=e=>!isNaN(e.getTime()),se=e=>e instanceof Error?e:new Error(typeof e=="symbol"?e.toString():`${e}`),U=e=>e instanceof A.z.ZodError?e.issues.map(({path:t,message:r})=>(t.length?[t.join("/")]:[]).concat(r).join(": ")).join("; "):e instanceof q?`output${e.originalError.issues[0]?.path.length>0?"/":": "}${e.message}`:e.message,Re=e=>(0,Mt.isHttpError)(e)?e.statusCode:e instanceof F?400:500,rt=({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})},
|
|
4
|
-
Caused by ${n?"response":"input"} schema of an Endpoint assigned to ${r.toUpperCase()} method of ${o} path.`;super(s)}},V=class extends Error{name="IOSchemaError"},q=class extends V{name="OutputValidationError";originalError;constructor(t){super(
|
|
5
|
-
Original error: ${e.originalError.message}.`:""))};var Ht=(e,t=[
|
|
3
|
+
`,{url:t.url,payload:r})},k=({schema:e,variant:t="original",validate:r=t==="parsed"})=>{let o=zt(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},be=(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}},Oe=e=>e.reduce((t,r)=>t||r,!1),G=e=>e instanceof A.z.ZodEffects&&e._def.effect.type!=="refinement"?!0:e instanceof A.z.ZodUnion?Oe(e.options.map(G)):e instanceof A.z.ZodIntersection?Oe([e._def.left,e._def.right].map(G)):!1,D=({subject:e,condition:t,maxDepth:r,depth:o=1})=>{if(t(e))return!0;if(r!==void 0&&o>=r)return!1;let n={condition:t,maxDepth:r,depth:o+1};return e instanceof A.z.ZodObject?Oe(Object.values(e.shape).map(s=>D({subject:s,...n}))):e instanceof A.z.ZodUnion?Oe(e.options.map(s=>D({subject:s,...n}))):e instanceof A.z.ZodIntersection?Oe([e._def.left,e._def.right].map(s=>D({subject:s,...n}))):e instanceof A.z.ZodOptional||e instanceof A.z.ZodNullable?D({subject:e.unwrap(),...n}):e instanceof A.z.ZodEffects||e instanceof A.z.ZodTransformer?D({subject:e.innerType(),...n}):e instanceof A.z.ZodRecord?D({subject:e.valueSchema,...n}):e instanceof A.z.ZodArray?D({subject:e.element,...n}):e instanceof A.z.ZodDefault?D({subject:e._def.innerType,...n}):!1},Ut=e=>D({subject:e,condition:t=>t instanceof ne}),ie=e=>D({subject:e,condition:t=>t instanceof N,maxDepth:3}),Ae=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(""),ve=e=>(0,jt.createHash)("sha1").update(JSON.stringify(e),"utf8").digest("hex"),ze=({effect:e,sample:t})=>{try{return typeof e.transform(t,{addIssue:()=>{},path:[]})}catch{return}},Te=e=>typeof e=="string"?{message:e}:e||{},Pe=async(e,t="default")=>{try{return(await import(e))[t]}catch{throw new ae(e)}};var Y=class extends Error{name="RoutingError"},I=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)}},V=class extends Error{name="IOSchemaError"},q=class extends V{name="OutputValidationError";originalError;constructor(t){super(U(t)),this.originalError=t}},F=class extends V{name="InputValidationError";originalError;constructor(t){super(U(t)),this.originalError=t}},pe=class extends Error{name="ResultHandlerError";originalError;constructor(t,r){super(t),this.originalError=r||void 0}},ae=class extends Error{name="MissingPeerError";constructor(t){super(`Missing peer dependency: '${t}'. Please install it to use the feature activated in config.`)}};var kt=e=>typeof e=="object"&&e!==null,J=e=>kt(e)&&"or"in e,Q=e=>kt(e)&&"and"in e,De=e=>({and:e.reduce((t,r)=>t.concat(Q(r)?r.and:r),[])}),Me=(e,t)=>Q(e)?{and:e.and.map(r=>J(r)?{or:r.or.map(t)}:t(r))}:J(e)?{or:e.or.map(r=>Q(r)?{and:r.and.map(t)}:t(r))}:t(e),ot=e=>e.and.reduce((t,r)=>{let o=be(t.or,J(r)?r.or:[r]);return o.type==="single"?t.or.push(...o.value):t.or=o.value.map(De),t},{or:[]}),de=(e,t)=>{if(Q(e))return Q(t)?De([e,t]):J(t)?de(ot(e),t):De([e,t]);if(J(e)){if(Q(t))return de(t,e);if(J(t)){let{type:r,value:o}=be(e.or,t.or);return{or:r==="single"?o:o.map(De)}}return de(e,{and:[t]})}return Q(t)||J(t)?de(t,e):{and:[e,t]}};var v=require("zod");var ce={positive:200,negative:400},je=e=>e,le=je({getPositiveResponse:e=>{let t=k({schema:e}),r=L(v.z.object({status:v.z.literal("success"),data:e}));return t.reduce((o,n)=>o.example({status:"success",data:n}),r)},getNegativeResponse:()=>L(v.z.object({status:v.z.literal("error"),error:v.z.object({message:v.z.string()})})).example({status:"error",error:{message:U(new Error("Sample error message"))}}),handler:({error:e,input:t,output:r,request:o,response:n,logger:s})=>{if(!e){n.status(ce.positive).json({status:"success",data:r});return}let a=Re(e);rt({logger:s,statusCode:a,request:o,error:e,input:t}),n.status(a).json({status:"error",error:{message:U(e)}})}}),Le=je({getPositiveResponse:e=>{let t=k({schema:e}),r=L("shape"in e&&"items"in e.shape&&e.shape.items instanceof v.z.ZodArray?e.shape.items:v.z.array(v.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:()=>L(v.z.string()).example(U(new Error("Sample error message"))),handler:({response:e,output:t,error:r,logger:o,request:n,input:s})=>{if(r){let a=Re(r);rt({logger:o,statusCode:a,request:n,error:r,input:s}),e.status(a).send(r.message);return}t&&"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")}}),Ue=({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 Ht=(e,t=[W])=>{if(e instanceof K.z.ZodType)return t;let{mimeTypes:r,mimeType:o}=e;return o?[o]:r||t},X=class{},ke=class extends X{#e;#r;#o;#n;#s;#i;#a;#t;#p;#d;#c;#l=[];constructor({methods:t,inputSchema:r,outputSchema:o,handler:n,resultHandler:s,getOperationId:a=()=>{},scopes:p=[],middlewares:d=[],tags:c=[],description:u,shortDescription:g}){super(),[{name:"input schema",schema:r},{name:"output schema",schema:o}].forEach(({name:h,schema:x})=>{if(G(x))throw new V(`Using transformations on the top level of endpoint ${h} is not allowed.`)}),this.#i=n,this.#a=s,this.#o=d,this.#c=a,this.#r=t,this.#p=p,this.#d=c,this.#e={long:u,short:g};let l={positive:s.getPositiveResponse(o),negative:s.getNegativeResponse()};this.#n={input:Ut(r)?[Se]:ie(r)?[Dt]:[W],positive:Ht(l.positive),negative:Ht(l.negative)},this.#t={input:r,output:o,positive:l.positive instanceof K.z.ZodType?l.positive:l.positive.schema,negative:l.negative instanceof K.z.ZodType?l.negative:l.negative.schema},this.#s={positive:l.positive instanceof K.z.ZodType?ce.positive:l.positive.statusCode||ce.positive,negative:l.negative instanceof K.z.ZodType?ce.negative:l.negative.statusCode||ce.negative}}_setSiblingMethods(t){this.#l=t}getDescription(t){return this.#e[t]}getMethods(){return this.#r}getSchema(t){return this.#t[t]}getMimeTypes(t){return this.#n[t]}getStatusCode(t){return this.#s[t]}getSecurity(){return this.#o.reduce((t,r)=>r.security?de(t,r.security):t,{and:[]})}getScopes(){return this.#p}getTags(){return this.#d}getOperationId(t){return this.#c(t)}#m(){return{"Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":this.#r.concat(this.#l).concat("options").join(", ").toUpperCase(),"Access-Control-Allow-Headers":"content-type"}}async#u(t){try{return await this.#t.output.parseAsync(t)}catch(r){throw r instanceof K.z.ZodError?new q(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(u){throw u instanceof K.z.ZodError?new F(u):u}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.#t.input.parseAsync(t)}catch(s){throw s instanceof K.z.ZodError?new F(s):s}return this.#i({input:n,options:r,logger:o})}async#g({error:t,request:r,response:o,logger:n,input:s,output:a}){try{await this.#a.handler({error:t,output:a,request:r,response:o,logger:n,input:s})}catch(p){Ue({logger:n,response:o,error:new pe(se(p).message,t)})}}async execute({request:t,response:r,logger:o,config:n}){let s=et(t),a=null,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 u in c)r.set(u,c[u])}let d=Lt(t,n.inputSources);try{let{options:c,isStreamClosed:u}=await this.#f({method:s,input:d,request:t,response:r,logger:o});if(u)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=se(c)}await this.#g({input:d,output:a,request:t,response:r,error:p,logger:o})}};var Ft=["get","post","put","delete","patch"];var nt=require("zod");var Kt=(e,t)=>{let r=e.map(({input:n})=>n).concat(t),o=r.reduce((n,s)=>n.and(s));return r.reduce((n,s)=>Ce(s,n),o)};var He=e=>{if(G(e.input))throw new V("Using transformations on the top level of middleware input schema is not allowed.");return{...e,type:"proprietary"}};var me=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:nt.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(He({input:nt.z.object({}),middleware:async()=>t})),this.resultHandler)}build({input:t,handler:r,output:o,description:n,shortDescription:s,operationId:a,...p}){let{middlewares:d,resultHandler:c}=this,u="methods"in p?p.methods:[p.method],g=typeof a=="function"?a:()=>a,l="scopes"in p?p.scopes:"scope"in p&&p.scope?[p.scope]:[],h="tags"in p?p.tags:"tag"in p&&p.tag?[p.tag]:[];return new ke({handler:r,middlewares:d,outputSchema:o,resultHandler:c,scopes:l,tags:h,methods:u,getOperationId:g,description:n,shortDescription:s,inputSchema:Kt(d,t)})}},$t=new me(le),Bt=new me(Le);var _t=require("util");var Gt=e=>typeof e=="object"&&e!==null&&"level"in e&&"color"in e&&typeof e.color=="boolean"&&typeof e.level=="string"&&["silent","warn","debug"].includes(e.level),qt=async e=>{let{createLogger:t,transports:r,format:{printf:o,timestamp:n,colorize:s,combine:a},config:{npm:p}}=await Pe("winston"),d=l=>{let{[Symbol.for("level")]:h,[Symbol.for("message")]:x,[Symbol.for("splat")]:T,...P}=l;return(0,_t.inspect)(P,!1,1,e.color)},c=l=>o(({timestamp:h,message:x,level:T,durationMs:P,...m})=>(typeof x=="object"&&(m={...m,...x},x="[No message]"),`${h} ${T}: ${x}`+(P===void 0?"":` duration: ${P}ms`)+(Object.keys(m).length===0?"":" "+(l?d(m):JSON.stringify(m))))),u=[n()],g={handleExceptions:!0};switch(e.color&&u.push(s()),e.level){case"debug":g.level="debug",u.push(c(!0));break;case"silent":case"warn":default:g.level="warn",u.push(c())}return g.format=a(...u),t({silent:e.level==="silent",levels:p.levels,transports:[new r.Console(g)],exitOnError:!1})};var ue=class{constructor(t){this.endpoints=t}};var Vt=z(require("express")),fe=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 Y(`The entry '${s}' must avoid having slashes \u2014 use nesting instead.`);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 fe)r&&a.apply(p,r);else if(a instanceof ue){if(Object.entries(a.endpoints).forEach(([d,c])=>{if(!c.getMethods().includes(d))throw new Y(`Endpoint assigned to ${d} method of ${p} must support ${d} method.`);t(c,p,d)}),n&&Object.keys(a.endpoints).length>0){let[d,...c]=Object.keys(a.endpoints),u=a.endpoints[d];u._setSiblingMethods(c),t(u,p,"options")}}else ee({onEndpoint:t,onStatic:r,hasCors:n,routing:a,parentPath:p})})};var Wt=()=>`
|
|
6
6
|
\x1B[94m\x1B[39m
|
|
7
7
|
\x1B[94m\x1B[39m
|
|
8
8
|
\x1B[94m8888888888 8888888888P 888 d8888 8888888b. 8888888 \x1B[39m
|
|
@@ -15,11 +15,11 @@ Original error: ${e.originalError.message}.`:""))};var Ht=(e,t=[Y])=>{if(e insta
|
|
|
15
15
|
\x1B[95m8888888888 888 888 88888P" 888 "Y8888 88888P' 88888P' d8888888888 "Y88P" "Y88888 d88P 888 888 8888888\x1B[39m\x1B[94m\x1B[39m
|
|
16
16
|
\x1B[94m 888\x1B[39m
|
|
17
17
|
\x1B[94m 888\x1B[3m Proudly supports transgender community.\x1B[23m\x1B[39m
|
|
18
|
-
\x1B[94m\x1B[3mfor
|
|
18
|
+
\x1B[94m\x1B[3mfor Vika \x1B[23m888\x1B[3m Start your API server with I/O schema validation and custom middlewares in minutes.\x1B[23m\x1B[39m\x1B[90m\x1B[39m
|
|
19
19
|
\x1B[90m\x1B[3m Thank you for choosing Express Zod API for your project.\x1B[23m\x1B[39m\x1B[0m\x1B[0m
|
|
20
20
|
\x1B[0m\x1B[0m
|
|
21
21
|
\x1B[0m\x1B[0m
|
|
22
|
-
`.trim();var st=({app:e,logger:t,config:r,routing:o})=>{r.startupLogo!==!1&&console.log(qt()),ee({routing:o,hasCors:!!r.cors,onEndpoint:(n,s,a)=>{e[a](s,async(d,p)=>{t.info(`${d.method}: ${s}`),await n.execute({request:d,response:p,logger:t,config:r})})},onStatic:(n,s)=>{e.use(n,s)}})};var it=A(require("express")),Vt=A(require("compression")),Yt=A(require("express-fileupload")),Jt=A(require("http")),at=A(require("https")),Qt=require("winston");var dt=A(require("http-errors")),qr=(e,t)=>(r,o,n,s)=>{if(!r)return s();e.handler({error:(0,dt.default)(400,se(r).message),request:o,response:n,logger:t,input:null,output:null})},Vr=(e,t)=>(r,o)=>{let n=(0,dt.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){Le({response:o,logger:t,error:new ae(se(s).message,n)})}},Wt=e=>{let t=e.logger instanceof Qt.Logger?e.logger:He(e.logger),r=e.errorHandler||ce,o=Vr(r,t);return{logger:t,errorHandler:r,notFoundHandler:o}},Xt=(e,t)=>{let{logger:r,notFoundHandler:o}=Wt(e);return st({app:e.app,routing:t,logger:r,config:e}),{notFoundHandler:o,logger:r}},er=(e,t)=>{let r=(0,it.default)().disable("x-powered-by");e.server.compression&&r.use((0,Vt.default)(typeof e.server.compression=="object"?e.server.compression:void 0)),r.use(e.server.jsonParser||it.default.json()),e.server.upload&&r.use((0,Yt.default)({...typeof e.server.upload=="object"?e.server.upload:{},abortOnLimit:!1,parseNested:!0})),e.server.rawParser&&(r.use(e.server.rawParser),r.use((d,{},p)=>{Buffer.isBuffer(d.body)&&(d.body={raw:d.body}),p()}));let{logger:o,errorHandler:n,notFoundHandler:s}=Wt(e);r.use(qr(n,o)),st({app:r,routing:t,logger:o,config:e}),r.use(s);let a={httpServer:Jt.default.createServer(r),httpsServer:e.https?at.default.createServer(e.https.options,r):void 0};for(let d of Object.values(a)){let p=d instanceof at.default.Server?e.https.listen:e.server.listen;d?.listen(p,()=>{typeof p=="object"?o.info("Listening",p):o.info(`Listening ${p}`)})}return{app:r,...a,logger:o}};var ur=require("openapi3-ts/oas30");var $=require("openapi3-ts/oas30"),fe=require("ramda"),b=require("zod");var O=require("zod");var pt=/^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(\.\d+)?)?Z?$/,Yr="ZodDateIn",Ke=class e extends O.ZodType{_parse(t){let{status:r,ctx:o}=this._processInputParams(t);if(o.parsedType!==O.ZodParsedType.string)return(0,O.addIssueToContext)(o,{code:O.ZodIssueCode.invalid_type,expected:O.ZodParsedType.string,received:o.parsedType}),O.INVALID;pt.test(o.data)||((0,O.addIssueToContext)(o,{code:O.ZodIssueCode.invalid_string,validation:"regex"}),r.dirty());let n=new Date(o.data);return we(n)?{status:r.value,value:n}:((0,O.addIssueToContext)(o,{code:O.ZodIssueCode.invalid_date}),O.INVALID)}static create=()=>new e({typeName:Yr})};var te=({schema:e,onEach:t,rules:r,onMissing:o,...n})=>{let s="typeName"in e._def?r[e._def.typeName]:void 0,a=n,p=s?s({schema:e,...a,next:m=>te({...m,...a,onEach:t,rules:r,onMissing:o})}):o({schema:e,...a}),c=t&&t({schema:e,prev:p,...a});return c?{...p,...c}:p};var tr=50,or="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString",Jr={integer:0,number:0,string:"",boolean:!1,object:{},null:null,array:[]},nr=/:([A-Za-z0-9_]+)/g,sr=e=>{let t=e.match(nr);return t?t.map(r=>r.slice(1)):[]},ir=e=>e.replace(nr,t=>`{${t.slice(1)}}`),Qr=({schema:{_def:{innerType:e,defaultValue:t}},next:r})=>({...r({schema:e}),default:t()}),Wr=({schema:{_def:{innerType:e}},next:t})=>t({schema:e}),Xr=()=>({format:"any"}),eo=e=>{if(e.isResponse)throw new I({message:"Please use z.upload() only for input.",...e});return{type:"string",format:"binary"}},to=({schema:{isBinary:e,isBase64:t,isBuffer:r}})=>({type:"string",format:r||e?"binary":t?"byte":"file"}),ro=({schema:{options:e},next:t})=>({oneOf:e.map(r=>t({schema:r}))}),oo=({schema:{options:e,discriminator:t},next:r})=>({discriminator:{propertyName:t},oneOf:Array.from(e.values()).map(o=>r({schema:o}))}),no=({schema:{_def:{left:e,right:t}},next:r})=>({allOf:[e,t].map(o=>r({schema:o}))}),so=({schema:e,next:t})=>t({schema:e.unwrap()}),io=({schema:e,next:t})=>t({schema:e._def.innerType}),ao=({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)}),po=({schema:{value:e}})=>({type:typeof e,enum:[e]}),co=({schema:e,isResponse:t,...r})=>{let o=Object.keys(e.shape).filter(n=>{let s=e.shape[n];return!(t&&Re(s)?s instanceof b.z.ZodOptional:s.isOptional())});return{type:"object",properties:Fe({schema:e,isResponse:t,...r}),...o.length?{required:o}:{}}},mo=()=>({type:"string",nullable:!0,format:"null"}),lo=e=>{if(e.isResponse)throw new I({message:"Please use z.dateOut() for output.",...e});return{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",pattern:pt.source,externalDocs:{url:or}}},uo=e=>{if(!e.isResponse)throw new I({message:"Please use z.dateIn() for input.",...e});return{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",externalDocs:{url:or}}},fo=e=>{throw new I({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})},yo=()=>({type:"boolean"}),go=()=>({type:"integer",format:"bigint"}),ho=e=>e.reduce((t,r)=>t&&r instanceof b.z.ZodLiteral,!0),xo=({schema:{keySchema:e,valueSchema:t},...r})=>{if(e instanceof b.z.ZodEnum||e instanceof b.z.ZodNativeEnum){let o=Object.values(e.enum),n=o.reduce((s,a)=>({...s,[a]:t}),{});return{type:"object",properties:Fe({schema:b.z.object(n),...r}),...o.length?{required:o}:{}}}if(e instanceof b.z.ZodLiteral)return{type:"object",properties:Fe({schema:b.z.object({[e.value]:t}),...r}),required:[e.value]};if(e instanceof b.z.ZodUnion&&ho(e.options)){let o=e.options.reduce((n,s)=>({...n,[`${s.value}`]:t}),{});return{type:"object",properties:Fe({schema:b.z.object(o),...r}),required:e.options.map(n=>n.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}}),bo=({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(", ")}}}},So=({schema:{isEmail:e,isURL:t,minLength:r,maxLength:o,isUUID:n,isCUID:s,isCUID2:a,isULID:d,isIP:p,isEmoji:c,isDatetime:m,_def:{checks:g}}})=>{let l=g.find(x=>x.kind==="regex"),h=g.find(x=>x.kind==="datetime"),S=l?l.regex:h?h.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",...m&&{format:"date-time"},...e&&{format:"email"},...t&&{format:"url"},...n&&{format:"uuid"},...s&&{format:"cuid"},...a&&{format:"cuid2"},...d&&{format:"ulid"},...p&&{format:"ip"},...c&&{format:"emoji"},...r!==null&&{minLength:r},...o!==null&&{maxLength:o},...S&&{pattern:`/${S.source}/${S.flags}`}}},Oo=({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}},Fe=({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 Jr?.[t]},Po=({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=ze({effect:n,sample:Ro(o)});return s&&["number","string","boolean"].includes(s)?{type:s}:r({schema:b.z.any()})}if(!t&&n.type==="preprocess"&&(0,$.isSchemaObject)(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"]}),Ao=({schema:e,next:t})=>t({schema:e.unwrap()}),Eo=({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}))))()},ar=(e,t,r=[])=>{let o=U({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,fe.omit)(r,s):s}}),{})}},Io=(e,t,r)=>{let o=U({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,{})}},Ze=(e,t)=>{if(e instanceof b.z.ZodObject)return e;let r;if(e instanceof b.z.ZodUnion||e instanceof b.z.ZodDiscriminatedUnion)r=Array.from(e.options.values()).map(o=>Ze(o,t)).reduce((o,n)=>o.merge(n.partial()),b.z.object({}));else if(e instanceof b.z.ZodEffects){if(G(e))throw new I({message:`Using transformations on the top level of ${t.isResponse?"response":"input"} schema is not allowed.`,...t});r=Ze(e._def.schema,t)}else r=Ze(e._def.left,t).merge(Ze(e._def.right,t));return Ie(e,r)},dr=({path:e,method:t,endpoint:r,inputSources:o,serializer:n,getRef:s,makeRef:a,composition:d,clue:p="parameter"})=>{let c=r.getSchema("input"),m=Ze(c,{path:e,method:t,isResponse:!1}).shape,g=sr(e),l=o.includes("query"),h=o.includes("params"),S=o.includes("headers"),x=u=>h&&g.includes(u),M=u=>S&&tt(u);return Object.keys(m).filter(u=>l||x(u)).map(u=>{let R=te({schema:m[u],isResponse:!1,rules:mt,onEach:lt,onMissing:ut,serializer:n,getRef:s,makeRef:a,path:e,method:t}),j=d==="components"?a(H(e,t,`${p} ${u}`),R):R;return{name:u,in:x(u)?"path":M(u)?"header":"query",required:!m[u].isOptional(),description:(0,$.isSchemaObject)(R)&&R.description||`${t.toUpperCase()} ${e} ${p}`,schema:j,...Io(c,!1,u)}})},mt={ZodString:So,ZodNumber:Oo,ZodBigInt:go,ZodBoolean:yo,ZodDateIn:lo,ZodDateOut:uo,ZodNull:mo,ZodArray:To,ZodTuple:bo,ZodRecord:xo,ZodObject:co,ZodLiteral:po,ZodIntersection:no,ZodUnion:ro,ZodFile:to,ZodUpload:eo,ZodAny:Xr,ZodDefault:Qr,ZodEnum:rr,ZodNativeEnum:rr,ZodEffects:Po,ZodOptional:so,ZodNullable:ao,ZodDiscriminatedUnion:oo,ZodBranded:Ao,ZodDate:fo,ZodCatch:Wr,ZodPipeline:Zo,ZodLazy:Eo,ZodReadonly:io},lt=({schema:e,isResponse:t,prev:r})=>{if((0,$.isReferenceObject)(r))return{};let{description:o}=e,n=e instanceof b.z.ZodLazy,s=r.type!==void 0,a=t&&Re(e),d=!n&&s&&!a&&e.isNullable(),p=n?[]:U({schema:e,variant:t?"parsed":"original",validate:!0});return{...o&&{description:o},...d&&{nullable:!0},...p.length>0&&{example:p[0]}}},ut=({schema:e,...t})=>{throw new I({message:`Zod type ${e.constructor.name} is unsupported.`,...t})},ct=(e,t)=>{if((0,$.isReferenceObject)(e))return e;let r=e.properties?(0,fe.omit)(t,e.properties):void 0,o=e.example?(0,fe.omit)(t,e.example):void 0,n=e.required?e.required.filter(d=>!t.includes(d)):void 0,s=e.allOf?e.allOf.map(d=>ct(d,t)):void 0,a=e.oneOf?e.oneOf.map(d=>ct(d,t)):void 0;return(0,fe.omit)(Object.entries({properties:r,required:n,example:o,allOf:s,oneOf:a}).filter(([{},d])=>d===void 0).map(([d])=>d),{...e,properties:r,required:n,example:o,allOf:s,oneOf:a})},pr=e=>(0,$.isSchemaObject)(e)?(0,fe.omit)(["example"],e):e,ft=({method:e,path:t,endpoint:r,isPositive:o,serializer:n,getRef:s,makeRef:a,composition:d,clue:p="response"})=>{let c=r.getSchema(o?"positive":"negative"),m=r.getMimeTypes(o?"positive":"negative"),g=pr(te({schema:c,isResponse:!0,rules:mt,onEach:lt,onMissing:ut,serializer:n,getRef:s,makeRef:a,path:t,method:e})),l=ar(c,!0),h=d==="components"?a(H(t,e,p),g):g;return{description:`${e.toUpperCase()} ${t} ${p}`,content:m.reduce((S,x)=>({...S,[x]:{schema:h,...l}}),{})}},Co=()=>({type:"http",scheme:"basic"}),wo=({format:e})=>({type:"http",scheme:"bearer",...e&&{bearerFormat:e}}),No=({name:e})=>({type:"apiKey",in:"query",name:e}),zo=({name:e})=>({type:"apiKey",in:"header",name:e}),Do=({name:e})=>({type:"apiKey",in:"cookie",name:e}),vo=({url:e})=>({type:"openIdConnect",openIdConnectUrl:e}),Mo=({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}}},{})}),cr=e=>{let t={basic:Co,bearer:wo,input:No,header:zo,cookie:Do,openid:vo,oauth2:Mo};return ve(e,r=>t[r.type](r))},$e=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 $e(ot(e))}return $e({or:[e]})},mr=({method:e,path:t,endpoint:r,serializer:o,getRef:n,makeRef:s,composition:a,clue:d="request body"})=>{let p=sr(t),c=r.getSchema("input"),m=pr(ct(te({schema:ie(c)?N.create().buffer():c,isResponse:!1,rules:mt,onEach:lt,onMissing:ut,serializer:o,getRef:n,makeRef:s,path:t,method:e}),p)),g=ar(r.getSchema("input"),!1,p),l=a==="components"?s(H(t,e,d),m):m;return{description:`${e.toUpperCase()} ${t} ${d}`,content:r.getMimeTypes("input").reduce((h,S)=>({...h,[S]:{schema:l,...g}}),{})}},lr=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}}}}),yt=e=>e.length<=tr?e:e.slice(0,tr-1)+"\u2026";var _e=class extends ur.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 I({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:d="Error response",hasSummaryFromDescription:p=!0,composition:c="inline",serializer:m=Ne}){super(),this.addInfo({title:o,version:n});for(let l of typeof s=="string"?[s]:s)this.addServer({url:l});ee({routing:t,onEndpoint:(l,h,S)=>{let x=S,M={path:h,method:x,endpoint:l,composition:c,serializer:m,getRef:this.getRef.bind(this),makeRef:this.makeRef.bind(this)},[u,R]=["short","long"].map(l.getDescription.bind(l)),j=r.inputSources?.[x]||Ce[x],ye=dr({...M,inputSources:j}),w={operationId:this.ensureUniqOperationId(h,x,l.getOperationId(x)),responses:{[l.getStatusCode("positive")]:ft({...M,clue:a,isPositive:!0}),[l.getStatusCode("negative")]:ft({...M,clue:d,isPositive:!1})}};R&&(w.description=R,p&&u===void 0&&(w.summary=yt(R))),u&&(w.summary=yt(u)),l.getTags().length>0&&(w.tags=l.getTags()),ye.length>0&&(w.parameters=ye),j.includes("body")&&(w.requestBody=mr(M));let ge=$e(ve(cr(l.getSecurity()),he=>{let It=this.ensureUniqSecuritySchemaName(he),Ir=["oauth2","openIdConnect"].includes(he.type)?l.getScopes():[];return this.addSecurityScheme(It,he),{name:It,scopes:Ir}}));ge.length>0&&(w.security=ge);let Xe=ir(h);this.addPath(Xe,{[x]:w})}}),this.rootDoc.tags=r.tags?lr(r.tags):[]}};var gt=A(require("http"));var jo=e=>({method:"GET",header:jest.fn(()=>Y),...e}),Lo=e=>{let t={writableEnded:!1,statusCode:200,statusMessage:gt.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=gt.default.STATUS_CODES[r],t)),json:jest.fn(()=>t),send:jest.fn(()=>t),end:jest.fn(()=>(t.writableEnded=!0,t)),...e};return t},fr=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=jo(t),d=Lo(r),p={info:jest.fn(),warn:jest.fn(),error:jest.fn(),debug:jest.fn(),...n},c={cors:!1,logger:p,...o};return await e.execute({request:a,response:d,config:c,logger:p}),{requestMock:a,responseMock:d,loggerMock:p}};var B=A(require("typescript"));var v=A(require("typescript")),i=v.default.factory,re=[i.createModifier(v.default.SyntaxKind.ExportKeyword)],ko=[i.createModifier(v.default.SyntaxKind.AsyncKeyword)],Uo=[i.createModifier(v.default.SyntaxKind.PublicKeyword),i.createModifier(v.default.SyntaxKind.ReadonlyKeyword)],yr=[i.createModifier(v.default.SyntaxKind.ProtectedKeyword),i.createModifier(v.default.SyntaxKind.ReadonlyKeyword)],Ho=i.createTemplateHead(""),Ko=i.createTemplateTail(""),Fo=i.createTemplateMiddle(" "),ht=e=>i.createTemplateLiteralType(Ho,e.map((t,r)=>i.createTemplateLiteralTypeSpan(i.createTypeReferenceNode(t),r===e.length-1?Ko:Fo))),xt=ht(["M","P"]),Be=(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(Be(o,e[o],t)),[]),Tt=(e,t)=>i.createExpressionWithTypeArguments(i.createIdentifier("Record"),[typeof e=="number"?i.createKeywordTypeNode(e):i.createTypeReferenceNode(e),i.createKeywordTypeNode(t)]),gr=e=>i.createConstructorDeclaration(void 0,e,i.createBlock([])),bt=(e,t)=>i.createPropertySignature(void 0,`"${e}"`,void 0,i.createTypeReferenceNode(t)),St=(e,t)=>i.createVariableDeclarationList([i.createVariableDeclaration(e,void 0,void 0,t)],v.default.NodeFlags.Const),Ot=(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),hr=(e,t,r)=>i.createPropertyDeclaration(Uo,e,void 0,t,r),xr=(e,t,r=[])=>i.createClassDeclaration(re,e,void 0,void 0,[t,...r]),Tr=(e,t)=>i.createTypeReferenceNode("Promise",[i.createIndexedAccessTypeNode(i.createTypeReferenceNode(e),t)]),br=()=>i.createTypeReferenceNode("Promise",[i.createKeywordTypeNode(v.default.SyntaxKind.AnyKeyword)]),Rt=(e,t,r)=>i.createInterfaceDeclaration(re,e,void 0,t,r),Sr=e=>Object.keys(e).reduce((t,r)=>t.concat(i.createTypeParameterDeclaration([],r,i.createTypeReferenceNode(e[r]))),[]),Or=(e,t)=>i.createArrowFunction(ko,void 0,e.map(r=>Be(r)),void 0,void 0,i.createCallExpression(i.createPropertyAccessExpression(i.createThis(),"implementation"),void 0,t)),Pt=(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 y=A(require("typescript")),Ar=require("zod");var _=A(require("typescript")),{factory:Ve}=_.default,Zt=(e,t)=>{_.default.addSyntheticLeadingComment(e,_.default.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0)},Ye=(e,t,r)=>{let o=Ve.createTypeAliasDeclaration(void 0,Ve.createIdentifier(t),void 0,e);return r&&Zt(o,r),o},Rr=(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)},$o=/^[A-Za-z_$][A-Za-z0-9_$]*$/,Pr=e=>$o.test(e)?Ve.createIdentifier(e):Ve.createStringLiteral(e);var{factory:f}=y.default,_o={[y.default.SyntaxKind.AnyKeyword]:"",[y.default.SyntaxKind.BigIntKeyword]:BigInt(0),[y.default.SyntaxKind.BooleanKeyword]:!1,[y.default.SyntaxKind.NumberKeyword]:0,[y.default.SyntaxKind.ObjectKeyword]:{},[y.default.SyntaxKind.StringKeyword]:"",[y.default.SyntaxKind.UndefinedKeyword]:void 0},Bo=({schema:{value:e}})=>f.createLiteralTypeNode(typeof e=="number"?f.createNumericLiteral(e):typeof e=="boolean"?e?f.createTrue():f.createFalse():f.createStringLiteral(e)),Go=({schema:{shape:e},isResponse:t,next:r,optionalPropStyle:{withQuestionMark:o}})=>{let n=Object.entries(e).map(([s,a])=>{let d=t&&Re(a)?a instanceof Ar.z.ZodOptional:a.isOptional(),p=f.createPropertySignature(void 0,Pr(s),d&&o?f.createToken(y.default.SyntaxKind.QuestionToken):void 0,r({schema:a}));return a.description&&Zt(p,a.description),p});return f.createTypeLiteralNode(n)},qo=({schema:{element:e},next:t})=>f.createArrayTypeNode(t({schema:e})),Vo=({schema:{options:e}})=>f.createUnionTypeNode(e.map(t=>f.createLiteralTypeNode(f.createStringLiteral(t)))),Zr=({schema:{options:e},next:t})=>f.createUnionTypeNode(e.map(r=>t({schema:r}))),Yo=e=>_o?.[e.kind],Jo=({schema:e,next:t,isResponse:r})=>{let o=t({schema:e.innerType()}),n=e._def.effect;if(r&&n.type==="transform"){let s=ze({effect:n,sample:Yo(o)}),a={number:y.default.SyntaxKind.NumberKeyword,bigint:y.default.SyntaxKind.BigIntKeyword,boolean:y.default.SyntaxKind.BooleanKeyword,string:y.default.SyntaxKind.StringKeyword,undefined:y.default.SyntaxKind.UndefinedKeyword,object:y.default.SyntaxKind.ObjectKeyword};return f.createKeywordTypeNode(s&&a[s]||y.default.SyntaxKind.AnyKeyword)}return o},Qo=({schema:e})=>f.createUnionTypeNode(Object.values(e.enum).map(t=>f.createLiteralTypeNode(typeof t=="number"?f.createNumericLiteral(t):f.createStringLiteral(t)))),Wo=({next:e,schema:t,optionalPropStyle:{withUndefined:r}})=>{let o=e({schema:t.unwrap()});return r?f.createUnionTypeNode([o,f.createKeywordTypeNode(y.default.SyntaxKind.UndefinedKeyword)]):o},Xo=({next:e,schema:t})=>f.createUnionTypeNode([e({schema:t.unwrap()}),f.createLiteralTypeNode(f.createNull())]),en=({next:e,schema:{items:t}})=>f.createTupleTypeNode(t.map(r=>e({schema:r}))),tn=({next:e,schema:{keySchema:t,valueSchema:r}})=>f.createExpressionWithTypeArguments(f.createIdentifier("Record"),[e({schema:t}),e({schema:r})]),rn=({next:e,schema:t})=>f.createIntersectionTypeNode([t._def.left,t._def.right].map(r=>e({schema:r}))),on=({next:e,schema:t})=>e({schema:t._def.innerType}),oe=e=>()=>f.createKeywordTypeNode(e),nn=({next:e,schema:t})=>e({schema:t.unwrap()}),sn=({next:e,schema:t})=>e({schema:t._def.innerType}),an=({next:e,schema:t})=>e({schema:t._def.innerType}),dn=({schema:e,next:t,isResponse:r})=>t({schema:e._def[r?"out":"in"]}),pn=()=>f.createLiteralTypeNode(f.createNull()),cn=({getAlias:e,makeAlias:t,next:r,serializer:o,schema:n})=>{let s=`Type${o(n.schema)}`;return e(s)||(()=>(t(s,f.createLiteralTypeNode(f.createNull())),t(s,r({schema:n.schema}))))()},mn=({schema:{isBuffer:e}})=>e?f.createTypeReferenceNode("Buffer"):f.createKeywordTypeNode(y.default.SyntaxKind.StringKeyword),ln={ZodString:oe(y.default.SyntaxKind.StringKeyword),ZodNumber:oe(y.default.SyntaxKind.NumberKeyword),ZodBigInt:oe(y.default.SyntaxKind.BigIntKeyword),ZodBoolean:oe(y.default.SyntaxKind.BooleanKeyword),ZodDateIn:oe(y.default.SyntaxKind.StringKeyword),ZodDateOut:oe(y.default.SyntaxKind.StringKeyword),ZodNull:pn,ZodArray:qo,ZodTuple:en,ZodRecord:tn,ZodObject:Go,ZodLiteral:Bo,ZodIntersection:rn,ZodUnion:Zr,ZodFile:mn,ZodAny:oe(y.default.SyntaxKind.AnyKeyword),ZodDefault:on,ZodEnum:Vo,ZodNativeEnum:Qo,ZodEffects:Jo,ZodOptional:Wo,ZodNullable:Xo,ZodDiscriminatedUnion:Zr,ZodBranded:nn,ZodCatch:an,ZodPipeline:dn,ZodLazy:cn,ZodReadonly:sn},At=({schema:e,...t})=>te({schema:e,rules:ln,onMissing:()=>f.createKeywordTypeNode(y.default.SyntaxKind.AnyKeyword),...t});var Je=class{agg=[];registry={};paths=[];aliases={};getAlias(t){return t in this.aliases?i.createTypeReferenceNode(t):void 0}makeAlias(t,r){return this.aliases[t]=Ye(r,t),this.getAlias(t)}constructor({routing:t,variant:r="client",serializer:o=Ne,optionalPropStyle:n={withQuestionMark:!0,withUndefined:!0}}){ee({routing:t,onEndpoint:(u,R,j)=>{let ye=H(R,j,"input"),We=H(R,j,"response"),w={serializer:o,getAlias:this.getAlias.bind(this),makeAlias:this.makeAlias.bind(this),optionalPropStyle:n},ge=u.getSchema("input"),Xe=At({...w,schema:ie(ge)?N.create().buffer():ge,isResponse:!1}),he=At({...w,isResponse:!0,schema:u.getSchema("positive").or(u.getSchema("negative"))});this.agg.push(Ye(Xe,ye),Ye(he,We)),j!=="options"&&(this.paths.push(R),this.registry[`${j} ${R}`]={in:ye,out:We,isJson:u.getMimeTypes("positive").includes(Y),tags:u.getTags()})}}),this.agg=Object.values(this.aliases).concat(this.agg);let s=Ot("Path",this.paths),a=Ot("Method",Kt),d=qe("MethodPath",ht([a.name,s.name])),p=[i.createHeritageClause(B.default.SyntaxKind.ExtendsKeyword,[Tt(d.name,B.default.SyntaxKind.AnyKeyword)])],c=Rt("Input",p,Object.keys(this.registry).map(u=>bt(u,this.registry[u].in))),m=Rt("Response",p,Object.keys(this.registry).map(u=>bt(u,this.registry[u].out)));if(this.agg.push(s,a,d,c,m),r==="types")return;let g=i.createVariableStatement(re,St("jsonEndpoints",i.createObjectLiteralExpression(Object.keys(this.registry).filter(u=>this.registry[u].isJson).map(u=>i.createPropertyAssignment(`"${u}"`,i.createTrue()))))),l=i.createVariableStatement(re,St("endpointTags",i.createObjectLiteralExpression(Object.keys(this.registry).map(u=>i.createPropertyAssignment(`"${u}"`,i.createArrayLiteralExpression(this.registry[u].tags.map(R=>i.createStringLiteral(R)))))))),h=qe("Provider",i.createFunctionTypeNode(Sr({M:a.name,P:s.name}),Ge({method:i.createTypeReferenceNode("M"),path:i.createTypeReferenceNode("P"),params:i.createIndexedAccessTypeNode(i.createTypeReferenceNode(c.name),xt)}),Tr(m.name,xt))),S=qe("Implementation",i.createFunctionTypeNode(void 0,Ge({method:i.createTypeReferenceNode(a.name),path:i.createKeywordTypeNode(B.default.SyntaxKind.StringKeyword),params:Tt(B.default.SyntaxKind.StringKeyword,B.default.SyntaxKind.AnyKeyword)}),br())),x=i.createTemplateExpression(i.createTemplateHead(":"),[i.createTemplateSpan(i.createIdentifier("key"),i.createTemplateTail(""))]),M=xr("ExpressZodAPIClient",gr([Be("implementation",i.createTypeReferenceNode(S.name),yr)]),[hr("provide",i.createTypeReferenceNode(h.name),Or(["method","path","params"],[i.createIdentifier("method"),Pt("params",i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("acc"),"replace"),void 0,[x,i.createElementAccessExpression(i.createIdentifier("params"),i.createIdentifier("key"))]),i.createIdentifier("path")),Pt("params",i.createConditionalExpression(i.createBinaryExpression(i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("path"),"indexOf"),void 0,[x]),B.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())]))]);B.default.addSyntheticLeadingComment(M,B.default.SyntaxKind.MultiLineCommentTrivia,`
|
|
22
|
+
`.trim();var st=({app:e,logger:t,config:r,routing:o})=>{r.startupLogo!==!1&&console.log(Wt()),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 it=z(require("express")),Yt=z(require("http")),at=z(require("https"));var pt=z(require("http-errors")),Kr=(e,t)=>(r,o,n,s)=>{if(!r)return s();e.handler({error:(0,pt.default)(400,se(r).message),request:o,response:n,logger:t,input:null,output:null})},$r=(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){Ue({response:o,logger:t,error:new pe(se(s).message,n)})}},Jt=async e=>{let t=Gt(e.logger)?await qt(e.logger):e.logger,r=e.errorHandler||le,o=$r(r,t);return{logger:t,errorHandler:r,notFoundHandler:o}},Qt=async(e,t)=>{let{logger:r,notFoundHandler:o}=await Jt(e);return st({app:e.app,routing:t,logger:r,config:e}),{notFoundHandler:o,logger:r}},Xt=async(e,t)=>{let r=(0,it.default)().disable("x-powered-by");if(e.server.compression){let p=await Pe("compression");r.use(p(typeof e.server.compression=="object"?e.server.compression:void 0))}if(r.use(e.server.jsonParser||it.default.json()),e.server.upload){let p=await Pe("express-fileupload");r.use(p({...typeof e.server.upload=="object"?e.server.upload:{},abortOnLimit:!1,parseNested:!0}))}e.server.rawParser&&(r.use(e.server.rawParser),r.use((p,{},d)=>{Buffer.isBuffer(p.body)&&(p.body={raw:p.body}),d()}));let{logger:o,errorHandler:n,notFoundHandler:s}=await Jt(e);r.use(Kr(n,o)),st({app:r,routing:t,logger:o,config:e}),r.use(s);let a={httpServer:Yt.default.createServer(r),httpsServer:e.https?at.default.createServer(e.https.options,r):void 0};for(let p of Object.values(a)){let d=p instanceof at.default.Server?e.https.listen:e.server.listen;p?.listen(d,()=>{typeof d=="object"?o.info("Listening",d):o.info(`Listening ${d}`)})}return{app:r,...a,logger:o}};var mr=require("openapi3-ts/oas30");var $=require("openapi3-ts/oas30"),ye=require("ramda"),S=require("zod");var O=require("zod");var dt=/^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(\.\d+)?)?Z?$/,Br="ZodDateIn",Fe=class e extends O.ZodType{_parse(t){let{status:r,ctx:o}=this._processInputParams(t);if(o.parsedType!==O.ZodParsedType.string)return(0,O.addIssueToContext)(o,{code:O.ZodIssueCode.invalid_type,expected:O.ZodParsedType.string,received:o.parsedType}),O.INVALID;dt.test(o.data)||((0,O.addIssueToContext)(o,{code:O.ZodIssueCode.invalid_string,validation:"regex"}),r.dirty());let n=new Date(o.data);return Ne(n)?{status:r.value,value:n}:((0,O.addIssueToContext)(o,{code:O.ZodIssueCode.invalid_date}),O.INVALID)}static create=()=>new e({typeName:Br})};var te=({schema:e,onEach:t,rules:r,onMissing:o,...n})=>{let s="typeName"in e._def?r[e._def.typeName]:void 0,a=n,d=s?s({schema:e,...a,next:u=>te({...u,...a,onEach:t,rules:r,onMissing:o})}):o({schema:e,...a}),c=t&&t({schema:e,prev:d,...a});return c?{...d,...c}:d};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=/:([A-Za-z0-9_]+)/g,nr=e=>{let t=e.match(or);return t?t.map(r=>r.slice(1)):[]},sr=e=>e.replace(or,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"}),Wr=e=>{if(e.isResponse)throw new I({message:"Please use z.upload() only for input.",...e});return{type:"string",format:"binary"}},Yr=({schema:{isBinary:e,isBase64:t,isBuffer:r}})=>({type:"string",format:r||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}))}),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()})}),tr=({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&&Ae(s)?s instanceof S.z.ZodOptional:s.isOptional())});return{type:"object",properties:Ke({schema:e,isResponse:t,...r}),...o.length?{required:o}:{}}},so=()=>({type:"string",nullable:!0,format:"null"}),io=e=>{if(e.isResponse)throw new I({message:"Please use z.dateOut() for output.",...e});return{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",pattern:dt.source,externalDocs:{url:rr}}},ao=e=>{if(!e.isResponse)throw new I({message:"Please use z.dateIn() for input.",...e});return{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",externalDocs:{url:rr}}},po=e=>{throw new I({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=e=>e.reduce((t,r)=>t&&r instanceof S.z.ZodLiteral,!0),uo=({schema:{keySchema:e,valueSchema:t},...r})=>{if(e instanceof S.z.ZodEnum||e instanceof S.z.ZodNativeEnum){let o=Object.values(e.enum),n=o.reduce((s,a)=>({...s,[a]:t}),{});return{type:"object",properties:Ke({schema:S.z.object(n),...r}),...o.length?{required:o}:{}}}if(e instanceof S.z.ZodLiteral)return{type:"object",properties:Ke({schema:S.z.object({[e.value]:t}),...r}),required:[e.value]};if(e instanceof S.z.ZodUnion&&mo(e.options)){let o=e.options.reduce((n,s)=>({...n,[`${s.value}`]:t}),{});return{type:"object",properties:Ke({schema:S.z.object(o),...r}),required:e.options.map(n=>n.value)}}return{type:"object",additionalProperties:r.next({schema:t})}},fo=({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}}),yo=({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(", ")}}}},go=({schema:{isEmail:e,isURL:t,minLength:r,maxLength:o,isUUID:n,isCUID:s,isCUID2:a,isULID:p,isIP:d,isEmoji:c,isDatetime:u,_def:{checks:g}}})=>{let l=g.find(T=>T.kind==="regex"),h=g.find(T=>T.kind==="datetime"),x=l?l.regex:h?h.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",...u&&{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},...x&&{pattern:`/${x.source}/${x.flags}`}}},ho=({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]})}),{}),xo=e=>{let t=Array.isArray(e.type)?e.type[0]:e.type;return _r?.[t]},To=({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=ze({effect:n,sample:xo(o)});return s&&["number","string","boolean"].includes(s)?{type:s}:r({schema:S.z.any()})}if(!t&&n.type==="preprocess"&&(0,$.isSchemaObject)(o)){let{type:s,...a}=o;return{...a,format:`${a.format||s} (preprocessed)`}}return o},bo=({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}))))()},ir=(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,ye.omit)(r,s):s}}),{})}},Ro=(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,{})}},Ze=(e,t)=>{if(e instanceof S.z.ZodObject)return e;let r;if(e instanceof S.z.ZodUnion||e instanceof S.z.ZodDiscriminatedUnion)r=Array.from(e.options.values()).map(o=>Ze(o,t)).reduce((o,n)=>o.merge(n.partial()),S.z.object({}));else if(e instanceof S.z.ZodEffects){if(G(e))throw new I({message:`Using transformations on the top level of ${t.isResponse?"response":"input"} schema is not allowed.`,...t});r=Ze(e._def.schema,t)}else r=Ze(e._def.left,t).merge(Ze(e._def.right,t));return Ce(e,r)},ar=({path:e,method:t,endpoint:r,inputSources:o,serializer:n,getRef:s,makeRef:a,composition:p,clue:d="parameter"})=>{let c=r.getSchema("input"),u=Ze(c,{path:e,method:t,isResponse:!1}).shape,g=nr(e),l=o.includes("query"),h=o.includes("params"),x=o.includes("headers"),T=m=>h&&g.includes(m),P=m=>x&&tt(m);return Object.keys(u).filter(m=>l||T(m)).map(m=>{let R=te({schema:u[m],isResponse:!1,rules:lt,onEach:mt,onMissing:ut,serializer:n,getRef:s,makeRef:a,path:e,method:t}),j=p==="components"?a(H(e,t,`${d} ${m}`),R):R;return{name:m,in:T(m)?"path":P(m)?"header":"query",required:!u[m].isOptional(),description:(0,$.isSchemaObject)(R)&&R.description||`${t.toUpperCase()} ${e} ${d}`,schema:j,...Ro(c,!1,m)}})},lt={ZodString:go,ZodNumber:ho,ZodBigInt:lo,ZodBoolean:co,ZodDateIn:io,ZodDateOut:ao,ZodNull:so,ZodArray:fo,ZodTuple:yo,ZodRecord:uo,ZodObject:no,ZodLiteral:oo,ZodIntersection:Xr,ZodUnion:Jr,ZodFile:Yr,ZodUpload:Wr,ZodAny:Vr,ZodDefault:Gr,ZodEnum:tr,ZodNativeEnum:tr,ZodEffects:To,ZodOptional:eo,ZodNullable:ro,ZodDiscriminatedUnion:Qr,ZodBranded:So,ZodDate:po,ZodCatch:qr,ZodPipeline:bo,ZodLazy:Oo,ZodReadonly:to},mt=({schema:e,isResponse:t,prev:r})=>{if((0,$.isReferenceObject)(r))return{};let{description:o}=e,n=e instanceof S.z.ZodLazy,s=r.type!==void 0,a=t&&Ae(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]}}},ut=({schema:e,...t})=>{throw new I({message:`Zod type ${e.constructor.name} is unsupported.`,...t})},ct=(e,t)=>{if((0,$.isReferenceObject)(e))return e;let r=e.properties?(0,ye.omit)(t,e.properties):void 0,o=e.example?(0,ye.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=>ct(p,t)):void 0,a=e.oneOf?e.oneOf.map(p=>ct(p,t)):void 0;return(0,ye.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})},pr=e=>(0,$.isSchemaObject)(e)?(0,ye.omit)(["example"],e):e,ft=({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"),u=r.getMimeTypes(o?"positive":"negative"),g=pr(te({schema:c,isResponse:!0,rules:lt,onEach:mt,onMissing:ut,serializer:n,getRef:s,makeRef:a,path:t,method:e})),l=ir(c,!0),h=p==="components"?a(H(t,e,d),g):g;return{description:`${e.toUpperCase()} ${t} ${d}`,content:u.reduce((x,T)=>({...x,[T]:{schema:h,...l}}),{})}},Ao=()=>({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}),Io=({name:e})=>({type:"apiKey",in:"cookie",name:e}),Co=({url:e})=>({type:"openIdConnect",openIdConnectUrl:e}),wo=({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:Ao,bearer:Po,input:Zo,header:Eo,cookie:Io,openid:Co,oauth2:wo};return Me(e,r=>t[r.type](r))},$e=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 $e(ot(e))}return $e({or:[e]})},cr=({method:e,path:t,endpoint:r,serializer:o,getRef:n,makeRef:s,composition:a,clue:p="request body"})=>{let d=nr(t),c=r.getSchema("input"),u=pr(ct(te({schema:ie(c)?N.create().buffer():c,isResponse:!1,rules:lt,onEach:mt,onMissing:ut,serializer:o,getRef:n,makeRef:s,path:t,method:e}),d)),g=ir(r.getSchema("input"),!1,d),l=a==="components"?s(H(t,e,p),u):u;return{description:`${e.toUpperCase()} ${t} ${p}`,content:r.getMimeTypes("input").reduce((h,x)=>({...h,[x]:{schema:l,...g}}),{})}},lr=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}}}}),yt=e=>e.length<=er?e:e.slice(0,er-1)+"\u2026";var Be=class extends mr.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 I({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:u=ve}){super(),this.addInfo({title:o,version:n});for(let l of typeof s=="string"?[s]:s)this.addServer({url:l});ee({routing:t,onEndpoint:(l,h,x)=>{let T=x,P={path:h,method:T,endpoint:l,composition:c,serializer:u,getRef:this.getRef.bind(this),makeRef:this.makeRef.bind(this)},[m,R]=["short","long"].map(l.getDescription.bind(l)),j=r.inputSources?.[T]||we[T],ge=ar({...P,inputSources:j}),w={operationId:this.ensureUniqOperationId(h,T,l.getOperationId(T)),responses:{[l.getStatusCode("positive")]:ft({...P,clue:a,isPositive:!0}),[l.getStatusCode("negative")]:ft({...P,clue:p,isPositive:!1})}};R&&(w.description=R,d&&m===void 0&&(w.summary=yt(R))),m&&(w.summary=yt(m)),l.getTags().length>0&&(w.tags=l.getTags()),ge.length>0&&(w.parameters=ge),j.includes("body")&&(w.requestBody=cr(P));let he=$e(Me(dr(l.getSecurity()),xe=>{let It=this.ensureUniqSecuritySchemaName(xe),Er=["oauth2","openIdConnect"].includes(xe.type)?l.getScopes():[];return this.addSecurityScheme(It,xe),{name:It,scopes:Er}}));he.length>0&&(w.security=he);let Xe=sr(h);this.addPath(Xe,{[T]:w})}}),this.rootDoc.tags=r.tags?lr(r.tags):[]}};var gt=z(require("http"));var No=({fnMethod:e,requestProps:t})=>({method:"GET",header:e(()=>W),...t}),vo=({fnMethod:e,responseProps:t})=>{let r={writableEnded:!1,statusCode:200,statusMessage:gt.default.STATUS_CODES[200],set:e(()=>r),setHeader:e(()=>r),header:e(()=>r),status:e(o=>(r.statusCode=o,r.statusMessage=gt.default.STATUS_CODES[o],r)),json:e(()=>r),send:e(()=>r),end:e(()=>(r.writableEnded=!0,r)),...t};return r},ur=async({endpoint:e,requestProps:t,responseProps:r,configProps:o,loggerProps:n,fnMethod:s})=>{let a=No({fnMethod:s,requestProps:t}),p=vo({fnMethod:s,responseProps:r}),d={info:s(),warn:s(),error:s(),debug:s(),...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 _=z(require("typescript"));var M=z(require("typescript")),i=M.default.factory,re=[i.createModifier(M.default.SyntaxKind.ExportKeyword)],zo=[i.createModifier(M.default.SyntaxKind.AsyncKeyword)],Do=[i.createModifier(M.default.SyntaxKind.PublicKeyword),i.createModifier(M.default.SyntaxKind.ReadonlyKeyword)],fr=[i.createModifier(M.default.SyntaxKind.ProtectedKeyword),i.createModifier(M.default.SyntaxKind.ReadonlyKeyword)],Mo=i.createTemplateHead(""),jo=i.createTemplateTail(""),Lo=i.createTemplateMiddle(" "),ht=e=>i.createTemplateLiteralType(Mo,e.map((t,r)=>i.createTemplateLiteralTypeSpan(i.createTypeReferenceNode(t),r===e.length-1?jo:Lo))),xt=ht(["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)),[]),Tt=(e,t)=>i.createExpressionWithTypeArguments(i.createIdentifier("Record"),[typeof e=="number"?i.createKeywordTypeNode(e):i.createTypeReferenceNode(e),i.createKeywordTypeNode(t)]),yr=e=>i.createConstructorDeclaration(void 0,e,i.createBlock([])),bt=(e,t)=>i.createPropertySignature(void 0,`"${e}"`,void 0,i.createTypeReferenceNode(t)),St=(e,t)=>i.createVariableDeclarationList([i.createVariableDeclaration(e,void 0,void 0,t)],M.default.NodeFlags.Const),Ot=(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),gr=(e,t,r)=>i.createPropertyDeclaration(Do,e,void 0,t,r),hr=(e,t,r=[])=>i.createClassDeclaration(re,e,void 0,void 0,[t,...r]),xr=(e,t)=>i.createTypeReferenceNode("Promise",[i.createIndexedAccessTypeNode(i.createTypeReferenceNode(e),t)]),Tr=()=>i.createTypeReferenceNode("Promise",[i.createKeywordTypeNode(M.default.SyntaxKind.AnyKeyword)]),Rt=(e,t,r)=>i.createInterfaceDeclaration(re,e,void 0,t,r),br=e=>Object.keys(e).reduce((t,r)=>t.concat(i.createTypeParameterDeclaration([],r,i.createTypeReferenceNode(e[r]))),[]),Sr=(e,t)=>i.createArrowFunction(zo,void 0,e.map(r=>_e(r)),void 0,void 0,i.createCallExpression(i.createPropertyAccessExpression(i.createThis(),"implementation"),void 0,t)),At=(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 y=z(require("typescript")),Pr=require("zod");var B=z(require("typescript")),{factory:Ve}=B.default,Pt=(e,t)=>{B.default.addSyntheticLeadingComment(e,B.default.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0)},We=(e,t,r)=>{let o=Ve.createTypeAliasDeclaration(void 0,Ve.createIdentifier(t),void 0,e);return r&&Pt(o,r),o},Or=(e,t)=>{let r=B.default.createSourceFile("print.ts","",B.default.ScriptTarget.Latest,!1,B.default.ScriptKind.TS);return B.default.createPrinter(t).printNode(B.default.EmitHint.Unspecified,e,r)},Uo=/^[A-Za-z_$][A-Za-z0-9_$]*$/,Rr=e=>Uo.test(e)?Ve.createIdentifier(e):Ve.createStringLiteral(e);var{factory:f}=y.default,ko={[y.default.SyntaxKind.AnyKeyword]:"",[y.default.SyntaxKind.BigIntKeyword]:BigInt(0),[y.default.SyntaxKind.BooleanKeyword]:!1,[y.default.SyntaxKind.NumberKeyword]:0,[y.default.SyntaxKind.ObjectKeyword]:{},[y.default.SyntaxKind.StringKeyword]:"",[y.default.SyntaxKind.UndefinedKeyword]:void 0},Ho=({schema:{value:e}})=>f.createLiteralTypeNode(typeof e=="number"?f.createNumericLiteral(e):typeof e=="boolean"?e?f.createTrue():f.createFalse():f.createStringLiteral(e)),Fo=({schema:{shape:e},isResponse:t,next:r,optionalPropStyle:{withQuestionMark:o}})=>{let n=Object.entries(e).map(([s,a])=>{let p=t&&Ae(a)?a instanceof Pr.z.ZodOptional:a.isOptional(),d=f.createPropertySignature(void 0,Rr(s),p&&o?f.createToken(y.default.SyntaxKind.QuestionToken):void 0,r({schema:a}));return a.description&&Pt(d,a.description),d});return f.createTypeLiteralNode(n)},Ko=({schema:{element:e},next:t})=>f.createArrayTypeNode(t({schema:e})),$o=({schema:{options:e}})=>f.createUnionTypeNode(e.map(t=>f.createLiteralTypeNode(f.createStringLiteral(t)))),Ar=({schema:{options:e},next:t})=>f.createUnionTypeNode(e.map(r=>t({schema:r}))),Bo=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=ze({effect:n,sample:Bo(o)}),a={number:y.default.SyntaxKind.NumberKeyword,bigint:y.default.SyntaxKind.BigIntKeyword,boolean:y.default.SyntaxKind.BooleanKeyword,string:y.default.SyntaxKind.StringKeyword,undefined:y.default.SyntaxKind.UndefinedKeyword,object:y.default.SyntaxKind.ObjectKeyword};return f.createKeywordTypeNode(s&&a[s]||y.default.SyntaxKind.AnyKeyword)}return o},Go=({schema:e})=>f.createUnionTypeNode(Object.values(e.enum).map(t=>f.createLiteralTypeNode(typeof t=="number"?f.createNumericLiteral(t):f.createStringLiteral(t)))),qo=({next:e,schema:t,optionalPropStyle:{withUndefined:r}})=>{let o=e({schema:t.unwrap()});return r?f.createUnionTypeNode([o,f.createKeywordTypeNode(y.default.SyntaxKind.UndefinedKeyword)]):o},Vo=({next:e,schema:t})=>f.createUnionTypeNode([e({schema:t.unwrap()}),f.createLiteralTypeNode(f.createNull())]),Wo=({next:e,schema:{items:t}})=>f.createTupleTypeNode(t.map(r=>e({schema:r}))),Yo=({next:e,schema:{keySchema:t,valueSchema:r}})=>f.createExpressionWithTypeArguments(f.createIdentifier("Record"),[e({schema:t}),e({schema:r})]),Jo=({next:e,schema:t})=>f.createIntersectionTypeNode([t._def.left,t._def.right].map(r=>e({schema:r}))),Qo=({next:e,schema:t})=>e({schema:t._def.innerType}),oe=e=>()=>f.createKeywordTypeNode(e),Xo=({next:e,schema:t})=>e({schema:t.unwrap()}),en=({next:e,schema:t})=>e({schema:t._def.innerType}),tn=({next:e,schema:t})=>e({schema:t._def.innerType}),rn=({schema:e,next:t,isResponse:r})=>t({schema:e._def[r?"out":"in"]}),on=()=>f.createLiteralTypeNode(f.createNull()),nn=({getAlias:e,makeAlias:t,next:r,serializer:o,schema:n})=>{let s=`Type${o(n.schema)}`;return e(s)||(()=>(t(s,f.createLiteralTypeNode(f.createNull())),t(s,r({schema:n.schema}))))()},sn=({schema:{isBuffer:e}})=>e?f.createTypeReferenceNode("Buffer"):f.createKeywordTypeNode(y.default.SyntaxKind.StringKeyword),an={ZodString:oe(y.default.SyntaxKind.StringKeyword),ZodNumber:oe(y.default.SyntaxKind.NumberKeyword),ZodBigInt:oe(y.default.SyntaxKind.BigIntKeyword),ZodBoolean:oe(y.default.SyntaxKind.BooleanKeyword),ZodDateIn:oe(y.default.SyntaxKind.StringKeyword),ZodDateOut:oe(y.default.SyntaxKind.StringKeyword),ZodNull:on,ZodArray:Ko,ZodTuple:Wo,ZodRecord:Yo,ZodObject:Fo,ZodLiteral:Ho,ZodIntersection:Jo,ZodUnion:Ar,ZodFile:sn,ZodAny:oe(y.default.SyntaxKind.AnyKeyword),ZodDefault:Qo,ZodEnum:$o,ZodNativeEnum:Go,ZodEffects:_o,ZodOptional:qo,ZodNullable:Vo,ZodDiscriminatedUnion:Ar,ZodBranded:Xo,ZodCatch:tn,ZodPipeline:rn,ZodLazy:nn,ZodReadonly:en},Zt=({schema:e,...t})=>te({schema:e,rules:an,onMissing:()=>f.createKeywordTypeNode(y.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]=We(r,t),this.getAlias(t)}constructor({routing:t,variant:r="client",serializer:o=ve,optionalPropStyle:n={withQuestionMark:!0,withUndefined:!0}}){ee({routing:t,onEndpoint:(m,R,j)=>{let ge=H(R,j,"input"),Qe=H(R,j,"response"),w={serializer:o,getAlias:this.getAlias.bind(this),makeAlias:this.makeAlias.bind(this),optionalPropStyle:n},he=m.getSchema("input"),Xe=Zt({...w,schema:ie(he)?N.create().buffer():he,isResponse:!1}),xe=Zt({...w,isResponse:!0,schema:m.getSchema("positive").or(m.getSchema("negative"))});this.agg.push(We(Xe,ge),We(xe,Qe)),j!=="options"&&(this.paths.push(R),this.registry[`${j} ${R}`]={in:ge,out:Qe,isJson:m.getMimeTypes("positive").includes(W),tags:m.getTags()})}}),this.agg=Object.values(this.aliases).concat(this.agg);let s=Ot("Path",this.paths),a=Ot("Method",Ft),p=qe("MethodPath",ht([a.name,s.name])),d=[i.createHeritageClause(_.default.SyntaxKind.ExtendsKeyword,[Tt(p.name,_.default.SyntaxKind.AnyKeyword)])],c=Rt("Input",d,Object.keys(this.registry).map(m=>bt(m,this.registry[m].in))),u=Rt("Response",d,Object.keys(this.registry).map(m=>bt(m,this.registry[m].out)));if(this.agg.push(s,a,p,c,u),r==="types")return;let g=i.createVariableStatement(re,St("jsonEndpoints",i.createObjectLiteralExpression(Object.keys(this.registry).filter(m=>this.registry[m].isJson).map(m=>i.createPropertyAssignment(`"${m}"`,i.createTrue()))))),l=i.createVariableStatement(re,St("endpointTags",i.createObjectLiteralExpression(Object.keys(this.registry).map(m=>i.createPropertyAssignment(`"${m}"`,i.createArrayLiteralExpression(this.registry[m].tags.map(R=>i.createStringLiteral(R)))))))),h=qe("Provider",i.createFunctionTypeNode(br({M:a.name,P:s.name}),Ge({method:i.createTypeReferenceNode("M"),path:i.createTypeReferenceNode("P"),params:i.createIndexedAccessTypeNode(i.createTypeReferenceNode(c.name),xt)}),xr(u.name,xt))),x=qe("Implementation",i.createFunctionTypeNode(void 0,Ge({method:i.createTypeReferenceNode(a.name),path:i.createKeywordTypeNode(_.default.SyntaxKind.StringKeyword),params:Tt(_.default.SyntaxKind.StringKeyword,_.default.SyntaxKind.AnyKeyword)}),Tr())),T=i.createTemplateExpression(i.createTemplateHead(":"),[i.createTemplateSpan(i.createIdentifier("key"),i.createTemplateTail(""))]),P=hr("ExpressZodAPIClient",yr([_e("implementation",i.createTypeReferenceNode(x.name),fr)]),[gr("provide",i.createTypeReferenceNode(h.name),Sr(["method","path","params"],[i.createIdentifier("method"),At("params",i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("acc"),"replace"),void 0,[T,i.createElementAccessExpression(i.createIdentifier("params"),i.createIdentifier("key"))]),i.createIdentifier("path")),At("params",i.createConditionalExpression(i.createBinaryExpression(i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("path"),"indexOf"),void 0,[T]),_.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())]))]);_.default.addSyntheticLeadingComment(P,_.default.SyntaxKind.MultiLineCommentTrivia,`
|
|
23
23
|
export const exampleImplementation: Implementation = async (
|
|
24
24
|
method,
|
|
25
25
|
path,
|
|
@@ -40,6 +40,6 @@ export const exampleImplementation: Implementation = async (
|
|
|
40
40
|
|
|
41
41
|
const client = new ExpressZodAPIClient(exampleImplementation);
|
|
42
42
|
client.provide("get", "/v1/user/retrieve", { id: "10" });
|
|
43
|
-
`,!0),this.agg.push(g,l,h,
|
|
43
|
+
`,!0),this.agg.push(g,l,h,x,P)}print(t){return this.agg.map(r=>Or(r,t)).join(`
|
|
44
44
|
|
|
45
|
-
`)}};var Et={};Ct(Et,{dateIn:()=>
|
|
45
|
+
`)}};var Et={};Ct(Et,{dateIn:()=>ln,dateOut:()=>mn,file:()=>dn,raw:()=>un,upload:()=>cn});var Zr=require("zod");var Z=require("zod");var pn="ZodDateOut",Je=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):Ne(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:pn})};var dn=N.create,cn=ne.create,ln=Fe.create,mn=Je.create,un=()=>Zr.z.object({raw:N.create().buffer()});0&&(module.exports={AbstractEndpoint,DependsOnMethod,Documentation,DocumentationError,EndpointsFactory,InputValidationError,Integration,MissingPeerError,OutputValidationError,RoutingError,ServeStatic,arrayEndpointsFactory,arrayResultHandler,attachRouting,createConfig,createMiddleware,createResultHandler,createServer,defaultEndpointsFactory,defaultResultHandler,ez,getExamples,getMessageFromError,getStatusCodeFromError,testEndpoint,withMeta});
|