express-zod-api 12.4.0 → 14.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 +39 -0
- package/README.md +6 -6
- package/SECURITY.md +17 -16
- package/dist/index.d.mts +48 -63
- package/dist/index.d.ts +48 -63
- package/dist/index.js +8 -20
- package/dist/index.mjs +8 -20
- package/package.json +36 -23
package/dist/index.d.ts
CHANGED
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
import compression from 'compression';
|
|
2
|
-
import {
|
|
3
|
-
import express, { Request, Response, Express } from 'express';
|
|
2
|
+
import express, { Request, Response, NextFunction, RequestHandler, Express } from 'express';
|
|
4
3
|
import fileUpload, { UploadedFile } from 'express-fileupload';
|
|
5
4
|
import https, { ServerOptions } from 'node:https';
|
|
6
5
|
import winston, { Logger } from 'winston';
|
|
7
6
|
import { z, ZodTypeDef, ZodType, ParseInput, ParseReturnType, ZodError } from 'zod';
|
|
8
7
|
import { HttpError } from 'http-errors';
|
|
9
|
-
export { default as createHttpError } from 'http-errors';
|
|
10
8
|
import * as qs from 'qs';
|
|
11
9
|
import * as express_serve_static_core from 'express-serve-static-core';
|
|
12
10
|
import * as http from 'http';
|
|
@@ -112,7 +110,7 @@ interface MiddlewareDefinition<IN extends IOSchema<"strip">, OPT, OUT extends Fl
|
|
|
112
110
|
}
|
|
113
111
|
type AnyMiddlewareDef = MiddlewareDefinition<any, any, any, any>;
|
|
114
112
|
declare const createMiddleware: <IN extends IOSchema<"strip">, OPT, OUT extends FlatObject, SCO extends string>(props: MiddlewareCreationProps<IN, OPT, OUT, SCO>) => MiddlewareDefinition<IN, OPT, OUT, SCO>;
|
|
115
|
-
type ExpressMiddleware<R extends Request, S extends Response> = (request: R, response: S, next:
|
|
113
|
+
type ExpressMiddleware<R extends Request, S extends Response> = (request: R, response: S, next: NextFunction) => void | Promise<void>;
|
|
116
114
|
interface ExpressMiddlewareFeatures<R extends Request, S extends Response, OUT extends FlatObject> {
|
|
117
115
|
provider?: (request: R, response: S) => OUT | Promise<OUT>;
|
|
118
116
|
transformer?: (err: Error) => HttpError | Error;
|
|
@@ -127,13 +125,8 @@ type IOSchema<U extends z.UnknownKeysParam = any> = z.ZodObject<any, U> | z.ZodU
|
|
|
127
125
|
type ProbableIntersection<A extends IOSchema<"strip"> | null, B extends IOSchema> = A extends null ? B : A extends IOSchema<"strip"> ? z.ZodIntersection<A, B> : never;
|
|
128
126
|
|
|
129
127
|
type Method = "get" | "post" | "put" | "delete" | "patch";
|
|
130
|
-
type MethodsDefinition<M extends Method> = {
|
|
131
|
-
methods: M[];
|
|
132
|
-
} | {
|
|
133
|
-
method: M;
|
|
134
|
-
};
|
|
135
128
|
|
|
136
|
-
type FlatObject = Record<string,
|
|
129
|
+
type FlatObject = Record<string, unknown>;
|
|
137
130
|
declare const getMessageFromError: (error: Error) => string;
|
|
138
131
|
declare const getStatusCodeFromError: (error: Error) => number;
|
|
139
132
|
declare const getExamples: <T extends z.ZodTypeAny, V extends "original" | "parsed" | undefined>({ schema, variant, validate, }: {
|
|
@@ -153,13 +146,12 @@ declare const getExamples: <T extends z.ZodTypeAny, V extends "original" | "pars
|
|
|
153
146
|
}) => readonly (V extends "parsed" ? z.output<T> : z.input<T>)[];
|
|
154
147
|
type ErrMessage = Exclude<Parameters<typeof z.ZodString.prototype.email>[0], undefined>;
|
|
155
148
|
|
|
149
|
+
interface Metadata<T extends z.ZodTypeAny> {
|
|
150
|
+
examples: z.input<T>[];
|
|
151
|
+
}
|
|
156
152
|
declare const metaProp = "expressZodApiMeta";
|
|
157
153
|
type MetaProp = typeof metaProp;
|
|
158
|
-
type MetaDef<T extends z.ZodTypeAny> =
|
|
159
|
-
[K in MetaProp]: {
|
|
160
|
-
examples: z.input<T>[];
|
|
161
|
-
};
|
|
162
|
-
};
|
|
154
|
+
type MetaDef<T extends z.ZodTypeAny> = Record<MetaProp, Metadata<T>>;
|
|
163
155
|
type ExampleSetter<T extends z.ZodTypeAny> = (example: z.input<T>) => WithMeta<T>;
|
|
164
156
|
type WithMeta<T extends z.ZodTypeAny> = T & {
|
|
165
157
|
_def: T["_def"] & MetaDef<T>;
|
|
@@ -231,7 +223,7 @@ declare class ZodUpload extends ZodType<UploadedFile, ZodUploadDef> {
|
|
|
231
223
|
static create: () => ZodUpload;
|
|
232
224
|
}
|
|
233
225
|
|
|
234
|
-
interface OpenAPIContext {
|
|
226
|
+
interface OpenAPIContext extends FlatObject {
|
|
235
227
|
isResponse: boolean;
|
|
236
228
|
serializer: (schema: z.ZodTypeAny) => string;
|
|
237
229
|
getRef: (name: string) => ReferenceObject | undefined;
|
|
@@ -244,10 +236,6 @@ interface OpenAPIContext {
|
|
|
244
236
|
declare class RoutingError extends Error {
|
|
245
237
|
name: string;
|
|
246
238
|
}
|
|
247
|
-
/** @desc An error related to the issues of using DependsOnMethod class */
|
|
248
|
-
declare class DependsOnMethodError extends RoutingError {
|
|
249
|
-
name: string;
|
|
250
|
-
}
|
|
251
239
|
/**
|
|
252
240
|
* @desc An error related to the generating of the documentation
|
|
253
241
|
* */
|
|
@@ -275,9 +263,11 @@ declare class InputValidationError extends IOSchemaError {
|
|
|
275
263
|
}
|
|
276
264
|
|
|
277
265
|
interface ResultHandlerParams<RES> {
|
|
266
|
+
/** null in case of failure to parse or to find the matching endpoint (error: not found) */
|
|
267
|
+
input: FlatObject | null;
|
|
268
|
+
/** null in case of errors or failures */
|
|
269
|
+
output: FlatObject | null;
|
|
278
270
|
error: Error | null;
|
|
279
|
-
input: any;
|
|
280
|
-
output: any;
|
|
281
271
|
request: Request;
|
|
282
272
|
response: Response<RES>;
|
|
283
273
|
logger: Logger;
|
|
@@ -288,6 +278,7 @@ interface ResultHandlerDefinition<POS extends z.ZodTypeAny, NEG extends z.ZodTyp
|
|
|
288
278
|
getNegativeResponse: () => NEG | ApiResponse<NEG>;
|
|
289
279
|
handler: ResultHandler<z.output<POS> | z.output<NEG>>;
|
|
290
280
|
}
|
|
281
|
+
type AnyResultHandlerDefinition = ResultHandlerDefinition<z.ZodTypeAny, z.ZodTypeAny>;
|
|
291
282
|
declare const createResultHandler: <POS extends z.ZodTypeAny, NEG extends z.ZodTypeAny>(definition: ResultHandlerDefinition<POS, NEG>) => ResultHandlerDefinition<POS, NEG>;
|
|
292
283
|
declare const defaultResultHandler: ResultHandlerDefinition<z.ZodObject<{
|
|
293
284
|
status: z.ZodLiteral<"success">;
|
|
@@ -405,9 +396,9 @@ declare const defaultResultHandler: ResultHandlerDefinition<z.ZodObject<{
|
|
|
405
396
|
* @desc Responding with array is a bad practice keeping your endpoints from evolving without breaking changes.
|
|
406
397
|
* @desc This handler expects your endpoint to have the property 'items' in the output object schema
|
|
407
398
|
* */
|
|
408
|
-
declare const arrayResultHandler: ResultHandlerDefinition<z.ZodArray<
|
|
409
|
-
_def: z.ZodArrayDef<
|
|
410
|
-
example: (example: any[]) => z.ZodArray<
|
|
399
|
+
declare const arrayResultHandler: ResultHandlerDefinition<z.ZodArray<z.ZodTypeAny, "many"> & {
|
|
400
|
+
_def: z.ZodArrayDef<z.ZodTypeAny> & MetaDef<z.ZodArray<z.ZodTypeAny, "many">>;
|
|
401
|
+
example: (example: any[]) => z.ZodArray<z.ZodTypeAny, "many"> & any;
|
|
411
402
|
}, z.ZodString & {
|
|
412
403
|
_def: z.ZodStringDef & MetaDef<z.ZodString>;
|
|
413
404
|
example: (example: string) => z.ZodString & any;
|
|
@@ -441,34 +432,28 @@ declare abstract class AbstractEndpoint {
|
|
|
441
432
|
abstract _setSiblingMethods(methods: Method[]): void;
|
|
442
433
|
abstract getOperationId(method: Method): string | undefined;
|
|
443
434
|
}
|
|
444
|
-
|
|
445
|
-
middlewares: AnyMiddlewareDef[];
|
|
446
|
-
inputSchema: IN;
|
|
447
|
-
outputSchema: OUT;
|
|
448
|
-
handler: Handler<z.output<IN>, z.input<OUT>, OPT>;
|
|
449
|
-
resultHandler: ResultHandlerDefinition<POS, NEG>;
|
|
450
|
-
description?: string;
|
|
451
|
-
shortDescription?: string;
|
|
452
|
-
operationId?: string | ((method: Method) => string);
|
|
453
|
-
} & ({
|
|
454
|
-
scopes?: SCO[];
|
|
455
|
-
} | {
|
|
456
|
-
scope?: SCO;
|
|
457
|
-
}) & ({
|
|
458
|
-
tags?: TAG[];
|
|
459
|
-
} | {
|
|
460
|
-
tag?: TAG;
|
|
461
|
-
}) & MethodsDefinition<M>;
|
|
462
|
-
declare class Endpoint<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> extends AbstractEndpoint {
|
|
435
|
+
declare class Endpoint<IN extends IOSchema, OUT extends IOSchema, OPT extends FlatObject, POS extends z.ZodTypeAny, NEG extends z.ZodTypeAny, SCO extends string, TAG extends string> extends AbstractEndpoint {
|
|
463
436
|
#private;
|
|
464
|
-
constructor({
|
|
437
|
+
constructor({ methods, inputSchema, outputSchema, handler, resultHandler, getOperationId, scopes, middlewares, tags, description: long, shortDescription: short, }: {
|
|
438
|
+
middlewares?: AnyMiddlewareDef[];
|
|
439
|
+
inputSchema: IN;
|
|
440
|
+
outputSchema: OUT;
|
|
441
|
+
handler: Handler<z.output<IN>, z.input<OUT>, OPT>;
|
|
442
|
+
resultHandler: ResultHandlerDefinition<POS, NEG>;
|
|
443
|
+
description?: string;
|
|
444
|
+
shortDescription?: string;
|
|
445
|
+
getOperationId?: (method: Method) => string | undefined;
|
|
446
|
+
methods: Method[];
|
|
447
|
+
scopes?: SCO[];
|
|
448
|
+
tags?: TAG[];
|
|
449
|
+
});
|
|
465
450
|
/**
|
|
466
451
|
* @desc Sets the other methods supported by the same path. Used by Routing in DependsOnMethod case, for options.
|
|
467
452
|
* @deprecated This method is for internal needs of the library, please avoid using it.
|
|
468
453
|
* */
|
|
469
454
|
_setSiblingMethods(methods: Method[]): void;
|
|
470
455
|
getDescription(variant: DescriptionVariant): string | undefined;
|
|
471
|
-
getMethods():
|
|
456
|
+
getMethods(): Method[];
|
|
472
457
|
getSchema(variant: "input"): IN;
|
|
473
458
|
getSchema(variant: "output"): OUT;
|
|
474
459
|
getSchema(variant: "positive"): POS;
|
|
@@ -507,7 +492,7 @@ interface ServerConfig {
|
|
|
507
492
|
* @desc Custom JSON parser.
|
|
508
493
|
* @default express.json()
|
|
509
494
|
* */
|
|
510
|
-
jsonParser?:
|
|
495
|
+
jsonParser?: RequestHandler;
|
|
511
496
|
/**
|
|
512
497
|
* @desc Enable or configure uploads handling.
|
|
513
498
|
* @default false
|
|
@@ -557,7 +542,7 @@ interface CommonConfig<TAG extends string = string> {
|
|
|
557
542
|
* @default defaultResultHandler
|
|
558
543
|
* @see defaultResultHandler
|
|
559
544
|
*/
|
|
560
|
-
errorHandler?:
|
|
545
|
+
errorHandler?: AnyResultHandlerDefinition;
|
|
561
546
|
/** @desc Logger configuration or your custom winston logger. */
|
|
562
547
|
logger: LoggerConfig | Logger;
|
|
563
548
|
/**
|
|
@@ -580,7 +565,7 @@ interface CommonConfig<TAG extends string = string> {
|
|
|
580
565
|
}
|
|
581
566
|
declare const createConfig: <TAG extends string, T extends (ServerConfig | AppConfig) & CommonConfig<TAG>>(config: T) => T;
|
|
582
567
|
|
|
583
|
-
type BuildProps<IN extends IOSchema, OUT extends IOSchema, MIN extends IOSchema<"strip"> | null, OPT extends FlatObject,
|
|
568
|
+
type BuildProps<IN extends IOSchema, OUT extends IOSchema, MIN extends IOSchema<"strip"> | null, OPT extends FlatObject, SCO extends string, TAG extends string> = {
|
|
584
569
|
input: IN;
|
|
585
570
|
output: OUT;
|
|
586
571
|
handler: Handler<z.output<ProbableIntersection<MIN, IN>>, z.input<OUT>, OPT>;
|
|
@@ -588,6 +573,10 @@ type BuildProps<IN extends IOSchema, OUT extends IOSchema, MIN extends IOSchema<
|
|
|
588
573
|
shortDescription?: string;
|
|
589
574
|
operationId?: string | ((method: Method) => string);
|
|
590
575
|
} & ({
|
|
576
|
+
method: Method;
|
|
577
|
+
} | {
|
|
578
|
+
methods: Method[];
|
|
579
|
+
}) & ({
|
|
591
580
|
scopes?: SCO[];
|
|
592
581
|
} | {
|
|
593
582
|
scope?: SCO;
|
|
@@ -595,7 +584,7 @@ type BuildProps<IN extends IOSchema, OUT extends IOSchema, MIN extends IOSchema<
|
|
|
595
584
|
tags?: TAG[];
|
|
596
585
|
} | {
|
|
597
586
|
tag?: TAG;
|
|
598
|
-
})
|
|
587
|
+
});
|
|
599
588
|
declare class EndpointsFactory<POS extends z.ZodTypeAny, NEG extends z.ZodTypeAny, IN extends IOSchema<"strip"> | null = null, OUT extends FlatObject = {}, SCO extends string = string, TAG extends string = string> {
|
|
600
589
|
#private;
|
|
601
590
|
protected resultHandler: ResultHandlerDefinition<POS, NEG>;
|
|
@@ -610,7 +599,7 @@ declare class EndpointsFactory<POS extends z.ZodTypeAny, NEG extends z.ZodTypeAn
|
|
|
610
599
|
use: <R extends Request<express_serve_static_core.ParamsDictionary, any, any, qs.ParsedQs, Record<string, any>>, S extends Response<any, Record<string, any>>, AOUT extends FlatObject = {}>(middleware: ExpressMiddleware<R, S>, features?: ExpressMiddlewareFeatures<R, S, AOUT> | undefined) => EndpointsFactory<POS, NEG, IN, OUT & AOUT, SCO, TAG>;
|
|
611
600
|
addExpressMiddleware<R extends Request, S extends Response, AOUT extends FlatObject = {}>(middleware: ExpressMiddleware<R, S>, features?: ExpressMiddlewareFeatures<R, S, AOUT>): EndpointsFactory<POS, NEG, IN, OUT & AOUT, SCO, TAG>;
|
|
612
601
|
addOptions<AOUT extends FlatObject>(options: AOUT): EndpointsFactory<POS, NEG, IN, OUT & AOUT, SCO, TAG>;
|
|
613
|
-
build<BIN extends IOSchema, BOUT extends IOSchema
|
|
602
|
+
build<BIN extends IOSchema, BOUT extends IOSchema>({ input, handler, output: outputSchema, description, shortDescription, operationId, ...rest }: BuildProps<BIN, BOUT, IN, OUT, SCO, TAG>): Endpoint<ProbableIntersection<IN, BIN>, BOUT, OUT, POS, NEG, SCO, TAG>;
|
|
614
603
|
}
|
|
615
604
|
declare const defaultEndpointsFactory: EndpointsFactory<z.ZodObject<{
|
|
616
605
|
status: z.ZodLiteral<"success">;
|
|
@@ -728,9 +717,9 @@ declare const defaultEndpointsFactory: EndpointsFactory<z.ZodObject<{
|
|
|
728
717
|
* @desc Responding with array is a bad practice keeping your endpoints from evolving without breaking changes.
|
|
729
718
|
* @desc The result handler of this factory expects your endpoint to have the property 'items' in the output schema
|
|
730
719
|
*/
|
|
731
|
-
declare const arrayEndpointsFactory: EndpointsFactory<z.ZodArray<
|
|
732
|
-
_def: z.ZodArrayDef<
|
|
733
|
-
example: (example: any[]) => z.ZodArray<
|
|
720
|
+
declare const arrayEndpointsFactory: EndpointsFactory<z.ZodArray<z.ZodTypeAny, "many"> & {
|
|
721
|
+
_def: z.ZodArrayDef<z.ZodTypeAny> & MetaDef<z.ZodArray<z.ZodTypeAny, "many">>;
|
|
722
|
+
example: (example: any[]) => z.ZodArray<z.ZodTypeAny, "many"> & any;
|
|
734
723
|
}, z.ZodString & {
|
|
735
724
|
_def: z.ZodStringDef & MetaDef<z.ZodString>;
|
|
736
725
|
example: (example: string) => z.ZodString & any;
|
|
@@ -739,12 +728,8 @@ declare const arrayEndpointsFactory: EndpointsFactory<z.ZodArray<any, "many"> &
|
|
|
739
728
|
declare const createLogger: (loggerConfig: LoggerConfig) => winston.Logger;
|
|
740
729
|
|
|
741
730
|
declare class DependsOnMethod {
|
|
742
|
-
readonly
|
|
743
|
-
|
|
744
|
-
};
|
|
745
|
-
constructor(methods: {
|
|
746
|
-
[K in Method]?: Endpoint<any, any, any, K, any, any, any, any> | Endpoint<any, any, any, Method, any, any, any, any>;
|
|
747
|
-
});
|
|
731
|
+
readonly endpoints: Partial<Record<Method, AbstractEndpoint>>;
|
|
732
|
+
constructor(endpoints: Partial<Record<Method, AbstractEndpoint>>);
|
|
748
733
|
}
|
|
749
734
|
|
|
750
735
|
type OriginalStatic = typeof express.static;
|
|
@@ -773,7 +758,7 @@ declare const createServer: (config: ServerConfig & CommonConfig, routing: Routi
|
|
|
773
758
|
interface DocumentationParams {
|
|
774
759
|
title: string;
|
|
775
760
|
version: string;
|
|
776
|
-
serverUrl: string;
|
|
761
|
+
serverUrl: string | [string, ...string[]];
|
|
777
762
|
routing: Routing;
|
|
778
763
|
config: CommonConfig;
|
|
779
764
|
/** @default Successful response */
|
|
@@ -820,7 +805,7 @@ declare const testEndpoint: <REQ extends Partial<Record<keyof Request<express_se
|
|
|
820
805
|
writableEnded: boolean;
|
|
821
806
|
statusCode: number;
|
|
822
807
|
statusMessage: string;
|
|
823
|
-
} & Record<"status" | "header" | "set" | "
|
|
808
|
+
} & Record<"status" | "header" | "set" | "end" | "send" | "json" | "setHeader", jest.Mock<any, any, any>> & (RES extends undefined ? {} : RES);
|
|
824
809
|
loggerMock: Record<"error" | "warn" | "debug" | "info", jest.Mock<any, any, any>> & (LOG extends undefined ? {} : LOG);
|
|
825
810
|
}>;
|
|
826
811
|
|
|
@@ -890,4 +875,4 @@ declare namespace proprietarySchemas {
|
|
|
890
875
|
};
|
|
891
876
|
}
|
|
892
877
|
|
|
893
|
-
export { AbstractEndpoint, BasicSecurity, BearerSecurity, CommonConfig, CookieSecurity, CustomHeaderSecurity, DependsOnMethod,
|
|
878
|
+
export { AbstractEndpoint, BasicSecurity, BearerSecurity, CommonConfig, CookieSecurity, CustomHeaderSecurity, DependsOnMethod, Documentation, DocumentationError, EndpointsFactory, FlatObject, IOSchema, InputSecurity, InputValidationError, Integration, LoggerConfig, Method, MiddlewareDefinition, OAuth2Security, OpenIdSecurity, OutputValidationError, ResultHandlerDefinition, Routing, RoutingError, ServeStatic, ZodDateInDef, ZodDateOutDef, ZodFileDef, ZodUploadDef, arrayEndpointsFactory, arrayResultHandler, attachRouting, createConfig, createLogger, createMiddleware, createResultHandler, createServer, defaultEndpointsFactory, defaultResultHandler, proprietarySchemas as ez, getExamples, getMessageFromError, getStatusCodeFromError, testEndpoint, withMeta };
|
package/dist/index.js
CHANGED
|
@@ -1,20 +1,8 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var Zr=Object.create;var Re=Object.defineProperty;var Ar=Object.getOwnPropertyDescriptor;var Er=Object.getOwnPropertyNames;var Ir=Object.getPrototypeOf,Cr=Object.prototype.hasOwnProperty;var It=(e,t)=>{for(var r in t)Re(e,r,{get:t[r],enumerable:!0})},Ct=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of Er(t))!Cr.call(e,n)&&n!==r&&Re(e,n,{get:()=>t[n],enumerable:!(o=Ar(t,n))||o.enumerable});return e};var I=(e,t,r)=>(r=e!=null?Zr(Ir(e)):{},Ct(t||!e||!e.__esModule?Re(r,"default",{value:e,enumerable:!0}):r,e)),wr=e=>Ct(Re({},"__esModule",{value:!0}),e);var mn={};It(mn,{AbstractEndpoint:()=>ee,DependsOnMethod:()=>ce,Documentation:()=>Ke,DocumentationError:()=>P,EndpointsFactory:()=>pe,InputValidationError:()=>H,Integration:()=>Ge,OutputValidationError:()=>V,RoutingError:()=>J,ServeStatic:()=>le,arrayEndpointsFactory:()=>Ft,arrayResultHandler:()=>ze,attachRouting:()=>Jt,createConfig:()=>Nt,createLogger:()=>be,createMiddleware:()=>je,createResultHandler:()=>De,createServer:()=>Qt,defaultEndpointsFactory:()=>Kt,defaultResultHandler:()=>X,ez:()=>At,getExamples:()=>L,getMessageFromError:()=>k,getStatusCodeFromError:()=>he,testEndpoint:()=>lr,withMeta:()=>j});module.exports=wr(mn);var wt={silent:!0,warn:!0,debug:!0},Nt=e=>e;var K=require("zod");var Mt=require("http-errors"),vt=require("crypto"),S=require("zod");var Pe=require("ramda"),A="expressZodApiMeta",Nr=e=>{let t=e.constructor,r=(0,Pe.clone)(e._def);return r[A]=r[A]||{examples:[]},new t(r)},j=e=>{let t=Nr(e);return Object.defineProperties(t,{example:{get:()=>r=>{let o=j(t);return o._def[A].examples.push(r),o}}}),t},Dt=e=>A in e._def?typeof e._def[A]=="object"&&e._def[A]!==null:!1,zt=(e,t)=>{if(!Dt(e))return;let r=e._def;return t in r[A]?r[A][t]:void 0},Ze=(e,t)=>{if(!Dt(e))return t;let r=j(t),o=fe(r._def[A].examples,e._def[A].examples);if(r._def[A].examples=[],o.type==="single")r._def[A].examples=o.value;else for(let[n,s]of o.value)r._def[A].examples.push((0,Pe.mergeDeepRight)({...n},{...s}));return r};var Y="application/json",ye="multipart/form-data";var C=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",ne=class e extends C.ZodType{_parse(t){let{ctx:r}=this._processInputParams(t);return r.parsedType!==C.ZodParsedType.object||!zr(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:Dr})};var Mr=e=>{let r=(e.header("content-type")||"").slice(0,ye.length).toLowerCase()===ye;return"files"in e&&r},Ae={get:["query","params"],post:["body","params","files"],put:["body","params"],patch:["body","params"],delete:["query","params"]},vr=["body","query","params"],Xe=e=>e.method.toLowerCase(),et=e=>e.startsWith("x-"),jr=e=>Object.entries(e.headers).reduce((t,[r,o])=>et(r)?{...t,[r]:o}:t,{}),jt=(e,t)=>{let r=Xe(e);if(r==="options")return{};let o=vr;return r in Ae&&(o=Ae[r]),t&&r in t&&(o=t[r]||o),o.filter(n=>n==="files"?Mr(e):!0).reduce((n,s)=>({...n,...s==="headers"?jr(e):e[s]}),{})},tt=e=>typeof e=="object"&&e!==null&&"level"in e&&typeof e.level=="string"&&Object.keys(wt).includes(e.level)&&"color"in e&&typeof e.color=="boolean",Ee=e=>!isNaN(e.getTime()),se=e=>e instanceof Error?e:new Error(typeof e=="symbol"?e.toString():`${e}`),k=e=>e instanceof S.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,he=e=>(0,Mt.isHttpError)(e)?e.statusCode:e instanceof H?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)}},
|
|
5
|
-
Original error: ${e.originalError.message}.`:""))};var
|
|
6
|
-
This error should prevent mistakes during the development process.
|
|
7
|
-
Example:
|
|
8
|
-
|
|
9
|
-
new ${this.constructor.name}({
|
|
10
|
-
${r}: endpointsFactory.build({
|
|
11
|
-
methods: ['${r}', `+((t[r]?.getMethods()||[]).map(n=>`'${n}'`).join(", ")||"...")+`]
|
|
12
|
-
// or method: '${r}'
|
|
13
|
-
...
|
|
14
|
-
})
|
|
15
|
-
});
|
|
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=()=>`
|
|
3
|
+
`,{url:t.url,payload:r})},L=({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},fe=(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=>e.reduce((t,r)=>t||r,!1),q=e=>e instanceof S.z.ZodEffects&&e._def.effect.type!=="refinement"?!0:e instanceof S.z.ZodUnion?ge(e.options.map(q)):e instanceof S.z.ZodIntersection?ge([e._def.left,e._def.right].map(q)):!1,D=e=>e instanceof ne?!0:e instanceof S.z.ZodObject?ge(Object.values(e.shape).map(D)):e instanceof S.z.ZodUnion?ge(e.options.map(D)):e instanceof S.z.ZodIntersection?ge([e._def.left,e._def.right].map(D)):e instanceof S.z.ZodOptional||e instanceof S.z.ZodNullable?D(e.unwrap()):e instanceof S.z.ZodEffects||e instanceof S.z.ZodTransformer?D(e._def.schema):e instanceof S.z.ZodRecord?D(e._def.valueType):e instanceof S.z.ZodArray?D(e._def.type):e instanceof S.z.ZodDefault?D(e._def.innerType):!1,xe=e=>"coerce"in e._def&&typeof e._def.coerce=="boolean"?e._def.coerce:!1,U=(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(""),Ie=e=>(0,vt.createHash)("sha1").update(JSON.stringify(e),"utf8").digest("hex"),Ce=({effect:e,sample:t})=>{try{return typeof e.transform(t,{addIssue:()=>{},path:[]})}catch{return}},ot=e=>typeof e=="string"?{message:e}:e||{};var J=class extends Error{name="RoutingError"},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)}},G=class extends Error{name="IOSchemaError"},V=class extends G{name="OutputValidationError";originalError;constructor(t){super(k(t)),this.originalError=t}},H=class extends G{name="InputValidationError";originalError;constructor(t){super(k(t)),this.originalError=t}},ie=class extends Error{name="ResultHandlerError";originalError;constructor(t,r){super(t),this.originalError=r||void 0}};var kt=e=>typeof e=="object"&&e!==null,Q=e=>kt(e)&&"or"in e,W=e=>kt(e)&&"and"in e,we=e=>({and:e.reduce((t,r)=>t.concat(W(r)?r.and:r),[])}),Ne=(e,t)=>W(e)?{and:e.and.map(r=>Q(r)?{or:r.or.map(t)}:t(r))}:Q(e)?{or:e.or.map(r=>W(r)?{and:r.and.map(t)}:t(r))}:t(e),nt=e=>e.and.reduce((t,r)=>{let o=fe(t.or,Q(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(W(e))return W(t)?we([e,t]):Q(t)?ae(nt(e),t):we([e,t]);if(Q(e)){if(W(t))return ae(t,e);if(Q(t)){let{type:r,value:o}=fe(e.or,t.or);return{or:r==="single"?o:o.map(we)}}return ae(e,{and:[t]})}return W(t)||Q(t)?ae(t,e):{and:[e,t]}};var N=require("zod");var de={positive:200,negative:400},De=e=>e,X=De({getPositiveResponse:e=>{let t=L({schema:e}),r=j(N.z.object({status:N.z.literal("success"),data:e}));return t.reduce((o,n)=>o.example({status:"success",data:n}),r)},getNegativeResponse:()=>j(N.z.object({status:N.z.literal("error"),error:N.z.object({message:N.z.string()})})).example({status:"error",error:{message:k(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=he(e);rt({logger:s,statusCode:a,request:o,error:e,input:t}),n.status(a).json({status:"error",error:{message:k(e)}})}}),ze=De({getPositiveResponse:e=>{let t=L({schema:e}),r=j("shape"in e&&"items"in e.shape&&e.shape.items instanceof N.z.ZodArray?e.shape.items:N.z.array(N.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(N.z.string()).example(k(new Error("Sample error message"))),handler:({response:e,output:t,error:r,logger:o,request:n,input:s})=>{if(r){let a=he(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")}}),Me=({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 Lt=(e,t=[Y])=>{if(e instanceof K.z.ZodType)return t;let{mimeTypes:r,mimeType:o}=e;return o?[o]:r||t},ee=class{},ve=class extends ee{#e;#r;#o;#n;#s;#i;#a;#t;#d;#p;#c;#l=[];constructor({methods:t,inputSchema:r,outputSchema:o,handler:n,resultHandler:s,getOperationId:a=()=>{},scopes:d=[],middlewares:p=[],tags:c=[],description:l,shortDescription:g}){super(),[{name:"input schema",schema:r},{name:"output schema",schema:o}].forEach(({name:h,schema:R})=>{if(q(R))throw new G(`Using transformations on the top level of endpoint ${h} is not allowed.`)}),this.#i=n,this.#a=s,this.#o=p,this.#c=a,this.#r=t,this.#d=d,this.#p=c,this.#e={long:l,short:g};let m={positive:s.getPositiveResponse(o),negative:s.getNegativeResponse()};this.#n={input:D(r)?[ye]:[Y],positive:Lt(m.positive),negative:Lt(m.negative)},this.#t={input:r,output:o,positive:m.positive instanceof K.z.ZodType?m.positive:m.positive.schema,negative:m.negative instanceof K.z.ZodType?m.negative:m.negative.schema},this.#s={positive:m.positive instanceof K.z.ZodType?de.positive:m.positive.statusCode||de.positive,negative:m.negative instanceof K.z.ZodType?de.negative:m.negative.statusCode||de.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?ae(t,r.security):t,{and:[]})}getScopes(){return this.#d}getTags(){return this.#p}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 V(r):r}}async#f({method:t,input:r,request:o,response:n,logger:s}){let a={},d=!1;for(let p of this.#o){if(t==="options"&&p.type==="proprietary")continue;let c;try{c=await p.input.parseAsync(r)}catch(l){throw l instanceof K.z.ZodError?new H(l):l}if(Object.assign(a,await p.middleware({input:c,options:a,request:o,response:n,logger:s})),d="writableEnded"in n&&n.writableEnded,d){s.warn(`The middleware ${p.middleware.name} has closed the stream. Accumulated options:`,a);break}}return{options:a,isStreamClosed:d}}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 H(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(d){Me({logger:n,response:o,error:new ie(se(d).message,t)})}}async execute({request:t,response:r,logger:o,config:n}){let s=Xe(t),a=null,d=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 p=jt(t,n.inputSources);try{let{options:c,isStreamClosed:l}=await this.#f({method:s,input:p,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:p,options:c,logger:o}))}catch(c){d=se(c)}await this.#g({input:p,output:a,request:t,response:r,error:d,logger:o})}};var Ut=["get","post","put","delete","patch"];var st=require("zod");var Ht=(e,t)=>{let r=e.map(({input:n})=>n).concat(t),o=r.reduce((n,s)=>n.and(s));return r.reduce((n,s)=>Ze(s,n),o)};var je=e=>{if(q(e.input))throw new G("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:st.z.object({}),middleware:async({request:a,response:d})=>new Promise((p,c)=>{t(a,d,g=>{if(g&&g instanceof Error)return c(o(g));p(n(a,d))})})};return e.#e(this.middlewares.concat(s),this.resultHandler)}addOptions(t){return e.#e(this.middlewares.concat(je({input:st.z.object({}),middleware:async()=>t})),this.resultHandler)}build({input:t,handler:r,output:o,description:n,shortDescription:s,operationId:a,...d}){let{middlewares:p,resultHandler:c}=this,l="methods"in d?d.methods:[d.method],g=typeof a=="function"?a:()=>a,m="scopes"in d?d.scopes:"scope"in d&&d.scope?[d.scope]:[],h="tags"in d?d.tags:"tag"in d&&d.tag?[d.tag]:[];return new ve({handler:r,middlewares:p,outputSchema:o,resultHandler:c,scopes:m,tags:h,methods:l,getOperationId:g,description:n,shortDescription:s,inputSchema:Ht(p,t)})}},Kt=new pe(X),Ft=new pe(ze);var $t=require("util"),Te=I(require("winston")),{combine:kr,colorize:Lr,timestamp:Ur,printf:Hr}=Te.default.format,be=e=>{let t=s=>{let{[Symbol.for("level")]:a,[Symbol.for("message")]:d,[Symbol.for("splat")]:p,...c}=s;return(0,$t.inspect)(c,!1,1,e.color)},r=s=>Hr(({timestamp:a,message:d,level:p,durationMs:c,...l})=>(typeof d=="object"&&(l={...l,...d},d="[No message]"),`${a} ${p}: ${d}`+(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(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=kr(...o),Te.default.createLogger({silent:e.level==="silent",levels:Te.default.config.npm.levels,transports:[new Te.default.transports.Console(n)],exitOnError:!1})};var ce=class{constructor(t){this.endpoints=t}};var _t=I(require("express")),le=class{params;constructor(...t){this.params=t}apply(t,r){return r(t,_t.default.static(...this.params))}};var te=({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(`The entry '${s}' must avoid having slashes \u2014 use nesting instead.`);let d=`${o||""}${s?`/${s}`:""}`;if(a instanceof ee){let p=a.getMethods().slice();n&&p.push("options"),p.forEach(c=>{t(a,d,c)})}else if(a instanceof le)r&&a.apply(d,r);else if(a instanceof ce){if(Object.entries(a.endpoints).forEach(([p,c])=>{if(!c.getMethods().includes(p))throw new J(`Endpoint assigned to ${p} method of ${d} must support ${p} method.`);t(c,d,p)}),n&&Object.keys(a.endpoints).length>0){let[p,...c]=Object.keys(a.endpoints),l=a.endpoints[p];l._setSiblingMethods(c),t(l,d,"options")}}else te({onEndpoint:t,onStatic:r,hasCors:n,routing:a,parentPath:d})})};var qt=()=>`
|
|
18
6
|
\x1B[94m\x1B[39m
|
|
19
7
|
\x1B[94m\x1B[39m
|
|
20
8
|
\x1B[94m8888888888 8888888888P 888 d8888 8888888b. 8888888 \x1B[39m
|
|
@@ -27,11 +15,11 @@ The error caused by ${o?`'${o}' route that has a '${s}'`:`'${s}'`} entry.`);let
|
|
|
27
15
|
\x1B[95m8888888888 888 888 88888P" 888 "Y8888 88888P' 88888P' d8888888888 "Y88P" "Y88888 d88P 888 888 8888888\x1B[39m\x1B[94m\x1B[39m
|
|
28
16
|
\x1B[94m 888\x1B[39m
|
|
29
17
|
\x1B[94m 888\x1B[3m Proudly supports transgender community.\x1B[23m\x1B[39m
|
|
30
|
-
\x1B[94m\x1B[3mfor
|
|
18
|
+
\x1B[94m\x1B[3mfor Katie \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
|
|
31
19
|
\x1B[90m\x1B[3m Thank you for choosing Express Zod API for your project.\x1B[23m\x1B[39m\x1B[0m\x1B[0m
|
|
32
20
|
\x1B[0m\x1B[0m
|
|
33
21
|
\x1B[0m\x1B[0m
|
|
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 we(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(h)),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(we(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}),Mo=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=Mo(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)],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(wo,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,`
|
|
22
|
+
`.trim();var it=({app:e,logger:t,config:r,routing:o})=>{r.startupLogo!==!1&&console.log(qt()),te({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 ke=I(require("express")),Vt=I(require("compression")),Gt=I(require("express-fileupload")),Bt=I(require("https"));var at=I(require("http-errors")),Kr=(e,t)=>(r,o,n,s)=>{if(!r)return s();e.handler({error:(0,at.default)(400,se(r).message),request:o,response:n,logger:t,input:null,output:null})},Yt=(e,t)=>(r,o)=>{let n=(0,at.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){Me({response:o,logger:t,error:new ie(se(s).message,n)})}},Jt=(e,t)=>{let r=tt(e.logger)?be(e.logger):e.logger;it({app:e.app,routing:t,logger:r,config:e});let o=e.errorHandler||X;return{notFoundHandler:Yt(o,r),logger:r}},Qt=(e,t)=>{let r=tt(e.logger)?be(e.logger):e.logger,o=(0,ke.default)();o.disable("x-powered-by");let n=e.errorHandler||X,s=e.server.compression?(0,Vt.default)({...typeof e.server.compression=="object"?e.server.compression:{}}):void 0,a=e.server.jsonParser||(0,ke.json)(),d=e.server.upload?(0,Gt.default)({...typeof e.server.upload=="object"?e.server.upload:{},abortOnLimit:!1,parseNested:!0}):void 0,p=[].concat(s||[]).concat(a).concat(d||[]);o.use(p),o.use(Kr(n,r)),it({app:o,routing:t,logger:r,config:e}),o.use(Yt(n,r));let c=o.listen(e.server.listen,()=>{r.info(`Listening ${e.server.listen}`)}),l;return e.https&&(l=Bt.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 F=require("openapi3-ts/oas30"),me=require("ramda"),T=require("zod");var b=require("zod");var dt=/^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(\.\d+)?)?Z?$/,Fr="ZodDateIn",Le=class e extends b.ZodType{_parse(t){let{status:r,ctx:o}=this._processInputParams(t);if(o.parsedType!==b.ZodParsedType.string)return(0,b.addIssueToContext)(o,{code:b.ZodIssueCode.invalid_type,expected:b.ZodParsedType.string,received:o.parsedType}),b.INVALID;dt.test(o.data)||((0,b.addIssueToContext)(o,{code:b.ZodIssueCode.invalid_string,validation:"regex"}),r.dirty());let n=new Date(o.data);return Ee(n)?{status:r.value,value:n}:((0,b.addIssueToContext)(o,{code:b.ZodIssueCode.invalid_date}),b.INVALID)}static create=()=>new e({typeName:Fr})};var re=({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:l=>re({...l,...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 Wt=50,er="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:[]},tr=/:([A-Za-z0-9_]+)/g,rr=e=>{let t=e.match(tr);return t?t.map(r=>r.slice(1)):[]},or=e=>e.replace(tr,t=>`{${t.slice(1)}}`),_r=({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"}),Gr=e=>{if(e.isResponse)throw new P({message:"Please use z.upload() only for input.",...e});return{type:"string",format:"binary"}},Br=({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"}},Yr=({schema:{options:e},next:t})=>({oneOf:e.map(r=>t({schema:r}))}),Jr=({schema:{options:e,discriminator:t},next:r})=>({discriminator:{propertyName:t},oneOf:Array.from(e.values()).map(o=>r({schema:o}))}),Qr=({schema:{_def:{left:e,right:t}},next:r})=>({allOf:[e,t].map(o=>r({schema:o}))}),Wr=({schema:e,next:t})=>t({schema:e.unwrap()}),Xr=({schema:e,next:t})=>t({schema:e._def.innerType}),eo=({schema:e,next:t})=>({nullable:!0,...t({schema:e.unwrap()})}),Xt=({schema:e})=>({type:typeof Object.values(e.enum)[0],enum:Object.values(e.enum)}),to=({schema:{value:e}})=>({type:typeof e,enum:[e]}),ro=({schema:e,isResponse:t,...r})=>{let o=Object.keys(e.shape).filter(n=>{let s=e.shape[n];return!(t&&xe(s)?s instanceof T.z.ZodOptional:s.isOptional())});return{type:"object",properties:Ue({schema:e,isResponse:t,...r}),...o.length?{required:o}:{}}},oo=()=>({type:"string",nullable:!0,format:"null"}),no=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:dt.source,externalDocs:{url:er}}},so=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:er}}},io=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})},ao=()=>({type:"boolean"}),po=()=>({type:"integer",format:"bigint"}),co=e=>e.reduce((t,r)=>t&&r instanceof T.z.ZodLiteral,!0),lo=({schema:{keySchema:e,valueSchema:t},...r})=>{if(e instanceof T.z.ZodEnum||e instanceof T.z.ZodNativeEnum){let o=Object.values(e.enum),n=o.reduce((s,a)=>({...s,[a]:t}),{});return{type:"object",properties:Ue({schema:T.z.object(n),...r}),...o.length?{required:o}:{}}}if(e instanceof T.z.ZodLiteral)return{type:"object",properties:Ue({schema:T.z.object({[e.value]:t}),...r}),required:[e.value]};if(e instanceof T.z.ZodUnion&&co(e.options)){let o=e.options.reduce((n,s)=>({...n,[`${s.value}`]:t}),{});return{type:"object",properties:Ue({schema:T.z.object(o),...r}),required:e.options.map(n=>n.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,F.isSchemaObject)(o)?o.type:o.$ref}`).join(", ")}}}},fo=({schema:{isEmail:e,isURL:t,minLength:r,maxLength:o,isUUID:n,isCUID:s,isCUID2:a,isULID:d,isIP:p,isEmoji:c,isDatetime:l,_def:{checks:g}}})=>{let m=g.find(x=>x.kind==="regex"),h=g.find(x=>x.kind==="datetime"),R=m?m.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",...l&&{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},...R&&{pattern:`/${R.source}/${R.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}},Ue=({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,F.isSchemaObject)(o)){let s=Ce({effect:n,sample:go(o)});return s&&["number","string","boolean"].includes(s)?{type:s}:r({schema:T.z.any()})}if(!t&&n.type==="preprocess"&&(0,F.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()}),bo=({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=L({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,me.omit)(r,s):s}}),{})}},Oo=(e,t,r)=>{let o=L({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,{})}},Oe=(e,t)=>{if(e instanceof T.z.ZodObject)return e;let r;if(e instanceof T.z.ZodUnion||e instanceof T.z.ZodDiscriminatedUnion)r=Array.from(e.options.values()).map(o=>Oe(o,t)).reduce((o,n)=>o.merge(n.partial()),T.z.object({}));else if(e instanceof T.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=Oe(e._def.schema,t)}else r=Oe(e._def.left,t).merge(Oe(e._def.right,t));return Ze(e,r)},sr=({path:e,method:t,endpoint:r,inputSources:o,serializer:n,getRef:s,makeRef:a,composition:d,clue:p="parameter"})=>{let c=r.getSchema("input"),l=Oe(c,{path:e,method:t,isResponse:!1}).shape,g=rr(e),m=o.includes("query"),h=o.includes("params"),R=o.includes("headers"),x=u=>h&&g.includes(u),M=u=>R&&et(u);return Object.keys(l).filter(u=>m||x(u)).map(u=>{let O=re({schema:l[u],isResponse:!1,rules:ct,onEach:lt,onMissing:mt,serializer:n,getRef:s,makeRef:a,path:e,method:t}),v=d==="components"?a(U(e,t,`${p} ${u}`),O):O;return{name:u,in:x(u)?"path":M(u)?"header":"query",required:!l[u].isOptional(),description:(0,F.isSchemaObject)(O)&&O.description||`${t.toUpperCase()} ${e} ${p}`,schema:v,...Oo(c,!1,u)}})},ct={ZodString:fo,ZodNumber:yo,ZodBigInt:po,ZodBoolean:ao,ZodDateIn:no,ZodDateOut:so,ZodNull:oo,ZodArray:mo,ZodTuple:uo,ZodRecord:lo,ZodObject:ro,ZodLiteral:to,ZodIntersection:Qr,ZodUnion:Yr,ZodFile:Br,ZodUpload:Gr,ZodAny:Vr,ZodDefault:_r,ZodEnum:Xt,ZodNativeEnum:Xt,ZodEffects:ho,ZodOptional:Wr,ZodNullable:eo,ZodDiscriminatedUnion:Jr,ZodBranded:To,ZodDate:io,ZodCatch:qr,ZodPipeline:xo,ZodLazy:bo,ZodReadonly:Xr},lt=({schema:e,isResponse:t,prev:r})=>{if((0,F.isReferenceObject)(r))return{};let{description:o}=e,n=e instanceof T.z.ZodLazy,s=r.type!==void 0,a=t&&xe(e),d=!n&&s&&!a&&e.isNullable(),p=n?[]:L({schema:e,variant:t?"parsed":"original",validate:!0});return{...o&&{description:o},...d&&{nullable:!0},...p.length>0&&{example:p[0]}}},mt=({schema:e,...t})=>{throw new P({message:`Zod type ${e.constructor.name} is unsupported.`,...t})},pt=(e,t)=>{if((0,F.isReferenceObject)(e))return e;let r=e.properties?(0,me.omit)(t,e.properties):void 0,o=e.example?(0,me.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=>pt(d,t)):void 0,a=e.oneOf?e.oneOf.map(d=>pt(d,t)):void 0;return(0,me.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})},ir=e=>(0,F.isSchemaObject)(e)?(0,me.omit)(["example"],e):e,ut=({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"),l=r.getMimeTypes(o?"positive":"negative"),g=ir(re({schema:c,isResponse:!0,rules:ct,onEach:lt,onMissing:mt,serializer:n,getRef:s,makeRef:a,path:t,method:e})),m=nr(c,!0),h=d==="components"?a(U(t,e,p),g):g;return{description:`${e.toUpperCase()} ${t} ${p}`,content:l.reduce((R,x)=>({...R,[x]:{schema:h,...m}}),{})}},So=()=>({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}),Ao=({name:e})=>({type:"apiKey",in:"cookie",name:e}),Eo=({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:So,bearer:Ro,input:Po,header:Zo,cookie:Ao,openid:Eo,oauth2:Io};return Ne(e,r=>t[r.type](r))},He=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 He(nt(e))}return He({or:[e]})},dr=({method:e,path:t,endpoint:r,serializer:o,getRef:n,makeRef:s,composition:a,clue:d="request body"})=>{let p=rr(t),c=ir(pt(re({schema:r.getSchema("input"),isResponse:!1,rules:ct,onEach:lt,onMissing:mt,serializer:o,getRef:n,makeRef:s,path:t,method:e}),p)),l=nr(r.getSchema("input"),!1,p),g=a==="components"?s(U(t,e,d),c):c;return{description:`${e.toUpperCase()} ${t} ${d}`,content:r.getMimeTypes("input").reduce((m,h)=>({...m,[h]:{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}}}}),ft=e=>e.length<=Wt?e:e.slice(0,Wt-1)+"\u2026";var Ke=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,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=U(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:l=Ie}){super(),this.addInfo({title:o,version:n});for(let m of typeof s=="string"?[s]:s)this.addServer({url:m});te({routing:t,onEndpoint:(m,h,R)=>{let x=R,M={path:h,method:x,endpoint:m,composition:c,serializer:l,getRef:this.getRef.bind(this),makeRef:this.makeRef.bind(this)},[u,O]=["short","long"].map(m.getDescription.bind(m)),v=r.inputSources?.[x]||Ae[x],ue=sr({...M,inputSources:v}),w={operationId:this.ensureUniqOperationId(h,x,m.getOperationId(x)),responses:{[m.getStatusCode("positive")]:ut({...M,clue:a,isPositive:!0}),[m.getStatusCode("negative")]:ut({...M,clue:d,isPositive:!1})}};O&&(w.description=O,p&&u===void 0&&(w.summary=ft(O))),u&&(w.summary=ft(u)),m.getTags().length>0&&(w.tags=m.getTags()),ue.length>0&&(w.parameters=ue),v.includes("body")&&(w.requestBody=dr(M));let Se=He(Ne(ar(m.getSecurity()),We=>{let Et=this.ensureUniqSecuritySchemaName(We),Pr=["oauth2","openIdConnect"].includes(We.type)?m.getScopes():[];return this.addSecurityScheme(Et,We),{name:Et,scopes:Pr}}));Se.length>0&&(w.security=Se);let Qe=or(h);this.addPath(Qe,{[x]:w})}}),this.rootDoc.tags=r.tags?pr(r.tags):[]}};var yt=I(require("http"));var Co=e=>({method:"GET",header:jest.fn(()=>Y),...e}),wo=e=>{let t={writableEnded:!1,statusCode:200,statusMessage:yt.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=yt.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),d=wo(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 _=I(require("typescript"));var z=I(require("typescript")),i=z.default.factory,oe=[i.createModifier(z.default.SyntaxKind.ExportKeyword)],No=[i.createModifier(z.default.SyntaxKind.AsyncKeyword)],Do=[i.createModifier(z.default.SyntaxKind.PublicKeyword),i.createModifier(z.default.SyntaxKind.ReadonlyKeyword)],mr=[i.createModifier(z.default.SyntaxKind.ProtectedKeyword),i.createModifier(z.default.SyntaxKind.ReadonlyKeyword)],zo=i.createTemplateHead(""),Mo=i.createTemplateTail(""),vo=i.createTemplateMiddle(" "),gt=e=>i.createTemplateLiteralType(zo,e.map((t,r)=>i.createTemplateLiteralTypeSpan(i.createTypeReferenceNode(t),r===e.length-1?Mo:vo))),ht=gt(["M","P"]),Fe=(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(Fe(o,e[o],t)),[]),xt=(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([])),Tt=(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)],z.default.NodeFlags.Const),Ot=(e,t)=>i.createTypeAliasDeclaration(oe,e,void 0,i.createUnionTypeNode(t.map(r=>i.createLiteralTypeNode(i.createStringLiteral(r))))),_e=(e,t)=>i.createTypeAliasDeclaration(oe,e,void 0,t),fr=(e,t,r)=>i.createPropertyDeclaration(Do,e,void 0,t,r),yr=(e,t,r=[])=>i.createClassDeclaration(oe,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(z.default.SyntaxKind.AnyKeyword)]),St=(e,t,r)=>i.createInterfaceDeclaration(oe,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(No,void 0,e.map(r=>Fe(r)),void 0,void 0,i.createCallExpression(i.createPropertyAccessExpression(i.createThis(),"implementation"),void 0,t)),Rt=(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 y=I(require("typescript")),Rr=require("zod");var $=I(require("typescript")),{factory:qe}=$.default,Pt=(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&&Pt(o,r),o},br=(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)?qe.createIdentifier(e):qe.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},Lo=({schema:{value:e}})=>f.createLiteralTypeNode(typeof e=="number"?f.createNumericLiteral(e):typeof e=="boolean"?e?f.createTrue():f.createFalse():f.createStringLiteral(e)),Uo=({schema:{shape:e},isResponse:t,next:r,optionalPropStyle:{withQuestionMark:o}})=>{let n=Object.entries(e).map(([s,a])=>{let d=t&&xe(a)?a instanceof Rr.z.ZodOptional:a.isOptional(),p=f.createPropertySignature(void 0,Or(s),d&&o?f.createToken(y.default.SyntaxKind.QuestionToken):void 0,r({schema:a}));return a.description&&Pt(p,a.description),p});return f.createTypeLiteralNode(n)},Ho=({schema:{element:e},next:t})=>f.createArrayTypeNode(t({schema:e})),Ko=({schema:{options:e}})=>f.createUnionTypeNode(e.map(t=>f.createLiteralTypeNode(f.createStringLiteral(t)))),Sr=({schema:{options:e},next:t})=>f.createUnionTypeNode(e.map(r=>t({schema:r}))),Fo=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=Ce({effect:n,sample:Fo(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},_o=({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())]),Go=({next:e,schema:{items:t}})=>f.createTupleTypeNode(t.map(r=>e({schema:r}))),Bo=({next:e,schema:{keySchema:t,valueSchema:r}})=>f.createExpressionWithTypeArguments(f.createIdentifier("Record"),[e({schema:t}),e({schema:r})]),Yo=({next:e,schema:t})=>f.createIntersectionTypeNode([t._def.left,t._def.right].map(r=>e({schema:r}))),Jo=({next:e,schema:t})=>e({schema:t._def.innerType}),B=e=>()=>f.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=()=>f.createLiteralTypeNode(f.createNull()),rn=({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}))))()},on={ZodString:B(y.default.SyntaxKind.StringKeyword),ZodNumber:B(y.default.SyntaxKind.NumberKeyword),ZodBigInt:B(y.default.SyntaxKind.BigIntKeyword),ZodBoolean:B(y.default.SyntaxKind.BooleanKeyword),ZodDateIn:B(y.default.SyntaxKind.StringKeyword),ZodDateOut:B(y.default.SyntaxKind.StringKeyword),ZodNull:tn,ZodArray:Ho,ZodTuple:Go,ZodRecord:Bo,ZodObject:Uo,ZodLiteral:Lo,ZodIntersection:Yo,ZodUnion:Sr,ZodFile:B(y.default.SyntaxKind.StringKeyword),ZodAny:B(y.default.SyntaxKind.AnyKeyword),ZodDefault:Jo,ZodEnum:Ko,ZodNativeEnum:_o,ZodEffects:$o,ZodOptional:qo,ZodNullable:Vo,ZodDiscriminatedUnion:Sr,ZodBranded:Qo,ZodCatch:Xo,ZodPipeline:en,ZodLazy:rn,ZodReadonly:Wo},Zt=({schema:e,...t})=>re({schema:e,rules:on,onMissing:()=>f.createKeywordTypeNode(y.default.SyntaxKind.AnyKeyword),...t});var Ge=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=Ie,optionalPropStyle:n={withQuestionMark:!0,withUndefined:!0}}){te({routing:t,onEndpoint:(u,O,v)=>{let ue=U(O,v,"input"),Je=U(O,v,"response"),w={serializer:o,getAlias:this.getAlias.bind(this),makeAlias:this.makeAlias.bind(this),optionalPropStyle:n},Se=Zt({...w,schema:u.getSchema("input"),isResponse:!1}),Qe=Zt({...w,isResponse:!0,schema:u.getSchema("positive").or(u.getSchema("negative"))});this.agg.push(Ve(Se,ue),Ve(Qe,Je)),v!=="options"&&(this.paths.push(O),this.registry[`${v} ${O}`]={in:ue,out:Je,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",Ut),d=_e("MethodPath",gt([a.name,s.name])),p=[i.createHeritageClause(_.default.SyntaxKind.ExtendsKeyword,[xt(d.name,_.default.SyntaxKind.AnyKeyword)])],c=St("Input",p,Object.keys(this.registry).map(u=>Tt(u,this.registry[u].in))),l=St("Response",p,Object.keys(this.registry).map(u=>Tt(u,this.registry[u].out)));if(this.agg.push(s,a,d,c,l),r==="types")return;let g=i.createVariableStatement(oe,bt("jsonEndpoints",i.createObjectLiteralExpression(Object.keys(this.registry).filter(u=>this.registry[u].isJson).map(u=>i.createPropertyAssignment(`"${u}"`,i.createTrue()))))),m=i.createVariableStatement(oe,bt("endpointTags",i.createObjectLiteralExpression(Object.keys(this.registry).map(u=>i.createPropertyAssignment(`"${u}"`,i.createArrayLiteralExpression(this.registry[u].tags.map(O=>i.createStringLiteral(O)))))))),h=_e("Provider",i.createFunctionTypeNode(xr({M:a.name,P:s.name}),$e({method:i.createTypeReferenceNode("M"),path:i.createTypeReferenceNode("P"),params:i.createIndexedAccessTypeNode(i.createTypeReferenceNode(c.name),ht)}),gr(l.name,ht))),R=_e("Implementation",i.createFunctionTypeNode(void 0,$e({method:i.createTypeReferenceNode(a.name),path:i.createKeywordTypeNode(_.default.SyntaxKind.StringKeyword),params:xt(_.default.SyntaxKind.StringKeyword,_.default.SyntaxKind.AnyKeyword)}),hr())),x=i.createTemplateExpression(i.createTemplateHead(":"),[i.createTemplateSpan(i.createIdentifier("key"),i.createTemplateTail(""))]),M=yr("ExpressZodAPIClient",ur([Fe("implementation",i.createTypeReferenceNode(R.name),mr)]),[fr("provide",i.createTypeReferenceNode(h.name),Tr(["method","path","params"],[i.createIdentifier("method"),Rt("params",i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("acc"),"replace"),void 0,[x,i.createElementAccessExpression(i.createIdentifier("params"),i.createIdentifier("key"))]),i.createIdentifier("path")),Rt("params",i.createConditionalExpression(i.createBinaryExpression(i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("path"),"indexOf"),void 0,[x]),_.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(M,_.default.SyntaxKind.MultiLineCommentTrivia,`
|
|
35
23
|
export const exampleImplementation: Implementation = async (
|
|
36
24
|
method,
|
|
37
25
|
path,
|
|
@@ -52,6 +40,6 @@ export const exampleImplementation: Implementation = async (
|
|
|
52
40
|
|
|
53
41
|
const client = new ExpressZodAPIClient(exampleImplementation);
|
|
54
42
|
client.provide("get", "/v1/user/retrieve", { id: "10" });
|
|
55
|
-
`,!0),this.agg.push(g,
|
|
43
|
+
`,!0),this.agg.push(g,m,h,R,M)}print(t){return this.agg.map(r=>br(r,t)).join(`
|
|
56
44
|
|
|
57
|
-
`)}};var
|
|
45
|
+
`)}};var At={};It(At,{dateIn:()=>cn,dateOut:()=>ln,file:()=>dn,upload:()=>pn});var Z=require("zod");var nn="ZodDateOut",Be=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):Ee(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:nn})};var E=require("zod");var sn="ZodFile",an=/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/,Ye=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",...ot(t)}]});base64=t=>new e({...this._def,checks:[...this._def.checks,{kind:"base64",...ot(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=Ye.create,pn=ne.create,cn=Le.create,ln=Be.create;0&&(module.exports={AbstractEndpoint,DependsOnMethod,Documentation,DocumentationError,EndpointsFactory,InputValidationError,Integration,OutputValidationError,RoutingError,ServeStatic,arrayEndpointsFactory,arrayResultHandler,attachRouting,createConfig,createLogger,createMiddleware,createResultHandler,createServer,defaultEndpointsFactory,defaultResultHandler,ez,getExamples,getMessageFromError,getStatusCodeFromError,testEndpoint,withMeta});
|