express-zod-api 14.0.3 → 14.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +25 -0
- package/README.md +3 -3
- package/dist/index.d.mts +5 -4
- package/dist/index.d.ts +5 -4
- package/dist/index.js +1 -1
- package/dist/index.mjs +1 -1
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,31 @@
|
|
|
2
2
|
|
|
3
3
|
## Version 14
|
|
4
4
|
|
|
5
|
+
### v14.1.0
|
|
6
|
+
|
|
7
|
+
- Featuring an ability to configure `host` and other listening options when using `createServer()` method.
|
|
8
|
+
- The `listen` property now supports object of type `ListenOptions`.
|
|
9
|
+
- Ensure having `@types/node` installed for assistance.
|
|
10
|
+
- Find out more about those options
|
|
11
|
+
[in Node.js documentation](https://nodejs.org/dist/latest-v20.x/docs/api/net.html#serverlistenoptions-callback).
|
|
12
|
+
- Thanks to [@huyhoang160593](https://github.com/huyhoang160593) for noticing the lack of configurability.
|
|
13
|
+
|
|
14
|
+
```typescript
|
|
15
|
+
import { createConfig } from "express-zod-api";
|
|
16
|
+
|
|
17
|
+
createConfig({
|
|
18
|
+
server: {
|
|
19
|
+
// example usage:
|
|
20
|
+
listen: {
|
|
21
|
+
port: 8080,
|
|
22
|
+
host: "custom",
|
|
23
|
+
backlog: 200,
|
|
24
|
+
ipv6Only: true,
|
|
25
|
+
},
|
|
26
|
+
},
|
|
27
|
+
});
|
|
28
|
+
```
|
|
29
|
+
|
|
5
30
|
### v14.0.3
|
|
6
31
|
|
|
7
32
|
- Fixed issue #1269 reported by [@alindsay55661](https://github.com/alindsay55661):
|
package/README.md
CHANGED
|
@@ -135,7 +135,7 @@ import { createConfig } from "express-zod-api";
|
|
|
135
135
|
|
|
136
136
|
const config = createConfig({
|
|
137
137
|
server: {
|
|
138
|
-
listen: 8090, // port or
|
|
138
|
+
listen: 8090, // port, UNIX socket or options
|
|
139
139
|
},
|
|
140
140
|
cors: true,
|
|
141
141
|
logger: {
|
|
@@ -818,7 +818,7 @@ const config = createConfig({
|
|
|
818
818
|
cert: fs.readFileSync("fullchain.pem", "utf-8"),
|
|
819
819
|
key: fs.readFileSync("privkey.pem", "utf-8"),
|
|
820
820
|
},
|
|
821
|
-
listen: 443, // port or
|
|
821
|
+
listen: 443, // port, UNIX socket or options
|
|
822
822
|
},
|
|
823
823
|
// ... cors, logger, etc
|
|
824
824
|
});
|
|
@@ -826,7 +826,7 @@ const config = createConfig({
|
|
|
826
826
|
const { app, httpServer, httpsServer, logger } = createServer(config, routing);
|
|
827
827
|
```
|
|
828
828
|
|
|
829
|
-
Ensure having `@types/node` package installed. At least you need to specify the port
|
|
829
|
+
Ensure having `@types/node` package installed. At least you need to specify the port (usually it is 443) or UNIX socket,
|
|
830
830
|
certificate and the key, issued by the certifying authority. For example, you can acquire a free TLS certificate for
|
|
831
831
|
your API at [Let's Encrypt](https://letsencrypt.org/).
|
|
832
832
|
|
package/dist/index.d.mts
CHANGED
|
@@ -5,6 +5,7 @@ import https, { ServerOptions } from 'node:https';
|
|
|
5
5
|
import winston, { Logger } from 'winston';
|
|
6
6
|
import { z, ZodTypeDef, ZodType, ParseInput, ParseReturnType, ZodError } from 'zod';
|
|
7
7
|
import { HttpError } from 'http-errors';
|
|
8
|
+
import { ListenOptions } from 'node:net';
|
|
8
9
|
import * as qs from 'qs';
|
|
9
10
|
import * as express_serve_static_core from 'express-serve-static-core';
|
|
10
11
|
import http from 'node:http';
|
|
@@ -481,8 +482,8 @@ type CompressionOptions = Pick<compression.CompressionOptions, "threshold" | "le
|
|
|
481
482
|
interface ServerConfig {
|
|
482
483
|
/** @desc Server configuration. */
|
|
483
484
|
server: {
|
|
484
|
-
/** @desc Port or
|
|
485
|
-
listen: number | string;
|
|
485
|
+
/** @desc Port, UNIX socket or custom options. */
|
|
486
|
+
listen: number | string | ListenOptions;
|
|
486
487
|
/**
|
|
487
488
|
* @desc Custom JSON parser.
|
|
488
489
|
* @default express.json()
|
|
@@ -503,8 +504,8 @@ interface ServerConfig {
|
|
|
503
504
|
https?: {
|
|
504
505
|
/** @desc At least "cert" and "key" options required. */
|
|
505
506
|
options: ServerOptions;
|
|
506
|
-
/** @desc Port or
|
|
507
|
-
listen: number | string;
|
|
507
|
+
/** @desc Port, UNIX socket or custom options. */
|
|
508
|
+
listen: number | string | ListenOptions;
|
|
508
509
|
};
|
|
509
510
|
}
|
|
510
511
|
interface AppConfig {
|
package/dist/index.d.ts
CHANGED
|
@@ -5,6 +5,7 @@ import https, { ServerOptions } from 'node:https';
|
|
|
5
5
|
import winston, { Logger } from 'winston';
|
|
6
6
|
import { z, ZodTypeDef, ZodType, ParseInput, ParseReturnType, ZodError } from 'zod';
|
|
7
7
|
import { HttpError } from 'http-errors';
|
|
8
|
+
import { ListenOptions } from 'node:net';
|
|
8
9
|
import * as qs from 'qs';
|
|
9
10
|
import * as express_serve_static_core from 'express-serve-static-core';
|
|
10
11
|
import http from 'node:http';
|
|
@@ -481,8 +482,8 @@ type CompressionOptions = Pick<compression.CompressionOptions, "threshold" | "le
|
|
|
481
482
|
interface ServerConfig {
|
|
482
483
|
/** @desc Server configuration. */
|
|
483
484
|
server: {
|
|
484
|
-
/** @desc Port or
|
|
485
|
-
listen: number | string;
|
|
485
|
+
/** @desc Port, UNIX socket or custom options. */
|
|
486
|
+
listen: number | string | ListenOptions;
|
|
486
487
|
/**
|
|
487
488
|
* @desc Custom JSON parser.
|
|
488
489
|
* @default express.json()
|
|
@@ -503,8 +504,8 @@ interface ServerConfig {
|
|
|
503
504
|
https?: {
|
|
504
505
|
/** @desc At least "cert" and "key" options required. */
|
|
505
506
|
options: ServerOptions;
|
|
506
|
-
/** @desc Port or
|
|
507
|
-
listen: number | string;
|
|
507
|
+
/** @desc Port, UNIX socket or custom options. */
|
|
508
|
+
listen: number | string | ListenOptions;
|
|
508
509
|
};
|
|
509
510
|
}
|
|
510
511
|
interface AppConfig {
|
package/dist/index.js
CHANGED
|
@@ -19,7 +19,7 @@ Original error: ${e.originalError.message}.`:""))};var kt=(e,t=[Y])=>{if(e insta
|
|
|
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 nt=({app:e,logger:t,config:r,routing:o})=>{r.startupLogo!==!1&&console.log(_t()),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 st=A(require("express")),qt=A(require("compression")),Vt=A(require("express-fileupload")),Gt=A(require("http")),it=A(require("https")),Bt=require("winston");var at=A(require("http-errors")),Kr=(e,t)=>(r,o,n,s)=>{if(!r)return s();e.handler({error:(0,at.default)(400,ne(r).message),request:o,response:n,logger:t,input:null,output:null})},Fr=(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){ze({response:o,logger:t,error:new se(ne(s).message,n)})}},Yt=e=>{let t=e.logger instanceof Bt.Logger?e.logger:je(e.logger),r=e.errorHandler||de,o=Fr(r,t);return{logger:t,errorHandler:r,notFoundHandler:o}},Jt=(e,t)=>{let{logger:r,notFoundHandler:o}=Yt(e);return nt({app:e.app,routing:t,logger:r,config:e}),{notFoundHandler:o,logger:r}},Qt=(e,t)=>{let r=(0,st.default)().disable("x-powered-by");e.server.compression&&r.use((0,qt.default)(typeof e.server.compression=="object"?e.server.compression:void 0)),r.use(e.server.jsonParser||st.default.json()),e.server.upload&&r.use((0,Vt.default)({...typeof e.server.upload=="object"?e.server.upload:{},abortOnLimit:!1,parseNested:!0}));let{logger:o,errorHandler:n,notFoundHandler:s}=Yt(e);r.use(Kr(n,o)),nt({app:r,routing:t,logger:o,config:e}),r.use(s);let a={httpServer:Gt.default.createServer(r),httpsServer:e.https?it.default.createServer(e.https.options,r):void 0};for(let d of Object.values(a)){let p=d instanceof it.default.Server?e.https.listen:e.server.listen;d?.listen(p,()=>{o.info(`Listening ${p}`)})}return{app:r,...a,logger:o}};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?$/,$r="ZodDateIn",ke=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 Ae(n)?{status:r.value,value:n}:((0,b.addIssueToContext)(o,{code:b.ZodIssueCode.invalid_date}),b.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,a=n,p=s?s({schema:e,...a,next:l=>te({...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)}}`),qr=({schema:{_def:{innerType:e,defaultValue:t}},next:r})=>({...r({schema:e}),default:t()}),Vr=({schema:{_def:{innerType:e}},next:t})=>t({schema:e}),Gr=()=>({format:"any"}),Br=e=>{if(e.isResponse)throw new Z({message:"Please use z.upload() only for input.",...e});return{type:"string",format:"binary"}},Yr=({schema:{isBinary:e,isBase64:t},...r})=>{if(!r.isResponse)throw new Z({message:"Please use z.file() only within ResultHandler.",...r});return{type:"string",format:e?"binary":t?"byte":"file"}},Jr=({schema:{options:e},next:t})=>({oneOf:e.map(r=>t({schema:r}))}),Qr=({schema:{options:e,discriminator:t},next:r})=>({discriminator:{propertyName:t},oneOf:Array.from(e.values()).map(o=>r({schema:o}))}),Wr=({schema:{_def:{left:e,right:t}},next:r})=>({allOf:[e,t].map(o=>r({schema:o}))}),Xr=({schema:e,next:t})=>t({schema:e.unwrap()}),eo=({schema:e,next:t})=>t({schema:e._def.innerType}),to=({schema:e,next:t})=>({nullable:!0,...t({schema:e.unwrap()})}),Xt=({schema:e})=>({type:typeof Object.values(e.enum)[0],enum:Object.values(e.enum)}),ro=({schema:{value:e}})=>({type:typeof e,enum:[e]}),oo=({schema:e,isResponse:t,...r})=>{let o=Object.keys(e.shape).filter(n=>{let s=e.shape[n];return!(t&&xe(s)?s instanceof T.z.ZodOptional:s.isOptional())});return{type:"object",properties:Le({schema:e,isResponse:t,...r}),...o.length?{required:o}:{}}},no=()=>({type:"string",nullable:!0,format:"null"}),so=e=>{if(e.isResponse)throw new Z({message:"Please use z.dateOut() for output.",...e});return{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",pattern:dt.source,externalDocs:{url:er}}},io=e=>{if(!e.isResponse)throw new Z({message:"Please use z.dateIn() for input.",...e});return{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",externalDocs:{url:er}}},ao=e=>{throw new Z({message:`Using z.date() within ${e.isResponse?"output":"input"} schema is forbidden. Please use z.date${e.isResponse?"Out":"In"}() instead. Check out the documentation for details.`,...e})},po=()=>({type:"boolean"}),co=()=>({type:"integer",format:"bigint"}),lo=e=>e.reduce((t,r)=>t&&r instanceof T.z.ZodLiteral,!0),mo=({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:Le({schema:T.z.object(n),...r}),...o.length?{required:o}:{}}}if(e instanceof T.z.ZodLiteral)return{type:"object",properties:Le({schema:T.z.object({[e.value]:t}),...r}),required:[e.value]};if(e instanceof T.z.ZodUnion&&lo(e.options)){let o=e.options.reduce((n,s)=>({...n,[`${s.value}`]:t}),{});return{type:"object",properties:Le({schema:T.z.object(o),...r}),required:e.options.map(n=>n.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,F.isSchemaObject)(o)?o.type:o.$ref}`).join(", ")}}}},yo=({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}`}}},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}},Le=({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 _r?.[t]},xo=({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=Ie({effect:n,sample:ho(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},To=({schema:e,isResponse:t,next:r})=>r({schema:e._def[t?"out":"in"]}),bo=({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}))))()},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}}),{})}},So=(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,{})}},be=(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=>be(o,t)).reduce((o,n)=>o.merge(n.partial()),T.z.object({}));else if(e instanceof T.z.ZodEffects){if(q(e))throw new Z({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 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=be(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&&Xe(u);return Object.keys(l).filter(u=>m||x(u)).map(u=>{let O=te({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,...So(c,!1,u)}})},ct={ZodString:yo,ZodNumber:go,ZodBigInt:co,ZodBoolean:po,ZodDateIn:so,ZodDateOut:io,ZodNull:no,ZodArray:uo,ZodTuple:fo,ZodRecord:mo,ZodObject:oo,ZodLiteral:ro,ZodIntersection:Wr,ZodUnion:Jr,ZodFile:Yr,ZodUpload:Br,ZodAny:Gr,ZodDefault:qr,ZodEnum:Xt,ZodNativeEnum:Xt,ZodEffects:xo,ZodOptional:Xr,ZodNullable:to,ZodDiscriminatedUnion:Qr,ZodBranded:bo,ZodDate:ao,ZodCatch:Vr,ZodPipeline:To,ZodLazy:Oo,ZodReadonly:eo},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 Z({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(te({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}}),{})}},Ro=()=>({type:"http",scheme:"basic"}),Zo=({format:e})=>({type:"http",scheme:"bearer",...e&&{bearerFormat:e}}),Po=({name:e})=>({type:"apiKey",in:"query",name:e}),Ao=({name:e})=>({type:"apiKey",in:"header",name:e}),Eo=({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}}},{})}),ar=e=>{let t={basic:Ro,bearer:Zo,input:Po,header:Ao,cookie:Eo,openid:Io,oauth2:Co};return we(e,r=>t[r.type](r))},Ue=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 Ue(rt(e))}return Ue({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(te({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 He=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 Z({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=Ee}){super(),this.addInfo({title:o,version:n});for(let m of typeof s=="string"?[s]:s)this.addServer({url:m});ee({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]||Pe[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 Oe=Ue(we(ar(m.getSecurity()),Qe=>{let Et=this.ensureUniqSecuritySchemaName(Qe),Zr=["oauth2","openIdConnect"].includes(Qe.type)?m.getScopes():[];return this.addSecurityScheme(Et,Qe),{name:Et,scopes:Zr}}));Oe.length>0&&(w.security=Oe);let Je=or(h);this.addPath(Je,{[x]:w})}}),this.rootDoc.tags=r.tags?pr(r.tags):[]}};var yt=A(require("http"));var wo=e=>({method:"GET",header:jest.fn(()=>Y),...e}),No=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=wo(t),d=No(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 _=A(require("typescript"));var z=A(require("typescript")),i=z.default.factory,re=[i.createModifier(z.default.SyntaxKind.ExportKeyword)],Do=[i.createModifier(z.default.SyntaxKind.AsyncKeyword)],zo=[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)],Mo=i.createTemplateHead(""),vo=i.createTemplateTail(""),jo=i.createTemplateMiddle(" "),gt=e=>i.createTemplateLiteralType(Mo,e.map((t,r)=>i.createTemplateLiteralTypeSpan(i.createTypeReferenceNode(t),r===e.length-1?vo:jo))),ht=gt(["M","P"]),Ke=(e,t,r)=>i.createParameterDeclaration(r,void 0,e,void 0,t,void 0),Fe=(e,t)=>Object.keys(e).reduce((r,o)=>r.concat(Ke(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(re,e,void 0,i.createUnionTypeNode(t.map(r=>i.createLiteralTypeNode(i.createStringLiteral(r))))),$e=(e,t)=>i.createTypeAliasDeclaration(re,e,void 0,t),fr=(e,t,r)=>i.createPropertyDeclaration(zo,e,void 0,t,r),yr=(e,t,r=[])=>i.createClassDeclaration(re,e,void 0,void 0,[t,...r]),gr=(e,t)=>i.createTypeReferenceNode("Promise",[i.createIndexedAccessTypeNode(i.createTypeReferenceNode(e),t)]),hr=()=>i.createTypeReferenceNode("Promise",[i.createKeywordTypeNode(z.default.SyntaxKind.AnyKeyword)]),St=(e,t,r)=>i.createInterfaceDeclaration(re,e,void 0,t,r),xr=e=>Object.keys(e).reduce((t,r)=>t.concat(i.createTypeParameterDeclaration([],r,i.createTypeReferenceNode(e[r]))),[]),Tr=(e,t)=>i.createArrowFunction(Do,void 0,e.map(r=>Ke(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,Fe({acc:void 0,key:void 0}),void 0,void 0,t),r]);var y=A(require("typescript")),Rr=require("zod");var $=A(require("typescript")),{factory:_e}=$.default,Zt=(e,t)=>{$.default.addSyntheticLeadingComment(e,$.default.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0)},qe=(e,t,r)=>{let o=_e.createTypeAliasDeclaration(void 0,_e.createIdentifier(t),void 0,e);return r&&Zt(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)},ko=/^[A-Za-z_$][A-Za-z0-9_$]*$/,Or=e=>ko.test(e)?_e.createIdentifier(e):_e.createStringLiteral(e);var{factory:f}=y.default,Lo={[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},Uo=({schema:{value:e}})=>f.createLiteralTypeNode(typeof e=="number"?f.createNumericLiteral(e):typeof e=="boolean"?e?f.createTrue():f.createFalse():f.createStringLiteral(e)),Ho=({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&&Zt(p,a.description),p});return f.createTypeLiteralNode(n)},Ko=({schema:{element:e},next:t})=>f.createArrayTypeNode(t({schema:e})),Fo=({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}))),$o=e=>Lo?.[e.kind],_o=({schema:e,next:t,isResponse:r})=>{let o=t({schema:e.innerType()}),n=e._def.effect;if(r&&n.type==="transform"){let s=Ie({effect:n,sample:$o(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)))),Vo=({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},Go=({next:e,schema:t})=>f.createUnionTypeNode([e({schema:t.unwrap()}),f.createLiteralTypeNode(f.createNull())]),Bo=({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}),B=e=>()=>f.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=()=>f.createLiteralTypeNode(f.createNull()),on=({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}))))()},nn={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:rn,ZodArray:Ko,ZodTuple:Bo,ZodRecord:Yo,ZodObject:Ho,ZodLiteral:Uo,ZodIntersection:Jo,ZodUnion:Sr,ZodFile:B(y.default.SyntaxKind.StringKeyword),ZodAny:B(y.default.SyntaxKind.AnyKeyword),ZodDefault:Qo,ZodEnum:Fo,ZodNativeEnum:qo,ZodEffects:_o,ZodOptional:Vo,ZodNullable:Go,ZodDiscriminatedUnion:Sr,ZodBranded:Wo,ZodCatch:en,ZodPipeline:tn,ZodLazy:on,ZodReadonly:Xo},Pt=({schema:e,...t})=>te({schema:e,rules:nn,onMissing:()=>f.createKeywordTypeNode(y.default.SyntaxKind.AnyKeyword),...t});var Ve=class{agg=[];registry={};paths=[];aliases={};getAlias(t){return t in this.aliases?i.createTypeReferenceNode(t):void 0}makeAlias(t,r){return this.aliases[t]=qe(r,t),this.getAlias(t)}constructor({routing:t,variant:r="client",serializer:o=Ee,optionalPropStyle:n={withQuestionMark:!0,withUndefined:!0}}){ee({routing:t,onEndpoint:(u,O,v)=>{let ue=U(O,v,"input"),Ye=U(O,v,"response"),w={serializer:o,getAlias:this.getAlias.bind(this),makeAlias:this.makeAlias.bind(this),optionalPropStyle:n},Oe=Pt({...w,schema:u.getSchema("input"),isResponse:!1}),Je=Pt({...w,isResponse:!0,schema:u.getSchema("positive").or(u.getSchema("negative"))});this.agg.push(qe(Oe,ue),qe(Je,Ye)),v!=="options"&&(this.paths.push(O),this.registry[`${v} ${O}`]={in:ue,out:Ye,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",Lt),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(re,bt("jsonEndpoints",i.createObjectLiteralExpression(Object.keys(this.registry).filter(u=>this.registry[u].isJson).map(u=>i.createPropertyAssignment(`"${u}"`,i.createTrue()))))),m=i.createVariableStatement(re,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}),Fe({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,Fe({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([Ke("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,`
|
|
22
|
+
`.trim();var nt=({app:e,logger:t,config:r,routing:o})=>{r.startupLogo!==!1&&console.log(_t()),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 st=A(require("express")),qt=A(require("compression")),Vt=A(require("express-fileupload")),Gt=A(require("http")),it=A(require("https")),Bt=require("winston");var at=A(require("http-errors")),Kr=(e,t)=>(r,o,n,s)=>{if(!r)return s();e.handler({error:(0,at.default)(400,ne(r).message),request:o,response:n,logger:t,input:null,output:null})},Fr=(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){ze({response:o,logger:t,error:new se(ne(s).message,n)})}},Yt=e=>{let t=e.logger instanceof Bt.Logger?e.logger:je(e.logger),r=e.errorHandler||de,o=Fr(r,t);return{logger:t,errorHandler:r,notFoundHandler:o}},Jt=(e,t)=>{let{logger:r,notFoundHandler:o}=Yt(e);return nt({app:e.app,routing:t,logger:r,config:e}),{notFoundHandler:o,logger:r}},Qt=(e,t)=>{let r=(0,st.default)().disable("x-powered-by");e.server.compression&&r.use((0,qt.default)(typeof e.server.compression=="object"?e.server.compression:void 0)),r.use(e.server.jsonParser||st.default.json()),e.server.upload&&r.use((0,Vt.default)({...typeof e.server.upload=="object"?e.server.upload:{},abortOnLimit:!1,parseNested:!0}));let{logger:o,errorHandler:n,notFoundHandler:s}=Yt(e);r.use(Kr(n,o)),nt({app:r,routing:t,logger:o,config:e}),r.use(s);let a={httpServer:Gt.default.createServer(r),httpsServer:e.https?it.default.createServer(e.https.options,r):void 0};for(let d of Object.values(a)){let p=d instanceof it.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 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?$/,$r="ZodDateIn",ke=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 Ae(n)?{status:r.value,value:n}:((0,b.addIssueToContext)(o,{code:b.ZodIssueCode.invalid_date}),b.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,a=n,p=s?s({schema:e,...a,next:l=>te({...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)}}`),qr=({schema:{_def:{innerType:e,defaultValue:t}},next:r})=>({...r({schema:e}),default:t()}),Vr=({schema:{_def:{innerType:e}},next:t})=>t({schema:e}),Gr=()=>({format:"any"}),Br=e=>{if(e.isResponse)throw new Z({message:"Please use z.upload() only for input.",...e});return{type:"string",format:"binary"}},Yr=({schema:{isBinary:e,isBase64:t},...r})=>{if(!r.isResponse)throw new Z({message:"Please use z.file() only within ResultHandler.",...r});return{type:"string",format:e?"binary":t?"byte":"file"}},Jr=({schema:{options:e},next:t})=>({oneOf:e.map(r=>t({schema:r}))}),Qr=({schema:{options:e,discriminator:t},next:r})=>({discriminator:{propertyName:t},oneOf:Array.from(e.values()).map(o=>r({schema:o}))}),Wr=({schema:{_def:{left:e,right:t}},next:r})=>({allOf:[e,t].map(o=>r({schema:o}))}),Xr=({schema:e,next:t})=>t({schema:e.unwrap()}),eo=({schema:e,next:t})=>t({schema:e._def.innerType}),to=({schema:e,next:t})=>({nullable:!0,...t({schema:e.unwrap()})}),Xt=({schema:e})=>({type:typeof Object.values(e.enum)[0],enum:Object.values(e.enum)}),ro=({schema:{value:e}})=>({type:typeof e,enum:[e]}),oo=({schema:e,isResponse:t,...r})=>{let o=Object.keys(e.shape).filter(n=>{let s=e.shape[n];return!(t&&xe(s)?s instanceof T.z.ZodOptional:s.isOptional())});return{type:"object",properties:Le({schema:e,isResponse:t,...r}),...o.length?{required:o}:{}}},no=()=>({type:"string",nullable:!0,format:"null"}),so=e=>{if(e.isResponse)throw new Z({message:"Please use z.dateOut() for output.",...e});return{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",pattern:dt.source,externalDocs:{url:er}}},io=e=>{if(!e.isResponse)throw new Z({message:"Please use z.dateIn() for input.",...e});return{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",externalDocs:{url:er}}},ao=e=>{throw new Z({message:`Using z.date() within ${e.isResponse?"output":"input"} schema is forbidden. Please use z.date${e.isResponse?"Out":"In"}() instead. Check out the documentation for details.`,...e})},po=()=>({type:"boolean"}),co=()=>({type:"integer",format:"bigint"}),lo=e=>e.reduce((t,r)=>t&&r instanceof T.z.ZodLiteral,!0),mo=({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:Le({schema:T.z.object(n),...r}),...o.length?{required:o}:{}}}if(e instanceof T.z.ZodLiteral)return{type:"object",properties:Le({schema:T.z.object({[e.value]:t}),...r}),required:[e.value]};if(e instanceof T.z.ZodUnion&&lo(e.options)){let o=e.options.reduce((n,s)=>({...n,[`${s.value}`]:t}),{});return{type:"object",properties:Le({schema:T.z.object(o),...r}),required:e.options.map(n=>n.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,F.isSchemaObject)(o)?o.type:o.$ref}`).join(", ")}}}},yo=({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}`}}},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}},Le=({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 _r?.[t]},xo=({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=Ie({effect:n,sample:ho(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},To=({schema:e,isResponse:t,next:r})=>r({schema:e._def[t?"out":"in"]}),bo=({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}))))()},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}}),{})}},So=(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,{})}},be=(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=>be(o,t)).reduce((o,n)=>o.merge(n.partial()),T.z.object({}));else if(e instanceof T.z.ZodEffects){if(q(e))throw new Z({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 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=be(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&&Xe(u);return Object.keys(l).filter(u=>m||x(u)).map(u=>{let O=te({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,...So(c,!1,u)}})},ct={ZodString:yo,ZodNumber:go,ZodBigInt:co,ZodBoolean:po,ZodDateIn:so,ZodDateOut:io,ZodNull:no,ZodArray:uo,ZodTuple:fo,ZodRecord:mo,ZodObject:oo,ZodLiteral:ro,ZodIntersection:Wr,ZodUnion:Jr,ZodFile:Yr,ZodUpload:Br,ZodAny:Gr,ZodDefault:qr,ZodEnum:Xt,ZodNativeEnum:Xt,ZodEffects:xo,ZodOptional:Xr,ZodNullable:to,ZodDiscriminatedUnion:Qr,ZodBranded:bo,ZodDate:ao,ZodCatch:Vr,ZodPipeline:To,ZodLazy:Oo,ZodReadonly:eo},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 Z({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(te({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}}),{})}},Ro=()=>({type:"http",scheme:"basic"}),Zo=({format:e})=>({type:"http",scheme:"bearer",...e&&{bearerFormat:e}}),Po=({name:e})=>({type:"apiKey",in:"query",name:e}),Ao=({name:e})=>({type:"apiKey",in:"header",name:e}),Eo=({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}}},{})}),ar=e=>{let t={basic:Ro,bearer:Zo,input:Po,header:Ao,cookie:Eo,openid:Io,oauth2:Co};return we(e,r=>t[r.type](r))},Ue=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 Ue(rt(e))}return Ue({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(te({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 He=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 Z({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=Ee}){super(),this.addInfo({title:o,version:n});for(let m of typeof s=="string"?[s]:s)this.addServer({url:m});ee({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]||Pe[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 Oe=Ue(we(ar(m.getSecurity()),Qe=>{let Et=this.ensureUniqSecuritySchemaName(Qe),Zr=["oauth2","openIdConnect"].includes(Qe.type)?m.getScopes():[];return this.addSecurityScheme(Et,Qe),{name:Et,scopes:Zr}}));Oe.length>0&&(w.security=Oe);let Je=or(h);this.addPath(Je,{[x]:w})}}),this.rootDoc.tags=r.tags?pr(r.tags):[]}};var yt=A(require("http"));var wo=e=>({method:"GET",header:jest.fn(()=>Y),...e}),No=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=wo(t),d=No(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 _=A(require("typescript"));var z=A(require("typescript")),i=z.default.factory,re=[i.createModifier(z.default.SyntaxKind.ExportKeyword)],Do=[i.createModifier(z.default.SyntaxKind.AsyncKeyword)],zo=[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)],Mo=i.createTemplateHead(""),vo=i.createTemplateTail(""),jo=i.createTemplateMiddle(" "),gt=e=>i.createTemplateLiteralType(Mo,e.map((t,r)=>i.createTemplateLiteralTypeSpan(i.createTypeReferenceNode(t),r===e.length-1?vo:jo))),ht=gt(["M","P"]),Ke=(e,t,r)=>i.createParameterDeclaration(r,void 0,e,void 0,t,void 0),Fe=(e,t)=>Object.keys(e).reduce((r,o)=>r.concat(Ke(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(re,e,void 0,i.createUnionTypeNode(t.map(r=>i.createLiteralTypeNode(i.createStringLiteral(r))))),$e=(e,t)=>i.createTypeAliasDeclaration(re,e,void 0,t),fr=(e,t,r)=>i.createPropertyDeclaration(zo,e,void 0,t,r),yr=(e,t,r=[])=>i.createClassDeclaration(re,e,void 0,void 0,[t,...r]),gr=(e,t)=>i.createTypeReferenceNode("Promise",[i.createIndexedAccessTypeNode(i.createTypeReferenceNode(e),t)]),hr=()=>i.createTypeReferenceNode("Promise",[i.createKeywordTypeNode(z.default.SyntaxKind.AnyKeyword)]),St=(e,t,r)=>i.createInterfaceDeclaration(re,e,void 0,t,r),xr=e=>Object.keys(e).reduce((t,r)=>t.concat(i.createTypeParameterDeclaration([],r,i.createTypeReferenceNode(e[r]))),[]),Tr=(e,t)=>i.createArrowFunction(Do,void 0,e.map(r=>Ke(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,Fe({acc:void 0,key:void 0}),void 0,void 0,t),r]);var y=A(require("typescript")),Rr=require("zod");var $=A(require("typescript")),{factory:_e}=$.default,Zt=(e,t)=>{$.default.addSyntheticLeadingComment(e,$.default.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0)},qe=(e,t,r)=>{let o=_e.createTypeAliasDeclaration(void 0,_e.createIdentifier(t),void 0,e);return r&&Zt(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)},ko=/^[A-Za-z_$][A-Za-z0-9_$]*$/,Or=e=>ko.test(e)?_e.createIdentifier(e):_e.createStringLiteral(e);var{factory:f}=y.default,Lo={[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},Uo=({schema:{value:e}})=>f.createLiteralTypeNode(typeof e=="number"?f.createNumericLiteral(e):typeof e=="boolean"?e?f.createTrue():f.createFalse():f.createStringLiteral(e)),Ho=({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&&Zt(p,a.description),p});return f.createTypeLiteralNode(n)},Ko=({schema:{element:e},next:t})=>f.createArrayTypeNode(t({schema:e})),Fo=({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}))),$o=e=>Lo?.[e.kind],_o=({schema:e,next:t,isResponse:r})=>{let o=t({schema:e.innerType()}),n=e._def.effect;if(r&&n.type==="transform"){let s=Ie({effect:n,sample:$o(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)))),Vo=({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},Go=({next:e,schema:t})=>f.createUnionTypeNode([e({schema:t.unwrap()}),f.createLiteralTypeNode(f.createNull())]),Bo=({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}),B=e=>()=>f.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=()=>f.createLiteralTypeNode(f.createNull()),on=({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}))))()},nn={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:rn,ZodArray:Ko,ZodTuple:Bo,ZodRecord:Yo,ZodObject:Ho,ZodLiteral:Uo,ZodIntersection:Jo,ZodUnion:Sr,ZodFile:B(y.default.SyntaxKind.StringKeyword),ZodAny:B(y.default.SyntaxKind.AnyKeyword),ZodDefault:Qo,ZodEnum:Fo,ZodNativeEnum:qo,ZodEffects:_o,ZodOptional:Vo,ZodNullable:Go,ZodDiscriminatedUnion:Sr,ZodBranded:Wo,ZodCatch:en,ZodPipeline:tn,ZodLazy:on,ZodReadonly:Xo},Pt=({schema:e,...t})=>te({schema:e,rules:nn,onMissing:()=>f.createKeywordTypeNode(y.default.SyntaxKind.AnyKeyword),...t});var Ve=class{agg=[];registry={};paths=[];aliases={};getAlias(t){return t in this.aliases?i.createTypeReferenceNode(t):void 0}makeAlias(t,r){return this.aliases[t]=qe(r,t),this.getAlias(t)}constructor({routing:t,variant:r="client",serializer:o=Ee,optionalPropStyle:n={withQuestionMark:!0,withUndefined:!0}}){ee({routing:t,onEndpoint:(u,O,v)=>{let ue=U(O,v,"input"),Ye=U(O,v,"response"),w={serializer:o,getAlias:this.getAlias.bind(this),makeAlias:this.makeAlias.bind(this),optionalPropStyle:n},Oe=Pt({...w,schema:u.getSchema("input"),isResponse:!1}),Je=Pt({...w,isResponse:!0,schema:u.getSchema("positive").or(u.getSchema("negative"))});this.agg.push(qe(Oe,ue),qe(Je,Ye)),v!=="options"&&(this.paths.push(O),this.registry[`${v} ${O}`]={in:ue,out:Ye,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",Lt),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(re,bt("jsonEndpoints",i.createObjectLiteralExpression(Object.keys(this.registry).filter(u=>this.registry[u].isJson).map(u=>i.createPropertyAssignment(`"${u}"`,i.createTrue()))))),m=i.createVariableStatement(re,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}),Fe({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,Fe({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([Ke("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,`
|
|
23
23
|
export const exampleImplementation: Implementation = async (
|
|
24
24
|
method,
|
|
25
25
|
path,
|
package/dist/index.mjs
CHANGED
|
@@ -19,7 +19,7 @@ Original error: ${e.originalError.message}.`:""))};var Ot=(e,t=[F])=>{if(e insta
|
|
|
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 Be=({app:e,logger:t,config:r,routing:o})=>{r.startupLogo!==!1&&console.log(Pt()),V({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)}})};import At from"express";import Ur from"compression";import Hr from"express-fileupload";import Kr from"http";import Et from"https";import{Logger as Fr}from"winston";import It from"http-errors";var $r=(e,t)=>(r,o,n,s)=>{if(!r)return s();e.handler({error:It(400,J(r).message),request:o,response:n,logger:t,input:null,output:null})},_r=(e,t)=>(r,o)=>{let n=It(404,`Can not ${r.method} ${r.path}`);try{e.handler({request:r,response:o,logger:t,error:n,input:null,output:null})}catch(s){Re({response:o,logger:t,error:new W(J(s).message,n)})}},Ct=e=>{let t=e.logger instanceof Fr?e.logger:Ge(e.logger),r=e.errorHandler||ae,o=_r(r,t);return{logger:t,errorHandler:r,notFoundHandler:o}},qr=(e,t)=>{let{logger:r,notFoundHandler:o}=Ct(e);return Be({app:e.app,routing:t,logger:r,config:e}),{notFoundHandler:o,logger:r}},Vr=(e,t)=>{let r=At().disable("x-powered-by");e.server.compression&&r.use(Ur(typeof e.server.compression=="object"?e.server.compression:void 0)),r.use(e.server.jsonParser||At.json()),e.server.upload&&r.use(Hr({...typeof e.server.upload=="object"?e.server.upload:{},abortOnLimit:!1,parseNested:!0}));let{logger:o,errorHandler:n,notFoundHandler:s}=Ct(e);r.use($r(n,o)),Be({app:r,routing:t,logger:o,config:e}),r.use(s);let a={httpServer:Kr.createServer(r),httpsServer:e.https?Et.createServer(e.https.options,r):void 0};for(let d of Object.values(a)){let p=d instanceof Et.Server?e.https.listen:e.server.listen;d?.listen(p,()=>{o.info(`Listening ${p}`)})}return{app:r,...a,logger:o}};import{OpenApiBuilder as vo}from"openapi3-ts/oas30";import{isReferenceObject as Mt,isSchemaObject as ue}from"openapi3-ts/oas30";import{omit as me}from"ramda";import{z as T}from"zod";import{INVALID as wt,ZodIssueCode as Ye,ZodParsedType as Nt,ZodType as Gr,addIssueToContext as Je}from"zod";var Qe=/^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(\.\d+)?)?Z?$/,Br="ZodDateIn",Ae=class e extends Gr{_parse(t){let{status:r,ctx:o}=this._processInputParams(t);if(o.parsedType!==Nt.string)return Je(o,{code:Ye.invalid_type,expected:Nt.string,received:o.parsedType}),wt;Qe.test(o.data)||(Je(o,{code:Ye.invalid_string,validation:"regex"}),r.dirty());let n=new Date(o.data);return he(n)?{status:r.value,value:n}:(Je(o,{code:Ye.invalid_date}),wt)}static create=()=>new e({typeName:Br})};var G=({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=>G({...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 Dt=50,vt="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString",Yr={integer:0,number:0,string:"",boolean:!1,object:{},null:null,array:[]},jt=/:([A-Za-z0-9_]+)/g,kt=e=>{let t=e.match(jt);return t?t.map(r=>r.slice(1)):[]},Lt=e=>e.replace(jt,t=>`{${t.slice(1)}}`),Jr=({schema:{_def:{innerType:e,defaultValue:t}},next:r})=>({...r({schema:e}),default:t()}),Qr=({schema:{_def:{innerType:e}},next:t})=>t({schema:e}),Wr=()=>({format:"any"}),Xr=e=>{if(e.isResponse)throw new Z({message:"Please use z.upload() only for input.",...e});return{type:"string",format:"binary"}},eo=({schema:{isBinary:e,isBase64:t},...r})=>{if(!r.isResponse)throw new Z({message:"Please use z.file() only within ResultHandler.",...r});return{type:"string",format:e?"binary":t?"byte":"file"}},to=({schema:{options:e},next:t})=>({oneOf:e.map(r=>t({schema:r}))}),ro=({schema:{options:e,discriminator:t},next:r})=>({discriminator:{propertyName:t},oneOf:Array.from(e.values()).map(o=>r({schema:o}))}),oo=({schema:{_def:{left:e,right:t}},next:r})=>({allOf:[e,t].map(o=>r({schema:o}))}),no=({schema:e,next:t})=>t({schema:e.unwrap()}),so=({schema:e,next:t})=>t({schema:e._def.innerType}),io=({schema:e,next:t})=>({nullable:!0,...t({schema:e.unwrap()})}),zt=({schema:e})=>({type:typeof Object.values(e.enum)[0],enum:Object.values(e.enum)}),ao=({schema:{value:e}})=>({type:typeof e,enum:[e]}),po=({schema:e,isResponse:t,...r})=>{let o=Object.keys(e.shape).filter(n=>{let s=e.shape[n];return!(t&&ie(s)?s instanceof T.ZodOptional:s.isOptional())});return{type:"object",properties:Ee({schema:e,isResponse:t,...r}),...o.length?{required:o}:{}}},co=()=>({type:"string",nullable:!0,format:"null"}),lo=e=>{if(e.isResponse)throw new Z({message:"Please use z.dateOut() for output.",...e});return{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",pattern:Qe.source,externalDocs:{url:vt}}},mo=e=>{if(!e.isResponse)throw new Z({message:"Please use z.dateIn() for input.",...e});return{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",externalDocs:{url:vt}}},uo=e=>{throw new Z({message:`Using z.date() within ${e.isResponse?"output":"input"} schema is forbidden. Please use z.date${e.isResponse?"Out":"In"}() instead. Check out the documentation for details.`,...e})},fo=()=>({type:"boolean"}),yo=()=>({type:"integer",format:"bigint"}),go=e=>e.reduce((t,r)=>t&&r instanceof T.ZodLiteral,!0),ho=({schema:{keySchema:e,valueSchema:t},...r})=>{if(e instanceof T.ZodEnum||e instanceof T.ZodNativeEnum){let o=Object.values(e.enum),n=o.reduce((s,a)=>({...s,[a]:t}),{});return{type:"object",properties:Ee({schema:T.object(n),...r}),...o.length?{required:o}:{}}}if(e instanceof T.ZodLiteral)return{type:"object",properties:Ee({schema:T.object({[e.value]:t}),...r}),required:[e.value]};if(e instanceof T.ZodUnion&&go(e.options)){let o=e.options.reduce((n,s)=>({...n,[`${s.value}`]:t}),{});return{type:"object",properties:Ee({schema:T.object(o),...r}),required:e.options.map(n=>n.value)}}return{type:"object",additionalProperties:r.next({schema:t})}},xo=({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}}),To=({schema:{items:e},next:t})=>{let r=e.map(o=>t({schema:o}));return{type:"array",minItems:r.length,maxItems:r.length,items:{oneOf:r,format:"tuple",...r.length>0&&{description:r.map((o,n)=>`${n}: ${ue(o)?o.type:o.$ref}`).join(", ")}}}},bo=({schema:{isEmail:e,isURL:t,minLength:r,maxLength:o,isUUID:n,isCUID:s,isCUID2:a,isULID: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"),O=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},...O&&{pattern:`/${O.source}/${O.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}},Ee=({schema:{shape:e},next:t})=>Object.keys(e).reduce((r,o)=>({...r,[o]:t({schema:e[o]})}),{}),So=e=>{let t=Array.isArray(e.type)?e.type[0]:e.type;return Yr?.[t]},Ro=({schema:e,isResponse:t,next:r})=>{let o=r({schema:e.innerType()}),{effect:n}=e._def;if(t&&n.type==="transform"&&ue(o)){let s=be({effect:n,sample:So(o)});return s&&["number","string","boolean"].includes(s)?{type:s}:r({schema:T.any()})}if(!t&&n.type==="preprocess"&&ue(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"]}),Po=({schema:e,next:t})=>t({schema:e.unwrap()}),Ao=({next:e,schema:t,serializer:r,getRef:o,makeRef:n})=>{let s=r(t.schema);return o(s)||(()=>(n(s,{}),n(s,e({schema:t.schema}))))()},Ut=(e,t,r=[])=>{let o=v({schema:e,variant:t?"parsed":"original",validate:!0});return o.length===0?{}:{examples:o.reduce((n,s,a)=>({...n,[`example${a+1}`]:{value:typeof s=="object"&&!Array.isArray(s)?me(r,s):s}}),{})}},Eo=(e,t,r)=>{let o=v({schema:e,variant:t?"parsed":"original",validate:!0});return o.length===0?{}:{examples:o.reduce((n,s,a)=>r in s?{...n,[`example${a+1}`]:{value:s[r]}}:n,{})}},le=(e,t)=>{if(e instanceof T.ZodObject)return e;let r;if(e instanceof T.ZodUnion||e instanceof T.ZodDiscriminatedUnion)r=Array.from(e.options.values()).map(o=>le(o,t)).reduce((o,n)=>o.merge(n.partial()),T.object({}));else if(e instanceof T.ZodEffects){if(z(e))throw new Z({message:`Using transformations on the top level of ${t.isResponse?"response":"input"} schema is not allowed.`,...t});r=le(e._def.schema,t)}else r=le(e._def.left,t).merge(le(e._def.right,t));return ye(e,r)},Ht=({path:e,method:t,endpoint:r,inputSources:o,serializer:n,getRef:s,makeRef:a,composition:d,clue:p="parameter"})=>{let c=r.getSchema("input"),l=le(c,{path:e,method:t,isResponse:!1}).shape,g=kt(e),m=o.includes("query"),h=o.includes("params"),O=o.includes("headers"),x=u=>h&&g.includes(u),I=u=>O&&He(u);return Object.keys(l).filter(u=>m||x(u)).map(u=>{let b=G({schema:l[u],isResponse:!1,rules:Xe,onEach:et,onMissing:tt,serializer:n,getRef:s,makeRef:a,path:e,method:t}),C=d==="components"?a(w(e,t,`${p} ${u}`),b):b;return{name:u,in:x(u)?"path":I(u)?"header":"query",required:!l[u].isOptional(),description:ue(b)&&b.description||`${t.toUpperCase()} ${e} ${p}`,schema:C,...Eo(c,!1,u)}})},Xe={ZodString:bo,ZodNumber:Oo,ZodBigInt:yo,ZodBoolean:fo,ZodDateIn:lo,ZodDateOut:mo,ZodNull:co,ZodArray:xo,ZodTuple:To,ZodRecord:ho,ZodObject:po,ZodLiteral:ao,ZodIntersection:oo,ZodUnion:to,ZodFile:eo,ZodUpload:Xr,ZodAny:Wr,ZodDefault:Jr,ZodEnum:zt,ZodNativeEnum:zt,ZodEffects:Ro,ZodOptional:no,ZodNullable:io,ZodDiscriminatedUnion:ro,ZodBranded:Po,ZodDate:uo,ZodCatch:Qr,ZodPipeline:Zo,ZodLazy:Ao,ZodReadonly:so},et=({schema:e,isResponse:t,prev:r})=>{if(Mt(r))return{};let{description:o}=e,n=e instanceof T.ZodLazy,s=r.type!==void 0,a=t&&ie(e),d=!n&&s&&!a&&e.isNullable(),p=n?[]:v({schema:e,variant:t?"parsed":"original",validate:!0});return{...o&&{description:o},...d&&{nullable:!0},...p.length>0&&{example:p[0]}}},tt=({schema:e,...t})=>{throw new Z({message:`Zod type ${e.constructor.name} is unsupported.`,...t})},We=(e,t)=>{if(Mt(e))return e;let r=e.properties?me(t,e.properties):void 0,o=e.example?me(t,e.example):void 0,n=e.required?e.required.filter(d=>!t.includes(d)):void 0,s=e.allOf?e.allOf.map(d=>We(d,t)):void 0,a=e.oneOf?e.oneOf.map(d=>We(d,t)):void 0;return me(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})},Kt=e=>ue(e)?me(["example"],e):e,rt=({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=Kt(G({schema:c,isResponse:!0,rules:Xe,onEach:et,onMissing:tt,serializer:n,getRef:s,makeRef:a,path:t,method:e})),m=Ut(c,!0),h=d==="components"?a(w(t,e,p),g):g;return{description:`${e.toUpperCase()} ${t} ${p}`,content:l.reduce((O,x)=>({...O,[x]:{schema:h,...m}}),{})}},Io=()=>({type:"http",scheme:"basic"}),Co=({format:e})=>({type:"http",scheme:"bearer",...e&&{bearerFormat:e}}),wo=({name:e})=>({type:"apiKey",in:"query",name:e}),No=({name:e})=>({type:"apiKey",in:"header",name:e}),Do=({name:e})=>({type:"apiKey",in:"cookie",name:e}),zo=({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}}},{})}),Ft=e=>{let t={basic:Io,bearer:Co,input:wo,header:No,cookie:Do,openid:zo,oauth2:Mo};return Se(e,r=>t[r.type](r))},Ie=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 Ie($e(e))}return Ie({or:[e]})},$t=({method:e,path:t,endpoint:r,serializer:o,getRef:n,makeRef:s,composition:a,clue:d="request body"})=>{let p=kt(t),c=Kt(We(G({schema:r.getSchema("input"),isResponse:!1,rules:Xe,onEach:et,onMissing:tt,serializer:o,getRef:n,makeRef:s,path:t,method:e}),p)),l=Ut(r.getSchema("input"),!1,p),g=a==="components"?s(w(t,e,d),c):c;return{description:`${e.toUpperCase()} ${t} ${d}`,content:r.getMimeTypes("input").reduce((m,h)=>({...m,[h]:{schema:g,...l}}),{})}},_t=e=>Object.keys(e).map(t=>{let r=e[t];return{name:t,description:typeof r=="string"?r:r.description,...typeof r=="object"&&r.url&&{externalDocs:{url:r.url}}}}),ot=e=>e.length<=Dt?e:e.slice(0,Dt-1)+"\u2026";var nt=class extends vo{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 Z({message:`Duplicated operationId: "${o}"`,method:r,isResponse:!1,path:t});return this.lastOperationIdSuffixes[o]=1,o}let n=w(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=Te}){super(),this.addInfo({title:o,version:n});for(let m of typeof s=="string"?[s]:s)this.addServer({url:m});V({routing:t,onEndpoint:(m,h,O)=>{let x=O,I={path:h,method:x,endpoint:m,composition:c,serializer:l,getRef:this.getRef.bind(this),makeRef:this.makeRef.bind(this)},[u,b]=["short","long"].map(m.getDescription.bind(m)),C=r.inputSources?.[x]||ge[x],re=Ht({...I,inputSources:C}),P={operationId:this.ensureUniqOperationId(h,x,m.getOperationId(x)),responses:{[m.getStatusCode("positive")]:rt({...I,clue:a,isPositive:!0}),[m.getStatusCode("negative")]:rt({...I,clue:d,isPositive:!1})}};b&&(P.description=b,p&&u===void 0&&(P.summary=ot(b))),u&&(P.summary=ot(u)),m.getTags().length>0&&(P.tags=m.getTags()),re.length>0&&(P.parameters=re),C.includes("body")&&(P.requestBody=$t(I));let fe=Ie(Se(Ft(m.getSecurity()),Le=>{let gt=this.ensureUniqSecuritySchemaName(Le),lr=["oauth2","openIdConnect"].includes(Le.type)?m.getScopes():[];return this.addSecurityScheme(gt,Le),{name:gt,scopes:lr}}));fe.length>0&&(P.security=fe);let ke=Lt(h);this.addPath(ke,{[x]:P})}}),this.rootDoc.tags=r.tags?_t(r.tags):[]}};import qt from"http";var jo=e=>({method:"GET",header:jest.fn(()=>F),...e}),ko=e=>{let t={writableEnded:!1,statusCode:200,statusMessage:qt.STATUS_CODES[200],set:jest.fn(()=>t),setHeader:jest.fn(()=>t),header:jest.fn(()=>t),status:jest.fn(r=>(t.statusCode=r,t.statusMessage=qt.STATUS_CODES[r],t)),json:jest.fn(()=>t),send:jest.fn(()=>t),end:jest.fn(()=>(t.writableEnded=!0,t)),...e};return t},Lo=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=ko(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}};import K from"typescript";import N from"typescript";var i=N.factory,B=[i.createModifier(N.SyntaxKind.ExportKeyword)],Uo=[i.createModifier(N.SyntaxKind.AsyncKeyword)],Ho=[i.createModifier(N.SyntaxKind.PublicKeyword),i.createModifier(N.SyntaxKind.ReadonlyKeyword)],Vt=[i.createModifier(N.SyntaxKind.ProtectedKeyword),i.createModifier(N.SyntaxKind.ReadonlyKeyword)],Ko=i.createTemplateHead(""),Fo=i.createTemplateTail(""),$o=i.createTemplateMiddle(" "),st=e=>i.createTemplateLiteralType(Ko,e.map((t,r)=>i.createTemplateLiteralTypeSpan(i.createTypeReferenceNode(t),r===e.length-1?Fo:$o))),it=st(["M","P"]),Ce=(e,t,r)=>i.createParameterDeclaration(r,void 0,e,void 0,t,void 0),we=(e,t)=>Object.keys(e).reduce((r,o)=>r.concat(Ce(o,e[o],t)),[]),at=(e,t)=>i.createExpressionWithTypeArguments(i.createIdentifier("Record"),[typeof e=="number"?i.createKeywordTypeNode(e):i.createTypeReferenceNode(e),i.createKeywordTypeNode(t)]),Gt=e=>i.createConstructorDeclaration(void 0,e,i.createBlock([])),dt=(e,t)=>i.createPropertySignature(void 0,`"${e}"`,void 0,i.createTypeReferenceNode(t)),pt=(e,t)=>i.createVariableDeclarationList([i.createVariableDeclaration(e,void 0,void 0,t)],N.NodeFlags.Const),ct=(e,t)=>i.createTypeAliasDeclaration(B,e,void 0,i.createUnionTypeNode(t.map(r=>i.createLiteralTypeNode(i.createStringLiteral(r))))),Ne=(e,t)=>i.createTypeAliasDeclaration(B,e,void 0,t),Bt=(e,t,r)=>i.createPropertyDeclaration(Ho,e,void 0,t,r),Yt=(e,t,r=[])=>i.createClassDeclaration(B,e,void 0,void 0,[t,...r]),Jt=(e,t)=>i.createTypeReferenceNode("Promise",[i.createIndexedAccessTypeNode(i.createTypeReferenceNode(e),t)]),Qt=()=>i.createTypeReferenceNode("Promise",[i.createKeywordTypeNode(N.SyntaxKind.AnyKeyword)]),lt=(e,t,r)=>i.createInterfaceDeclaration(B,e,void 0,t,r),Wt=e=>Object.keys(e).reduce((t,r)=>t.concat(i.createTypeParameterDeclaration([],r,i.createTypeReferenceNode(e[r]))),[]),Xt=(e,t)=>i.createArrowFunction(Uo,void 0,e.map(r=>Ce(r)),void 0,void 0,i.createCallExpression(i.createPropertyAccessExpression(i.createThis(),"implementation"),void 0,t)),mt=(e,t,r)=>i.createCallExpression(i.createPropertyAccessExpression(i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("Object"),"keys"),void 0,[i.createIdentifier(e)]),"reduce"),void 0,[i.createArrowFunction(void 0,void 0,we({acc:void 0,key:void 0}),void 0,void 0,t),r]);import y from"typescript";import{z as qo}from"zod";import U from"typescript";var{factory:De}=U,ut=(e,t)=>{U.addSyntheticLeadingComment(e,U.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0)},ze=(e,t,r)=>{let o=De.createTypeAliasDeclaration(void 0,De.createIdentifier(t),void 0,e);return r&&ut(o,r),o},er=(e,t)=>{let r=U.createSourceFile("print.ts","",U.ScriptTarget.Latest,!1,U.ScriptKind.TS);return U.createPrinter(t).printNode(U.EmitHint.Unspecified,e,r)},_o=/^[A-Za-z_$][A-Za-z0-9_$]*$/,tr=e=>_o.test(e)?De.createIdentifier(e):De.createStringLiteral(e);var{factory:f}=y,Vo={[y.SyntaxKind.AnyKeyword]:"",[y.SyntaxKind.BigIntKeyword]:BigInt(0),[y.SyntaxKind.BooleanKeyword]:!1,[y.SyntaxKind.NumberKeyword]:0,[y.SyntaxKind.ObjectKeyword]:{},[y.SyntaxKind.StringKeyword]:"",[y.SyntaxKind.UndefinedKeyword]:void 0},Go=({schema:{value:e}})=>f.createLiteralTypeNode(typeof e=="number"?f.createNumericLiteral(e):typeof e=="boolean"?e?f.createTrue():f.createFalse():f.createStringLiteral(e)),Bo=({schema:{shape:e},isResponse:t,next:r,optionalPropStyle:{withQuestionMark:o}})=>{let n=Object.entries(e).map(([s,a])=>{let d=t&&ie(a)?a instanceof qo.ZodOptional:a.isOptional(),p=f.createPropertySignature(void 0,tr(s),d&&o?f.createToken(y.SyntaxKind.QuestionToken):void 0,r({schema:a}));return a.description&&ut(p,a.description),p});return f.createTypeLiteralNode(n)},Yo=({schema:{element:e},next:t})=>f.createArrayTypeNode(t({schema:e})),Jo=({schema:{options:e}})=>f.createUnionTypeNode(e.map(t=>f.createLiteralTypeNode(f.createStringLiteral(t)))),rr=({schema:{options:e},next:t})=>f.createUnionTypeNode(e.map(r=>t({schema:r}))),Qo=e=>Vo?.[e.kind],Wo=({schema:e,next:t,isResponse:r})=>{let o=t({schema:e.innerType()}),n=e._def.effect;if(r&&n.type==="transform"){let s=be({effect:n,sample:Qo(o)}),a={number:y.SyntaxKind.NumberKeyword,bigint:y.SyntaxKind.BigIntKeyword,boolean:y.SyntaxKind.BooleanKeyword,string:y.SyntaxKind.StringKeyword,undefined:y.SyntaxKind.UndefinedKeyword,object:y.SyntaxKind.ObjectKeyword};return f.createKeywordTypeNode(s&&a[s]||y.SyntaxKind.AnyKeyword)}return o},Xo=({schema:e})=>f.createUnionTypeNode(Object.values(e.enum).map(t=>f.createLiteralTypeNode(typeof t=="number"?f.createNumericLiteral(t):f.createStringLiteral(t)))),en=({next:e,schema:t,optionalPropStyle:{withUndefined:r}})=>{let o=e({schema:t.unwrap()});return r?f.createUnionTypeNode([o,f.createKeywordTypeNode(y.SyntaxKind.UndefinedKeyword)]):o},tn=({next:e,schema:t})=>f.createUnionTypeNode([e({schema:t.unwrap()}),f.createLiteralTypeNode(f.createNull())]),rn=({next:e,schema:{items:t}})=>f.createTupleTypeNode(t.map(r=>e({schema:r}))),on=({next:e,schema:{keySchema:t,valueSchema:r}})=>f.createExpressionWithTypeArguments(f.createIdentifier("Record"),[e({schema:t}),e({schema:r})]),nn=({next:e,schema:t})=>f.createIntersectionTypeNode([t._def.left,t._def.right].map(r=>e({schema:r}))),sn=({next:e,schema:t})=>e({schema:t._def.innerType}),H=e=>()=>f.createKeywordTypeNode(e),an=({next:e,schema:t})=>e({schema:t.unwrap()}),dn=({next:e,schema:t})=>e({schema:t._def.innerType}),pn=({next:e,schema:t})=>e({schema:t._def.innerType}),cn=({schema:e,next:t,isResponse:r})=>t({schema:e._def[r?"out":"in"]}),ln=()=>f.createLiteralTypeNode(f.createNull()),mn=({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}))))()},un={ZodString:H(y.SyntaxKind.StringKeyword),ZodNumber:H(y.SyntaxKind.NumberKeyword),ZodBigInt:H(y.SyntaxKind.BigIntKeyword),ZodBoolean:H(y.SyntaxKind.BooleanKeyword),ZodDateIn:H(y.SyntaxKind.StringKeyword),ZodDateOut:H(y.SyntaxKind.StringKeyword),ZodNull:ln,ZodArray:Yo,ZodTuple:rn,ZodRecord:on,ZodObject:Bo,ZodLiteral:Go,ZodIntersection:nn,ZodUnion:rr,ZodFile:H(y.SyntaxKind.StringKeyword),ZodAny:H(y.SyntaxKind.AnyKeyword),ZodDefault:sn,ZodEnum:Jo,ZodNativeEnum:Xo,ZodEffects:Wo,ZodOptional:en,ZodNullable:tn,ZodDiscriminatedUnion:rr,ZodBranded:an,ZodCatch:pn,ZodPipeline:cn,ZodLazy:mn,ZodReadonly:dn},ft=({schema:e,...t})=>G({schema:e,rules:un,onMissing:()=>f.createKeywordTypeNode(y.SyntaxKind.AnyKeyword),...t});var yt=class{agg=[];registry={};paths=[];aliases={};getAlias(t){return t in this.aliases?i.createTypeReferenceNode(t):void 0}makeAlias(t,r){return this.aliases[t]=ze(r,t),this.getAlias(t)}constructor({routing:t,variant:r="client",serializer:o=Te,optionalPropStyle:n={withQuestionMark:!0,withUndefined:!0}}){V({routing:t,onEndpoint:(u,b,C)=>{let re=w(b,C,"input"),je=w(b,C,"response"),P={serializer:o,getAlias:this.getAlias.bind(this),makeAlias:this.makeAlias.bind(this),optionalPropStyle:n},fe=ft({...P,schema:u.getSchema("input"),isResponse:!1}),ke=ft({...P,isResponse:!0,schema:u.getSchema("positive").or(u.getSchema("negative"))});this.agg.push(ze(fe,re),ze(ke,je)),C!=="options"&&(this.paths.push(b),this.registry[`${C} ${b}`]={in:re,out:je,isJson:u.getMimeTypes("positive").includes(F),tags:u.getTags()})}}),this.agg=Object.values(this.aliases).concat(this.agg);let s=ct("Path",this.paths),a=ct("Method",St),d=Ne("MethodPath",st([a.name,s.name])),p=[i.createHeritageClause(K.SyntaxKind.ExtendsKeyword,[at(d.name,K.SyntaxKind.AnyKeyword)])],c=lt("Input",p,Object.keys(this.registry).map(u=>dt(u,this.registry[u].in))),l=lt("Response",p,Object.keys(this.registry).map(u=>dt(u,this.registry[u].out)));if(this.agg.push(s,a,d,c,l),r==="types")return;let g=i.createVariableStatement(B,pt("jsonEndpoints",i.createObjectLiteralExpression(Object.keys(this.registry).filter(u=>this.registry[u].isJson).map(u=>i.createPropertyAssignment(`"${u}"`,i.createTrue()))))),m=i.createVariableStatement(B,pt("endpointTags",i.createObjectLiteralExpression(Object.keys(this.registry).map(u=>i.createPropertyAssignment(`"${u}"`,i.createArrayLiteralExpression(this.registry[u].tags.map(b=>i.createStringLiteral(b)))))))),h=Ne("Provider",i.createFunctionTypeNode(Wt({M:a.name,P:s.name}),we({method:i.createTypeReferenceNode("M"),path:i.createTypeReferenceNode("P"),params:i.createIndexedAccessTypeNode(i.createTypeReferenceNode(c.name),it)}),Jt(l.name,it))),O=Ne("Implementation",i.createFunctionTypeNode(void 0,we({method:i.createTypeReferenceNode(a.name),path:i.createKeywordTypeNode(K.SyntaxKind.StringKeyword),params:at(K.SyntaxKind.StringKeyword,K.SyntaxKind.AnyKeyword)}),Qt())),x=i.createTemplateExpression(i.createTemplateHead(":"),[i.createTemplateSpan(i.createIdentifier("key"),i.createTemplateTail(""))]),I=Yt("ExpressZodAPIClient",Gt([Ce("implementation",i.createTypeReferenceNode(O.name),Vt)]),[Bt("provide",i.createTypeReferenceNode(h.name),Xt(["method","path","params"],[i.createIdentifier("method"),mt("params",i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("acc"),"replace"),void 0,[x,i.createElementAccessExpression(i.createIdentifier("params"),i.createIdentifier("key"))]),i.createIdentifier("path")),mt("params",i.createConditionalExpression(i.createBinaryExpression(i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("path"),"indexOf"),void 0,[x]),K.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())]))]);K.addSyntheticLeadingComment(I,K.SyntaxKind.MultiLineCommentTrivia,`
|
|
22
|
+
`.trim();var Be=({app:e,logger:t,config:r,routing:o})=>{r.startupLogo!==!1&&console.log(Pt()),V({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)}})};import At from"express";import Ur from"compression";import Hr from"express-fileupload";import Kr from"http";import Et from"https";import{Logger as Fr}from"winston";import It from"http-errors";var $r=(e,t)=>(r,o,n,s)=>{if(!r)return s();e.handler({error:It(400,J(r).message),request:o,response:n,logger:t,input:null,output:null})},_r=(e,t)=>(r,o)=>{let n=It(404,`Can not ${r.method} ${r.path}`);try{e.handler({request:r,response:o,logger:t,error:n,input:null,output:null})}catch(s){Re({response:o,logger:t,error:new W(J(s).message,n)})}},Ct=e=>{let t=e.logger instanceof Fr?e.logger:Ge(e.logger),r=e.errorHandler||ae,o=_r(r,t);return{logger:t,errorHandler:r,notFoundHandler:o}},qr=(e,t)=>{let{logger:r,notFoundHandler:o}=Ct(e);return Be({app:e.app,routing:t,logger:r,config:e}),{notFoundHandler:o,logger:r}},Vr=(e,t)=>{let r=At().disable("x-powered-by");e.server.compression&&r.use(Ur(typeof e.server.compression=="object"?e.server.compression:void 0)),r.use(e.server.jsonParser||At.json()),e.server.upload&&r.use(Hr({...typeof e.server.upload=="object"?e.server.upload:{},abortOnLimit:!1,parseNested:!0}));let{logger:o,errorHandler:n,notFoundHandler:s}=Ct(e);r.use($r(n,o)),Be({app:r,routing:t,logger:o,config:e}),r.use(s);let a={httpServer:Kr.createServer(r),httpsServer:e.https?Et.createServer(e.https.options,r):void 0};for(let d of Object.values(a)){let p=d instanceof Et.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}};import{OpenApiBuilder as vo}from"openapi3-ts/oas30";import{isReferenceObject as Mt,isSchemaObject as ue}from"openapi3-ts/oas30";import{omit as me}from"ramda";import{z as T}from"zod";import{INVALID as wt,ZodIssueCode as Ye,ZodParsedType as Nt,ZodType as Gr,addIssueToContext as Je}from"zod";var Qe=/^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(\.\d+)?)?Z?$/,Br="ZodDateIn",Ae=class e extends Gr{_parse(t){let{status:r,ctx:o}=this._processInputParams(t);if(o.parsedType!==Nt.string)return Je(o,{code:Ye.invalid_type,expected:Nt.string,received:o.parsedType}),wt;Qe.test(o.data)||(Je(o,{code:Ye.invalid_string,validation:"regex"}),r.dirty());let n=new Date(o.data);return he(n)?{status:r.value,value:n}:(Je(o,{code:Ye.invalid_date}),wt)}static create=()=>new e({typeName:Br})};var G=({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=>G({...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 Dt=50,vt="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString",Yr={integer:0,number:0,string:"",boolean:!1,object:{},null:null,array:[]},jt=/:([A-Za-z0-9_]+)/g,kt=e=>{let t=e.match(jt);return t?t.map(r=>r.slice(1)):[]},Lt=e=>e.replace(jt,t=>`{${t.slice(1)}}`),Jr=({schema:{_def:{innerType:e,defaultValue:t}},next:r})=>({...r({schema:e}),default:t()}),Qr=({schema:{_def:{innerType:e}},next:t})=>t({schema:e}),Wr=()=>({format:"any"}),Xr=e=>{if(e.isResponse)throw new Z({message:"Please use z.upload() only for input.",...e});return{type:"string",format:"binary"}},eo=({schema:{isBinary:e,isBase64:t},...r})=>{if(!r.isResponse)throw new Z({message:"Please use z.file() only within ResultHandler.",...r});return{type:"string",format:e?"binary":t?"byte":"file"}},to=({schema:{options:e},next:t})=>({oneOf:e.map(r=>t({schema:r}))}),ro=({schema:{options:e,discriminator:t},next:r})=>({discriminator:{propertyName:t},oneOf:Array.from(e.values()).map(o=>r({schema:o}))}),oo=({schema:{_def:{left:e,right:t}},next:r})=>({allOf:[e,t].map(o=>r({schema:o}))}),no=({schema:e,next:t})=>t({schema:e.unwrap()}),so=({schema:e,next:t})=>t({schema:e._def.innerType}),io=({schema:e,next:t})=>({nullable:!0,...t({schema:e.unwrap()})}),zt=({schema:e})=>({type:typeof Object.values(e.enum)[0],enum:Object.values(e.enum)}),ao=({schema:{value:e}})=>({type:typeof e,enum:[e]}),po=({schema:e,isResponse:t,...r})=>{let o=Object.keys(e.shape).filter(n=>{let s=e.shape[n];return!(t&&ie(s)?s instanceof T.ZodOptional:s.isOptional())});return{type:"object",properties:Ee({schema:e,isResponse:t,...r}),...o.length?{required:o}:{}}},co=()=>({type:"string",nullable:!0,format:"null"}),lo=e=>{if(e.isResponse)throw new Z({message:"Please use z.dateOut() for output.",...e});return{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",pattern:Qe.source,externalDocs:{url:vt}}},mo=e=>{if(!e.isResponse)throw new Z({message:"Please use z.dateIn() for input.",...e});return{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",externalDocs:{url:vt}}},uo=e=>{throw new Z({message:`Using z.date() within ${e.isResponse?"output":"input"} schema is forbidden. Please use z.date${e.isResponse?"Out":"In"}() instead. Check out the documentation for details.`,...e})},fo=()=>({type:"boolean"}),yo=()=>({type:"integer",format:"bigint"}),go=e=>e.reduce((t,r)=>t&&r instanceof T.ZodLiteral,!0),ho=({schema:{keySchema:e,valueSchema:t},...r})=>{if(e instanceof T.ZodEnum||e instanceof T.ZodNativeEnum){let o=Object.values(e.enum),n=o.reduce((s,a)=>({...s,[a]:t}),{});return{type:"object",properties:Ee({schema:T.object(n),...r}),...o.length?{required:o}:{}}}if(e instanceof T.ZodLiteral)return{type:"object",properties:Ee({schema:T.object({[e.value]:t}),...r}),required:[e.value]};if(e instanceof T.ZodUnion&&go(e.options)){let o=e.options.reduce((n,s)=>({...n,[`${s.value}`]:t}),{});return{type:"object",properties:Ee({schema:T.object(o),...r}),required:e.options.map(n=>n.value)}}return{type:"object",additionalProperties:r.next({schema:t})}},xo=({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}}),To=({schema:{items:e},next:t})=>{let r=e.map(o=>t({schema:o}));return{type:"array",minItems:r.length,maxItems:r.length,items:{oneOf:r,format:"tuple",...r.length>0&&{description:r.map((o,n)=>`${n}: ${ue(o)?o.type:o.$ref}`).join(", ")}}}},bo=({schema:{isEmail:e,isURL:t,minLength:r,maxLength:o,isUUID:n,isCUID:s,isCUID2:a,isULID: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"),O=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},...O&&{pattern:`/${O.source}/${O.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}},Ee=({schema:{shape:e},next:t})=>Object.keys(e).reduce((r,o)=>({...r,[o]:t({schema:e[o]})}),{}),So=e=>{let t=Array.isArray(e.type)?e.type[0]:e.type;return Yr?.[t]},Ro=({schema:e,isResponse:t,next:r})=>{let o=r({schema:e.innerType()}),{effect:n}=e._def;if(t&&n.type==="transform"&&ue(o)){let s=be({effect:n,sample:So(o)});return s&&["number","string","boolean"].includes(s)?{type:s}:r({schema:T.any()})}if(!t&&n.type==="preprocess"&&ue(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"]}),Po=({schema:e,next:t})=>t({schema:e.unwrap()}),Ao=({next:e,schema:t,serializer:r,getRef:o,makeRef:n})=>{let s=r(t.schema);return o(s)||(()=>(n(s,{}),n(s,e({schema:t.schema}))))()},Ut=(e,t,r=[])=>{let o=v({schema:e,variant:t?"parsed":"original",validate:!0});return o.length===0?{}:{examples:o.reduce((n,s,a)=>({...n,[`example${a+1}`]:{value:typeof s=="object"&&!Array.isArray(s)?me(r,s):s}}),{})}},Eo=(e,t,r)=>{let o=v({schema:e,variant:t?"parsed":"original",validate:!0});return o.length===0?{}:{examples:o.reduce((n,s,a)=>r in s?{...n,[`example${a+1}`]:{value:s[r]}}:n,{})}},le=(e,t)=>{if(e instanceof T.ZodObject)return e;let r;if(e instanceof T.ZodUnion||e instanceof T.ZodDiscriminatedUnion)r=Array.from(e.options.values()).map(o=>le(o,t)).reduce((o,n)=>o.merge(n.partial()),T.object({}));else if(e instanceof T.ZodEffects){if(z(e))throw new Z({message:`Using transformations on the top level of ${t.isResponse?"response":"input"} schema is not allowed.`,...t});r=le(e._def.schema,t)}else r=le(e._def.left,t).merge(le(e._def.right,t));return ye(e,r)},Ht=({path:e,method:t,endpoint:r,inputSources:o,serializer:n,getRef:s,makeRef:a,composition:d,clue:p="parameter"})=>{let c=r.getSchema("input"),l=le(c,{path:e,method:t,isResponse:!1}).shape,g=kt(e),m=o.includes("query"),h=o.includes("params"),O=o.includes("headers"),x=u=>h&&g.includes(u),I=u=>O&&He(u);return Object.keys(l).filter(u=>m||x(u)).map(u=>{let b=G({schema:l[u],isResponse:!1,rules:Xe,onEach:et,onMissing:tt,serializer:n,getRef:s,makeRef:a,path:e,method:t}),C=d==="components"?a(w(e,t,`${p} ${u}`),b):b;return{name:u,in:x(u)?"path":I(u)?"header":"query",required:!l[u].isOptional(),description:ue(b)&&b.description||`${t.toUpperCase()} ${e} ${p}`,schema:C,...Eo(c,!1,u)}})},Xe={ZodString:bo,ZodNumber:Oo,ZodBigInt:yo,ZodBoolean:fo,ZodDateIn:lo,ZodDateOut:mo,ZodNull:co,ZodArray:xo,ZodTuple:To,ZodRecord:ho,ZodObject:po,ZodLiteral:ao,ZodIntersection:oo,ZodUnion:to,ZodFile:eo,ZodUpload:Xr,ZodAny:Wr,ZodDefault:Jr,ZodEnum:zt,ZodNativeEnum:zt,ZodEffects:Ro,ZodOptional:no,ZodNullable:io,ZodDiscriminatedUnion:ro,ZodBranded:Po,ZodDate:uo,ZodCatch:Qr,ZodPipeline:Zo,ZodLazy:Ao,ZodReadonly:so},et=({schema:e,isResponse:t,prev:r})=>{if(Mt(r))return{};let{description:o}=e,n=e instanceof T.ZodLazy,s=r.type!==void 0,a=t&&ie(e),d=!n&&s&&!a&&e.isNullable(),p=n?[]:v({schema:e,variant:t?"parsed":"original",validate:!0});return{...o&&{description:o},...d&&{nullable:!0},...p.length>0&&{example:p[0]}}},tt=({schema:e,...t})=>{throw new Z({message:`Zod type ${e.constructor.name} is unsupported.`,...t})},We=(e,t)=>{if(Mt(e))return e;let r=e.properties?me(t,e.properties):void 0,o=e.example?me(t,e.example):void 0,n=e.required?e.required.filter(d=>!t.includes(d)):void 0,s=e.allOf?e.allOf.map(d=>We(d,t)):void 0,a=e.oneOf?e.oneOf.map(d=>We(d,t)):void 0;return me(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})},Kt=e=>ue(e)?me(["example"],e):e,rt=({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=Kt(G({schema:c,isResponse:!0,rules:Xe,onEach:et,onMissing:tt,serializer:n,getRef:s,makeRef:a,path:t,method:e})),m=Ut(c,!0),h=d==="components"?a(w(t,e,p),g):g;return{description:`${e.toUpperCase()} ${t} ${p}`,content:l.reduce((O,x)=>({...O,[x]:{schema:h,...m}}),{})}},Io=()=>({type:"http",scheme:"basic"}),Co=({format:e})=>({type:"http",scheme:"bearer",...e&&{bearerFormat:e}}),wo=({name:e})=>({type:"apiKey",in:"query",name:e}),No=({name:e})=>({type:"apiKey",in:"header",name:e}),Do=({name:e})=>({type:"apiKey",in:"cookie",name:e}),zo=({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}}},{})}),Ft=e=>{let t={basic:Io,bearer:Co,input:wo,header:No,cookie:Do,openid:zo,oauth2:Mo};return Se(e,r=>t[r.type](r))},Ie=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 Ie($e(e))}return Ie({or:[e]})},$t=({method:e,path:t,endpoint:r,serializer:o,getRef:n,makeRef:s,composition:a,clue:d="request body"})=>{let p=kt(t),c=Kt(We(G({schema:r.getSchema("input"),isResponse:!1,rules:Xe,onEach:et,onMissing:tt,serializer:o,getRef:n,makeRef:s,path:t,method:e}),p)),l=Ut(r.getSchema("input"),!1,p),g=a==="components"?s(w(t,e,d),c):c;return{description:`${e.toUpperCase()} ${t} ${d}`,content:r.getMimeTypes("input").reduce((m,h)=>({...m,[h]:{schema:g,...l}}),{})}},_t=e=>Object.keys(e).map(t=>{let r=e[t];return{name:t,description:typeof r=="string"?r:r.description,...typeof r=="object"&&r.url&&{externalDocs:{url:r.url}}}}),ot=e=>e.length<=Dt?e:e.slice(0,Dt-1)+"\u2026";var nt=class extends vo{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 Z({message:`Duplicated operationId: "${o}"`,method:r,isResponse:!1,path:t});return this.lastOperationIdSuffixes[o]=1,o}let n=w(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=Te}){super(),this.addInfo({title:o,version:n});for(let m of typeof s=="string"?[s]:s)this.addServer({url:m});V({routing:t,onEndpoint:(m,h,O)=>{let x=O,I={path:h,method:x,endpoint:m,composition:c,serializer:l,getRef:this.getRef.bind(this),makeRef:this.makeRef.bind(this)},[u,b]=["short","long"].map(m.getDescription.bind(m)),C=r.inputSources?.[x]||ge[x],re=Ht({...I,inputSources:C}),P={operationId:this.ensureUniqOperationId(h,x,m.getOperationId(x)),responses:{[m.getStatusCode("positive")]:rt({...I,clue:a,isPositive:!0}),[m.getStatusCode("negative")]:rt({...I,clue:d,isPositive:!1})}};b&&(P.description=b,p&&u===void 0&&(P.summary=ot(b))),u&&(P.summary=ot(u)),m.getTags().length>0&&(P.tags=m.getTags()),re.length>0&&(P.parameters=re),C.includes("body")&&(P.requestBody=$t(I));let fe=Ie(Se(Ft(m.getSecurity()),Le=>{let gt=this.ensureUniqSecuritySchemaName(Le),lr=["oauth2","openIdConnect"].includes(Le.type)?m.getScopes():[];return this.addSecurityScheme(gt,Le),{name:gt,scopes:lr}}));fe.length>0&&(P.security=fe);let ke=Lt(h);this.addPath(ke,{[x]:P})}}),this.rootDoc.tags=r.tags?_t(r.tags):[]}};import qt from"http";var jo=e=>({method:"GET",header:jest.fn(()=>F),...e}),ko=e=>{let t={writableEnded:!1,statusCode:200,statusMessage:qt.STATUS_CODES[200],set:jest.fn(()=>t),setHeader:jest.fn(()=>t),header:jest.fn(()=>t),status:jest.fn(r=>(t.statusCode=r,t.statusMessage=qt.STATUS_CODES[r],t)),json:jest.fn(()=>t),send:jest.fn(()=>t),end:jest.fn(()=>(t.writableEnded=!0,t)),...e};return t},Lo=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=ko(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}};import K from"typescript";import N from"typescript";var i=N.factory,B=[i.createModifier(N.SyntaxKind.ExportKeyword)],Uo=[i.createModifier(N.SyntaxKind.AsyncKeyword)],Ho=[i.createModifier(N.SyntaxKind.PublicKeyword),i.createModifier(N.SyntaxKind.ReadonlyKeyword)],Vt=[i.createModifier(N.SyntaxKind.ProtectedKeyword),i.createModifier(N.SyntaxKind.ReadonlyKeyword)],Ko=i.createTemplateHead(""),Fo=i.createTemplateTail(""),$o=i.createTemplateMiddle(" "),st=e=>i.createTemplateLiteralType(Ko,e.map((t,r)=>i.createTemplateLiteralTypeSpan(i.createTypeReferenceNode(t),r===e.length-1?Fo:$o))),it=st(["M","P"]),Ce=(e,t,r)=>i.createParameterDeclaration(r,void 0,e,void 0,t,void 0),we=(e,t)=>Object.keys(e).reduce((r,o)=>r.concat(Ce(o,e[o],t)),[]),at=(e,t)=>i.createExpressionWithTypeArguments(i.createIdentifier("Record"),[typeof e=="number"?i.createKeywordTypeNode(e):i.createTypeReferenceNode(e),i.createKeywordTypeNode(t)]),Gt=e=>i.createConstructorDeclaration(void 0,e,i.createBlock([])),dt=(e,t)=>i.createPropertySignature(void 0,`"${e}"`,void 0,i.createTypeReferenceNode(t)),pt=(e,t)=>i.createVariableDeclarationList([i.createVariableDeclaration(e,void 0,void 0,t)],N.NodeFlags.Const),ct=(e,t)=>i.createTypeAliasDeclaration(B,e,void 0,i.createUnionTypeNode(t.map(r=>i.createLiteralTypeNode(i.createStringLiteral(r))))),Ne=(e,t)=>i.createTypeAliasDeclaration(B,e,void 0,t),Bt=(e,t,r)=>i.createPropertyDeclaration(Ho,e,void 0,t,r),Yt=(e,t,r=[])=>i.createClassDeclaration(B,e,void 0,void 0,[t,...r]),Jt=(e,t)=>i.createTypeReferenceNode("Promise",[i.createIndexedAccessTypeNode(i.createTypeReferenceNode(e),t)]),Qt=()=>i.createTypeReferenceNode("Promise",[i.createKeywordTypeNode(N.SyntaxKind.AnyKeyword)]),lt=(e,t,r)=>i.createInterfaceDeclaration(B,e,void 0,t,r),Wt=e=>Object.keys(e).reduce((t,r)=>t.concat(i.createTypeParameterDeclaration([],r,i.createTypeReferenceNode(e[r]))),[]),Xt=(e,t)=>i.createArrowFunction(Uo,void 0,e.map(r=>Ce(r)),void 0,void 0,i.createCallExpression(i.createPropertyAccessExpression(i.createThis(),"implementation"),void 0,t)),mt=(e,t,r)=>i.createCallExpression(i.createPropertyAccessExpression(i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("Object"),"keys"),void 0,[i.createIdentifier(e)]),"reduce"),void 0,[i.createArrowFunction(void 0,void 0,we({acc:void 0,key:void 0}),void 0,void 0,t),r]);import y from"typescript";import{z as qo}from"zod";import U from"typescript";var{factory:De}=U,ut=(e,t)=>{U.addSyntheticLeadingComment(e,U.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0)},ze=(e,t,r)=>{let o=De.createTypeAliasDeclaration(void 0,De.createIdentifier(t),void 0,e);return r&&ut(o,r),o},er=(e,t)=>{let r=U.createSourceFile("print.ts","",U.ScriptTarget.Latest,!1,U.ScriptKind.TS);return U.createPrinter(t).printNode(U.EmitHint.Unspecified,e,r)},_o=/^[A-Za-z_$][A-Za-z0-9_$]*$/,tr=e=>_o.test(e)?De.createIdentifier(e):De.createStringLiteral(e);var{factory:f}=y,Vo={[y.SyntaxKind.AnyKeyword]:"",[y.SyntaxKind.BigIntKeyword]:BigInt(0),[y.SyntaxKind.BooleanKeyword]:!1,[y.SyntaxKind.NumberKeyword]:0,[y.SyntaxKind.ObjectKeyword]:{},[y.SyntaxKind.StringKeyword]:"",[y.SyntaxKind.UndefinedKeyword]:void 0},Go=({schema:{value:e}})=>f.createLiteralTypeNode(typeof e=="number"?f.createNumericLiteral(e):typeof e=="boolean"?e?f.createTrue():f.createFalse():f.createStringLiteral(e)),Bo=({schema:{shape:e},isResponse:t,next:r,optionalPropStyle:{withQuestionMark:o}})=>{let n=Object.entries(e).map(([s,a])=>{let d=t&&ie(a)?a instanceof qo.ZodOptional:a.isOptional(),p=f.createPropertySignature(void 0,tr(s),d&&o?f.createToken(y.SyntaxKind.QuestionToken):void 0,r({schema:a}));return a.description&&ut(p,a.description),p});return f.createTypeLiteralNode(n)},Yo=({schema:{element:e},next:t})=>f.createArrayTypeNode(t({schema:e})),Jo=({schema:{options:e}})=>f.createUnionTypeNode(e.map(t=>f.createLiteralTypeNode(f.createStringLiteral(t)))),rr=({schema:{options:e},next:t})=>f.createUnionTypeNode(e.map(r=>t({schema:r}))),Qo=e=>Vo?.[e.kind],Wo=({schema:e,next:t,isResponse:r})=>{let o=t({schema:e.innerType()}),n=e._def.effect;if(r&&n.type==="transform"){let s=be({effect:n,sample:Qo(o)}),a={number:y.SyntaxKind.NumberKeyword,bigint:y.SyntaxKind.BigIntKeyword,boolean:y.SyntaxKind.BooleanKeyword,string:y.SyntaxKind.StringKeyword,undefined:y.SyntaxKind.UndefinedKeyword,object:y.SyntaxKind.ObjectKeyword};return f.createKeywordTypeNode(s&&a[s]||y.SyntaxKind.AnyKeyword)}return o},Xo=({schema:e})=>f.createUnionTypeNode(Object.values(e.enum).map(t=>f.createLiteralTypeNode(typeof t=="number"?f.createNumericLiteral(t):f.createStringLiteral(t)))),en=({next:e,schema:t,optionalPropStyle:{withUndefined:r}})=>{let o=e({schema:t.unwrap()});return r?f.createUnionTypeNode([o,f.createKeywordTypeNode(y.SyntaxKind.UndefinedKeyword)]):o},tn=({next:e,schema:t})=>f.createUnionTypeNode([e({schema:t.unwrap()}),f.createLiteralTypeNode(f.createNull())]),rn=({next:e,schema:{items:t}})=>f.createTupleTypeNode(t.map(r=>e({schema:r}))),on=({next:e,schema:{keySchema:t,valueSchema:r}})=>f.createExpressionWithTypeArguments(f.createIdentifier("Record"),[e({schema:t}),e({schema:r})]),nn=({next:e,schema:t})=>f.createIntersectionTypeNode([t._def.left,t._def.right].map(r=>e({schema:r}))),sn=({next:e,schema:t})=>e({schema:t._def.innerType}),H=e=>()=>f.createKeywordTypeNode(e),an=({next:e,schema:t})=>e({schema:t.unwrap()}),dn=({next:e,schema:t})=>e({schema:t._def.innerType}),pn=({next:e,schema:t})=>e({schema:t._def.innerType}),cn=({schema:e,next:t,isResponse:r})=>t({schema:e._def[r?"out":"in"]}),ln=()=>f.createLiteralTypeNode(f.createNull()),mn=({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}))))()},un={ZodString:H(y.SyntaxKind.StringKeyword),ZodNumber:H(y.SyntaxKind.NumberKeyword),ZodBigInt:H(y.SyntaxKind.BigIntKeyword),ZodBoolean:H(y.SyntaxKind.BooleanKeyword),ZodDateIn:H(y.SyntaxKind.StringKeyword),ZodDateOut:H(y.SyntaxKind.StringKeyword),ZodNull:ln,ZodArray:Yo,ZodTuple:rn,ZodRecord:on,ZodObject:Bo,ZodLiteral:Go,ZodIntersection:nn,ZodUnion:rr,ZodFile:H(y.SyntaxKind.StringKeyword),ZodAny:H(y.SyntaxKind.AnyKeyword),ZodDefault:sn,ZodEnum:Jo,ZodNativeEnum:Xo,ZodEffects:Wo,ZodOptional:en,ZodNullable:tn,ZodDiscriminatedUnion:rr,ZodBranded:an,ZodCatch:pn,ZodPipeline:cn,ZodLazy:mn,ZodReadonly:dn},ft=({schema:e,...t})=>G({schema:e,rules:un,onMissing:()=>f.createKeywordTypeNode(y.SyntaxKind.AnyKeyword),...t});var yt=class{agg=[];registry={};paths=[];aliases={};getAlias(t){return t in this.aliases?i.createTypeReferenceNode(t):void 0}makeAlias(t,r){return this.aliases[t]=ze(r,t),this.getAlias(t)}constructor({routing:t,variant:r="client",serializer:o=Te,optionalPropStyle:n={withQuestionMark:!0,withUndefined:!0}}){V({routing:t,onEndpoint:(u,b,C)=>{let re=w(b,C,"input"),je=w(b,C,"response"),P={serializer:o,getAlias:this.getAlias.bind(this),makeAlias:this.makeAlias.bind(this),optionalPropStyle:n},fe=ft({...P,schema:u.getSchema("input"),isResponse:!1}),ke=ft({...P,isResponse:!0,schema:u.getSchema("positive").or(u.getSchema("negative"))});this.agg.push(ze(fe,re),ze(ke,je)),C!=="options"&&(this.paths.push(b),this.registry[`${C} ${b}`]={in:re,out:je,isJson:u.getMimeTypes("positive").includes(F),tags:u.getTags()})}}),this.agg=Object.values(this.aliases).concat(this.agg);let s=ct("Path",this.paths),a=ct("Method",St),d=Ne("MethodPath",st([a.name,s.name])),p=[i.createHeritageClause(K.SyntaxKind.ExtendsKeyword,[at(d.name,K.SyntaxKind.AnyKeyword)])],c=lt("Input",p,Object.keys(this.registry).map(u=>dt(u,this.registry[u].in))),l=lt("Response",p,Object.keys(this.registry).map(u=>dt(u,this.registry[u].out)));if(this.agg.push(s,a,d,c,l),r==="types")return;let g=i.createVariableStatement(B,pt("jsonEndpoints",i.createObjectLiteralExpression(Object.keys(this.registry).filter(u=>this.registry[u].isJson).map(u=>i.createPropertyAssignment(`"${u}"`,i.createTrue()))))),m=i.createVariableStatement(B,pt("endpointTags",i.createObjectLiteralExpression(Object.keys(this.registry).map(u=>i.createPropertyAssignment(`"${u}"`,i.createArrayLiteralExpression(this.registry[u].tags.map(b=>i.createStringLiteral(b)))))))),h=Ne("Provider",i.createFunctionTypeNode(Wt({M:a.name,P:s.name}),we({method:i.createTypeReferenceNode("M"),path:i.createTypeReferenceNode("P"),params:i.createIndexedAccessTypeNode(i.createTypeReferenceNode(c.name),it)}),Jt(l.name,it))),O=Ne("Implementation",i.createFunctionTypeNode(void 0,we({method:i.createTypeReferenceNode(a.name),path:i.createKeywordTypeNode(K.SyntaxKind.StringKeyword),params:at(K.SyntaxKind.StringKeyword,K.SyntaxKind.AnyKeyword)}),Qt())),x=i.createTemplateExpression(i.createTemplateHead(":"),[i.createTemplateSpan(i.createIdentifier("key"),i.createTemplateTail(""))]),I=Yt("ExpressZodAPIClient",Gt([Ce("implementation",i.createTypeReferenceNode(O.name),Vt)]),[Bt("provide",i.createTypeReferenceNode(h.name),Xt(["method","path","params"],[i.createIdentifier("method"),mt("params",i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("acc"),"replace"),void 0,[x,i.createElementAccessExpression(i.createIdentifier("params"),i.createIdentifier("key"))]),i.createIdentifier("path")),mt("params",i.createConditionalExpression(i.createBinaryExpression(i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("path"),"indexOf"),void 0,[x]),K.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())]))]);K.addSyntheticLeadingComment(I,K.SyntaxKind.MultiLineCommentTrivia,`
|
|
23
23
|
export const exampleImplementation: Implementation = async (
|
|
24
24
|
method,
|
|
25
25
|
path,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "express-zod-api",
|
|
3
|
-
"version": "14.0
|
|
3
|
+
"version": "14.1.0",
|
|
4
4
|
"description": "A Typescript library to help you get an API server up and running with I/O schema validation and custom middlewares in minutes.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"scripts": {
|
|
@@ -128,7 +128,7 @@
|
|
|
128
128
|
},
|
|
129
129
|
"repository": {
|
|
130
130
|
"type": "git",
|
|
131
|
-
"url": "https://github.com/RobinTail/express-zod-api.git"
|
|
131
|
+
"url": "git+https://github.com/RobinTail/express-zod-api.git"
|
|
132
132
|
},
|
|
133
133
|
"homepage": "https://ez.robintail.cz",
|
|
134
134
|
"author": {
|