express-zod-api 11.4.0 → 11.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,11 @@
2
2
 
3
3
  ## Version 11
4
4
 
5
+ ### v11.5.0
6
+
7
+ - The following methods added to the mocked `response` object for `testEndpoint()` method:
8
+ - `send`, `setHeader`, `header`.
9
+
5
10
  ### v11.4.0
6
11
 
7
12
  - Supporting `z.readonly()` of `zod` v3.22.
@@ -787,7 +787,7 @@ declare const testEndpoint: <REQ extends Partial<Record<keyof Request<express_se
787
787
  writableEnded: boolean;
788
788
  statusCode: number;
789
789
  statusMessage: string;
790
- } & Record<"status" | "set" | "json" | "end", jest.Mock<any, any, any>> & (RES extends undefined ? {} : RES);
790
+ } & Record<"status" | "header" | "set" | "json" | "end" | "send" | "setHeader", jest.Mock<any, any, any>> & (RES extends undefined ? {} : RES);
791
791
  loggerMock: Record<"error" | "warn" | "debug" | "info", jest.Mock<any, any, any>> & (LOG extends undefined ? {} : LOG);
792
792
  }>;
793
793
 
package/dist/esm/index.js CHANGED
@@ -31,7 +31,7 @@ The error caused by ${o?`'${o}' route that has a '${s}'`:`'${s}'`} entry.`);let
31
31
  \x1B[90m\x1B[3m Thank you for choosing Express Zod API for your project.\x1B[23m\x1B[39m\x1B[0m\x1B[0m
32
32
  \x1B[0m\x1B[0m
33
33
  \x1B[0m\x1B[0m
34
- `.trim();var it=({app:e,logger:t,config:r,routing:o})=>{r.startupLogo!==!1&&console.log(Ft()),G({routing:o,hasCors:!!r.cors,onEndpoint:(n,s,a)=>{e[a](s,async(d,c)=>{t.info(`${d.method}: ${s}`),await n.execute({request:d,response:c,logger:t,config:r})})},onStatic:(n,s)=>{e.use(n,s)}})};import oo,{json as no}from"express";import so from"compression";import io from"express-fileupload";import ao from"https";import $t from"http-errors";var po=(e,t)=>(r,o,n,s)=>{if(!r)return s();e.handler({error:$t(400,J(r).message),request:o,response:n,logger:t,input:o.body,output:null})},_t=(e,t)=>(r,o)=>{let n=$t(404,`Can not ${r.method} ${r.path}`);try{e.handler({request:r,response:o,logger:t,error:n,input:null,output:null})}catch(s){Ie({response:o,logger:t,error:new W(J(s).message,n)})}};function co(e,t){let r=et(e.logger)?ke(e.logger):e.logger;it({app:e.app,routing:t,logger:r,config:e});let o=e.errorHandler||re;return{notFoundHandler:_t(o,r),logger:r}}function lo(e,t){let r=et(e.logger)?ke(e.logger):e.logger,o=oo();o.disable("x-powered-by");let n=e.errorHandler||re,s=e.server.compression?so({...typeof e.server.compression=="object"?e.server.compression:{}}):void 0,a=e.server.jsonParser||no(),d=e.server.upload?io({...typeof e.server.upload=="object"?e.server.upload:{},abortOnLimit:!1,parseNested:!0}):void 0,c=[].concat(s||[]).concat(a).concat(d||[]);o.use(c),o.use(po(n,r)),it({app:o,routing:t,logger:r,config:e}),o.use(_t(n,r));let p=o.listen(e.server.listen,()=>{r.info(`Listening ${e.server.listen}`)}),l;return e.https&&(l=ao.createServer(e.https.options,o).listen(e.https.listen,()=>{r.info(`Listening ${e.https.listen}`)})),{app:o,httpServer:p,httpsServer:l,logger:r}}import{OpenApiBuilder as Wo}from"openapi3-ts/oas30";import{isReferenceObject as Yt,isSchemaObject as xe}from"openapi3-ts/oas30";import{omit as he}from"ramda";import{z as T}from"zod";import{INVALID as Gt,ZodIssueCode as at,ZodParsedType as qt,ZodType as mo,addIssueToContext as dt}from"zod";var pt=/^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(\.\d+)?)?Z?$/,uo="ZodDateIn",He=class He extends mo{_parse(t){let{status:r,ctx:o}=this._processInputParams(t);if(o.parsedType!==qt.string)return dt(o,{code:at.invalid_type,expected:qt.string,received:o.parsedType}),Gt;pt.test(o.data)||(dt(o,{code:at.invalid_string,validation:"regex"}),r.dirty());let n=new Date(o.data);return Re(n)?{status:r.value,value:n}:(dt(o,{code:at.invalid_date}),Gt)}};He.create=()=>new He({typeName:uo});var Ue=He;var q=({schema:e,onEach:t,rules:r,onMissing:o,...n})=>{let s="typeName"in e._def?r[e._def.typeName]:void 0,d=s?s({schema:e,...n,next:p=>q({...p,...n,onEach:t,rules:r,onMissing:o})}):o({schema:e,...n}),c=t&&t({schema:e,prev:d,...n});return c?{...d,...c}:d};var Vt=50,Jt="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString",fo={integer:0,number:0,string:"",boolean:!1,object:{},null:null,array:[]},Qt=e=>e.replace(We,t=>`{${t.slice(1)}}`),yo=({schema:{_def:{innerType:e,defaultValue:t}},next:r})=>({...r({schema:e}),default:t()}),go=({schema:{_def:{innerType:e}},next:t})=>t({schema:e}),ho=()=>({format:"any"}),xo=e=>{if(e.isResponse)throw new P({message:"Please use z.upload() only for input.",...e});return{type:"string",format:"binary"}},To=({schema:{isBinary:e,isBase64:t},...r})=>{if(!r.isResponse)throw new P({message:"Please use z.file() only within ResultHandler.",...r});return{type:"string",format:e?"binary":t?"byte":"file"}},So=({schema:{options:e},next:t})=>({oneOf:e.map(r=>t({schema:r}))}),Oo=({schema:{options:e,discriminator:t},next:r})=>({discriminator:{propertyName:t},oneOf:Array.from(e.values()).map(o=>r({schema:o}))}),bo=({schema:{_def:{left:e,right:t}},next:r})=>({allOf:[e,t].map(o=>r({schema:o}))}),Ro=({schema:e,next:t})=>t({schema:e.unwrap()}),Po=({schema:e,next:t})=>t({schema:e._def.innerType}),Zo=({schema:e,next:t})=>({nullable:!0,...t({schema:e.unwrap()})}),Bt=({schema:e})=>({type:typeof Object.values(e.enum)[0],enum:Object.values(e.enum)}),Eo=({schema:{value:e}})=>({type:typeof e,enum:[e]}),Ao=({schema:e,isResponse:t,...r})=>{let o=Object.keys(e.shape).filter(n=>{let s=e.shape[n];return!(t&&me(s)?s instanceof T.ZodOptional:s.isOptional())});return{type:"object",properties:Ke({schema:e,isResponse:t,...r}),...o.length?{required:o}:{}}},Io=()=>({type:"string",nullable:!0,format:"null"}),Co=e=>{if(e.isResponse)throw new P({message:"Please use z.dateOut() for output.",...e});return{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",pattern:pt.source,externalDocs:{url:Jt}}},Mo=e=>{if(!e.isResponse)throw new P({message:"Please use z.dateIn() for input.",...e});return{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",externalDocs:{url:Jt}}},No=e=>{throw new P({message:`Using z.date() within ${e.isResponse?"output":"input"} schema is forbidden. Please use z.date${e.isResponse?"Out":"In"}() instead. Check out the documentation for details.`,...e})},wo=()=>({type:"boolean"}),Do=()=>({type:"integer",format:"bigint"}),zo=({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:Ke({schema:T.object(n),...r}),...o.length?{required:o}:{}}}if(e instanceof T.ZodLiteral)return{type:"object",properties:Ke({schema:T.object({[e.value]:t}),...r}),required:[e.value]};if(e instanceof T.ZodUnion&&e.options.reduce((n,s)=>n&&s instanceof T.ZodLiteral,!0)){let n=e.options.reduce((s,a)=>({...s,[a.value]:t}),{});return{type:"object",properties:Ke({schema:T.object(n),...r}),required:e.options.map(s=>s.value)}}return{type:"object",additionalProperties:r.next({schema:t})}},vo=({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}}),jo=({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}: ${xe(o)?o.type:o.$ref}`).join(", ")}}}},Lo=({schema:{isEmail:e,isURL:t,minLength:r,maxLength:o,isUUID:n,isCUID:s,isCUID2:a,isULID:d,isIP:c,isEmoji:p,isDatetime:l,_def:{checks:f}}})=>{let x=f.find(h=>h.kind==="regex"),g=f.find(h=>h.kind==="datetime"),S=x?x.regex:g?g.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"},...c&&{format:"ip"},...p&&{format:"emoji"},...r!==null&&{minLength:r},...o!==null&&{maxLength:o},...S&&{pattern:`/${S.source}/${S.flags}`}}},ko=({schema:e})=>{let t=e._def.checks.find(({kind:s})=>s==="min"),r=t?t.inclusive:!0,o=e._def.checks.find(({kind:s})=>s==="max"),n=o?o.inclusive:!0;return{type:e.isInt?"integer":"number",format:e.isInt?"int64":"double",minimum:e.minValue===null?e.isInt?Number.MIN_SAFE_INTEGER:Number.MIN_VALUE:e.minValue,exclusiveMinimum:!r,maximum:e.maxValue===null?e.isInt?Number.MAX_SAFE_INTEGER:Number.MAX_VALUE:e.maxValue,exclusiveMaximum:!n}},Ke=({schema:{shape:e},next:t})=>Object.keys(e).reduce((r,o)=>({...r,[o]:t({schema:e[o]})}),{}),Uo=e=>{let t=Array.isArray(e.type)?e.type[0]:e.type;return fo?.[t]},Ho=({schema:e,isResponse:t,next:r})=>{let o=r({schema:e.innerType()}),{effect:n}=e._def;if(t&&n.type==="transform"&&xe(o)){let s=Ze({effect:n,sample:Uo(o)});return s&&["number","string","boolean"].includes(s)?{type:s}:r({schema:T.any()})}if(!t&&n.type==="preprocess"&&xe(o)){let{type:s,...a}=o;return{...a,format:`${a.format||s} (preprocessed)`}}return o},Ko=({schema:e,isResponse:t,next:r})=>r({schema:e._def[t?"out":"in"]}),Fo=({schema:e,next:t})=>t({schema:e.unwrap()}),$o=({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}))))()},Wt=(e,t,r=[])=>{let o=F({schema:e,variant:t?"parsed":"original",validate:!0});return o.length===0?{}:{examples:o.reduce((n,s,a)=>({...n,[`example${a+1}`]:{value:he(r,s)}}),{})}},_o=(e,t,r)=>{let o=F({schema:e,variant:t?"parsed":"original",validate:!0});return o.length===0?{}:{examples:o.reduce((n,s,a)=>r in s?{...n,[`example${a+1}`]:{value:s[r]}}:n,{})}};function ge(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=>ge(o,t)).reduce((o,n)=>o.merge(n.partial()),T.object({}));else if(e instanceof T.ZodEffects){if(D(e))throw new P({message:`Using transformations on the top level of ${t.isResponse?"response":"input"} schema is not allowed.`,...t});r=ge(e._def.schema,t)}else r=ge(e._def.left,t).merge(ge(e._def.right,t));return Se(e,r)}var Xt=({path:e,method:t,endpoint:r,inputSources:o,serializer:n,getRef:s,makeRef:a,composition:d,clue:c="parameter"})=>{let p=r.getSchema("input"),l=ge(p,{path:e,method:t,isResponse:!1}).shape,f=rt(e),x=o.includes("query"),g=o.includes("params"),S=h=>g&&f.includes(h);return Object.keys(l).filter(h=>x||S(h)).map(h=>{let y=q({schema:l[h],isResponse:!1,rules:lt,onEach:mt,onMissing:ut,serializer:n,getRef:s,makeRef:a,path:e,method:t}),R=d==="components"?a(I(e,t,`${c} ${h}`),y):y;return{name:h,in:S(h)?"path":"query",required:!l[h].isOptional(),description:xe(y)&&y.description||`${t.toUpperCase()} ${e} ${c}`,schema:R,..._o(p,!1,h)}})},lt={ZodString:Lo,ZodNumber:ko,ZodBigInt:Do,ZodBoolean:wo,ZodDateIn:Co,ZodDateOut:Mo,ZodNull:Io,ZodArray:vo,ZodTuple:jo,ZodRecord:zo,ZodObject:Ao,ZodLiteral:Eo,ZodIntersection:bo,ZodUnion:So,ZodFile:To,ZodUpload:xo,ZodAny:ho,ZodDefault:yo,ZodEnum:Bt,ZodNativeEnum:Bt,ZodEffects:Ho,ZodOptional:Ro,ZodNullable:Zo,ZodDiscriminatedUnion:Oo,ZodBranded:Fo,ZodDate:No,ZodCatch:go,ZodPipeline:Ko,ZodLazy:$o,ZodReadonly:Po},mt=({schema:e,isResponse:t,prev:r})=>{if(Yt(r))return{};let{description:o}=e,n=e instanceof T.ZodLazy,s=r.type!==void 0,a=t&&me(e),d=!n&&s&&!a&&e.isNullable(),c=n?[]:F({schema:e,variant:t?"parsed":"original",validate:!0});return{...o&&{description:o},...d&&{nullable:!0},...c.length>0&&{example:c[0]}}},ut=({schema:e,...t})=>{throw new P({message:`Zod type ${e.constructor.name} is unsupported.`,...t})},ct=(e,t)=>{if(Yt(e))return e;let r=e.properties?he(t,e.properties):void 0,o=e.example?he(t,e.example):void 0,n=e.required?e.required.filter(d=>!t.includes(d)):void 0,s=e.allOf?e.allOf.map(d=>ct(d,t)):void 0,a=e.oneOf?e.oneOf.map(d=>ct(d,t)):void 0;return he(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})},er=e=>xe(e)?he(["example"],e):e,ft=({method:e,path:t,endpoint:r,isPositive:o,serializer:n,getRef:s,makeRef:a,composition:d,clue:c="response"})=>{let p=r.getSchema(o?"positive":"negative"),l=r.getMimeTypes(o?"positive":"negative"),f=er(q({schema:p,isResponse:!0,rules:lt,onEach:mt,onMissing:ut,serializer:n,getRef:s,makeRef:a,path:t,method:e})),x=Wt(p,!0),g=d==="components"?a(I(t,e,c),f):f;return{description:`${e.toUpperCase()} ${t} ${c}`,content:l.reduce((S,h)=>({...S,[h]:{schema:g,...x}}),{})}},Go=()=>({type:"http",scheme:"basic"}),qo=({format:e})=>({type:"http",scheme:"bearer",...e&&{bearerFormat:e}}),Vo=({name:e})=>({type:"apiKey",in:"query",name:e}),Bo=({name:e})=>({type:"apiKey",in:"header",name:e}),Yo=({name:e})=>({type:"apiKey",in:"cookie",name:e}),Jo=({url:e})=>({type:"openIdConnect",openIdConnectUrl:e}),Qo=({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}}},{})}),tr=e=>{let t={basic:Go,bearer:qo,input:Vo,header:Bo,cookie:Yo,openid:Jo,oauth2:Qo};return Ae(e,r=>t[r.type](r))},Fe=e=>{if(typeof e=="object"){if("or"in e)return e.or.map(t=>("and"in t?t.and:[t]).reduce((r,{name:o,scopes:n})=>({...r,[o]:n}),{}));if("and"in e)return Fe(nt(e))}return Fe({or:[e]})},rr=({method:e,path:t,endpoint:r,serializer:o,getRef:n,makeRef:s,composition:a,clue:d="request body"})=>{let c=rt(t),p=er(ct(q({schema:r.getSchema("input"),isResponse:!1,rules:lt,onEach:mt,onMissing:ut,serializer:o,getRef:n,makeRef:s,path:t,method:e}),c)),l=Wt(r.getSchema("input"),!1,c),f=a==="components"?s(I(t,e,d),p):p;return{description:`${e.toUpperCase()} ${t} ${d}`,content:r.getMimeTypes("input").reduce((x,g)=>({...x,[g]:{schema:f,...l}}),{})}},or=e=>Object.keys(e).map(t=>{let r=e[t];return{name:t,description:typeof r=="string"?r:r.description,...typeof r=="object"&&r.url&&{externalDocs:{url:r.url}}}}),yt=e=>e.length<=Vt?e:e.slice(0,Vt-1)+"\u2026";var gt=class extends Wo{constructor({routing:r,config:o,title:n,version:s,serverUrl:a,successfulResponseDescription:d="Successful response",errorResponseDescription:c="Error response",hasSummaryFromDescription:p=!0,composition:l="inline",serializer:f=Pe}){super();this.lastSecuritySchemaIds={};this.lastOperationIdSuffixes={};this.addInfo({title:n,version:s}).addServer({url:a}),G({routing:r,onEndpoint:(g,S,h)=>{let y=h,R={path:S,method:y,endpoint:g,composition:l,serializer:f,getRef:this.getRef.bind(this),makeRef:this.makeRef.bind(this)},[N,V]=["short","long"].map(g.getDescription.bind(g)),ae=o.inputSources?.[y]||be[y],de=Xt({...R,inputSources:ae}),Z={operationId:this.ensureUniqOperationId(S,y),responses:{[g.getStatusCode("positive")]:ft({...R,clue:d,isPositive:!0}),[g.getStatusCode("negative")]:ft({...R,clue:c,isPositive:!1})}};V&&(Z.description=V,p&&N===void 0&&(Z.summary=yt(V))),N&&(Z.summary=yt(N)),g.getTags().length>0&&(Z.tags=g.getTags()),de.length>0&&(Z.parameters=de),ae.includes("body")&&(Z.requestBody=rr(R));let Te=Fe(Ae(tr(g.getSecurity()),Qe=>{let At=this.ensureUniqSecuritySchemaName(Qe),Er=["oauth2","openIdConnect"].includes(Qe.type)?g.getScopes():[];return this.addSecurityScheme(At,Qe),{name:At,scopes:Er}}));Te.length>0&&(Z.security=Te);let Zr=Qt(S);this.addPath(Zr,{[y]:Z})}}),this.rootDoc.tags=o.tags?or(o.tags):[]}makeRef(r,o){return this.addSchema(r,o),this.getRef(r)}getRef(r){return r in(this.rootDoc.components?.schemas||{})?{$ref:`#/components/schemas/${r}`}:void 0}ensureUniqOperationId(r,o){let n=I(r,o);return n in this.lastOperationIdSuffixes?(this.lastOperationIdSuffixes[n]++,`${n}${this.lastOperationIdSuffixes[n]}`):(this.lastOperationIdSuffixes[n]=1,n)}ensureUniqSecuritySchemaName(r){let o=JSON.stringify(r);for(let n in this.rootDoc.components?.securitySchemes||{})if(o===JSON.stringify(this.rootDoc.components?.securitySchemes?.[n]))return n;return this.lastSecuritySchemaIds[r.type]=(this.lastSecuritySchemaIds?.[r.type]||0)+1,`${r.type.toUpperCase()}_${this.lastSecuritySchemaIds[r.type]}`}};import nr from"http";var Xo=e=>({method:"GET",header:jest.fn(()=>H),...e}),en=e=>{let t={writableEnded:!1,statusCode:200,statusMessage:nr.STATUS_CODES[200],set:jest.fn(()=>t),status:jest.fn(r=>(t.statusCode=r,t.statusMessage=nr.STATUS_CODES[r],t)),json:jest.fn(()=>t),end:jest.fn(()=>(t.writableEnded=!0,t)),...e};return t},tn=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=Xo(t),d=en(r),c={info:jest.fn(),warn:jest.fn(),error:jest.fn(),debug:jest.fn(),...n},p={cors:!1,logger:c,...o};return await e.execute({request:a,response:d,config:p,logger:c}),{requestMock:a,responseMock:d,loggerMock:c}};import U from"typescript";import M from"typescript";var i=M.factory,se=[i.createModifier(M.SyntaxKind.ExportKeyword)],rn=[i.createModifier(M.SyntaxKind.AsyncKeyword)],on=[i.createModifier(M.SyntaxKind.PublicKeyword),i.createModifier(M.SyntaxKind.ReadonlyKeyword)],sr=[i.createModifier(M.SyntaxKind.ProtectedKeyword),i.createModifier(M.SyntaxKind.ReadonlyKeyword)],nn=i.createTemplateHead(""),sn=i.createTemplateTail(""),an=i.createTemplateMiddle(" "),ht=e=>i.createTemplateLiteralType(nn,e.map((t,r)=>i.createTemplateLiteralTypeSpan(i.createTypeReferenceNode(t),r===e.length-1?sn:an))),xt=ht(["M","P"]),$e=(e,t,r)=>i.createParameterDeclaration(r,void 0,e,void 0,t),_e=(e,t)=>Object.keys(e).reduce((r,o)=>r.concat($e(o,e[o],t)),[]),Tt=(e,t)=>i.createExpressionWithTypeArguments(i.createIdentifier("Record"),[typeof e=="number"?i.createKeywordTypeNode(e):i.createTypeReferenceNode(e),i.createKeywordTypeNode(t)]),ir=e=>i.createConstructorDeclaration(void 0,e,i.createBlock([])),St=(e,t)=>i.createPropertySignature(void 0,`"${e}"`,void 0,i.createTypeReferenceNode(t)),ar=(e,t)=>i.createVariableDeclarationList([i.createVariableDeclaration(e,void 0,void 0,t)],M.NodeFlags.Const),Ot=(e,t)=>i.createTypeAliasDeclaration(se,e,void 0,i.createUnionTypeNode(t.map(r=>i.createLiteralTypeNode(i.createStringLiteral(r))))),Ge=(e,t)=>i.createTypeAliasDeclaration(se,e,void 0,t),dr=(e,t,r)=>i.createPropertyDeclaration(on,e,void 0,t,r),pr=(e,t,r=[])=>i.createClassDeclaration(se,e,void 0,void 0,[t,...r]),cr=(e,t)=>i.createTypeReferenceNode("Promise",[i.createIndexedAccessTypeNode(i.createTypeReferenceNode(e),t)]),lr=()=>i.createTypeReferenceNode("Promise",[i.createKeywordTypeNode(M.SyntaxKind.AnyKeyword)]),bt=(e,t,r)=>i.createInterfaceDeclaration(se,e,void 0,t,r),mr=e=>Object.keys(e).reduce((t,r)=>t.concat(i.createTypeParameterDeclaration([],r,i.createTypeReferenceNode(e[r]))),[]),ur=(e,t)=>i.createArrowFunction(rn,void 0,e.map(r=>$e(r)),void 0,void 0,i.createCallExpression(i.createPropertyAccessExpression(i.createThis(),"implementation"),void 0,t)),Rt=(e,t,r)=>i.createCallExpression(i.createPropertyAccessExpression(i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("Object"),"keys"),void 0,[i.createIdentifier(e)]),"reduce"),void 0,[i.createArrowFunction(void 0,void 0,_e({acc:void 0,key:void 0}),void 0,void 0,t),r]);import u from"typescript";import{z as pn}from"zod";import L from"typescript";var{factory:qe}=L,Pt=(e,t)=>{L.addSyntheticLeadingComment(e,L.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0)},Ve=(e,t,r)=>{let o=qe.createTypeAliasDeclaration(void 0,qe.createIdentifier(t),void 0,e);return r&&Pt(o,r),o},fr=(e,t)=>{let r=L.createSourceFile("print.ts","",L.ScriptTarget.Latest,!1,L.ScriptKind.TS);return L.createPrinter(t).printNode(L.EmitHint.Unspecified,e,r)},dn=/^[A-Za-z_$][A-Za-z0-9_$]*$/,yr=e=>dn.test(e)?qe.createIdentifier(e):qe.createStringLiteral(e);var{factory:m}=u,cn={[u.SyntaxKind.AnyKeyword]:"",[u.SyntaxKind.BigIntKeyword]:BigInt(0),[u.SyntaxKind.BooleanKeyword]:!1,[u.SyntaxKind.NumberKeyword]:0,[u.SyntaxKind.ObjectKeyword]:{},[u.SyntaxKind.StringKeyword]:"",[u.SyntaxKind.UndefinedKeyword]:void 0},ln=({schema:{value:e}})=>m.createLiteralTypeNode(typeof e=="number"?m.createNumericLiteral(e):typeof e=="boolean"?e?m.createTrue():m.createFalse():m.createStringLiteral(e)),mn=({schema:{shape:e},isResponse:t,next:r,optionalPropStyle:{withQuestionMark:o}})=>{let n=Object.entries(e).map(([s,a])=>{let d=t&&me(a)?a instanceof pn.ZodOptional:a.isOptional(),c=m.createPropertySignature(void 0,yr(s),d&&o?m.createToken(u.SyntaxKind.QuestionToken):void 0,r({schema:a}));return a.description&&Pt(c,a.description),c});return m.createTypeLiteralNode(n)},un=({schema:{element:e},next:t})=>m.createArrayTypeNode(t({schema:e})),fn=({schema:{options:e}})=>m.createUnionTypeNode(e.map(t=>m.createLiteralTypeNode(m.createStringLiteral(t)))),gr=({schema:{options:e},next:t})=>m.createUnionTypeNode(e.map(r=>t({schema:r}))),yn=e=>cn?.[e.kind],gn=({schema:e,next:t,isResponse:r})=>{let o=t({schema:e.innerType()}),n=e._def.effect;if(r&&n.type==="transform"){let s=Ze({effect:n,sample:yn(o)}),a={number:u.SyntaxKind.NumberKeyword,bigint:u.SyntaxKind.BigIntKeyword,boolean:u.SyntaxKind.BooleanKeyword,string:u.SyntaxKind.StringKeyword,undefined:u.SyntaxKind.UndefinedKeyword,object:u.SyntaxKind.ObjectKeyword};return m.createKeywordTypeNode(s&&a[s]||u.SyntaxKind.AnyKeyword)}return o},hn=({schema:e})=>m.createUnionTypeNode(Object.values(e.enum).map(t=>m.createLiteralTypeNode(typeof t=="number"?m.createNumericLiteral(t):m.createStringLiteral(t)))),xn=({next:e,schema:t,optionalPropStyle:{withUndefined:r}})=>{let o=e({schema:t.unwrap()});return r?m.createUnionTypeNode([o,m.createKeywordTypeNode(u.SyntaxKind.UndefinedKeyword)]):o},Tn=({next:e,schema:t})=>m.createUnionTypeNode([e({schema:t.unwrap()}),m.createLiteralTypeNode(m.createNull())]),Sn=({next:e,schema:{items:t}})=>m.createTupleTypeNode(t.map(r=>e({schema:r}))),On=({next:e,schema:{keySchema:t,valueSchema:r}})=>m.createExpressionWithTypeArguments(m.createIdentifier("Record"),[e({schema:t}),e({schema:r})]),bn=({next:e,schema:t})=>m.createIntersectionTypeNode([t._def.left,t._def.right].map(r=>e({schema:r}))),Rn=({next:e,schema:t})=>e({schema:t._def.innerType}),k=e=>()=>m.createKeywordTypeNode(e),Pn=({next:e,schema:t})=>e({schema:t.unwrap()}),Zn=({next:e,schema:t})=>e({schema:t._def.innerType}),En=({next:e,schema:t})=>e({schema:t._def.innerType}),An=({schema:e,next:t,isResponse:r})=>t({schema:e._def[r?"out":"in"]}),In=()=>m.createLiteralTypeNode(m.createNull()),Cn=({getAlias:e,makeAlias:t,next:r,serializer:o,schema:n})=>{let s=`Type${o(n.schema)}`;return e(s)||(()=>(t(s,m.createLiteralTypeNode(m.createNull())),t(s,r({schema:n.schema}))))()},Mn={ZodString:k(u.SyntaxKind.StringKeyword),ZodNumber:k(u.SyntaxKind.NumberKeyword),ZodBigInt:k(u.SyntaxKind.BigIntKeyword),ZodBoolean:k(u.SyntaxKind.BooleanKeyword),ZodDateIn:k(u.SyntaxKind.StringKeyword),ZodDateOut:k(u.SyntaxKind.StringKeyword),ZodNull:In,ZodArray:un,ZodTuple:Sn,ZodRecord:On,ZodObject:mn,ZodLiteral:ln,ZodIntersection:bn,ZodUnion:gr,ZodFile:k(u.SyntaxKind.StringKeyword),ZodAny:k(u.SyntaxKind.AnyKeyword),ZodDefault:Rn,ZodEnum:fn,ZodNativeEnum:hn,ZodEffects:gn,ZodOptional:xn,ZodNullable:Tn,ZodDiscriminatedUnion:gr,ZodBranded:Pn,ZodCatch:En,ZodPipeline:An,ZodLazy:Cn,ZodReadonly:Zn},Zt=({schema:e,...t})=>q({schema:e,rules:Mn,onMissing:()=>m.createKeywordTypeNode(u.SyntaxKind.AnyKeyword),...t});var Et=class{constructor({routing:t,variant:r="client",serializer:o=Pe,optionalPropStyle:n={withQuestionMark:!0,withUndefined:!0}}){this.agg=[];this.registry={};this.paths=[];this.aliases={};G({routing:t,onEndpoint:(y,R,N)=>{let V=I(R,N,"input"),ae=I(R,N,"response"),de={serializer:o,getAlias:this.getAlias.bind(this),makeAlias:this.makeAlias.bind(this),optionalPropStyle:n},Z=Zt({...de,schema:y.getSchema("input"),isResponse:!1}),Te=Zt({...de,isResponse:!0,schema:y.getSchema("positive").or(y.getSchema("negative"))});this.agg.push(Ve(Z,V),Ve(Te,ae)),N!=="options"&&(this.paths.push(R),this.registry[`${N} ${R}`]={in:V,out:ae,isJson:y.getMimeTypes("positive").includes(H)})}}),this.agg=Object.values(this.aliases).concat(this.agg);let s=Ot("Path",this.paths),a=Ot("Method",Ut),d=Ge("MethodPath",ht([a.name,s.name])),c=[i.createHeritageClause(U.SyntaxKind.ExtendsKeyword,[Tt(d.name,U.SyntaxKind.AnyKeyword)])],p=bt("Input",c,Object.keys(this.registry).map(y=>St(y,this.registry[y].in))),l=bt("Response",c,Object.keys(this.registry).map(y=>St(y,this.registry[y].out)));if(this.agg.push(s,a,d,p,l),r==="types")return;let f=i.createVariableStatement(se,ar("jsonEndpoints",i.createObjectLiteralExpression(Object.keys(this.registry).filter(y=>this.registry[y].isJson).map(y=>i.createPropertyAssignment(`"${y}"`,i.createTrue()))))),x=Ge("Provider",i.createFunctionTypeNode(mr({M:a.name,P:s.name}),_e({method:i.createTypeReferenceNode("M"),path:i.createTypeReferenceNode("P"),params:i.createIndexedAccessTypeNode(i.createTypeReferenceNode(p.name),xt)}),cr(l.name,xt))),g=Ge("Implementation",i.createFunctionTypeNode(void 0,_e({method:i.createTypeReferenceNode(a.name),path:i.createKeywordTypeNode(U.SyntaxKind.StringKeyword),params:Tt(U.SyntaxKind.StringKeyword,U.SyntaxKind.AnyKeyword)}),lr())),S=i.createTemplateExpression(i.createTemplateHead(":"),[i.createTemplateSpan(i.createIdentifier("key"),i.createTemplateTail(""))]),h=pr("ExpressZodAPIClient",ir([$e("implementation",i.createTypeReferenceNode(g.name),sr)]),[dr("provide",i.createTypeReferenceNode(x.name),ur(["method","path","params"],[i.createIdentifier("method"),Rt("params",i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("acc"),"replace"),void 0,[S,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,[S]),U.SyntaxKind.GreaterThanEqualsToken,i.createNumericLiteral(0)),void 0,i.createIdentifier("acc"),void 0,i.createObjectLiteralExpression([i.createSpreadAssignment(i.createIdentifier("acc")),i.createPropertyAssignment("[key]",i.createElementAccessExpression(i.createIdentifier("params"),i.createIdentifier("key")))])),i.createObjectLiteralExpression())]))]);U.addSyntheticLeadingComment(h,U.SyntaxKind.MultiLineCommentTrivia,`
34
+ `.trim();var it=({app:e,logger:t,config:r,routing:o})=>{r.startupLogo!==!1&&console.log(Ft()),G({routing:o,hasCors:!!r.cors,onEndpoint:(n,s,a)=>{e[a](s,async(d,c)=>{t.info(`${d.method}: ${s}`),await n.execute({request:d,response:c,logger:t,config:r})})},onStatic:(n,s)=>{e.use(n,s)}})};import oo,{json as no}from"express";import so from"compression";import io from"express-fileupload";import ao from"https";import $t from"http-errors";var po=(e,t)=>(r,o,n,s)=>{if(!r)return s();e.handler({error:$t(400,J(r).message),request:o,response:n,logger:t,input:o.body,output:null})},_t=(e,t)=>(r,o)=>{let n=$t(404,`Can not ${r.method} ${r.path}`);try{e.handler({request:r,response:o,logger:t,error:n,input:null,output:null})}catch(s){Ie({response:o,logger:t,error:new W(J(s).message,n)})}};function co(e,t){let r=et(e.logger)?ke(e.logger):e.logger;it({app:e.app,routing:t,logger:r,config:e});let o=e.errorHandler||re;return{notFoundHandler:_t(o,r),logger:r}}function lo(e,t){let r=et(e.logger)?ke(e.logger):e.logger,o=oo();o.disable("x-powered-by");let n=e.errorHandler||re,s=e.server.compression?so({...typeof e.server.compression=="object"?e.server.compression:{}}):void 0,a=e.server.jsonParser||no(),d=e.server.upload?io({...typeof e.server.upload=="object"?e.server.upload:{},abortOnLimit:!1,parseNested:!0}):void 0,c=[].concat(s||[]).concat(a).concat(d||[]);o.use(c),o.use(po(n,r)),it({app:o,routing:t,logger:r,config:e}),o.use(_t(n,r));let p=o.listen(e.server.listen,()=>{r.info(`Listening ${e.server.listen}`)}),l;return e.https&&(l=ao.createServer(e.https.options,o).listen(e.https.listen,()=>{r.info(`Listening ${e.https.listen}`)})),{app:o,httpServer:p,httpsServer:l,logger:r}}import{OpenApiBuilder as Wo}from"openapi3-ts/oas30";import{isReferenceObject as Yt,isSchemaObject as xe}from"openapi3-ts/oas30";import{omit as he}from"ramda";import{z as T}from"zod";import{INVALID as Gt,ZodIssueCode as at,ZodParsedType as qt,ZodType as mo,addIssueToContext as dt}from"zod";var pt=/^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(\.\d+)?)?Z?$/,uo="ZodDateIn",He=class He extends mo{_parse(t){let{status:r,ctx:o}=this._processInputParams(t);if(o.parsedType!==qt.string)return dt(o,{code:at.invalid_type,expected:qt.string,received:o.parsedType}),Gt;pt.test(o.data)||(dt(o,{code:at.invalid_string,validation:"regex"}),r.dirty());let n=new Date(o.data);return Re(n)?{status:r.value,value:n}:(dt(o,{code:at.invalid_date}),Gt)}};He.create=()=>new He({typeName:uo});var Ue=He;var q=({schema:e,onEach:t,rules:r,onMissing:o,...n})=>{let s="typeName"in e._def?r[e._def.typeName]:void 0,d=s?s({schema:e,...n,next:p=>q({...p,...n,onEach:t,rules:r,onMissing:o})}):o({schema:e,...n}),c=t&&t({schema:e,prev:d,...n});return c?{...d,...c}:d};var Vt=50,Jt="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString",fo={integer:0,number:0,string:"",boolean:!1,object:{},null:null,array:[]},Qt=e=>e.replace(We,t=>`{${t.slice(1)}}`),yo=({schema:{_def:{innerType:e,defaultValue:t}},next:r})=>({...r({schema:e}),default:t()}),go=({schema:{_def:{innerType:e}},next:t})=>t({schema:e}),ho=()=>({format:"any"}),xo=e=>{if(e.isResponse)throw new P({message:"Please use z.upload() only for input.",...e});return{type:"string",format:"binary"}},To=({schema:{isBinary:e,isBase64:t},...r})=>{if(!r.isResponse)throw new P({message:"Please use z.file() only within ResultHandler.",...r});return{type:"string",format:e?"binary":t?"byte":"file"}},So=({schema:{options:e},next:t})=>({oneOf:e.map(r=>t({schema:r}))}),Oo=({schema:{options:e,discriminator:t},next:r})=>({discriminator:{propertyName:t},oneOf:Array.from(e.values()).map(o=>r({schema:o}))}),bo=({schema:{_def:{left:e,right:t}},next:r})=>({allOf:[e,t].map(o=>r({schema:o}))}),Ro=({schema:e,next:t})=>t({schema:e.unwrap()}),Po=({schema:e,next:t})=>t({schema:e._def.innerType}),Zo=({schema:e,next:t})=>({nullable:!0,...t({schema:e.unwrap()})}),Bt=({schema:e})=>({type:typeof Object.values(e.enum)[0],enum:Object.values(e.enum)}),Eo=({schema:{value:e}})=>({type:typeof e,enum:[e]}),Ao=({schema:e,isResponse:t,...r})=>{let o=Object.keys(e.shape).filter(n=>{let s=e.shape[n];return!(t&&me(s)?s instanceof T.ZodOptional:s.isOptional())});return{type:"object",properties:Ke({schema:e,isResponse:t,...r}),...o.length?{required:o}:{}}},Io=()=>({type:"string",nullable:!0,format:"null"}),Co=e=>{if(e.isResponse)throw new P({message:"Please use z.dateOut() for output.",...e});return{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",pattern:pt.source,externalDocs:{url:Jt}}},Mo=e=>{if(!e.isResponse)throw new P({message:"Please use z.dateIn() for input.",...e});return{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",externalDocs:{url:Jt}}},No=e=>{throw new P({message:`Using z.date() within ${e.isResponse?"output":"input"} schema is forbidden. Please use z.date${e.isResponse?"Out":"In"}() instead. Check out the documentation for details.`,...e})},wo=()=>({type:"boolean"}),Do=()=>({type:"integer",format:"bigint"}),zo=({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:Ke({schema:T.object(n),...r}),...o.length?{required:o}:{}}}if(e instanceof T.ZodLiteral)return{type:"object",properties:Ke({schema:T.object({[e.value]:t}),...r}),required:[e.value]};if(e instanceof T.ZodUnion&&e.options.reduce((n,s)=>n&&s instanceof T.ZodLiteral,!0)){let n=e.options.reduce((s,a)=>({...s,[a.value]:t}),{});return{type:"object",properties:Ke({schema:T.object(n),...r}),required:e.options.map(s=>s.value)}}return{type:"object",additionalProperties:r.next({schema:t})}},vo=({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}}),jo=({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}: ${xe(o)?o.type:o.$ref}`).join(", ")}}}},Lo=({schema:{isEmail:e,isURL:t,minLength:r,maxLength:o,isUUID:n,isCUID:s,isCUID2:a,isULID:d,isIP:c,isEmoji:p,isDatetime:l,_def:{checks:f}}})=>{let x=f.find(h=>h.kind==="regex"),g=f.find(h=>h.kind==="datetime"),S=x?x.regex:g?g.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"},...c&&{format:"ip"},...p&&{format:"emoji"},...r!==null&&{minLength:r},...o!==null&&{maxLength:o},...S&&{pattern:`/${S.source}/${S.flags}`}}},ko=({schema:e})=>{let t=e._def.checks.find(({kind:s})=>s==="min"),r=t?t.inclusive:!0,o=e._def.checks.find(({kind:s})=>s==="max"),n=o?o.inclusive:!0;return{type:e.isInt?"integer":"number",format:e.isInt?"int64":"double",minimum:e.minValue===null?e.isInt?Number.MIN_SAFE_INTEGER:Number.MIN_VALUE:e.minValue,exclusiveMinimum:!r,maximum:e.maxValue===null?e.isInt?Number.MAX_SAFE_INTEGER:Number.MAX_VALUE:e.maxValue,exclusiveMaximum:!n}},Ke=({schema:{shape:e},next:t})=>Object.keys(e).reduce((r,o)=>({...r,[o]:t({schema:e[o]})}),{}),Uo=e=>{let t=Array.isArray(e.type)?e.type[0]:e.type;return fo?.[t]},Ho=({schema:e,isResponse:t,next:r})=>{let o=r({schema:e.innerType()}),{effect:n}=e._def;if(t&&n.type==="transform"&&xe(o)){let s=Ze({effect:n,sample:Uo(o)});return s&&["number","string","boolean"].includes(s)?{type:s}:r({schema:T.any()})}if(!t&&n.type==="preprocess"&&xe(o)){let{type:s,...a}=o;return{...a,format:`${a.format||s} (preprocessed)`}}return o},Ko=({schema:e,isResponse:t,next:r})=>r({schema:e._def[t?"out":"in"]}),Fo=({schema:e,next:t})=>t({schema:e.unwrap()}),$o=({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}))))()},Wt=(e,t,r=[])=>{let o=F({schema:e,variant:t?"parsed":"original",validate:!0});return o.length===0?{}:{examples:o.reduce((n,s,a)=>({...n,[`example${a+1}`]:{value:he(r,s)}}),{})}},_o=(e,t,r)=>{let o=F({schema:e,variant:t?"parsed":"original",validate:!0});return o.length===0?{}:{examples:o.reduce((n,s,a)=>r in s?{...n,[`example${a+1}`]:{value:s[r]}}:n,{})}};function ge(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=>ge(o,t)).reduce((o,n)=>o.merge(n.partial()),T.object({}));else if(e instanceof T.ZodEffects){if(D(e))throw new P({message:`Using transformations on the top level of ${t.isResponse?"response":"input"} schema is not allowed.`,...t});r=ge(e._def.schema,t)}else r=ge(e._def.left,t).merge(ge(e._def.right,t));return Se(e,r)}var Xt=({path:e,method:t,endpoint:r,inputSources:o,serializer:n,getRef:s,makeRef:a,composition:d,clue:c="parameter"})=>{let p=r.getSchema("input"),l=ge(p,{path:e,method:t,isResponse:!1}).shape,f=rt(e),x=o.includes("query"),g=o.includes("params"),S=h=>g&&f.includes(h);return Object.keys(l).filter(h=>x||S(h)).map(h=>{let y=q({schema:l[h],isResponse:!1,rules:lt,onEach:mt,onMissing:ut,serializer:n,getRef:s,makeRef:a,path:e,method:t}),R=d==="components"?a(I(e,t,`${c} ${h}`),y):y;return{name:h,in:S(h)?"path":"query",required:!l[h].isOptional(),description:xe(y)&&y.description||`${t.toUpperCase()} ${e} ${c}`,schema:R,..._o(p,!1,h)}})},lt={ZodString:Lo,ZodNumber:ko,ZodBigInt:Do,ZodBoolean:wo,ZodDateIn:Co,ZodDateOut:Mo,ZodNull:Io,ZodArray:vo,ZodTuple:jo,ZodRecord:zo,ZodObject:Ao,ZodLiteral:Eo,ZodIntersection:bo,ZodUnion:So,ZodFile:To,ZodUpload:xo,ZodAny:ho,ZodDefault:yo,ZodEnum:Bt,ZodNativeEnum:Bt,ZodEffects:Ho,ZodOptional:Ro,ZodNullable:Zo,ZodDiscriminatedUnion:Oo,ZodBranded:Fo,ZodDate:No,ZodCatch:go,ZodPipeline:Ko,ZodLazy:$o,ZodReadonly:Po},mt=({schema:e,isResponse:t,prev:r})=>{if(Yt(r))return{};let{description:o}=e,n=e instanceof T.ZodLazy,s=r.type!==void 0,a=t&&me(e),d=!n&&s&&!a&&e.isNullable(),c=n?[]:F({schema:e,variant:t?"parsed":"original",validate:!0});return{...o&&{description:o},...d&&{nullable:!0},...c.length>0&&{example:c[0]}}},ut=({schema:e,...t})=>{throw new P({message:`Zod type ${e.constructor.name} is unsupported.`,...t})},ct=(e,t)=>{if(Yt(e))return e;let r=e.properties?he(t,e.properties):void 0,o=e.example?he(t,e.example):void 0,n=e.required?e.required.filter(d=>!t.includes(d)):void 0,s=e.allOf?e.allOf.map(d=>ct(d,t)):void 0,a=e.oneOf?e.oneOf.map(d=>ct(d,t)):void 0;return he(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})},er=e=>xe(e)?he(["example"],e):e,ft=({method:e,path:t,endpoint:r,isPositive:o,serializer:n,getRef:s,makeRef:a,composition:d,clue:c="response"})=>{let p=r.getSchema(o?"positive":"negative"),l=r.getMimeTypes(o?"positive":"negative"),f=er(q({schema:p,isResponse:!0,rules:lt,onEach:mt,onMissing:ut,serializer:n,getRef:s,makeRef:a,path:t,method:e})),x=Wt(p,!0),g=d==="components"?a(I(t,e,c),f):f;return{description:`${e.toUpperCase()} ${t} ${c}`,content:l.reduce((S,h)=>({...S,[h]:{schema:g,...x}}),{})}},Go=()=>({type:"http",scheme:"basic"}),qo=({format:e})=>({type:"http",scheme:"bearer",...e&&{bearerFormat:e}}),Vo=({name:e})=>({type:"apiKey",in:"query",name:e}),Bo=({name:e})=>({type:"apiKey",in:"header",name:e}),Yo=({name:e})=>({type:"apiKey",in:"cookie",name:e}),Jo=({url:e})=>({type:"openIdConnect",openIdConnectUrl:e}),Qo=({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}}},{})}),tr=e=>{let t={basic:Go,bearer:qo,input:Vo,header:Bo,cookie:Yo,openid:Jo,oauth2:Qo};return Ae(e,r=>t[r.type](r))},Fe=e=>{if(typeof e=="object"){if("or"in e)return e.or.map(t=>("and"in t?t.and:[t]).reduce((r,{name:o,scopes:n})=>({...r,[o]:n}),{}));if("and"in e)return Fe(nt(e))}return Fe({or:[e]})},rr=({method:e,path:t,endpoint:r,serializer:o,getRef:n,makeRef:s,composition:a,clue:d="request body"})=>{let c=rt(t),p=er(ct(q({schema:r.getSchema("input"),isResponse:!1,rules:lt,onEach:mt,onMissing:ut,serializer:o,getRef:n,makeRef:s,path:t,method:e}),c)),l=Wt(r.getSchema("input"),!1,c),f=a==="components"?s(I(t,e,d),p):p;return{description:`${e.toUpperCase()} ${t} ${d}`,content:r.getMimeTypes("input").reduce((x,g)=>({...x,[g]:{schema:f,...l}}),{})}},or=e=>Object.keys(e).map(t=>{let r=e[t];return{name:t,description:typeof r=="string"?r:r.description,...typeof r=="object"&&r.url&&{externalDocs:{url:r.url}}}}),yt=e=>e.length<=Vt?e:e.slice(0,Vt-1)+"\u2026";var gt=class extends Wo{constructor({routing:r,config:o,title:n,version:s,serverUrl:a,successfulResponseDescription:d="Successful response",errorResponseDescription:c="Error response",hasSummaryFromDescription:p=!0,composition:l="inline",serializer:f=Pe}){super();this.lastSecuritySchemaIds={};this.lastOperationIdSuffixes={};this.addInfo({title:n,version:s}).addServer({url:a}),G({routing:r,onEndpoint:(g,S,h)=>{let y=h,R={path:S,method:y,endpoint:g,composition:l,serializer:f,getRef:this.getRef.bind(this),makeRef:this.makeRef.bind(this)},[N,V]=["short","long"].map(g.getDescription.bind(g)),ae=o.inputSources?.[y]||be[y],de=Xt({...R,inputSources:ae}),Z={operationId:this.ensureUniqOperationId(S,y),responses:{[g.getStatusCode("positive")]:ft({...R,clue:d,isPositive:!0}),[g.getStatusCode("negative")]:ft({...R,clue:c,isPositive:!1})}};V&&(Z.description=V,p&&N===void 0&&(Z.summary=yt(V))),N&&(Z.summary=yt(N)),g.getTags().length>0&&(Z.tags=g.getTags()),de.length>0&&(Z.parameters=de),ae.includes("body")&&(Z.requestBody=rr(R));let Te=Fe(Ae(tr(g.getSecurity()),Qe=>{let At=this.ensureUniqSecuritySchemaName(Qe),Er=["oauth2","openIdConnect"].includes(Qe.type)?g.getScopes():[];return this.addSecurityScheme(At,Qe),{name:At,scopes:Er}}));Te.length>0&&(Z.security=Te);let Zr=Qt(S);this.addPath(Zr,{[y]:Z})}}),this.rootDoc.tags=o.tags?or(o.tags):[]}makeRef(r,o){return this.addSchema(r,o),this.getRef(r)}getRef(r){return r in(this.rootDoc.components?.schemas||{})?{$ref:`#/components/schemas/${r}`}:void 0}ensureUniqOperationId(r,o){let n=I(r,o);return n in this.lastOperationIdSuffixes?(this.lastOperationIdSuffixes[n]++,`${n}${this.lastOperationIdSuffixes[n]}`):(this.lastOperationIdSuffixes[n]=1,n)}ensureUniqSecuritySchemaName(r){let o=JSON.stringify(r);for(let n in this.rootDoc.components?.securitySchemes||{})if(o===JSON.stringify(this.rootDoc.components?.securitySchemes?.[n]))return n;return this.lastSecuritySchemaIds[r.type]=(this.lastSecuritySchemaIds?.[r.type]||0)+1,`${r.type.toUpperCase()}_${this.lastSecuritySchemaIds[r.type]}`}};import nr from"http";var Xo=e=>({method:"GET",header:jest.fn(()=>H),...e}),en=e=>{let t={writableEnded:!1,statusCode:200,statusMessage:nr.STATUS_CODES[200],set:jest.fn(()=>t),setHeader:jest.fn(()=>t),header:jest.fn(()=>t),status:jest.fn(r=>(t.statusCode=r,t.statusMessage=nr.STATUS_CODES[r],t)),json:jest.fn(()=>t),send:jest.fn(()=>t),end:jest.fn(()=>(t.writableEnded=!0,t)),...e};return t},tn=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=Xo(t),d=en(r),c={info:jest.fn(),warn:jest.fn(),error:jest.fn(),debug:jest.fn(),...n},p={cors:!1,logger:c,...o};return await e.execute({request:a,response:d,config:p,logger:c}),{requestMock:a,responseMock:d,loggerMock:c}};import U from"typescript";import M from"typescript";var i=M.factory,se=[i.createModifier(M.SyntaxKind.ExportKeyword)],rn=[i.createModifier(M.SyntaxKind.AsyncKeyword)],on=[i.createModifier(M.SyntaxKind.PublicKeyword),i.createModifier(M.SyntaxKind.ReadonlyKeyword)],sr=[i.createModifier(M.SyntaxKind.ProtectedKeyword),i.createModifier(M.SyntaxKind.ReadonlyKeyword)],nn=i.createTemplateHead(""),sn=i.createTemplateTail(""),an=i.createTemplateMiddle(" "),ht=e=>i.createTemplateLiteralType(nn,e.map((t,r)=>i.createTemplateLiteralTypeSpan(i.createTypeReferenceNode(t),r===e.length-1?sn:an))),xt=ht(["M","P"]),$e=(e,t,r)=>i.createParameterDeclaration(r,void 0,e,void 0,t),_e=(e,t)=>Object.keys(e).reduce((r,o)=>r.concat($e(o,e[o],t)),[]),Tt=(e,t)=>i.createExpressionWithTypeArguments(i.createIdentifier("Record"),[typeof e=="number"?i.createKeywordTypeNode(e):i.createTypeReferenceNode(e),i.createKeywordTypeNode(t)]),ir=e=>i.createConstructorDeclaration(void 0,e,i.createBlock([])),St=(e,t)=>i.createPropertySignature(void 0,`"${e}"`,void 0,i.createTypeReferenceNode(t)),ar=(e,t)=>i.createVariableDeclarationList([i.createVariableDeclaration(e,void 0,void 0,t)],M.NodeFlags.Const),Ot=(e,t)=>i.createTypeAliasDeclaration(se,e,void 0,i.createUnionTypeNode(t.map(r=>i.createLiteralTypeNode(i.createStringLiteral(r))))),Ge=(e,t)=>i.createTypeAliasDeclaration(se,e,void 0,t),dr=(e,t,r)=>i.createPropertyDeclaration(on,e,void 0,t,r),pr=(e,t,r=[])=>i.createClassDeclaration(se,e,void 0,void 0,[t,...r]),cr=(e,t)=>i.createTypeReferenceNode("Promise",[i.createIndexedAccessTypeNode(i.createTypeReferenceNode(e),t)]),lr=()=>i.createTypeReferenceNode("Promise",[i.createKeywordTypeNode(M.SyntaxKind.AnyKeyword)]),bt=(e,t,r)=>i.createInterfaceDeclaration(se,e,void 0,t,r),mr=e=>Object.keys(e).reduce((t,r)=>t.concat(i.createTypeParameterDeclaration([],r,i.createTypeReferenceNode(e[r]))),[]),ur=(e,t)=>i.createArrowFunction(rn,void 0,e.map(r=>$e(r)),void 0,void 0,i.createCallExpression(i.createPropertyAccessExpression(i.createThis(),"implementation"),void 0,t)),Rt=(e,t,r)=>i.createCallExpression(i.createPropertyAccessExpression(i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("Object"),"keys"),void 0,[i.createIdentifier(e)]),"reduce"),void 0,[i.createArrowFunction(void 0,void 0,_e({acc:void 0,key:void 0}),void 0,void 0,t),r]);import u from"typescript";import{z as pn}from"zod";import L from"typescript";var{factory:qe}=L,Pt=(e,t)=>{L.addSyntheticLeadingComment(e,L.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0)},Ve=(e,t,r)=>{let o=qe.createTypeAliasDeclaration(void 0,qe.createIdentifier(t),void 0,e);return r&&Pt(o,r),o},fr=(e,t)=>{let r=L.createSourceFile("print.ts","",L.ScriptTarget.Latest,!1,L.ScriptKind.TS);return L.createPrinter(t).printNode(L.EmitHint.Unspecified,e,r)},dn=/^[A-Za-z_$][A-Za-z0-9_$]*$/,yr=e=>dn.test(e)?qe.createIdentifier(e):qe.createStringLiteral(e);var{factory:m}=u,cn={[u.SyntaxKind.AnyKeyword]:"",[u.SyntaxKind.BigIntKeyword]:BigInt(0),[u.SyntaxKind.BooleanKeyword]:!1,[u.SyntaxKind.NumberKeyword]:0,[u.SyntaxKind.ObjectKeyword]:{},[u.SyntaxKind.StringKeyword]:"",[u.SyntaxKind.UndefinedKeyword]:void 0},ln=({schema:{value:e}})=>m.createLiteralTypeNode(typeof e=="number"?m.createNumericLiteral(e):typeof e=="boolean"?e?m.createTrue():m.createFalse():m.createStringLiteral(e)),mn=({schema:{shape:e},isResponse:t,next:r,optionalPropStyle:{withQuestionMark:o}})=>{let n=Object.entries(e).map(([s,a])=>{let d=t&&me(a)?a instanceof pn.ZodOptional:a.isOptional(),c=m.createPropertySignature(void 0,yr(s),d&&o?m.createToken(u.SyntaxKind.QuestionToken):void 0,r({schema:a}));return a.description&&Pt(c,a.description),c});return m.createTypeLiteralNode(n)},un=({schema:{element:e},next:t})=>m.createArrayTypeNode(t({schema:e})),fn=({schema:{options:e}})=>m.createUnionTypeNode(e.map(t=>m.createLiteralTypeNode(m.createStringLiteral(t)))),gr=({schema:{options:e},next:t})=>m.createUnionTypeNode(e.map(r=>t({schema:r}))),yn=e=>cn?.[e.kind],gn=({schema:e,next:t,isResponse:r})=>{let o=t({schema:e.innerType()}),n=e._def.effect;if(r&&n.type==="transform"){let s=Ze({effect:n,sample:yn(o)}),a={number:u.SyntaxKind.NumberKeyword,bigint:u.SyntaxKind.BigIntKeyword,boolean:u.SyntaxKind.BooleanKeyword,string:u.SyntaxKind.StringKeyword,undefined:u.SyntaxKind.UndefinedKeyword,object:u.SyntaxKind.ObjectKeyword};return m.createKeywordTypeNode(s&&a[s]||u.SyntaxKind.AnyKeyword)}return o},hn=({schema:e})=>m.createUnionTypeNode(Object.values(e.enum).map(t=>m.createLiteralTypeNode(typeof t=="number"?m.createNumericLiteral(t):m.createStringLiteral(t)))),xn=({next:e,schema:t,optionalPropStyle:{withUndefined:r}})=>{let o=e({schema:t.unwrap()});return r?m.createUnionTypeNode([o,m.createKeywordTypeNode(u.SyntaxKind.UndefinedKeyword)]):o},Tn=({next:e,schema:t})=>m.createUnionTypeNode([e({schema:t.unwrap()}),m.createLiteralTypeNode(m.createNull())]),Sn=({next:e,schema:{items:t}})=>m.createTupleTypeNode(t.map(r=>e({schema:r}))),On=({next:e,schema:{keySchema:t,valueSchema:r}})=>m.createExpressionWithTypeArguments(m.createIdentifier("Record"),[e({schema:t}),e({schema:r})]),bn=({next:e,schema:t})=>m.createIntersectionTypeNode([t._def.left,t._def.right].map(r=>e({schema:r}))),Rn=({next:e,schema:t})=>e({schema:t._def.innerType}),k=e=>()=>m.createKeywordTypeNode(e),Pn=({next:e,schema:t})=>e({schema:t.unwrap()}),Zn=({next:e,schema:t})=>e({schema:t._def.innerType}),En=({next:e,schema:t})=>e({schema:t._def.innerType}),An=({schema:e,next:t,isResponse:r})=>t({schema:e._def[r?"out":"in"]}),In=()=>m.createLiteralTypeNode(m.createNull()),Cn=({getAlias:e,makeAlias:t,next:r,serializer:o,schema:n})=>{let s=`Type${o(n.schema)}`;return e(s)||(()=>(t(s,m.createLiteralTypeNode(m.createNull())),t(s,r({schema:n.schema}))))()},Mn={ZodString:k(u.SyntaxKind.StringKeyword),ZodNumber:k(u.SyntaxKind.NumberKeyword),ZodBigInt:k(u.SyntaxKind.BigIntKeyword),ZodBoolean:k(u.SyntaxKind.BooleanKeyword),ZodDateIn:k(u.SyntaxKind.StringKeyword),ZodDateOut:k(u.SyntaxKind.StringKeyword),ZodNull:In,ZodArray:un,ZodTuple:Sn,ZodRecord:On,ZodObject:mn,ZodLiteral:ln,ZodIntersection:bn,ZodUnion:gr,ZodFile:k(u.SyntaxKind.StringKeyword),ZodAny:k(u.SyntaxKind.AnyKeyword),ZodDefault:Rn,ZodEnum:fn,ZodNativeEnum:hn,ZodEffects:gn,ZodOptional:xn,ZodNullable:Tn,ZodDiscriminatedUnion:gr,ZodBranded:Pn,ZodCatch:En,ZodPipeline:An,ZodLazy:Cn,ZodReadonly:Zn},Zt=({schema:e,...t})=>q({schema:e,rules:Mn,onMissing:()=>m.createKeywordTypeNode(u.SyntaxKind.AnyKeyword),...t});var Et=class{constructor({routing:t,variant:r="client",serializer:o=Pe,optionalPropStyle:n={withQuestionMark:!0,withUndefined:!0}}){this.agg=[];this.registry={};this.paths=[];this.aliases={};G({routing:t,onEndpoint:(y,R,N)=>{let V=I(R,N,"input"),ae=I(R,N,"response"),de={serializer:o,getAlias:this.getAlias.bind(this),makeAlias:this.makeAlias.bind(this),optionalPropStyle:n},Z=Zt({...de,schema:y.getSchema("input"),isResponse:!1}),Te=Zt({...de,isResponse:!0,schema:y.getSchema("positive").or(y.getSchema("negative"))});this.agg.push(Ve(Z,V),Ve(Te,ae)),N!=="options"&&(this.paths.push(R),this.registry[`${N} ${R}`]={in:V,out:ae,isJson:y.getMimeTypes("positive").includes(H)})}}),this.agg=Object.values(this.aliases).concat(this.agg);let s=Ot("Path",this.paths),a=Ot("Method",Ut),d=Ge("MethodPath",ht([a.name,s.name])),c=[i.createHeritageClause(U.SyntaxKind.ExtendsKeyword,[Tt(d.name,U.SyntaxKind.AnyKeyword)])],p=bt("Input",c,Object.keys(this.registry).map(y=>St(y,this.registry[y].in))),l=bt("Response",c,Object.keys(this.registry).map(y=>St(y,this.registry[y].out)));if(this.agg.push(s,a,d,p,l),r==="types")return;let f=i.createVariableStatement(se,ar("jsonEndpoints",i.createObjectLiteralExpression(Object.keys(this.registry).filter(y=>this.registry[y].isJson).map(y=>i.createPropertyAssignment(`"${y}"`,i.createTrue()))))),x=Ge("Provider",i.createFunctionTypeNode(mr({M:a.name,P:s.name}),_e({method:i.createTypeReferenceNode("M"),path:i.createTypeReferenceNode("P"),params:i.createIndexedAccessTypeNode(i.createTypeReferenceNode(p.name),xt)}),cr(l.name,xt))),g=Ge("Implementation",i.createFunctionTypeNode(void 0,_e({method:i.createTypeReferenceNode(a.name),path:i.createKeywordTypeNode(U.SyntaxKind.StringKeyword),params:Tt(U.SyntaxKind.StringKeyword,U.SyntaxKind.AnyKeyword)}),lr())),S=i.createTemplateExpression(i.createTemplateHead(":"),[i.createTemplateSpan(i.createIdentifier("key"),i.createTemplateTail(""))]),h=pr("ExpressZodAPIClient",ir([$e("implementation",i.createTypeReferenceNode(g.name),sr)]),[dr("provide",i.createTypeReferenceNode(x.name),ur(["method","path","params"],[i.createIdentifier("method"),Rt("params",i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("acc"),"replace"),void 0,[S,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,[S]),U.SyntaxKind.GreaterThanEqualsToken,i.createNumericLiteral(0)),void 0,i.createIdentifier("acc"),void 0,i.createObjectLiteralExpression([i.createSpreadAssignment(i.createIdentifier("acc")),i.createPropertyAssignment("[key]",i.createElementAccessExpression(i.createIdentifier("params"),i.createIdentifier("key")))])),i.createObjectLiteralExpression())]))]);U.addSyntheticLeadingComment(h,U.SyntaxKind.MultiLineCommentTrivia,`
35
35
  export const exampleImplementation: Implementation = async (
36
36
  method,
37
37
  path,
@@ -1 +1 @@
1
- {"type":"module","version":"11.4.0"}
1
+ {"type":"module","version":"11.5.0"}
package/dist/index.d.ts CHANGED
@@ -787,7 +787,7 @@ declare const testEndpoint: <REQ extends Partial<Record<keyof Request<express_se
787
787
  writableEnded: boolean;
788
788
  statusCode: number;
789
789
  statusMessage: string;
790
- } & Record<"status" | "set" | "json" | "end", jest.Mock<any, any, any>> & (RES extends undefined ? {} : RES);
790
+ } & Record<"status" | "header" | "set" | "json" | "end" | "send" | "setHeader", jest.Mock<any, any, any>> & (RES extends undefined ? {} : RES);
791
791
  loggerMock: Record<"error" | "warn" | "debug" | "info", jest.Mock<any, any, any>> & (LOG extends undefined ? {} : LOG);
792
792
  }>;
793
793
 
package/dist/index.js CHANGED
@@ -31,7 +31,7 @@ The error caused by ${o?`'${o}' route that has a '${s}'`:`'${s}'`} entry.`);let
31
31
  \x1B[90m\x1B[3m Thank you for choosing Express Zod API for your project.\x1B[23m\x1B[39m\x1B[0m\x1B[0m
32
32
  \x1B[0m\x1B[0m
33
33
  \x1B[0m\x1B[0m
34
- `.trim();var Tt=({app:e,logger:t,config:r,routing:o})=>{r.startupLogo!==!1&&console.log(ar()),re({routing:o,hasCors:!!r.cors,onEndpoint:(n,s,a)=>{e[a](s,async(d,c)=>{t.info(`${d.method}: ${s}`),await n.execute({request:d,response:c,logger:t,config:r})})},onStatic:(n,s)=>{e.use(n,s)}})};var Ye=R(require("express")),dr=R(require("compression")),pr=R(require("express-fileupload")),cr=R(require("https"));var St=R(require("http-errors")),no=(e,t)=>(r,o,n,s)=>{if(!r)return s();e.handler({error:(0,St.default)(400,ie(r).message),request:o,response:n,logger:t,input:o.body,output:null})},lr=(e,t)=>(r,o)=>{let n=(0,St.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){He({response:o,logger:t,error:new de(ie(s).message,n)})}};function mr(e,t){let r=ut(e.logger)?Ee(e.logger):e.logger;Tt({app:e.app,routing:t,logger:r,config:e});let o=e.errorHandler||X;return{notFoundHandler:lr(o,r),logger:r}}function ur(e,t){let r=ut(e.logger)?Ee(e.logger):e.logger,o=(0,Ye.default)();o.disable("x-powered-by");let n=e.errorHandler||X,s=e.server.compression?(0,dr.default)({...typeof e.server.compression=="object"?e.server.compression:{}}):void 0,a=e.server.jsonParser||(0,Ye.json)(),d=e.server.upload?(0,pr.default)({...typeof e.server.upload=="object"?e.server.upload:{},abortOnLimit:!1,parseNested:!0}):void 0,c=[].concat(s||[]).concat(a).concat(d||[]);o.use(c),o.use(no(n,r)),Tt({app:o,routing:t,logger:r,config:e}),o.use(lr(n,r));let p=o.listen(e.server.listen,()=>{r.info(`Listening ${e.server.listen}`)}),l;return e.https&&(l=cr.default.createServer(e.https.options,o).listen(e.https.listen,()=>{r.info(`Listening ${e.https.listen}`)})),{app:o,httpServer:p,httpsServer:l,logger:r}}var Pr=require("openapi3-ts/oas30");var k=require("openapi3-ts/oas30"),ye=require("ramda"),T=require("zod");var S=require("zod");var Ot=/^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(\.\d+)?)?Z?$/,so="ZodDateIn",Qe=class Qe extends S.ZodType{_parse(t){let{status:r,ctx:o}=this._processInputParams(t);if(o.parsedType!==S.ZodParsedType.string)return(0,S.addIssueToContext)(o,{code:S.ZodIssueCode.invalid_type,expected:S.ZodParsedType.string,received:o.parsedType}),S.INVALID;Ot.test(o.data)||((0,S.addIssueToContext)(o,{code:S.ZodIssueCode.invalid_string,validation:"regex"}),r.dirty());let n=new Date(o.data);return ze(n)?{status:r.value,value:n}:((0,S.addIssueToContext)(o,{code:S.ZodIssueCode.invalid_date}),S.INVALID)}};Qe.create=()=>new Qe({typeName:so});var Je=Qe;var oe=({schema:e,onEach:t,rules:r,onMissing:o,...n})=>{let s="typeName"in e._def?r[e._def.typeName]:void 0,d=s?s({schema:e,...n,next:p=>oe({...p,...n,onEach:t,rules:r,onMissing:o})}):o({schema:e,...n}),c=t&&t({schema:e,prev:d,...n});return c?{...d,...c}:d};var fr=50,gr="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString",io={integer:0,number:0,string:"",boolean:!1,object:{},null:null,array:[]},hr=e=>e.replace(lt,t=>`{${t.slice(1)}}`),ao=({schema:{_def:{innerType:e,defaultValue:t}},next:r})=>({...r({schema:e}),default:t()}),po=({schema:{_def:{innerType:e}},next:t})=>t({schema:e}),co=()=>({format:"any"}),lo=e=>{if(e.isResponse)throw new I({message:"Please use z.upload() only for input.",...e});return{type:"string",format:"binary"}},mo=({schema:{isBinary:e,isBase64:t},...r})=>{if(!r.isResponse)throw new I({message:"Please use z.file() only within ResultHandler.",...r});return{type:"string",format:e?"binary":t?"byte":"file"}},uo=({schema:{options:e},next:t})=>({oneOf:e.map(r=>t({schema:r}))}),fo=({schema:{options:e,discriminator:t},next:r})=>({discriminator:{propertyName:t},oneOf:Array.from(e.values()).map(o=>r({schema:o}))}),yo=({schema:{_def:{left:e,right:t}},next:r})=>({allOf:[e,t].map(o=>r({schema:o}))}),go=({schema:e,next:t})=>t({schema:e.unwrap()}),ho=({schema:e,next:t})=>t({schema:e._def.innerType}),xo=({schema:e,next:t})=>({nullable:!0,...t({schema:e.unwrap()})}),yr=({schema:e})=>({type:typeof Object.values(e.enum)[0],enum:Object.values(e.enum)}),To=({schema:{value:e}})=>({type:typeof e,enum:[e]}),So=({schema:e,isResponse:t,...r})=>{let o=Object.keys(e.shape).filter(n=>{let s=e.shape[n];return!(t&&Re(s)?s instanceof T.z.ZodOptional:s.isOptional())});return{type:"object",properties:We({schema:e,isResponse:t,...r}),...o.length?{required:o}:{}}},Oo=()=>({type:"string",nullable:!0,format:"null"}),bo=e=>{if(e.isResponse)throw new I({message:"Please use z.dateOut() for output.",...e});return{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",pattern:Ot.source,externalDocs:{url:gr}}},Ro=e=>{if(!e.isResponse)throw new I({message:"Please use z.dateIn() for input.",...e});return{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",externalDocs:{url:gr}}},Po=e=>{throw new I({message:`Using z.date() within ${e.isResponse?"output":"input"} schema is forbidden. Please use z.date${e.isResponse?"Out":"In"}() instead. Check out the documentation for details.`,...e})},Zo=()=>({type:"boolean"}),Eo=()=>({type:"integer",format:"bigint"}),Ao=({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:We({schema:T.z.object(n),...r}),...o.length?{required:o}:{}}}if(e instanceof T.z.ZodLiteral)return{type:"object",properties:We({schema:T.z.object({[e.value]:t}),...r}),required:[e.value]};if(e instanceof T.z.ZodUnion&&e.options.reduce((n,s)=>n&&s instanceof T.z.ZodLiteral,!0)){let n=e.options.reduce((s,a)=>({...s,[a.value]:t}),{});return{type:"object",properties:We({schema:T.z.object(n),...r}),required:e.options.map(s=>s.value)}}return{type:"object",additionalProperties:r.next({schema:t})}},Io=({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}}),Co=({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,k.isSchemaObject)(o)?o.type:o.$ref}`).join(", ")}}}},Mo=({schema:{isEmail:e,isURL:t,minLength:r,maxLength:o,isUUID:n,isCUID:s,isCUID2:a,isULID:d,isIP:c,isEmoji:p,isDatetime:l,_def:{checks:f}}})=>{let x=f.find(h=>h.kind==="regex"),g=f.find(h=>h.kind==="datetime"),O=x?x.regex:g?g.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"},...c&&{format:"ip"},...p&&{format:"emoji"},...r!==null&&{minLength:r},...o!==null&&{maxLength:o},...O&&{pattern:`/${O.source}/${O.flags}`}}},No=({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}},We=({schema:{shape:e},next:t})=>Object.keys(e).reduce((r,o)=>({...r,[o]:t({schema:e[o]})}),{}),wo=e=>{let t=Array.isArray(e.type)?e.type[0]:e.type;return io?.[t]},Do=({schema:e,isResponse:t,next:r})=>{let o=r({schema:e.innerType()}),{effect:n}=e._def;if(t&&n.type==="transform"&&(0,k.isSchemaObject)(o)){let s=Le({effect:n,sample:wo(o)});return s&&["number","string","boolean"].includes(s)?{type:s}:r({schema:T.z.any()})}if(!t&&n.type==="preprocess"&&(0,k.isSchemaObject)(o)){let{type:s,...a}=o;return{...a,format:`${a.format||s} (preprocessed)`}}return o},zo=({schema:e,isResponse:t,next:r})=>r({schema:e._def[t?"out":"in"]}),vo=({schema:e,next:t})=>t({schema:e.unwrap()}),jo=({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}))))()},xr=(e,t,r=[])=>{let o=G({schema:e,variant:t?"parsed":"original",validate:!0});return o.length===0?{}:{examples:o.reduce((n,s,a)=>({...n,[`example${a+1}`]:{value:(0,ye.omit)(r,s)}}),{})}},Lo=(e,t,r)=>{let o=G({schema:e,variant:t?"parsed":"original",validate:!0});return o.length===0?{}:{examples:o.reduce((n,s,a)=>r in s?{...n,[`example${a+1}`]:{value:s[r]}}:n,{})}};function Ae(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=>Ae(o,t)).reduce((o,n)=>o.merge(n.partial()),T.z.object({}));else if(e instanceof T.z.ZodEffects){if($(e))throw new I({message:`Using transformations on the top level of ${t.isResponse?"response":"input"} schema is not allowed.`,...t});r=Ae(e._def.schema,t)}else r=Ae(e._def.left,t).merge(Ae(e._def.right,t));return Ne(e,r)}var Tr=({path:e,method:t,endpoint:r,inputSources:o,serializer:n,getRef:s,makeRef:a,composition:d,clue:c="parameter"})=>{let p=r.getSchema("input"),l=Ae(p,{path:e,method:t,isResponse:!1}).shape,f=ft(e),x=o.includes("query"),g=o.includes("params"),O=h=>g&&f.includes(h);return Object.keys(l).filter(h=>x||O(h)).map(h=>{let y=oe({schema:l[h],isResponse:!1,rules:Rt,onEach:Pt,onMissing:Zt,serializer:n,getRef:s,makeRef:a,path:e,method:t}),C=d==="components"?a(z(e,t,`${c} ${h}`),y):y;return{name:h,in:O(h)?"path":"query",required:!l[h].isOptional(),description:(0,k.isSchemaObject)(y)&&y.description||`${t.toUpperCase()} ${e} ${c}`,schema:C,...Lo(p,!1,h)}})},Rt={ZodString:Mo,ZodNumber:No,ZodBigInt:Eo,ZodBoolean:Zo,ZodDateIn:bo,ZodDateOut:Ro,ZodNull:Oo,ZodArray:Io,ZodTuple:Co,ZodRecord:Ao,ZodObject:So,ZodLiteral:To,ZodIntersection:yo,ZodUnion:uo,ZodFile:mo,ZodUpload:lo,ZodAny:co,ZodDefault:ao,ZodEnum:yr,ZodNativeEnum:yr,ZodEffects:Do,ZodOptional:go,ZodNullable:xo,ZodDiscriminatedUnion:fo,ZodBranded:vo,ZodDate:Po,ZodCatch:po,ZodPipeline:zo,ZodLazy:jo,ZodReadonly:ho},Pt=({schema:e,isResponse:t,prev:r})=>{if((0,k.isReferenceObject)(r))return{};let{description:o}=e,n=e instanceof T.z.ZodLazy,s=r.type!==void 0,a=t&&Re(e),d=!n&&s&&!a&&e.isNullable(),c=n?[]:G({schema:e,variant:t?"parsed":"original",validate:!0});return{...o&&{description:o},...d&&{nullable:!0},...c.length>0&&{example:c[0]}}},Zt=({schema:e,...t})=>{throw new I({message:`Zod type ${e.constructor.name} is unsupported.`,...t})},bt=(e,t)=>{if((0,k.isReferenceObject)(e))return e;let r=e.properties?(0,ye.omit)(t,e.properties):void 0,o=e.example?(0,ye.omit)(t,e.example):void 0,n=e.required?e.required.filter(d=>!t.includes(d)):void 0,s=e.allOf?e.allOf.map(d=>bt(d,t)):void 0,a=e.oneOf?e.oneOf.map(d=>bt(d,t)):void 0;return(0,ye.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})},Sr=e=>(0,k.isSchemaObject)(e)?(0,ye.omit)(["example"],e):e,Et=({method:e,path:t,endpoint:r,isPositive:o,serializer:n,getRef:s,makeRef:a,composition:d,clue:c="response"})=>{let p=r.getSchema(o?"positive":"negative"),l=r.getMimeTypes(o?"positive":"negative"),f=Sr(oe({schema:p,isResponse:!0,rules:Rt,onEach:Pt,onMissing:Zt,serializer:n,getRef:s,makeRef:a,path:t,method:e})),x=xr(p,!0),g=d==="components"?a(z(t,e,c),f):f;return{description:`${e.toUpperCase()} ${t} ${c}`,content:l.reduce((O,h)=>({...O,[h]:{schema:g,...x}}),{})}},ko=()=>({type:"http",scheme:"basic"}),Uo=({format:e})=>({type:"http",scheme:"bearer",...e&&{bearerFormat:e}}),Ho=({name:e})=>({type:"apiKey",in:"query",name:e}),Ko=({name:e})=>({type:"apiKey",in:"header",name:e}),Fo=({name:e})=>({type:"apiKey",in:"cookie",name:e}),$o=({url:e})=>({type:"openIdConnect",openIdConnectUrl:e}),_o=({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}}},{})}),Or=e=>{let t={basic:ko,bearer:Uo,input:Ho,header:Ko,cookie:Fo,openid:$o,oauth2:_o};return Ue(e,r=>t[r.type](r))},Xe=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 Xe(gt(e))}return Xe({or:[e]})},br=({method:e,path:t,endpoint:r,serializer:o,getRef:n,makeRef:s,composition:a,clue:d="request body"})=>{let c=ft(t),p=Sr(bt(oe({schema:r.getSchema("input"),isResponse:!1,rules:Rt,onEach:Pt,onMissing:Zt,serializer:o,getRef:n,makeRef:s,path:t,method:e}),c)),l=xr(r.getSchema("input"),!1,c),f=a==="components"?s(z(t,e,d),p):p;return{description:`${e.toUpperCase()} ${t} ${d}`,content:r.getMimeTypes("input").reduce((x,g)=>({...x,[g]:{schema:f,...l}}),{})}},Rr=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}}}}),At=e=>e.length<=fr?e:e.slice(0,fr-1)+"\u2026";var et=class extends Pr.OpenApiBuilder{constructor({routing:r,config:o,title:n,version:s,serverUrl:a,successfulResponseDescription:d="Successful response",errorResponseDescription:c="Error response",hasSummaryFromDescription:p=!0,composition:l="inline",serializer:f=je}){super();this.lastSecuritySchemaIds={};this.lastOperationIdSuffixes={};this.addInfo({title:n,version:s}).addServer({url:a}),re({routing:r,onEndpoint:(g,O,h)=>{let y=h,C={path:O,method:y,endpoint:g,composition:l,serializer:f,getRef:this.getRef.bind(this),makeRef:this.makeRef.bind(this)},[K,ne]=["short","long"].map(g.getDescription.bind(g)),xe=o.inputSources?.[y]||De[y],Te=Tr({...C,inputSources:xe}),M={operationId:this.ensureUniqOperationId(O,y),responses:{[g.getStatusCode("positive")]:Et({...C,clue:d,isPositive:!0}),[g.getStatusCode("negative")]:Et({...C,clue:c,isPositive:!1})}};ne&&(M.description=ne,p&&K===void 0&&(M.summary=At(ne))),K&&(M.summary=At(K)),g.getTags().length>0&&(M.tags=g.getTags()),Te.length>0&&(M.parameters=Te),xe.includes("body")&&(M.requestBody=br(C));let Ie=Xe(Ue(Or(g.getSecurity()),ct=>{let Ut=this.ensureUniqSecuritySchemaName(ct),Kr=["oauth2","openIdConnect"].includes(ct.type)?g.getScopes():[];return this.addSecurityScheme(Ut,ct),{name:Ut,scopes:Kr}}));Ie.length>0&&(M.security=Ie);let Hr=hr(O);this.addPath(Hr,{[y]:M})}}),this.rootDoc.tags=o.tags?Rr(o.tags):[]}makeRef(r,o){return this.addSchema(r,o),this.getRef(r)}getRef(r){return r in(this.rootDoc.components?.schemas||{})?{$ref:`#/components/schemas/${r}`}:void 0}ensureUniqOperationId(r,o){let n=z(r,o);return n in this.lastOperationIdSuffixes?(this.lastOperationIdSuffixes[n]++,`${n}${this.lastOperationIdSuffixes[n]}`):(this.lastOperationIdSuffixes[n]=1,n)}ensureUniqSecuritySchemaName(r){let o=JSON.stringify(r);for(let n in this.rootDoc.components?.securitySchemes||{})if(o===JSON.stringify(this.rootDoc.components?.securitySchemes?.[n]))return n;return this.lastSecuritySchemaIds[r.type]=(this.lastSecuritySchemaIds?.[r.type]||0)+1,`${r.type.toUpperCase()}_${this.lastSecuritySchemaIds[r.type]}`}};var It=R(require("http"));var Go=e=>({method:"GET",header:jest.fn(()=>J),...e}),qo=e=>{let t={writableEnded:!1,statusCode:200,statusMessage:It.default.STATUS_CODES[200],set:jest.fn(()=>t),status:jest.fn(r=>(t.statusCode=r,t.statusMessage=It.default.STATUS_CODES[r],t)),json:jest.fn(()=>t),end:jest.fn(()=>(t.writableEnded=!0,t)),...e};return t},Zr=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=Go(t),d=qo(r),c={info:jest.fn(),warn:jest.fn(),error:jest.fn(),debug:jest.fn(),...n},p={cors:!1,logger:c,...o};return await e.execute({request:a,response:d,config:p,logger:c}),{requestMock:a,responseMock:d,loggerMock:c}};var H=R(require("typescript"));var D=R(require("typescript")),i=D.default.factory,ge=[i.createModifier(D.default.SyntaxKind.ExportKeyword)],Vo=[i.createModifier(D.default.SyntaxKind.AsyncKeyword)],Bo=[i.createModifier(D.default.SyntaxKind.PublicKeyword),i.createModifier(D.default.SyntaxKind.ReadonlyKeyword)],Er=[i.createModifier(D.default.SyntaxKind.ProtectedKeyword),i.createModifier(D.default.SyntaxKind.ReadonlyKeyword)],Yo=i.createTemplateHead(""),Jo=i.createTemplateTail(""),Qo=i.createTemplateMiddle(" "),Ct=e=>i.createTemplateLiteralType(Yo,e.map((t,r)=>i.createTemplateLiteralTypeSpan(i.createTypeReferenceNode(t),r===e.length-1?Jo:Qo))),Mt=Ct(["M","P"]),tt=(e,t,r)=>i.createParameterDeclaration(r,void 0,e,void 0,t),rt=(e,t)=>Object.keys(e).reduce((r,o)=>r.concat(tt(o,e[o],t)),[]),Nt=(e,t)=>i.createExpressionWithTypeArguments(i.createIdentifier("Record"),[typeof e=="number"?i.createKeywordTypeNode(e):i.createTypeReferenceNode(e),i.createKeywordTypeNode(t)]),Ar=e=>i.createConstructorDeclaration(void 0,e,i.createBlock([])),wt=(e,t)=>i.createPropertySignature(void 0,`"${e}"`,void 0,i.createTypeReferenceNode(t)),Ir=(e,t)=>i.createVariableDeclarationList([i.createVariableDeclaration(e,void 0,void 0,t)],D.default.NodeFlags.Const),Dt=(e,t)=>i.createTypeAliasDeclaration(ge,e,void 0,i.createUnionTypeNode(t.map(r=>i.createLiteralTypeNode(i.createStringLiteral(r))))),ot=(e,t)=>i.createTypeAliasDeclaration(ge,e,void 0,t),Cr=(e,t,r)=>i.createPropertyDeclaration(Bo,e,void 0,t,r),Mr=(e,t,r=[])=>i.createClassDeclaration(ge,e,void 0,void 0,[t,...r]),Nr=(e,t)=>i.createTypeReferenceNode("Promise",[i.createIndexedAccessTypeNode(i.createTypeReferenceNode(e),t)]),wr=()=>i.createTypeReferenceNode("Promise",[i.createKeywordTypeNode(D.default.SyntaxKind.AnyKeyword)]),zt=(e,t,r)=>i.createInterfaceDeclaration(ge,e,void 0,t,r),Dr=e=>Object.keys(e).reduce((t,r)=>t.concat(i.createTypeParameterDeclaration([],r,i.createTypeReferenceNode(e[r]))),[]),zr=(e,t)=>i.createArrowFunction(Vo,void 0,e.map(r=>tt(r)),void 0,void 0,i.createCallExpression(i.createPropertyAccessExpression(i.createThis(),"implementation"),void 0,t)),vt=(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,rt({acc:void 0,key:void 0}),void 0,void 0,t),r]);var u=R(require("typescript")),kr=require("zod");var U=R(require("typescript")),{factory:nt}=U.default,jt=(e,t)=>{U.default.addSyntheticLeadingComment(e,U.default.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0)},st=(e,t,r)=>{let o=nt.createTypeAliasDeclaration(void 0,nt.createIdentifier(t),void 0,e);return r&&jt(o,r),o},vr=(e,t)=>{let r=U.default.createSourceFile("print.ts","",U.default.ScriptTarget.Latest,!1,U.default.ScriptKind.TS);return U.default.createPrinter(t).printNode(U.default.EmitHint.Unspecified,e,r)},Wo=/^[A-Za-z_$][A-Za-z0-9_$]*$/,jr=e=>Wo.test(e)?nt.createIdentifier(e):nt.createStringLiteral(e);var{factory:m}=u.default,Xo={[u.default.SyntaxKind.AnyKeyword]:"",[u.default.SyntaxKind.BigIntKeyword]:BigInt(0),[u.default.SyntaxKind.BooleanKeyword]:!1,[u.default.SyntaxKind.NumberKeyword]:0,[u.default.SyntaxKind.ObjectKeyword]:{},[u.default.SyntaxKind.StringKeyword]:"",[u.default.SyntaxKind.UndefinedKeyword]:void 0},en=({schema:{value:e}})=>m.createLiteralTypeNode(typeof e=="number"?m.createNumericLiteral(e):typeof e=="boolean"?e?m.createTrue():m.createFalse():m.createStringLiteral(e)),tn=({schema:{shape:e},isResponse:t,next:r,optionalPropStyle:{withQuestionMark:o}})=>{let n=Object.entries(e).map(([s,a])=>{let d=t&&Re(a)?a instanceof kr.z.ZodOptional:a.isOptional(),c=m.createPropertySignature(void 0,jr(s),d&&o?m.createToken(u.default.SyntaxKind.QuestionToken):void 0,r({schema:a}));return a.description&&jt(c,a.description),c});return m.createTypeLiteralNode(n)},rn=({schema:{element:e},next:t})=>m.createArrayTypeNode(t({schema:e})),on=({schema:{options:e}})=>m.createUnionTypeNode(e.map(t=>m.createLiteralTypeNode(m.createStringLiteral(t)))),Lr=({schema:{options:e},next:t})=>m.createUnionTypeNode(e.map(r=>t({schema:r}))),nn=e=>Xo?.[e.kind],sn=({schema:e,next:t,isResponse:r})=>{let o=t({schema:e.innerType()}),n=e._def.effect;if(r&&n.type==="transform"){let s=Le({effect:n,sample:nn(o)}),a={number:u.default.SyntaxKind.NumberKeyword,bigint:u.default.SyntaxKind.BigIntKeyword,boolean:u.default.SyntaxKind.BooleanKeyword,string:u.default.SyntaxKind.StringKeyword,undefined:u.default.SyntaxKind.UndefinedKeyword,object:u.default.SyntaxKind.ObjectKeyword};return m.createKeywordTypeNode(s&&a[s]||u.default.SyntaxKind.AnyKeyword)}return o},an=({schema:e})=>m.createUnionTypeNode(Object.values(e.enum).map(t=>m.createLiteralTypeNode(typeof t=="number"?m.createNumericLiteral(t):m.createStringLiteral(t)))),dn=({next:e,schema:t,optionalPropStyle:{withUndefined:r}})=>{let o=e({schema:t.unwrap()});return r?m.createUnionTypeNode([o,m.createKeywordTypeNode(u.default.SyntaxKind.UndefinedKeyword)]):o},pn=({next:e,schema:t})=>m.createUnionTypeNode([e({schema:t.unwrap()}),m.createLiteralTypeNode(m.createNull())]),cn=({next:e,schema:{items:t}})=>m.createTupleTypeNode(t.map(r=>e({schema:r}))),ln=({next:e,schema:{keySchema:t,valueSchema:r}})=>m.createExpressionWithTypeArguments(m.createIdentifier("Record"),[e({schema:t}),e({schema:r})]),mn=({next:e,schema:t})=>m.createIntersectionTypeNode([t._def.left,t._def.right].map(r=>e({schema:r}))),un=({next:e,schema:t})=>e({schema:t._def.innerType}),B=e=>()=>m.createKeywordTypeNode(e),fn=({next:e,schema:t})=>e({schema:t.unwrap()}),yn=({next:e,schema:t})=>e({schema:t._def.innerType}),gn=({next:e,schema:t})=>e({schema:t._def.innerType}),hn=({schema:e,next:t,isResponse:r})=>t({schema:e._def[r?"out":"in"]}),xn=()=>m.createLiteralTypeNode(m.createNull()),Tn=({getAlias:e,makeAlias:t,next:r,serializer:o,schema:n})=>{let s=`Type${o(n.schema)}`;return e(s)||(()=>(t(s,m.createLiteralTypeNode(m.createNull())),t(s,r({schema:n.schema}))))()},Sn={ZodString:B(u.default.SyntaxKind.StringKeyword),ZodNumber:B(u.default.SyntaxKind.NumberKeyword),ZodBigInt:B(u.default.SyntaxKind.BigIntKeyword),ZodBoolean:B(u.default.SyntaxKind.BooleanKeyword),ZodDateIn:B(u.default.SyntaxKind.StringKeyword),ZodDateOut:B(u.default.SyntaxKind.StringKeyword),ZodNull:xn,ZodArray:rn,ZodTuple:cn,ZodRecord:ln,ZodObject:tn,ZodLiteral:en,ZodIntersection:mn,ZodUnion:Lr,ZodFile:B(u.default.SyntaxKind.StringKeyword),ZodAny:B(u.default.SyntaxKind.AnyKeyword),ZodDefault:un,ZodEnum:on,ZodNativeEnum:an,ZodEffects:sn,ZodOptional:dn,ZodNullable:pn,ZodDiscriminatedUnion:Lr,ZodBranded:fn,ZodCatch:gn,ZodPipeline:hn,ZodLazy:Tn,ZodReadonly:yn},Lt=({schema:e,...t})=>oe({schema:e,rules:Sn,onMissing:()=>m.createKeywordTypeNode(u.default.SyntaxKind.AnyKeyword),...t});var it=class{constructor({routing:t,variant:r="client",serializer:o=je,optionalPropStyle:n={withQuestionMark:!0,withUndefined:!0}}){this.agg=[];this.registry={};this.paths=[];this.aliases={};re({routing:t,onEndpoint:(y,C,K)=>{let ne=z(C,K,"input"),xe=z(C,K,"response"),Te={serializer:o,getAlias:this.getAlias.bind(this),makeAlias:this.makeAlias.bind(this),optionalPropStyle:n},M=Lt({...Te,schema:y.getSchema("input"),isResponse:!1}),Ie=Lt({...Te,isResponse:!0,schema:y.getSchema("positive").or(y.getSchema("negative"))});this.agg.push(st(M,ne),st(Ie,xe)),K!=="options"&&(this.paths.push(C),this.registry[`${K} ${C}`]={in:ne,out:xe,isJson:y.getMimeTypes("positive").includes(J)})}}),this.agg=Object.values(this.aliases).concat(this.agg);let s=Dt("Path",this.paths),a=Dt("Method",rr),d=ot("MethodPath",Ct([a.name,s.name])),c=[i.createHeritageClause(H.default.SyntaxKind.ExtendsKeyword,[Nt(d.name,H.default.SyntaxKind.AnyKeyword)])],p=zt("Input",c,Object.keys(this.registry).map(y=>wt(y,this.registry[y].in))),l=zt("Response",c,Object.keys(this.registry).map(y=>wt(y,this.registry[y].out)));if(this.agg.push(s,a,d,p,l),r==="types")return;let f=i.createVariableStatement(ge,Ir("jsonEndpoints",i.createObjectLiteralExpression(Object.keys(this.registry).filter(y=>this.registry[y].isJson).map(y=>i.createPropertyAssignment(`"${y}"`,i.createTrue()))))),x=ot("Provider",i.createFunctionTypeNode(Dr({M:a.name,P:s.name}),rt({method:i.createTypeReferenceNode("M"),path:i.createTypeReferenceNode("P"),params:i.createIndexedAccessTypeNode(i.createTypeReferenceNode(p.name),Mt)}),Nr(l.name,Mt))),g=ot("Implementation",i.createFunctionTypeNode(void 0,rt({method:i.createTypeReferenceNode(a.name),path:i.createKeywordTypeNode(H.default.SyntaxKind.StringKeyword),params:Nt(H.default.SyntaxKind.StringKeyword,H.default.SyntaxKind.AnyKeyword)}),wr())),O=i.createTemplateExpression(i.createTemplateHead(":"),[i.createTemplateSpan(i.createIdentifier("key"),i.createTemplateTail(""))]),h=Mr("ExpressZodAPIClient",Ar([tt("implementation",i.createTypeReferenceNode(g.name),Er)]),[Cr("provide",i.createTypeReferenceNode(x.name),zr(["method","path","params"],[i.createIdentifier("method"),vt("params",i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("acc"),"replace"),void 0,[O,i.createElementAccessExpression(i.createIdentifier("params"),i.createIdentifier("key"))]),i.createIdentifier("path")),vt("params",i.createConditionalExpression(i.createBinaryExpression(i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("path"),"indexOf"),void 0,[O]),H.default.SyntaxKind.GreaterThanEqualsToken,i.createNumericLiteral(0)),void 0,i.createIdentifier("acc"),void 0,i.createObjectLiteralExpression([i.createSpreadAssignment(i.createIdentifier("acc")),i.createPropertyAssignment("[key]",i.createElementAccessExpression(i.createIdentifier("params"),i.createIdentifier("key")))])),i.createObjectLiteralExpression())]))]);H.default.addSyntheticLeadingComment(h,H.default.SyntaxKind.MultiLineCommentTrivia,`
34
+ `.trim();var Tt=({app:e,logger:t,config:r,routing:o})=>{r.startupLogo!==!1&&console.log(ar()),re({routing:o,hasCors:!!r.cors,onEndpoint:(n,s,a)=>{e[a](s,async(d,c)=>{t.info(`${d.method}: ${s}`),await n.execute({request:d,response:c,logger:t,config:r})})},onStatic:(n,s)=>{e.use(n,s)}})};var Ye=R(require("express")),dr=R(require("compression")),pr=R(require("express-fileupload")),cr=R(require("https"));var St=R(require("http-errors")),no=(e,t)=>(r,o,n,s)=>{if(!r)return s();e.handler({error:(0,St.default)(400,ie(r).message),request:o,response:n,logger:t,input:o.body,output:null})},lr=(e,t)=>(r,o)=>{let n=(0,St.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){He({response:o,logger:t,error:new de(ie(s).message,n)})}};function mr(e,t){let r=ut(e.logger)?Ee(e.logger):e.logger;Tt({app:e.app,routing:t,logger:r,config:e});let o=e.errorHandler||X;return{notFoundHandler:lr(o,r),logger:r}}function ur(e,t){let r=ut(e.logger)?Ee(e.logger):e.logger,o=(0,Ye.default)();o.disable("x-powered-by");let n=e.errorHandler||X,s=e.server.compression?(0,dr.default)({...typeof e.server.compression=="object"?e.server.compression:{}}):void 0,a=e.server.jsonParser||(0,Ye.json)(),d=e.server.upload?(0,pr.default)({...typeof e.server.upload=="object"?e.server.upload:{},abortOnLimit:!1,parseNested:!0}):void 0,c=[].concat(s||[]).concat(a).concat(d||[]);o.use(c),o.use(no(n,r)),Tt({app:o,routing:t,logger:r,config:e}),o.use(lr(n,r));let p=o.listen(e.server.listen,()=>{r.info(`Listening ${e.server.listen}`)}),l;return e.https&&(l=cr.default.createServer(e.https.options,o).listen(e.https.listen,()=>{r.info(`Listening ${e.https.listen}`)})),{app:o,httpServer:p,httpsServer:l,logger:r}}var Pr=require("openapi3-ts/oas30");var k=require("openapi3-ts/oas30"),ye=require("ramda"),T=require("zod");var S=require("zod");var Ot=/^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(\.\d+)?)?Z?$/,so="ZodDateIn",Qe=class Qe extends S.ZodType{_parse(t){let{status:r,ctx:o}=this._processInputParams(t);if(o.parsedType!==S.ZodParsedType.string)return(0,S.addIssueToContext)(o,{code:S.ZodIssueCode.invalid_type,expected:S.ZodParsedType.string,received:o.parsedType}),S.INVALID;Ot.test(o.data)||((0,S.addIssueToContext)(o,{code:S.ZodIssueCode.invalid_string,validation:"regex"}),r.dirty());let n=new Date(o.data);return ze(n)?{status:r.value,value:n}:((0,S.addIssueToContext)(o,{code:S.ZodIssueCode.invalid_date}),S.INVALID)}};Qe.create=()=>new Qe({typeName:so});var Je=Qe;var oe=({schema:e,onEach:t,rules:r,onMissing:o,...n})=>{let s="typeName"in e._def?r[e._def.typeName]:void 0,d=s?s({schema:e,...n,next:p=>oe({...p,...n,onEach:t,rules:r,onMissing:o})}):o({schema:e,...n}),c=t&&t({schema:e,prev:d,...n});return c?{...d,...c}:d};var fr=50,gr="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString",io={integer:0,number:0,string:"",boolean:!1,object:{},null:null,array:[]},hr=e=>e.replace(lt,t=>`{${t.slice(1)}}`),ao=({schema:{_def:{innerType:e,defaultValue:t}},next:r})=>({...r({schema:e}),default:t()}),po=({schema:{_def:{innerType:e}},next:t})=>t({schema:e}),co=()=>({format:"any"}),lo=e=>{if(e.isResponse)throw new I({message:"Please use z.upload() only for input.",...e});return{type:"string",format:"binary"}},mo=({schema:{isBinary:e,isBase64:t},...r})=>{if(!r.isResponse)throw new I({message:"Please use z.file() only within ResultHandler.",...r});return{type:"string",format:e?"binary":t?"byte":"file"}},uo=({schema:{options:e},next:t})=>({oneOf:e.map(r=>t({schema:r}))}),fo=({schema:{options:e,discriminator:t},next:r})=>({discriminator:{propertyName:t},oneOf:Array.from(e.values()).map(o=>r({schema:o}))}),yo=({schema:{_def:{left:e,right:t}},next:r})=>({allOf:[e,t].map(o=>r({schema:o}))}),go=({schema:e,next:t})=>t({schema:e.unwrap()}),ho=({schema:e,next:t})=>t({schema:e._def.innerType}),xo=({schema:e,next:t})=>({nullable:!0,...t({schema:e.unwrap()})}),yr=({schema:e})=>({type:typeof Object.values(e.enum)[0],enum:Object.values(e.enum)}),To=({schema:{value:e}})=>({type:typeof e,enum:[e]}),So=({schema:e,isResponse:t,...r})=>{let o=Object.keys(e.shape).filter(n=>{let s=e.shape[n];return!(t&&Re(s)?s instanceof T.z.ZodOptional:s.isOptional())});return{type:"object",properties:We({schema:e,isResponse:t,...r}),...o.length?{required:o}:{}}},Oo=()=>({type:"string",nullable:!0,format:"null"}),bo=e=>{if(e.isResponse)throw new I({message:"Please use z.dateOut() for output.",...e});return{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",pattern:Ot.source,externalDocs:{url:gr}}},Ro=e=>{if(!e.isResponse)throw new I({message:"Please use z.dateIn() for input.",...e});return{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",externalDocs:{url:gr}}},Po=e=>{throw new I({message:`Using z.date() within ${e.isResponse?"output":"input"} schema is forbidden. Please use z.date${e.isResponse?"Out":"In"}() instead. Check out the documentation for details.`,...e})},Zo=()=>({type:"boolean"}),Eo=()=>({type:"integer",format:"bigint"}),Ao=({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:We({schema:T.z.object(n),...r}),...o.length?{required:o}:{}}}if(e instanceof T.z.ZodLiteral)return{type:"object",properties:We({schema:T.z.object({[e.value]:t}),...r}),required:[e.value]};if(e instanceof T.z.ZodUnion&&e.options.reduce((n,s)=>n&&s instanceof T.z.ZodLiteral,!0)){let n=e.options.reduce((s,a)=>({...s,[a.value]:t}),{});return{type:"object",properties:We({schema:T.z.object(n),...r}),required:e.options.map(s=>s.value)}}return{type:"object",additionalProperties:r.next({schema:t})}},Io=({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}}),Co=({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,k.isSchemaObject)(o)?o.type:o.$ref}`).join(", ")}}}},Mo=({schema:{isEmail:e,isURL:t,minLength:r,maxLength:o,isUUID:n,isCUID:s,isCUID2:a,isULID:d,isIP:c,isEmoji:p,isDatetime:l,_def:{checks:f}}})=>{let x=f.find(h=>h.kind==="regex"),g=f.find(h=>h.kind==="datetime"),O=x?x.regex:g?g.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"},...c&&{format:"ip"},...p&&{format:"emoji"},...r!==null&&{minLength:r},...o!==null&&{maxLength:o},...O&&{pattern:`/${O.source}/${O.flags}`}}},No=({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}},We=({schema:{shape:e},next:t})=>Object.keys(e).reduce((r,o)=>({...r,[o]:t({schema:e[o]})}),{}),wo=e=>{let t=Array.isArray(e.type)?e.type[0]:e.type;return io?.[t]},Do=({schema:e,isResponse:t,next:r})=>{let o=r({schema:e.innerType()}),{effect:n}=e._def;if(t&&n.type==="transform"&&(0,k.isSchemaObject)(o)){let s=Le({effect:n,sample:wo(o)});return s&&["number","string","boolean"].includes(s)?{type:s}:r({schema:T.z.any()})}if(!t&&n.type==="preprocess"&&(0,k.isSchemaObject)(o)){let{type:s,...a}=o;return{...a,format:`${a.format||s} (preprocessed)`}}return o},zo=({schema:e,isResponse:t,next:r})=>r({schema:e._def[t?"out":"in"]}),vo=({schema:e,next:t})=>t({schema:e.unwrap()}),jo=({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}))))()},xr=(e,t,r=[])=>{let o=G({schema:e,variant:t?"parsed":"original",validate:!0});return o.length===0?{}:{examples:o.reduce((n,s,a)=>({...n,[`example${a+1}`]:{value:(0,ye.omit)(r,s)}}),{})}},Lo=(e,t,r)=>{let o=G({schema:e,variant:t?"parsed":"original",validate:!0});return o.length===0?{}:{examples:o.reduce((n,s,a)=>r in s?{...n,[`example${a+1}`]:{value:s[r]}}:n,{})}};function Ae(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=>Ae(o,t)).reduce((o,n)=>o.merge(n.partial()),T.z.object({}));else if(e instanceof T.z.ZodEffects){if($(e))throw new I({message:`Using transformations on the top level of ${t.isResponse?"response":"input"} schema is not allowed.`,...t});r=Ae(e._def.schema,t)}else r=Ae(e._def.left,t).merge(Ae(e._def.right,t));return Ne(e,r)}var Tr=({path:e,method:t,endpoint:r,inputSources:o,serializer:n,getRef:s,makeRef:a,composition:d,clue:c="parameter"})=>{let p=r.getSchema("input"),l=Ae(p,{path:e,method:t,isResponse:!1}).shape,f=ft(e),x=o.includes("query"),g=o.includes("params"),O=h=>g&&f.includes(h);return Object.keys(l).filter(h=>x||O(h)).map(h=>{let y=oe({schema:l[h],isResponse:!1,rules:Rt,onEach:Pt,onMissing:Zt,serializer:n,getRef:s,makeRef:a,path:e,method:t}),C=d==="components"?a(z(e,t,`${c} ${h}`),y):y;return{name:h,in:O(h)?"path":"query",required:!l[h].isOptional(),description:(0,k.isSchemaObject)(y)&&y.description||`${t.toUpperCase()} ${e} ${c}`,schema:C,...Lo(p,!1,h)}})},Rt={ZodString:Mo,ZodNumber:No,ZodBigInt:Eo,ZodBoolean:Zo,ZodDateIn:bo,ZodDateOut:Ro,ZodNull:Oo,ZodArray:Io,ZodTuple:Co,ZodRecord:Ao,ZodObject:So,ZodLiteral:To,ZodIntersection:yo,ZodUnion:uo,ZodFile:mo,ZodUpload:lo,ZodAny:co,ZodDefault:ao,ZodEnum:yr,ZodNativeEnum:yr,ZodEffects:Do,ZodOptional:go,ZodNullable:xo,ZodDiscriminatedUnion:fo,ZodBranded:vo,ZodDate:Po,ZodCatch:po,ZodPipeline:zo,ZodLazy:jo,ZodReadonly:ho},Pt=({schema:e,isResponse:t,prev:r})=>{if((0,k.isReferenceObject)(r))return{};let{description:o}=e,n=e instanceof T.z.ZodLazy,s=r.type!==void 0,a=t&&Re(e),d=!n&&s&&!a&&e.isNullable(),c=n?[]:G({schema:e,variant:t?"parsed":"original",validate:!0});return{...o&&{description:o},...d&&{nullable:!0},...c.length>0&&{example:c[0]}}},Zt=({schema:e,...t})=>{throw new I({message:`Zod type ${e.constructor.name} is unsupported.`,...t})},bt=(e,t)=>{if((0,k.isReferenceObject)(e))return e;let r=e.properties?(0,ye.omit)(t,e.properties):void 0,o=e.example?(0,ye.omit)(t,e.example):void 0,n=e.required?e.required.filter(d=>!t.includes(d)):void 0,s=e.allOf?e.allOf.map(d=>bt(d,t)):void 0,a=e.oneOf?e.oneOf.map(d=>bt(d,t)):void 0;return(0,ye.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})},Sr=e=>(0,k.isSchemaObject)(e)?(0,ye.omit)(["example"],e):e,Et=({method:e,path:t,endpoint:r,isPositive:o,serializer:n,getRef:s,makeRef:a,composition:d,clue:c="response"})=>{let p=r.getSchema(o?"positive":"negative"),l=r.getMimeTypes(o?"positive":"negative"),f=Sr(oe({schema:p,isResponse:!0,rules:Rt,onEach:Pt,onMissing:Zt,serializer:n,getRef:s,makeRef:a,path:t,method:e})),x=xr(p,!0),g=d==="components"?a(z(t,e,c),f):f;return{description:`${e.toUpperCase()} ${t} ${c}`,content:l.reduce((O,h)=>({...O,[h]:{schema:g,...x}}),{})}},ko=()=>({type:"http",scheme:"basic"}),Uo=({format:e})=>({type:"http",scheme:"bearer",...e&&{bearerFormat:e}}),Ho=({name:e})=>({type:"apiKey",in:"query",name:e}),Ko=({name:e})=>({type:"apiKey",in:"header",name:e}),Fo=({name:e})=>({type:"apiKey",in:"cookie",name:e}),$o=({url:e})=>({type:"openIdConnect",openIdConnectUrl:e}),_o=({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}}},{})}),Or=e=>{let t={basic:ko,bearer:Uo,input:Ho,header:Ko,cookie:Fo,openid:$o,oauth2:_o};return Ue(e,r=>t[r.type](r))},Xe=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 Xe(gt(e))}return Xe({or:[e]})},br=({method:e,path:t,endpoint:r,serializer:o,getRef:n,makeRef:s,composition:a,clue:d="request body"})=>{let c=ft(t),p=Sr(bt(oe({schema:r.getSchema("input"),isResponse:!1,rules:Rt,onEach:Pt,onMissing:Zt,serializer:o,getRef:n,makeRef:s,path:t,method:e}),c)),l=xr(r.getSchema("input"),!1,c),f=a==="components"?s(z(t,e,d),p):p;return{description:`${e.toUpperCase()} ${t} ${d}`,content:r.getMimeTypes("input").reduce((x,g)=>({...x,[g]:{schema:f,...l}}),{})}},Rr=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}}}}),At=e=>e.length<=fr?e:e.slice(0,fr-1)+"\u2026";var et=class extends Pr.OpenApiBuilder{constructor({routing:r,config:o,title:n,version:s,serverUrl:a,successfulResponseDescription:d="Successful response",errorResponseDescription:c="Error response",hasSummaryFromDescription:p=!0,composition:l="inline",serializer:f=je}){super();this.lastSecuritySchemaIds={};this.lastOperationIdSuffixes={};this.addInfo({title:n,version:s}).addServer({url:a}),re({routing:r,onEndpoint:(g,O,h)=>{let y=h,C={path:O,method:y,endpoint:g,composition:l,serializer:f,getRef:this.getRef.bind(this),makeRef:this.makeRef.bind(this)},[K,ne]=["short","long"].map(g.getDescription.bind(g)),xe=o.inputSources?.[y]||De[y],Te=Tr({...C,inputSources:xe}),M={operationId:this.ensureUniqOperationId(O,y),responses:{[g.getStatusCode("positive")]:Et({...C,clue:d,isPositive:!0}),[g.getStatusCode("negative")]:Et({...C,clue:c,isPositive:!1})}};ne&&(M.description=ne,p&&K===void 0&&(M.summary=At(ne))),K&&(M.summary=At(K)),g.getTags().length>0&&(M.tags=g.getTags()),Te.length>0&&(M.parameters=Te),xe.includes("body")&&(M.requestBody=br(C));let Ie=Xe(Ue(Or(g.getSecurity()),ct=>{let Ut=this.ensureUniqSecuritySchemaName(ct),Kr=["oauth2","openIdConnect"].includes(ct.type)?g.getScopes():[];return this.addSecurityScheme(Ut,ct),{name:Ut,scopes:Kr}}));Ie.length>0&&(M.security=Ie);let Hr=hr(O);this.addPath(Hr,{[y]:M})}}),this.rootDoc.tags=o.tags?Rr(o.tags):[]}makeRef(r,o){return this.addSchema(r,o),this.getRef(r)}getRef(r){return r in(this.rootDoc.components?.schemas||{})?{$ref:`#/components/schemas/${r}`}:void 0}ensureUniqOperationId(r,o){let n=z(r,o);return n in this.lastOperationIdSuffixes?(this.lastOperationIdSuffixes[n]++,`${n}${this.lastOperationIdSuffixes[n]}`):(this.lastOperationIdSuffixes[n]=1,n)}ensureUniqSecuritySchemaName(r){let o=JSON.stringify(r);for(let n in this.rootDoc.components?.securitySchemes||{})if(o===JSON.stringify(this.rootDoc.components?.securitySchemes?.[n]))return n;return this.lastSecuritySchemaIds[r.type]=(this.lastSecuritySchemaIds?.[r.type]||0)+1,`${r.type.toUpperCase()}_${this.lastSecuritySchemaIds[r.type]}`}};var It=R(require("http"));var Go=e=>({method:"GET",header:jest.fn(()=>J),...e}),qo=e=>{let t={writableEnded:!1,statusCode:200,statusMessage:It.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=It.default.STATUS_CODES[r],t)),json:jest.fn(()=>t),send:jest.fn(()=>t),end:jest.fn(()=>(t.writableEnded=!0,t)),...e};return t},Zr=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=Go(t),d=qo(r),c={info:jest.fn(),warn:jest.fn(),error:jest.fn(),debug:jest.fn(),...n},p={cors:!1,logger:c,...o};return await e.execute({request:a,response:d,config:p,logger:c}),{requestMock:a,responseMock:d,loggerMock:c}};var H=R(require("typescript"));var D=R(require("typescript")),i=D.default.factory,ge=[i.createModifier(D.default.SyntaxKind.ExportKeyword)],Vo=[i.createModifier(D.default.SyntaxKind.AsyncKeyword)],Bo=[i.createModifier(D.default.SyntaxKind.PublicKeyword),i.createModifier(D.default.SyntaxKind.ReadonlyKeyword)],Er=[i.createModifier(D.default.SyntaxKind.ProtectedKeyword),i.createModifier(D.default.SyntaxKind.ReadonlyKeyword)],Yo=i.createTemplateHead(""),Jo=i.createTemplateTail(""),Qo=i.createTemplateMiddle(" "),Ct=e=>i.createTemplateLiteralType(Yo,e.map((t,r)=>i.createTemplateLiteralTypeSpan(i.createTypeReferenceNode(t),r===e.length-1?Jo:Qo))),Mt=Ct(["M","P"]),tt=(e,t,r)=>i.createParameterDeclaration(r,void 0,e,void 0,t),rt=(e,t)=>Object.keys(e).reduce((r,o)=>r.concat(tt(o,e[o],t)),[]),Nt=(e,t)=>i.createExpressionWithTypeArguments(i.createIdentifier("Record"),[typeof e=="number"?i.createKeywordTypeNode(e):i.createTypeReferenceNode(e),i.createKeywordTypeNode(t)]),Ar=e=>i.createConstructorDeclaration(void 0,e,i.createBlock([])),wt=(e,t)=>i.createPropertySignature(void 0,`"${e}"`,void 0,i.createTypeReferenceNode(t)),Ir=(e,t)=>i.createVariableDeclarationList([i.createVariableDeclaration(e,void 0,void 0,t)],D.default.NodeFlags.Const),Dt=(e,t)=>i.createTypeAliasDeclaration(ge,e,void 0,i.createUnionTypeNode(t.map(r=>i.createLiteralTypeNode(i.createStringLiteral(r))))),ot=(e,t)=>i.createTypeAliasDeclaration(ge,e,void 0,t),Cr=(e,t,r)=>i.createPropertyDeclaration(Bo,e,void 0,t,r),Mr=(e,t,r=[])=>i.createClassDeclaration(ge,e,void 0,void 0,[t,...r]),Nr=(e,t)=>i.createTypeReferenceNode("Promise",[i.createIndexedAccessTypeNode(i.createTypeReferenceNode(e),t)]),wr=()=>i.createTypeReferenceNode("Promise",[i.createKeywordTypeNode(D.default.SyntaxKind.AnyKeyword)]),zt=(e,t,r)=>i.createInterfaceDeclaration(ge,e,void 0,t,r),Dr=e=>Object.keys(e).reduce((t,r)=>t.concat(i.createTypeParameterDeclaration([],r,i.createTypeReferenceNode(e[r]))),[]),zr=(e,t)=>i.createArrowFunction(Vo,void 0,e.map(r=>tt(r)),void 0,void 0,i.createCallExpression(i.createPropertyAccessExpression(i.createThis(),"implementation"),void 0,t)),vt=(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,rt({acc:void 0,key:void 0}),void 0,void 0,t),r]);var u=R(require("typescript")),kr=require("zod");var U=R(require("typescript")),{factory:nt}=U.default,jt=(e,t)=>{U.default.addSyntheticLeadingComment(e,U.default.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0)},st=(e,t,r)=>{let o=nt.createTypeAliasDeclaration(void 0,nt.createIdentifier(t),void 0,e);return r&&jt(o,r),o},vr=(e,t)=>{let r=U.default.createSourceFile("print.ts","",U.default.ScriptTarget.Latest,!1,U.default.ScriptKind.TS);return U.default.createPrinter(t).printNode(U.default.EmitHint.Unspecified,e,r)},Wo=/^[A-Za-z_$][A-Za-z0-9_$]*$/,jr=e=>Wo.test(e)?nt.createIdentifier(e):nt.createStringLiteral(e);var{factory:m}=u.default,Xo={[u.default.SyntaxKind.AnyKeyword]:"",[u.default.SyntaxKind.BigIntKeyword]:BigInt(0),[u.default.SyntaxKind.BooleanKeyword]:!1,[u.default.SyntaxKind.NumberKeyword]:0,[u.default.SyntaxKind.ObjectKeyword]:{},[u.default.SyntaxKind.StringKeyword]:"",[u.default.SyntaxKind.UndefinedKeyword]:void 0},en=({schema:{value:e}})=>m.createLiteralTypeNode(typeof e=="number"?m.createNumericLiteral(e):typeof e=="boolean"?e?m.createTrue():m.createFalse():m.createStringLiteral(e)),tn=({schema:{shape:e},isResponse:t,next:r,optionalPropStyle:{withQuestionMark:o}})=>{let n=Object.entries(e).map(([s,a])=>{let d=t&&Re(a)?a instanceof kr.z.ZodOptional:a.isOptional(),c=m.createPropertySignature(void 0,jr(s),d&&o?m.createToken(u.default.SyntaxKind.QuestionToken):void 0,r({schema:a}));return a.description&&jt(c,a.description),c});return m.createTypeLiteralNode(n)},rn=({schema:{element:e},next:t})=>m.createArrayTypeNode(t({schema:e})),on=({schema:{options:e}})=>m.createUnionTypeNode(e.map(t=>m.createLiteralTypeNode(m.createStringLiteral(t)))),Lr=({schema:{options:e},next:t})=>m.createUnionTypeNode(e.map(r=>t({schema:r}))),nn=e=>Xo?.[e.kind],sn=({schema:e,next:t,isResponse:r})=>{let o=t({schema:e.innerType()}),n=e._def.effect;if(r&&n.type==="transform"){let s=Le({effect:n,sample:nn(o)}),a={number:u.default.SyntaxKind.NumberKeyword,bigint:u.default.SyntaxKind.BigIntKeyword,boolean:u.default.SyntaxKind.BooleanKeyword,string:u.default.SyntaxKind.StringKeyword,undefined:u.default.SyntaxKind.UndefinedKeyword,object:u.default.SyntaxKind.ObjectKeyword};return m.createKeywordTypeNode(s&&a[s]||u.default.SyntaxKind.AnyKeyword)}return o},an=({schema:e})=>m.createUnionTypeNode(Object.values(e.enum).map(t=>m.createLiteralTypeNode(typeof t=="number"?m.createNumericLiteral(t):m.createStringLiteral(t)))),dn=({next:e,schema:t,optionalPropStyle:{withUndefined:r}})=>{let o=e({schema:t.unwrap()});return r?m.createUnionTypeNode([o,m.createKeywordTypeNode(u.default.SyntaxKind.UndefinedKeyword)]):o},pn=({next:e,schema:t})=>m.createUnionTypeNode([e({schema:t.unwrap()}),m.createLiteralTypeNode(m.createNull())]),cn=({next:e,schema:{items:t}})=>m.createTupleTypeNode(t.map(r=>e({schema:r}))),ln=({next:e,schema:{keySchema:t,valueSchema:r}})=>m.createExpressionWithTypeArguments(m.createIdentifier("Record"),[e({schema:t}),e({schema:r})]),mn=({next:e,schema:t})=>m.createIntersectionTypeNode([t._def.left,t._def.right].map(r=>e({schema:r}))),un=({next:e,schema:t})=>e({schema:t._def.innerType}),B=e=>()=>m.createKeywordTypeNode(e),fn=({next:e,schema:t})=>e({schema:t.unwrap()}),yn=({next:e,schema:t})=>e({schema:t._def.innerType}),gn=({next:e,schema:t})=>e({schema:t._def.innerType}),hn=({schema:e,next:t,isResponse:r})=>t({schema:e._def[r?"out":"in"]}),xn=()=>m.createLiteralTypeNode(m.createNull()),Tn=({getAlias:e,makeAlias:t,next:r,serializer:o,schema:n})=>{let s=`Type${o(n.schema)}`;return e(s)||(()=>(t(s,m.createLiteralTypeNode(m.createNull())),t(s,r({schema:n.schema}))))()},Sn={ZodString:B(u.default.SyntaxKind.StringKeyword),ZodNumber:B(u.default.SyntaxKind.NumberKeyword),ZodBigInt:B(u.default.SyntaxKind.BigIntKeyword),ZodBoolean:B(u.default.SyntaxKind.BooleanKeyword),ZodDateIn:B(u.default.SyntaxKind.StringKeyword),ZodDateOut:B(u.default.SyntaxKind.StringKeyword),ZodNull:xn,ZodArray:rn,ZodTuple:cn,ZodRecord:ln,ZodObject:tn,ZodLiteral:en,ZodIntersection:mn,ZodUnion:Lr,ZodFile:B(u.default.SyntaxKind.StringKeyword),ZodAny:B(u.default.SyntaxKind.AnyKeyword),ZodDefault:un,ZodEnum:on,ZodNativeEnum:an,ZodEffects:sn,ZodOptional:dn,ZodNullable:pn,ZodDiscriminatedUnion:Lr,ZodBranded:fn,ZodCatch:gn,ZodPipeline:hn,ZodLazy:Tn,ZodReadonly:yn},Lt=({schema:e,...t})=>oe({schema:e,rules:Sn,onMissing:()=>m.createKeywordTypeNode(u.default.SyntaxKind.AnyKeyword),...t});var it=class{constructor({routing:t,variant:r="client",serializer:o=je,optionalPropStyle:n={withQuestionMark:!0,withUndefined:!0}}){this.agg=[];this.registry={};this.paths=[];this.aliases={};re({routing:t,onEndpoint:(y,C,K)=>{let ne=z(C,K,"input"),xe=z(C,K,"response"),Te={serializer:o,getAlias:this.getAlias.bind(this),makeAlias:this.makeAlias.bind(this),optionalPropStyle:n},M=Lt({...Te,schema:y.getSchema("input"),isResponse:!1}),Ie=Lt({...Te,isResponse:!0,schema:y.getSchema("positive").or(y.getSchema("negative"))});this.agg.push(st(M,ne),st(Ie,xe)),K!=="options"&&(this.paths.push(C),this.registry[`${K} ${C}`]={in:ne,out:xe,isJson:y.getMimeTypes("positive").includes(J)})}}),this.agg=Object.values(this.aliases).concat(this.agg);let s=Dt("Path",this.paths),a=Dt("Method",rr),d=ot("MethodPath",Ct([a.name,s.name])),c=[i.createHeritageClause(H.default.SyntaxKind.ExtendsKeyword,[Nt(d.name,H.default.SyntaxKind.AnyKeyword)])],p=zt("Input",c,Object.keys(this.registry).map(y=>wt(y,this.registry[y].in))),l=zt("Response",c,Object.keys(this.registry).map(y=>wt(y,this.registry[y].out)));if(this.agg.push(s,a,d,p,l),r==="types")return;let f=i.createVariableStatement(ge,Ir("jsonEndpoints",i.createObjectLiteralExpression(Object.keys(this.registry).filter(y=>this.registry[y].isJson).map(y=>i.createPropertyAssignment(`"${y}"`,i.createTrue()))))),x=ot("Provider",i.createFunctionTypeNode(Dr({M:a.name,P:s.name}),rt({method:i.createTypeReferenceNode("M"),path:i.createTypeReferenceNode("P"),params:i.createIndexedAccessTypeNode(i.createTypeReferenceNode(p.name),Mt)}),Nr(l.name,Mt))),g=ot("Implementation",i.createFunctionTypeNode(void 0,rt({method:i.createTypeReferenceNode(a.name),path:i.createKeywordTypeNode(H.default.SyntaxKind.StringKeyword),params:Nt(H.default.SyntaxKind.StringKeyword,H.default.SyntaxKind.AnyKeyword)}),wr())),O=i.createTemplateExpression(i.createTemplateHead(":"),[i.createTemplateSpan(i.createIdentifier("key"),i.createTemplateTail(""))]),h=Mr("ExpressZodAPIClient",Ar([tt("implementation",i.createTypeReferenceNode(g.name),Er)]),[Cr("provide",i.createTypeReferenceNode(x.name),zr(["method","path","params"],[i.createIdentifier("method"),vt("params",i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("acc"),"replace"),void 0,[O,i.createElementAccessExpression(i.createIdentifier("params"),i.createIdentifier("key"))]),i.createIdentifier("path")),vt("params",i.createConditionalExpression(i.createBinaryExpression(i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("path"),"indexOf"),void 0,[O]),H.default.SyntaxKind.GreaterThanEqualsToken,i.createNumericLiteral(0)),void 0,i.createIdentifier("acc"),void 0,i.createObjectLiteralExpression([i.createSpreadAssignment(i.createIdentifier("acc")),i.createPropertyAssignment("[key]",i.createElementAccessExpression(i.createIdentifier("params"),i.createIdentifier("key")))])),i.createObjectLiteralExpression())]))]);H.default.addSyntheticLeadingComment(h,H.default.SyntaxKind.MultiLineCommentTrivia,`
35
35
  export const exampleImplementation: Implementation = async (
36
36
  method,
37
37
  path,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "express-zod-api",
3
- "version": "11.4.0",
3
+ "version": "11.5.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": {