express-zod-api 12.4.0 → 12.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 +12 -0
- package/dist/index.d.mts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/index.mjs +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,18 @@
|
|
|
2
2
|
|
|
3
3
|
## Version 12
|
|
4
4
|
|
|
5
|
+
### v12.5.0
|
|
6
|
+
|
|
7
|
+
- Featuring an ability to specify multiple server URLs when generating documentation.
|
|
8
|
+
- This feature is a shorthand for `new Documentation().addServer()`
|
|
9
|
+
|
|
10
|
+
```typescript
|
|
11
|
+
new Documentation({
|
|
12
|
+
serverUrl: ["https://example1.com", "https://example2.com"],
|
|
13
|
+
// ...
|
|
14
|
+
});
|
|
15
|
+
```
|
|
16
|
+
|
|
5
17
|
### v12.4.0
|
|
6
18
|
|
|
7
19
|
- Feature: ability to assign a function to the `operationId` property of the `EndpointsFactory::build()` argument.
|
package/dist/index.d.mts
CHANGED
|
@@ -773,7 +773,7 @@ declare const createServer: (config: ServerConfig & CommonConfig, routing: Routi
|
|
|
773
773
|
interface DocumentationParams {
|
|
774
774
|
title: string;
|
|
775
775
|
version: string;
|
|
776
|
-
serverUrl: string;
|
|
776
|
+
serverUrl: string | [string, ...string[]];
|
|
777
777
|
routing: Routing;
|
|
778
778
|
config: CommonConfig;
|
|
779
779
|
/** @default Successful response */
|
package/dist/index.d.ts
CHANGED
|
@@ -773,7 +773,7 @@ declare const createServer: (config: ServerConfig & CommonConfig, routing: Routi
|
|
|
773
773
|
interface DocumentationParams {
|
|
774
774
|
title: string;
|
|
775
775
|
version: string;
|
|
776
|
-
serverUrl: string;
|
|
776
|
+
serverUrl: string | [string, ...string[]];
|
|
777
777
|
routing: Routing;
|
|
778
778
|
config: CommonConfig;
|
|
779
779
|
/** @default Successful response */
|
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 pt=({app:e,logger:t,config:r,routing:o})=>{r.startupLogo!==!1&&console.log(Bt()),ee({routing:o,hasCors:!!r.cors,onEndpoint:(n,s,a)=>{e[a](s,async(p,d)=>{t.info(`${p.method}: ${s}`),await n.execute({request:p,response:d,logger:t,config:r})})},onStatic:(n,s)=>{e.use(n,s)}})};var ke=R(require("express")),Yt=R(require("compression")),Jt=R(require("express-fileupload")),Qt=R(require("https"));var ct=R(require("http-errors")),$r=(e,t)=>(r,o,n,s)=>{if(!r)return s();e.handler({error:(0,ct.default)(400,ne(r).message),request:o,response:n,logger:t,input:o.body,output:null})},Wt=(e,t)=>(r,o)=>{let n=(0,ct.default)(404,`Can not ${r.method} ${r.path}`);try{e.handler({request:r,response:o,logger:t,error:n,input:null,output:null})}catch(s){ve({response:o,logger:t,error:new ie(ne(s).message,n)})}},Xt=(e,t)=>{let r=ot(e.logger)?Oe(e.logger):e.logger;pt({app:e.app,routing:t,logger:r,config:e});let o=e.errorHandler||W;return{notFoundHandler:Wt(o,r),logger:r}},er=(e,t)=>{let r=ot(e.logger)?Oe(e.logger):e.logger,o=(0,ke.default)();o.disable("x-powered-by");let n=e.errorHandler||W,s=e.server.compression?(0,Yt.default)({...typeof e.server.compression=="object"?e.server.compression:{}}):void 0,a=e.server.jsonParser||(0,ke.json)(),p=e.server.upload?(0,Jt.default)({...typeof e.server.upload=="object"?e.server.upload:{},abortOnLimit:!1,parseNested:!0}):void 0,d=[].concat(s||[]).concat(a).concat(p||[]);o.use(d),o.use($r(n,r)),pt({app:o,routing:t,logger:r,config:e}),o.use(Wt(n,r));let c=o.listen(e.server.listen,()=>{r.info(`Listening ${e.server.listen}`)}),l;return e.https&&(l=Qt.default.createServer(e.https.options,o).listen(e.https.listen,()=>{r.info(`Listening ${e.https.listen}`)})),{app:o,httpServer:c,httpsServer:l,logger:r}};var lr=require("openapi3-ts/oas30");var $=require("openapi3-ts/oas30"),ue=require("ramda"),x=require("zod");var T=require("zod");var lt=/^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(\.\d+)?)?Z?$/,_r="ZodDateIn",He=class e extends T.ZodType{_parse(t){let{status:r,ctx:o}=this._processInputParams(t);if(o.parsedType!==T.ZodParsedType.string)return(0,T.addIssueToContext)(o,{code:T.ZodIssueCode.invalid_type,expected:T.ZodParsedType.string,received:o.parsedType}),T.INVALID;lt.test(o.data)||((0,T.addIssueToContext)(o,{code:T.ZodIssueCode.invalid_string,validation:"regex"}),r.dirty());let n=new Date(o.data);return Ie(n)?{status:r.value,value:n}:((0,T.addIssueToContext)(o,{code:T.ZodIssueCode.invalid_date}),T.INVALID)}static create=()=>new e({typeName:_r})};var te=({schema:e,onEach:t,rules:r,onMissing:o,...n})=>{let s="typeName"in e._def?r[e._def.typeName]:void 0,p=s?s({schema:e,...n,next:c=>te({...c,...n,onEach:t,rules:r,onMissing:o})}):o({schema:e,...n}),d=t&&t({schema:e,prev:p,...n});return d?{...p,...d}:p};var tr=50,or="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString",Gr={integer:0,number:0,string:"",boolean:!1,object:{},null:null,array:[]},nr=e=>e.replace(et,t=>`{${t.slice(1)}}`),qr=({schema:{_def:{innerType:e,defaultValue:t}},next:r})=>({...r({schema:e}),default:t()}),Vr=({schema:{_def:{innerType:e}},next:t})=>t({schema:e}),Br=()=>({format:"any"}),Yr=e=>{if(e.isResponse)throw new P({message:"Please use z.upload() only for input.",...e});return{type:"string",format:"binary"}},Jr=({schema:{isBinary:e,isBase64:t},...r})=>{if(!r.isResponse)throw new P({message:"Please use z.file() only within ResultHandler.",...r});return{type:"string",format:e?"binary":t?"byte":"file"}},Qr=({schema:{options:e},next:t})=>({oneOf:e.map(r=>t({schema:r}))}),Wr=({schema:{options:e,discriminator:t},next:r})=>({discriminator:{propertyName:t},oneOf:Array.from(e.values()).map(o=>r({schema:o}))}),Xr=({schema:{_def:{left:e,right:t}},next:r})=>({allOf:[e,t].map(o=>r({schema:o}))}),eo=({schema:e,next:t})=>t({schema:e.unwrap()}),to=({schema:e,next:t})=>t({schema:e._def.innerType}),ro=({schema:e,next:t})=>({nullable:!0,...t({schema:e.unwrap()})}),rr=({schema:e})=>({type:typeof Object.values(e.enum)[0],enum:Object.values(e.enum)}),oo=({schema:{value:e}})=>({type:typeof e,enum:[e]}),no=({schema:e,isResponse:t,...r})=>{let o=Object.keys(e.shape).filter(n=>{let s=e.shape[n];return!(t&&Te(s)?s instanceof x.z.ZodOptional:s.isOptional())});return{type:"object",properties:Ue({schema:e,isResponse:t,...r}),...o.length?{required:o}:{}}},so=()=>({type:"string",nullable:!0,format:"null"}),io=e=>{if(e.isResponse)throw new P({message:"Please use z.dateOut() for output.",...e});return{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",pattern:lt.source,externalDocs:{url:or}}},ao=e=>{if(!e.isResponse)throw new P({message:"Please use z.dateIn() for input.",...e});return{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",externalDocs:{url:or}}},po=e=>{throw new P({message:`Using z.date() within ${e.isResponse?"output":"input"} schema is forbidden. Please use z.date${e.isResponse?"Out":"In"}() instead. Check out the documentation for details.`,...e})},co=()=>({type:"boolean"}),lo=()=>({type:"integer",format:"bigint"}),mo=({schema:{keySchema:e,valueSchema:t},...r})=>{if(e instanceof x.z.ZodEnum||e instanceof x.z.ZodNativeEnum){let o=Object.values(e.enum),n=o.reduce((s,a)=>({...s,[a]:t}),{});return{type:"object",properties:Ue({schema:x.z.object(n),...r}),...o.length?{required:o}:{}}}if(e instanceof x.z.ZodLiteral)return{type:"object",properties:Ue({schema:x.z.object({[e.value]:t}),...r}),required:[e.value]};if(e instanceof x.z.ZodUnion&&e.options.reduce((n,s)=>n&&s instanceof x.z.ZodLiteral,!0)){let n=e.options.reduce((s,a)=>({...s,[a.value]:t}),{});return{type:"object",properties:Ue({schema:x.z.object(n),...r}),required:e.options.map(s=>s.value)}}return{type:"object",additionalProperties:r.next({schema:t})}},uo=({schema:{_def:e,element:t},next:r})=>({type:"array",items:r({schema:t}),...e.minLength!==null&&{minItems:e.minLength.value},...e.maxLength!==null&&{maxItems:e.maxLength.value}}),fo=({schema:{items:e},next:t})=>{let r=e.map(o=>t({schema:o}));return{type:"array",minItems:r.length,maxItems:r.length,items:{oneOf:r,format:"tuple",...r.length>0&&{description:r.map((o,n)=>`${n}: ${(0,$.isSchemaObject)(o)?o.type:o.$ref}`).join(", ")}}}},yo=({schema:{isEmail:e,isURL:t,minLength:r,maxLength:o,isUUID:n,isCUID:s,isCUID2:a,isULID:p,isIP:d,isEmoji:c,isDatetime:l,_def:{checks:g}}})=>{let y=g.find(h=>h.kind==="regex"),S=g.find(h=>h.kind==="datetime"),I=y?y.regex:S?S.offset?new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(([+-]\\d{2}:\\d{2})|Z)$"):new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?Z$"):void 0;return{type:"string",...l&&{format:"date-time"},...e&&{format:"email"},...t&&{format:"url"},...n&&{format:"uuid"},...s&&{format:"cuid"},...a&&{format:"cuid2"},...p&&{format:"ulid"},...d&&{format:"ip"},...c&&{format:"emoji"},...r!==null&&{minLength:r},...o!==null&&{maxLength:o},...I&&{pattern:`/${I.source}/${I.flags}`}}},go=({schema:e})=>{let t=e._def.checks.find(({kind:s})=>s==="min"),r=t?t.inclusive:!0,o=e._def.checks.find(({kind:s})=>s==="max"),n=o?o.inclusive:!0;return{type:e.isInt?"integer":"number",format:e.isInt?"int64":"double",minimum:e.minValue===null?e.isInt?Number.MIN_SAFE_INTEGER:Number.MIN_VALUE:e.minValue,exclusiveMinimum:!r,maximum:e.maxValue===null?e.isInt?Number.MAX_SAFE_INTEGER:Number.MAX_VALUE:e.maxValue,exclusiveMaximum:!n}},Ue=({schema:{shape:e},next:t})=>Object.keys(e).reduce((r,o)=>({...r,[o]:t({schema:e[o]})}),{}),ho=e=>{let t=Array.isArray(e.type)?e.type[0]:e.type;return Gr?.[t]},xo=({schema:e,isResponse:t,next:r})=>{let o=r({schema:e.innerType()}),{effect:n}=e._def;if(t&&n.type==="transform"&&(0,$.isSchemaObject)(o)){let s=Ne({effect:n,sample:ho(o)});return s&&["number","string","boolean"].includes(s)?{type:s}:r({schema:x.z.any()})}if(!t&&n.type==="preprocess"&&(0,$.isSchemaObject)(o)){let{type:s,...a}=o;return{...a,format:`${a.format||s} (preprocessed)`}}return o},To=({schema:e,isResponse:t,next:r})=>r({schema:e._def[t?"out":"in"]}),So=({schema:e,next:t})=>t({schema:e.unwrap()}),Oo=({next:e,schema:t,serializer:r,getRef:o,makeRef:n})=>{let s=r(t.schema);return o(s)||(()=>(n(s,{}),n(s,e({schema:t.schema}))))()},sr=(e,t,r=[])=>{let o=k({schema:e,variant:t?"parsed":"original",validate:!0});return o.length===0?{}:{examples:o.reduce((n,s,a)=>({...n,[`example${a+1}`]:{value:typeof s=="object"&&!Array.isArray(s)?(0,ue.omit)(r,s):s}}),{})}},bo=(e,t,r)=>{let o=k({schema:e,variant:t?"parsed":"original",validate:!0});return o.length===0?{}:{examples:o.reduce((n,s,a)=>r in s?{...n,[`example${a+1}`]:{value:s[r]}}:n,{})}},be=(e,t)=>{if(e instanceof x.z.ZodObject)return e;let r;if(e instanceof x.z.ZodUnion||e instanceof x.z.ZodDiscriminatedUnion)r=Array.from(e.options.values()).map(o=>be(o,t)).reduce((o,n)=>o.merge(n.partial()),x.z.object({}));else if(e instanceof x.z.ZodEffects){if(q(e))throw new P({message:`Using transformations on the top level of ${t.isResponse?"response":"input"} schema is not allowed.`,...t});r=be(e._def.schema,t)}else r=be(e._def.left,t).merge(be(e._def.right,t));return Ee(e,r)},ir=({path:e,method:t,endpoint:r,inputSources:o,serializer:n,getRef:s,makeRef:a,composition:p,clue:d="parameter"})=>{let c=r.getSchema("input"),l=be(c,{path:e,method:t,isResponse:!1}).shape,g=st(e),y=o.includes("query"),S=o.includes("params"),I=o.includes("headers"),h=m=>S&&g.includes(m),z=m=>I&&rt(m);return Object.keys(l).filter(m=>y||h(m)).map(m=>{let O=te({schema:l[m],isResponse:!1,rules:ut,onEach:ft,onMissing:yt,serializer:n,getRef:s,makeRef:a,path:e,method:t}),v=p==="components"?a(H(e,t,`${d} ${m}`),O):O;return{name:m,in:h(m)?"path":z(m)?"header":"query",required:!l[m].isOptional(),description:(0,$.isSchemaObject)(O)&&O.description||`${t.toUpperCase()} ${e} ${d}`,schema:v,...bo(c,!1,m)}})},ut={ZodString:yo,ZodNumber:go,ZodBigInt:lo,ZodBoolean:co,ZodDateIn:io,ZodDateOut:ao,ZodNull:so,ZodArray:uo,ZodTuple:fo,ZodRecord:mo,ZodObject:no,ZodLiteral:oo,ZodIntersection:Xr,ZodUnion:Qr,ZodFile:Jr,ZodUpload:Yr,ZodAny:Br,ZodDefault:qr,ZodEnum:rr,ZodNativeEnum:rr,ZodEffects:xo,ZodOptional:eo,ZodNullable:ro,ZodDiscriminatedUnion:Wr,ZodBranded:So,ZodDate:po,ZodCatch:Vr,ZodPipeline:To,ZodLazy:Oo,ZodReadonly:to},ft=({schema:e,isResponse:t,prev:r})=>{if((0,$.isReferenceObject)(r))return{};let{description:o}=e,n=e instanceof x.z.ZodLazy,s=r.type!==void 0,a=t&&Te(e),p=!n&&s&&!a&&e.isNullable(),d=n?[]:k({schema:e,variant:t?"parsed":"original",validate:!0});return{...o&&{description:o},...p&&{nullable:!0},...d.length>0&&{example:d[0]}}},yt=({schema:e,...t})=>{throw new P({message:`Zod type ${e.constructor.name} is unsupported.`,...t})},mt=(e,t)=>{if((0,$.isReferenceObject)(e))return e;let r=e.properties?(0,ue.omit)(t,e.properties):void 0,o=e.example?(0,ue.omit)(t,e.example):void 0,n=e.required?e.required.filter(p=>!t.includes(p)):void 0,s=e.allOf?e.allOf.map(p=>mt(p,t)):void 0,a=e.oneOf?e.oneOf.map(p=>mt(p,t)):void 0;return(0,ue.omit)(Object.entries({properties:r,required:n,example:o,allOf:s,oneOf:a}).filter(([{},p])=>p===void 0).map(([p])=>p),{...e,properties:r,required:n,example:o,allOf:s,oneOf:a})},ar=e=>(0,$.isSchemaObject)(e)?(0,ue.omit)(["example"],e):e,gt=({method:e,path:t,endpoint:r,isPositive:o,serializer:n,getRef:s,makeRef:a,composition:p,clue:d="response"})=>{let c=r.getSchema(o?"positive":"negative"),l=r.getMimeTypes(o?"positive":"negative"),g=ar(te({schema:c,isResponse:!0,rules:ut,onEach:ft,onMissing:yt,serializer:n,getRef:s,makeRef:a,path:t,method:e})),y=sr(c,!0),S=p==="components"?a(H(t,e,d),g):g;return{description:`${e.toUpperCase()} ${t} ${d}`,content:l.reduce((I,h)=>({...I,[h]:{schema:S,...y}}),{})}},Ro=()=>({type:"http",scheme:"basic"}),Po=({format:e})=>({type:"http",scheme:"bearer",...e&&{bearerFormat:e}}),Zo=({name:e})=>({type:"apiKey",in:"query",name:e}),Eo=({name:e})=>({type:"apiKey",in:"header",name:e}),Ao=({name:e})=>({type:"apiKey",in:"cookie",name:e}),Io=({url:e})=>({type:"openIdConnect",openIdConnectUrl:e}),Co=({flows:e={}})=>({type:"oauth2",flows:Object.keys(e).reduce((t,r)=>{let o=e[r];if(!o)return t;let{scopes:n={},...s}=o;return{...t,[r]:{...s,scopes:n}}},{})}),dr=e=>{let t={basic:Ro,bearer:Po,input:Zo,header:Eo,cookie:Ao,openid:Io,oauth2:Co};return we(e,r=>t[r.type](r))},Ke=e=>{if(typeof e=="object"){if("or"in e)return e.or.map(t=>("and"in t?t.and:[t]).reduce((r,{name:o,scopes:n})=>({...r,[o]:n}),{}));if("and"in e)return Ke(at(e))}return Ke({or:[e]})},pr=({method:e,path:t,endpoint:r,serializer:o,getRef:n,makeRef:s,composition:a,clue:p="request body"})=>{let d=st(t),c=ar(mt(te({schema:r.getSchema("input"),isResponse:!1,rules:ut,onEach:ft,onMissing:yt,serializer:o,getRef:n,makeRef:s,path:t,method:e}),d)),l=sr(r.getSchema("input"),!1,d),g=a==="components"?s(H(t,e,p),c):c;return{description:`${e.toUpperCase()} ${t} ${p}`,content:r.getMimeTypes("input").reduce((y,S)=>({...y,[S]:{schema:g,...l}}),{})}},cr=e=>Object.keys(e).map(t=>{let r=e[t];return{name:t,description:typeof r=="string"?r:r.description,...typeof r=="object"&&r.url&&{externalDocs:{url:r.url}}}}),ht=e=>e.length<=tr?e:e.slice(0,tr-1)+"\u2026";var Fe=class extends lr.OpenApiBuilder{lastSecuritySchemaIds={};lastOperationIdSuffixes={};makeRef(t,r){return this.addSchema(t,r),this.getRef(t)}getRef(t){return t in(this.rootDoc.components?.schemas||{})?{$ref:`#/components/schemas/${t}`}:void 0}ensureUniqOperationId(t,r,o){if(o){if(o in this.lastOperationIdSuffixes)throw new P({message:`Duplicated operationId: "${o}"`,method:r,isResponse:!1,path:t});return this.lastOperationIdSuffixes[o]=1,o}let n=H(t,r);return n in this.lastOperationIdSuffixes?(this.lastOperationIdSuffixes[n]++,`${n}${this.lastOperationIdSuffixes[n]}`):(this.lastOperationIdSuffixes[n]=1,n)}ensureUniqSecuritySchemaName(t){let r=JSON.stringify(t);for(let o in this.rootDoc.components?.securitySchemes||{})if(r===JSON.stringify(this.rootDoc.components?.securitySchemes?.[o]))return o;return this.lastSecuritySchemaIds[t.type]=(this.lastSecuritySchemaIds?.[t.type]||0)+1,`${t.type.toUpperCase()}_${this.lastSecuritySchemaIds[t.type]}`}constructor({routing:t,config:r,title:o,version:n,serverUrl:s,successfulResponseDescription:a="Successful response",errorResponseDescription:p="Error response",hasSummaryFromDescription:d=!0,composition:c="inline",serializer:l=Ce}){super(),this.addInfo({title:o,version:n}).addServer({url:s}),ee({routing:t,onEndpoint:(y,S,I)=>{let h=I,z={path:S,method:h,endpoint:y,composition:c,serializer:l,getRef:this.getRef.bind(this),makeRef:this.makeRef.bind(this)},[m,O]=["short","long"].map(y.getDescription.bind(y)),v=r.inputSources?.[h]||Ae[h],fe=ir({...z,inputSources:v}),N={operationId:this.ensureUniqOperationId(S,h,y.getOperationId(h)),responses:{[y.getStatusCode("positive")]:gt({...z,clue:a,isPositive:!0}),[y.getStatusCode("negative")]:gt({...z,clue:p,isPositive:!1})}};O&&(N.description=O,d&&m===void 0&&(N.summary=ht(O))),m&&(N.summary=ht(m)),y.getTags().length>0&&(N.tags=y.getTags()),fe.length>0&&(N.parameters=fe),v.includes("body")&&(N.requestBody=pr(z));let Re=Ke(we(dr(y.getSecurity()),Xe=>{let Nt=this.ensureUniqSecuritySchemaName(Xe),Er=["oauth2","openIdConnect"].includes(Xe.type)?y.getScopes():[];return this.addSecurityScheme(Nt,Xe),{name:Nt,scopes:Er}}));Re.length>0&&(N.security=Re);let We=nr(S);this.addPath(We,{[h]:N})}}),this.rootDoc.tags=r.tags?cr(r.tags):[]}};var xt=R(require("http"));var No=e=>({method:"GET",header:jest.fn(()=>J),...e}),Mo=e=>{let t={writableEnded:!1,statusCode:200,statusMessage:xt.default.STATUS_CODES[200],set:jest.fn(()=>t),setHeader:jest.fn(()=>t),header:jest.fn(()=>t),status:jest.fn(r=>(t.statusCode=r,t.statusMessage=xt.default.STATUS_CODES[r],t)),json:jest.fn(()=>t),send:jest.fn(()=>t),end:jest.fn(()=>(t.writableEnded=!0,t)),...e};return t},mr=async({endpoint:e,requestProps:t,responseProps:r,configProps:o,loggerProps:n,__noJest:s})=>{if(!jest||s)throw new Error("You need to install Jest in order to use testEndpoint().");let a=No(t),p=Mo(r),d={info:jest.fn(),warn:jest.fn(),error:jest.fn(),debug:jest.fn(),...n},c={cors:!1,logger:d,...o};return await e.execute({request:a,response:p,config:c,logger:d}),{requestMock:a,responseMock:p,loggerMock:d}};var G=R(require("typescript"));var D=R(require("typescript")),i=D.default.factory,re=[i.createModifier(D.default.SyntaxKind.ExportKeyword)],wo=[i.createModifier(D.default.SyntaxKind.AsyncKeyword)],Do=[i.createModifier(D.default.SyntaxKind.PublicKeyword),i.createModifier(D.default.SyntaxKind.ReadonlyKeyword)],ur=[i.createModifier(D.default.SyntaxKind.ProtectedKeyword),i.createModifier(D.default.SyntaxKind.ReadonlyKeyword)],zo=i.createTemplateHead(""),vo=i.createTemplateTail(""),jo=i.createTemplateMiddle(" "),Tt=e=>i.createTemplateLiteralType(zo,e.map((t,r)=>i.createTemplateLiteralTypeSpan(i.createTypeReferenceNode(t),r===e.length-1?vo:jo))),St=Tt(["M","P"]),$e=(e,t,r)=>i.createParameterDeclaration(r,void 0,e,void 0,t,void 0),_e=(e,t)=>Object.keys(e).reduce((r,o)=>r.concat($e(o,e[o],t)),[]),Ot=(e,t)=>i.createExpressionWithTypeArguments(i.createIdentifier("Record"),[typeof e=="number"?i.createKeywordTypeNode(e):i.createTypeReferenceNode(e),i.createKeywordTypeNode(t)]),fr=e=>i.createConstructorDeclaration(void 0,e,i.createBlock([])),bt=(e,t)=>i.createPropertySignature(void 0,`"${e}"`,void 0,i.createTypeReferenceNode(t)),Rt=(e,t)=>i.createVariableDeclarationList([i.createVariableDeclaration(e,void 0,void 0,t)],D.default.NodeFlags.Const),Pt=(e,t)=>i.createTypeAliasDeclaration(re,e,void 0,i.createUnionTypeNode(t.map(r=>i.createLiteralTypeNode(i.createStringLiteral(r))))),Ge=(e,t)=>i.createTypeAliasDeclaration(re,e,void 0,t),yr=(e,t,r)=>i.createPropertyDeclaration(Do,e,void 0,t,r),gr=(e,t,r=[])=>i.createClassDeclaration(re,e,void 0,void 0,[t,...r]),hr=(e,t)=>i.createTypeReferenceNode("Promise",[i.createIndexedAccessTypeNode(i.createTypeReferenceNode(e),t)]),xr=()=>i.createTypeReferenceNode("Promise",[i.createKeywordTypeNode(D.default.SyntaxKind.AnyKeyword)]),Zt=(e,t,r)=>i.createInterfaceDeclaration(re,e,void 0,t,r),Tr=e=>Object.keys(e).reduce((t,r)=>t.concat(i.createTypeParameterDeclaration([],r,i.createTypeReferenceNode(e[r]))),[]),Sr=(e,t)=>i.createArrowFunction(wo,void 0,e.map(r=>$e(r)),void 0,void 0,i.createCallExpression(i.createPropertyAccessExpression(i.createThis(),"implementation"),void 0,t)),Et=(e,t,r)=>i.createCallExpression(i.createPropertyAccessExpression(i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("Object"),"keys"),void 0,[i.createIdentifier(e)]),"reduce"),void 0,[i.createArrowFunction(void 0,void 0,_e({acc:void 0,key:void 0}),void 0,void 0,t),r]);var f=R(require("typescript")),Pr=require("zod");var _=R(require("typescript")),{factory:qe}=_.default,At=(e,t)=>{_.default.addSyntheticLeadingComment(e,_.default.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0)},Ve=(e,t,r)=>{let o=qe.createTypeAliasDeclaration(void 0,qe.createIdentifier(t),void 0,e);return r&&At(o,r),o},Or=(e,t)=>{let r=_.default.createSourceFile("print.ts","",_.default.ScriptTarget.Latest,!1,_.default.ScriptKind.TS);return _.default.createPrinter(t).printNode(_.default.EmitHint.Unspecified,e,r)},Lo=/^[A-Za-z_$][A-Za-z0-9_$]*$/,br=e=>Lo.test(e)?qe.createIdentifier(e):qe.createStringLiteral(e);var{factory:u}=f.default,ko={[f.default.SyntaxKind.AnyKeyword]:"",[f.default.SyntaxKind.BigIntKeyword]:BigInt(0),[f.default.SyntaxKind.BooleanKeyword]:!1,[f.default.SyntaxKind.NumberKeyword]:0,[f.default.SyntaxKind.ObjectKeyword]:{},[f.default.SyntaxKind.StringKeyword]:"",[f.default.SyntaxKind.UndefinedKeyword]:void 0},Ho=({schema:{value:e}})=>u.createLiteralTypeNode(typeof e=="number"?u.createNumericLiteral(e):typeof e=="boolean"?e?u.createTrue():u.createFalse():u.createStringLiteral(e)),Uo=({schema:{shape:e},isResponse:t,next:r,optionalPropStyle:{withQuestionMark:o}})=>{let n=Object.entries(e).map(([s,a])=>{let p=t&&Te(a)?a instanceof Pr.z.ZodOptional:a.isOptional(),d=u.createPropertySignature(void 0,br(s),p&&o?u.createToken(f.default.SyntaxKind.QuestionToken):void 0,r({schema:a}));return a.description&&At(d,a.description),d});return u.createTypeLiteralNode(n)},Ko=({schema:{element:e},next:t})=>u.createArrayTypeNode(t({schema:e})),Fo=({schema:{options:e}})=>u.createUnionTypeNode(e.map(t=>u.createLiteralTypeNode(u.createStringLiteral(t)))),Rr=({schema:{options:e},next:t})=>u.createUnionTypeNode(e.map(r=>t({schema:r}))),$o=e=>ko?.[e.kind],_o=({schema:e,next:t,isResponse:r})=>{let o=t({schema:e.innerType()}),n=e._def.effect;if(r&&n.type==="transform"){let s=Ne({effect:n,sample:$o(o)}),a={number:f.default.SyntaxKind.NumberKeyword,bigint:f.default.SyntaxKind.BigIntKeyword,boolean:f.default.SyntaxKind.BooleanKeyword,string:f.default.SyntaxKind.StringKeyword,undefined:f.default.SyntaxKind.UndefinedKeyword,object:f.default.SyntaxKind.ObjectKeyword};return u.createKeywordTypeNode(s&&a[s]||f.default.SyntaxKind.AnyKeyword)}return o},Go=({schema:e})=>u.createUnionTypeNode(Object.values(e.enum).map(t=>u.createLiteralTypeNode(typeof t=="number"?u.createNumericLiteral(t):u.createStringLiteral(t)))),qo=({next:e,schema:t,optionalPropStyle:{withUndefined:r}})=>{let o=e({schema:t.unwrap()});return r?u.createUnionTypeNode([o,u.createKeywordTypeNode(f.default.SyntaxKind.UndefinedKeyword)]):o},Vo=({next:e,schema:t})=>u.createUnionTypeNode([e({schema:t.unwrap()}),u.createLiteralTypeNode(u.createNull())]),Bo=({next:e,schema:{items:t}})=>u.createTupleTypeNode(t.map(r=>e({schema:r}))),Yo=({next:e,schema:{keySchema:t,valueSchema:r}})=>u.createExpressionWithTypeArguments(u.createIdentifier("Record"),[e({schema:t}),e({schema:r})]),Jo=({next:e,schema:t})=>u.createIntersectionTypeNode([t._def.left,t._def.right].map(r=>e({schema:r}))),Qo=({next:e,schema:t})=>e({schema:t._def.innerType}),Y=e=>()=>u.createKeywordTypeNode(e),Wo=({next:e,schema:t})=>e({schema:t.unwrap()}),Xo=({next:e,schema:t})=>e({schema:t._def.innerType}),en=({next:e,schema:t})=>e({schema:t._def.innerType}),tn=({schema:e,next:t,isResponse:r})=>t({schema:e._def[r?"out":"in"]}),rn=()=>u.createLiteralTypeNode(u.createNull()),on=({getAlias:e,makeAlias:t,next:r,serializer:o,schema:n})=>{let s=`Type${o(n.schema)}`;return e(s)||(()=>(t(s,u.createLiteralTypeNode(u.createNull())),t(s,r({schema:n.schema}))))()},nn={ZodString:Y(f.default.SyntaxKind.StringKeyword),ZodNumber:Y(f.default.SyntaxKind.NumberKeyword),ZodBigInt:Y(f.default.SyntaxKind.BigIntKeyword),ZodBoolean:Y(f.default.SyntaxKind.BooleanKeyword),ZodDateIn:Y(f.default.SyntaxKind.StringKeyword),ZodDateOut:Y(f.default.SyntaxKind.StringKeyword),ZodNull:rn,ZodArray:Ko,ZodTuple:Bo,ZodRecord:Yo,ZodObject:Uo,ZodLiteral:Ho,ZodIntersection:Jo,ZodUnion:Rr,ZodFile:Y(f.default.SyntaxKind.StringKeyword),ZodAny:Y(f.default.SyntaxKind.AnyKeyword),ZodDefault:Qo,ZodEnum:Fo,ZodNativeEnum:Go,ZodEffects:_o,ZodOptional:qo,ZodNullable:Vo,ZodDiscriminatedUnion:Rr,ZodBranded:Wo,ZodCatch:en,ZodPipeline:tn,ZodLazy:on,ZodReadonly:Xo},It=({schema:e,...t})=>te({schema:e,rules:nn,onMissing:()=>u.createKeywordTypeNode(f.default.SyntaxKind.AnyKeyword),...t});var Be=class{agg=[];registry={};paths=[];aliases={};getAlias(t){return t in this.aliases?i.createTypeReferenceNode(t):void 0}makeAlias(t,r){return this.aliases[t]=Ve(r,t),this.getAlias(t)}constructor({routing:t,variant:r="client",serializer:o=Ce,optionalPropStyle:n={withQuestionMark:!0,withUndefined:!0}}){ee({routing:t,onEndpoint:(m,O,v)=>{let fe=H(O,v,"input"),Qe=H(O,v,"response"),N={serializer:o,getAlias:this.getAlias.bind(this),makeAlias:this.makeAlias.bind(this),optionalPropStyle:n},Re=It({...N,schema:m.getSchema("input"),isResponse:!1}),We=It({...N,isResponse:!0,schema:m.getSchema("positive").or(m.getSchema("negative"))});this.agg.push(Ve(Re,fe),Ve(We,Qe)),v!=="options"&&(this.paths.push(O),this.registry[`${v} ${O}`]={in:fe,out:Qe,isJson:m.getMimeTypes("positive").includes(J),tags:m.getTags()})}}),this.agg=Object.values(this.aliases).concat(this.agg);let s=Pt("Path",this.paths),a=Pt("Method",Ft),p=Ge("MethodPath",Tt([a.name,s.name])),d=[i.createHeritageClause(G.default.SyntaxKind.ExtendsKeyword,[Ot(p.name,G.default.SyntaxKind.AnyKeyword)])],c=Zt("Input",d,Object.keys(this.registry).map(m=>bt(m,this.registry[m].in))),l=Zt("Response",d,Object.keys(this.registry).map(m=>bt(m,this.registry[m].out)));if(this.agg.push(s,a,p,c,l),r==="types")return;let g=i.createVariableStatement(re,Rt("jsonEndpoints",i.createObjectLiteralExpression(Object.keys(this.registry).filter(m=>this.registry[m].isJson).map(m=>i.createPropertyAssignment(`"${m}"`,i.createTrue()))))),y=i.createVariableStatement(re,Rt("endpointTags",i.createObjectLiteralExpression(Object.keys(this.registry).map(m=>i.createPropertyAssignment(`"${m}"`,i.createArrayLiteralExpression(this.registry[m].tags.map(O=>i.createStringLiteral(O)))))))),S=Ge("Provider",i.createFunctionTypeNode(Tr({M:a.name,P:s.name}),_e({method:i.createTypeReferenceNode("M"),path:i.createTypeReferenceNode("P"),params:i.createIndexedAccessTypeNode(i.createTypeReferenceNode(c.name),St)}),hr(l.name,St))),I=Ge("Implementation",i.createFunctionTypeNode(void 0,_e({method:i.createTypeReferenceNode(a.name),path:i.createKeywordTypeNode(G.default.SyntaxKind.StringKeyword),params:Ot(G.default.SyntaxKind.StringKeyword,G.default.SyntaxKind.AnyKeyword)}),xr())),h=i.createTemplateExpression(i.createTemplateHead(":"),[i.createTemplateSpan(i.createIdentifier("key"),i.createTemplateTail(""))]),z=gr("ExpressZodAPIClient",fr([$e("implementation",i.createTypeReferenceNode(I.name),ur)]),[yr("provide",i.createTypeReferenceNode(S.name),Sr(["method","path","params"],[i.createIdentifier("method"),Et("params",i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("acc"),"replace"),void 0,[h,i.createElementAccessExpression(i.createIdentifier("params"),i.createIdentifier("key"))]),i.createIdentifier("path")),Et("params",i.createConditionalExpression(i.createBinaryExpression(i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("path"),"indexOf"),void 0,[h]),G.default.SyntaxKind.GreaterThanEqualsToken,i.createNumericLiteral(0)),void 0,i.createIdentifier("acc"),void 0,i.createObjectLiteralExpression([i.createSpreadAssignment(i.createIdentifier("acc")),i.createPropertyAssignment(i.createComputedPropertyName(i.createIdentifier("key")),i.createElementAccessExpression(i.createIdentifier("params"),i.createIdentifier("key")))])),i.createObjectLiteralExpression())]))]);G.default.addSyntheticLeadingComment(z,G.default.SyntaxKind.MultiLineCommentTrivia,`
|
|
34
|
+
`.trim();var pt=({app:e,logger:t,config:r,routing:o})=>{r.startupLogo!==!1&&console.log(Bt()),ee({routing:o,hasCors:!!r.cors,onEndpoint:(n,s,a)=>{e[a](s,async(p,d)=>{t.info(`${p.method}: ${s}`),await n.execute({request:p,response:d,logger:t,config:r})})},onStatic:(n,s)=>{e.use(n,s)}})};var ke=R(require("express")),Yt=R(require("compression")),Jt=R(require("express-fileupload")),Qt=R(require("https"));var ct=R(require("http-errors")),$r=(e,t)=>(r,o,n,s)=>{if(!r)return s();e.handler({error:(0,ct.default)(400,ne(r).message),request:o,response:n,logger:t,input:o.body,output:null})},Wt=(e,t)=>(r,o)=>{let n=(0,ct.default)(404,`Can not ${r.method} ${r.path}`);try{e.handler({request:r,response:o,logger:t,error:n,input:null,output:null})}catch(s){ve({response:o,logger:t,error:new ie(ne(s).message,n)})}},Xt=(e,t)=>{let r=ot(e.logger)?Oe(e.logger):e.logger;pt({app:e.app,routing:t,logger:r,config:e});let o=e.errorHandler||W;return{notFoundHandler:Wt(o,r),logger:r}},er=(e,t)=>{let r=ot(e.logger)?Oe(e.logger):e.logger,o=(0,ke.default)();o.disable("x-powered-by");let n=e.errorHandler||W,s=e.server.compression?(0,Yt.default)({...typeof e.server.compression=="object"?e.server.compression:{}}):void 0,a=e.server.jsonParser||(0,ke.json)(),p=e.server.upload?(0,Jt.default)({...typeof e.server.upload=="object"?e.server.upload:{},abortOnLimit:!1,parseNested:!0}):void 0,d=[].concat(s||[]).concat(a).concat(p||[]);o.use(d),o.use($r(n,r)),pt({app:o,routing:t,logger:r,config:e}),o.use(Wt(n,r));let c=o.listen(e.server.listen,()=>{r.info(`Listening ${e.server.listen}`)}),l;return e.https&&(l=Qt.default.createServer(e.https.options,o).listen(e.https.listen,()=>{r.info(`Listening ${e.https.listen}`)})),{app:o,httpServer:c,httpsServer:l,logger:r}};var lr=require("openapi3-ts/oas30");var $=require("openapi3-ts/oas30"),ue=require("ramda"),x=require("zod");var T=require("zod");var lt=/^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(\.\d+)?)?Z?$/,_r="ZodDateIn",He=class e extends T.ZodType{_parse(t){let{status:r,ctx:o}=this._processInputParams(t);if(o.parsedType!==T.ZodParsedType.string)return(0,T.addIssueToContext)(o,{code:T.ZodIssueCode.invalid_type,expected:T.ZodParsedType.string,received:o.parsedType}),T.INVALID;lt.test(o.data)||((0,T.addIssueToContext)(o,{code:T.ZodIssueCode.invalid_string,validation:"regex"}),r.dirty());let n=new Date(o.data);return Ie(n)?{status:r.value,value:n}:((0,T.addIssueToContext)(o,{code:T.ZodIssueCode.invalid_date}),T.INVALID)}static create=()=>new e({typeName:_r})};var te=({schema:e,onEach:t,rules:r,onMissing:o,...n})=>{let s="typeName"in e._def?r[e._def.typeName]:void 0,p=s?s({schema:e,...n,next:c=>te({...c,...n,onEach:t,rules:r,onMissing:o})}):o({schema:e,...n}),d=t&&t({schema:e,prev:p,...n});return d?{...p,...d}:p};var tr=50,or="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString",Gr={integer:0,number:0,string:"",boolean:!1,object:{},null:null,array:[]},nr=e=>e.replace(et,t=>`{${t.slice(1)}}`),qr=({schema:{_def:{innerType:e,defaultValue:t}},next:r})=>({...r({schema:e}),default:t()}),Vr=({schema:{_def:{innerType:e}},next:t})=>t({schema:e}),Br=()=>({format:"any"}),Yr=e=>{if(e.isResponse)throw new P({message:"Please use z.upload() only for input.",...e});return{type:"string",format:"binary"}},Jr=({schema:{isBinary:e,isBase64:t},...r})=>{if(!r.isResponse)throw new P({message:"Please use z.file() only within ResultHandler.",...r});return{type:"string",format:e?"binary":t?"byte":"file"}},Qr=({schema:{options:e},next:t})=>({oneOf:e.map(r=>t({schema:r}))}),Wr=({schema:{options:e,discriminator:t},next:r})=>({discriminator:{propertyName:t},oneOf:Array.from(e.values()).map(o=>r({schema:o}))}),Xr=({schema:{_def:{left:e,right:t}},next:r})=>({allOf:[e,t].map(o=>r({schema:o}))}),eo=({schema:e,next:t})=>t({schema:e.unwrap()}),to=({schema:e,next:t})=>t({schema:e._def.innerType}),ro=({schema:e,next:t})=>({nullable:!0,...t({schema:e.unwrap()})}),rr=({schema:e})=>({type:typeof Object.values(e.enum)[0],enum:Object.values(e.enum)}),oo=({schema:{value:e}})=>({type:typeof e,enum:[e]}),no=({schema:e,isResponse:t,...r})=>{let o=Object.keys(e.shape).filter(n=>{let s=e.shape[n];return!(t&&Te(s)?s instanceof x.z.ZodOptional:s.isOptional())});return{type:"object",properties:Ue({schema:e,isResponse:t,...r}),...o.length?{required:o}:{}}},so=()=>({type:"string",nullable:!0,format:"null"}),io=e=>{if(e.isResponse)throw new P({message:"Please use z.dateOut() for output.",...e});return{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",pattern:lt.source,externalDocs:{url:or}}},ao=e=>{if(!e.isResponse)throw new P({message:"Please use z.dateIn() for input.",...e});return{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",externalDocs:{url:or}}},po=e=>{throw new P({message:`Using z.date() within ${e.isResponse?"output":"input"} schema is forbidden. Please use z.date${e.isResponse?"Out":"In"}() instead. Check out the documentation for details.`,...e})},co=()=>({type:"boolean"}),lo=()=>({type:"integer",format:"bigint"}),mo=({schema:{keySchema:e,valueSchema:t},...r})=>{if(e instanceof x.z.ZodEnum||e instanceof x.z.ZodNativeEnum){let o=Object.values(e.enum),n=o.reduce((s,a)=>({...s,[a]:t}),{});return{type:"object",properties:Ue({schema:x.z.object(n),...r}),...o.length?{required:o}:{}}}if(e instanceof x.z.ZodLiteral)return{type:"object",properties:Ue({schema:x.z.object({[e.value]:t}),...r}),required:[e.value]};if(e instanceof x.z.ZodUnion&&e.options.reduce((n,s)=>n&&s instanceof x.z.ZodLiteral,!0)){let n=e.options.reduce((s,a)=>({...s,[a.value]:t}),{});return{type:"object",properties:Ue({schema:x.z.object(n),...r}),required:e.options.map(s=>s.value)}}return{type:"object",additionalProperties:r.next({schema:t})}},uo=({schema:{_def:e,element:t},next:r})=>({type:"array",items:r({schema:t}),...e.minLength!==null&&{minItems:e.minLength.value},...e.maxLength!==null&&{maxItems:e.maxLength.value}}),fo=({schema:{items:e},next:t})=>{let r=e.map(o=>t({schema:o}));return{type:"array",minItems:r.length,maxItems:r.length,items:{oneOf:r,format:"tuple",...r.length>0&&{description:r.map((o,n)=>`${n}: ${(0,$.isSchemaObject)(o)?o.type:o.$ref}`).join(", ")}}}},yo=({schema:{isEmail:e,isURL:t,minLength:r,maxLength:o,isUUID:n,isCUID:s,isCUID2:a,isULID:p,isIP:d,isEmoji:c,isDatetime:l,_def:{checks:g}}})=>{let y=g.find(h=>h.kind==="regex"),S=g.find(h=>h.kind==="datetime"),I=y?y.regex:S?S.offset?new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(([+-]\\d{2}:\\d{2})|Z)$"):new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?Z$"):void 0;return{type:"string",...l&&{format:"date-time"},...e&&{format:"email"},...t&&{format:"url"},...n&&{format:"uuid"},...s&&{format:"cuid"},...a&&{format:"cuid2"},...p&&{format:"ulid"},...d&&{format:"ip"},...c&&{format:"emoji"},...r!==null&&{minLength:r},...o!==null&&{maxLength:o},...I&&{pattern:`/${I.source}/${I.flags}`}}},go=({schema:e})=>{let t=e._def.checks.find(({kind:s})=>s==="min"),r=t?t.inclusive:!0,o=e._def.checks.find(({kind:s})=>s==="max"),n=o?o.inclusive:!0;return{type:e.isInt?"integer":"number",format:e.isInt?"int64":"double",minimum:e.minValue===null?e.isInt?Number.MIN_SAFE_INTEGER:Number.MIN_VALUE:e.minValue,exclusiveMinimum:!r,maximum:e.maxValue===null?e.isInt?Number.MAX_SAFE_INTEGER:Number.MAX_VALUE:e.maxValue,exclusiveMaximum:!n}},Ue=({schema:{shape:e},next:t})=>Object.keys(e).reduce((r,o)=>({...r,[o]:t({schema:e[o]})}),{}),ho=e=>{let t=Array.isArray(e.type)?e.type[0]:e.type;return Gr?.[t]},xo=({schema:e,isResponse:t,next:r})=>{let o=r({schema:e.innerType()}),{effect:n}=e._def;if(t&&n.type==="transform"&&(0,$.isSchemaObject)(o)){let s=Ne({effect:n,sample:ho(o)});return s&&["number","string","boolean"].includes(s)?{type:s}:r({schema:x.z.any()})}if(!t&&n.type==="preprocess"&&(0,$.isSchemaObject)(o)){let{type:s,...a}=o;return{...a,format:`${a.format||s} (preprocessed)`}}return o},To=({schema:e,isResponse:t,next:r})=>r({schema:e._def[t?"out":"in"]}),So=({schema:e,next:t})=>t({schema:e.unwrap()}),Oo=({next:e,schema:t,serializer:r,getRef:o,makeRef:n})=>{let s=r(t.schema);return o(s)||(()=>(n(s,{}),n(s,e({schema:t.schema}))))()},sr=(e,t,r=[])=>{let o=k({schema:e,variant:t?"parsed":"original",validate:!0});return o.length===0?{}:{examples:o.reduce((n,s,a)=>({...n,[`example${a+1}`]:{value:typeof s=="object"&&!Array.isArray(s)?(0,ue.omit)(r,s):s}}),{})}},bo=(e,t,r)=>{let o=k({schema:e,variant:t?"parsed":"original",validate:!0});return o.length===0?{}:{examples:o.reduce((n,s,a)=>r in s?{...n,[`example${a+1}`]:{value:s[r]}}:n,{})}},be=(e,t)=>{if(e instanceof x.z.ZodObject)return e;let r;if(e instanceof x.z.ZodUnion||e instanceof x.z.ZodDiscriminatedUnion)r=Array.from(e.options.values()).map(o=>be(o,t)).reduce((o,n)=>o.merge(n.partial()),x.z.object({}));else if(e instanceof x.z.ZodEffects){if(q(e))throw new P({message:`Using transformations on the top level of ${t.isResponse?"response":"input"} schema is not allowed.`,...t});r=be(e._def.schema,t)}else r=be(e._def.left,t).merge(be(e._def.right,t));return Ee(e,r)},ir=({path:e,method:t,endpoint:r,inputSources:o,serializer:n,getRef:s,makeRef:a,composition:p,clue:d="parameter"})=>{let c=r.getSchema("input"),l=be(c,{path:e,method:t,isResponse:!1}).shape,g=st(e),y=o.includes("query"),S=o.includes("params"),I=o.includes("headers"),h=m=>S&&g.includes(m),z=m=>I&&rt(m);return Object.keys(l).filter(m=>y||h(m)).map(m=>{let O=te({schema:l[m],isResponse:!1,rules:ut,onEach:ft,onMissing:yt,serializer:n,getRef:s,makeRef:a,path:e,method:t}),v=p==="components"?a(H(e,t,`${d} ${m}`),O):O;return{name:m,in:h(m)?"path":z(m)?"header":"query",required:!l[m].isOptional(),description:(0,$.isSchemaObject)(O)&&O.description||`${t.toUpperCase()} ${e} ${d}`,schema:v,...bo(c,!1,m)}})},ut={ZodString:yo,ZodNumber:go,ZodBigInt:lo,ZodBoolean:co,ZodDateIn:io,ZodDateOut:ao,ZodNull:so,ZodArray:uo,ZodTuple:fo,ZodRecord:mo,ZodObject:no,ZodLiteral:oo,ZodIntersection:Xr,ZodUnion:Qr,ZodFile:Jr,ZodUpload:Yr,ZodAny:Br,ZodDefault:qr,ZodEnum:rr,ZodNativeEnum:rr,ZodEffects:xo,ZodOptional:eo,ZodNullable:ro,ZodDiscriminatedUnion:Wr,ZodBranded:So,ZodDate:po,ZodCatch:Vr,ZodPipeline:To,ZodLazy:Oo,ZodReadonly:to},ft=({schema:e,isResponse:t,prev:r})=>{if((0,$.isReferenceObject)(r))return{};let{description:o}=e,n=e instanceof x.z.ZodLazy,s=r.type!==void 0,a=t&&Te(e),p=!n&&s&&!a&&e.isNullable(),d=n?[]:k({schema:e,variant:t?"parsed":"original",validate:!0});return{...o&&{description:o},...p&&{nullable:!0},...d.length>0&&{example:d[0]}}},yt=({schema:e,...t})=>{throw new P({message:`Zod type ${e.constructor.name} is unsupported.`,...t})},mt=(e,t)=>{if((0,$.isReferenceObject)(e))return e;let r=e.properties?(0,ue.omit)(t,e.properties):void 0,o=e.example?(0,ue.omit)(t,e.example):void 0,n=e.required?e.required.filter(p=>!t.includes(p)):void 0,s=e.allOf?e.allOf.map(p=>mt(p,t)):void 0,a=e.oneOf?e.oneOf.map(p=>mt(p,t)):void 0;return(0,ue.omit)(Object.entries({properties:r,required:n,example:o,allOf:s,oneOf:a}).filter(([{},p])=>p===void 0).map(([p])=>p),{...e,properties:r,required:n,example:o,allOf:s,oneOf:a})},ar=e=>(0,$.isSchemaObject)(e)?(0,ue.omit)(["example"],e):e,gt=({method:e,path:t,endpoint:r,isPositive:o,serializer:n,getRef:s,makeRef:a,composition:p,clue:d="response"})=>{let c=r.getSchema(o?"positive":"negative"),l=r.getMimeTypes(o?"positive":"negative"),g=ar(te({schema:c,isResponse:!0,rules:ut,onEach:ft,onMissing:yt,serializer:n,getRef:s,makeRef:a,path:t,method:e})),y=sr(c,!0),S=p==="components"?a(H(t,e,d),g):g;return{description:`${e.toUpperCase()} ${t} ${d}`,content:l.reduce((I,h)=>({...I,[h]:{schema:S,...y}}),{})}},Ro=()=>({type:"http",scheme:"basic"}),Po=({format:e})=>({type:"http",scheme:"bearer",...e&&{bearerFormat:e}}),Zo=({name:e})=>({type:"apiKey",in:"query",name:e}),Eo=({name:e})=>({type:"apiKey",in:"header",name:e}),Ao=({name:e})=>({type:"apiKey",in:"cookie",name:e}),Io=({url:e})=>({type:"openIdConnect",openIdConnectUrl:e}),Co=({flows:e={}})=>({type:"oauth2",flows:Object.keys(e).reduce((t,r)=>{let o=e[r];if(!o)return t;let{scopes:n={},...s}=o;return{...t,[r]:{...s,scopes:n}}},{})}),dr=e=>{let t={basic:Ro,bearer:Po,input:Zo,header:Eo,cookie:Ao,openid:Io,oauth2:Co};return we(e,r=>t[r.type](r))},Ke=e=>{if(typeof e=="object"){if("or"in e)return e.or.map(t=>("and"in t?t.and:[t]).reduce((r,{name:o,scopes:n})=>({...r,[o]:n}),{}));if("and"in e)return Ke(at(e))}return Ke({or:[e]})},pr=({method:e,path:t,endpoint:r,serializer:o,getRef:n,makeRef:s,composition:a,clue:p="request body"})=>{let d=st(t),c=ar(mt(te({schema:r.getSchema("input"),isResponse:!1,rules:ut,onEach:ft,onMissing:yt,serializer:o,getRef:n,makeRef:s,path:t,method:e}),d)),l=sr(r.getSchema("input"),!1,d),g=a==="components"?s(H(t,e,p),c):c;return{description:`${e.toUpperCase()} ${t} ${p}`,content:r.getMimeTypes("input").reduce((y,S)=>({...y,[S]:{schema:g,...l}}),{})}},cr=e=>Object.keys(e).map(t=>{let r=e[t];return{name:t,description:typeof r=="string"?r:r.description,...typeof r=="object"&&r.url&&{externalDocs:{url:r.url}}}}),ht=e=>e.length<=tr?e:e.slice(0,tr-1)+"\u2026";var Fe=class extends lr.OpenApiBuilder{lastSecuritySchemaIds={};lastOperationIdSuffixes={};makeRef(t,r){return this.addSchema(t,r),this.getRef(t)}getRef(t){return t in(this.rootDoc.components?.schemas||{})?{$ref:`#/components/schemas/${t}`}:void 0}ensureUniqOperationId(t,r,o){if(o){if(o in this.lastOperationIdSuffixes)throw new P({message:`Duplicated operationId: "${o}"`,method:r,isResponse:!1,path:t});return this.lastOperationIdSuffixes[o]=1,o}let n=H(t,r);return n in this.lastOperationIdSuffixes?(this.lastOperationIdSuffixes[n]++,`${n}${this.lastOperationIdSuffixes[n]}`):(this.lastOperationIdSuffixes[n]=1,n)}ensureUniqSecuritySchemaName(t){let r=JSON.stringify(t);for(let o in this.rootDoc.components?.securitySchemes||{})if(r===JSON.stringify(this.rootDoc.components?.securitySchemes?.[o]))return o;return this.lastSecuritySchemaIds[t.type]=(this.lastSecuritySchemaIds?.[t.type]||0)+1,`${t.type.toUpperCase()}_${this.lastSecuritySchemaIds[t.type]}`}constructor({routing:t,config:r,title:o,version:n,serverUrl:s,successfulResponseDescription:a="Successful response",errorResponseDescription:p="Error response",hasSummaryFromDescription:d=!0,composition:c="inline",serializer:l=Ce}){super(),this.addInfo({title:o,version:n});for(let y of typeof s=="string"?[s]:s)this.addServer({url:y});ee({routing:t,onEndpoint:(y,S,I)=>{let h=I,z={path:S,method:h,endpoint:y,composition:c,serializer:l,getRef:this.getRef.bind(this),makeRef:this.makeRef.bind(this)},[m,O]=["short","long"].map(y.getDescription.bind(y)),v=r.inputSources?.[h]||Ae[h],fe=ir({...z,inputSources:v}),N={operationId:this.ensureUniqOperationId(S,h,y.getOperationId(h)),responses:{[y.getStatusCode("positive")]:gt({...z,clue:a,isPositive:!0}),[y.getStatusCode("negative")]:gt({...z,clue:p,isPositive:!1})}};O&&(N.description=O,d&&m===void 0&&(N.summary=ht(O))),m&&(N.summary=ht(m)),y.getTags().length>0&&(N.tags=y.getTags()),fe.length>0&&(N.parameters=fe),v.includes("body")&&(N.requestBody=pr(z));let Re=Ke(we(dr(y.getSecurity()),Xe=>{let Nt=this.ensureUniqSecuritySchemaName(Xe),Er=["oauth2","openIdConnect"].includes(Xe.type)?y.getScopes():[];return this.addSecurityScheme(Nt,Xe),{name:Nt,scopes:Er}}));Re.length>0&&(N.security=Re);let We=nr(S);this.addPath(We,{[h]:N})}}),this.rootDoc.tags=r.tags?cr(r.tags):[]}};var xt=R(require("http"));var No=e=>({method:"GET",header:jest.fn(()=>J),...e}),Mo=e=>{let t={writableEnded:!1,statusCode:200,statusMessage:xt.default.STATUS_CODES[200],set:jest.fn(()=>t),setHeader:jest.fn(()=>t),header:jest.fn(()=>t),status:jest.fn(r=>(t.statusCode=r,t.statusMessage=xt.default.STATUS_CODES[r],t)),json:jest.fn(()=>t),send:jest.fn(()=>t),end:jest.fn(()=>(t.writableEnded=!0,t)),...e};return t},mr=async({endpoint:e,requestProps:t,responseProps:r,configProps:o,loggerProps:n,__noJest:s})=>{if(!jest||s)throw new Error("You need to install Jest in order to use testEndpoint().");let a=No(t),p=Mo(r),d={info:jest.fn(),warn:jest.fn(),error:jest.fn(),debug:jest.fn(),...n},c={cors:!1,logger:d,...o};return await e.execute({request:a,response:p,config:c,logger:d}),{requestMock:a,responseMock:p,loggerMock:d}};var G=R(require("typescript"));var D=R(require("typescript")),i=D.default.factory,re=[i.createModifier(D.default.SyntaxKind.ExportKeyword)],wo=[i.createModifier(D.default.SyntaxKind.AsyncKeyword)],Do=[i.createModifier(D.default.SyntaxKind.PublicKeyword),i.createModifier(D.default.SyntaxKind.ReadonlyKeyword)],ur=[i.createModifier(D.default.SyntaxKind.ProtectedKeyword),i.createModifier(D.default.SyntaxKind.ReadonlyKeyword)],zo=i.createTemplateHead(""),vo=i.createTemplateTail(""),jo=i.createTemplateMiddle(" "),Tt=e=>i.createTemplateLiteralType(zo,e.map((t,r)=>i.createTemplateLiteralTypeSpan(i.createTypeReferenceNode(t),r===e.length-1?vo:jo))),St=Tt(["M","P"]),$e=(e,t,r)=>i.createParameterDeclaration(r,void 0,e,void 0,t,void 0),_e=(e,t)=>Object.keys(e).reduce((r,o)=>r.concat($e(o,e[o],t)),[]),Ot=(e,t)=>i.createExpressionWithTypeArguments(i.createIdentifier("Record"),[typeof e=="number"?i.createKeywordTypeNode(e):i.createTypeReferenceNode(e),i.createKeywordTypeNode(t)]),fr=e=>i.createConstructorDeclaration(void 0,e,i.createBlock([])),bt=(e,t)=>i.createPropertySignature(void 0,`"${e}"`,void 0,i.createTypeReferenceNode(t)),Rt=(e,t)=>i.createVariableDeclarationList([i.createVariableDeclaration(e,void 0,void 0,t)],D.default.NodeFlags.Const),Pt=(e,t)=>i.createTypeAliasDeclaration(re,e,void 0,i.createUnionTypeNode(t.map(r=>i.createLiteralTypeNode(i.createStringLiteral(r))))),Ge=(e,t)=>i.createTypeAliasDeclaration(re,e,void 0,t),yr=(e,t,r)=>i.createPropertyDeclaration(Do,e,void 0,t,r),gr=(e,t,r=[])=>i.createClassDeclaration(re,e,void 0,void 0,[t,...r]),hr=(e,t)=>i.createTypeReferenceNode("Promise",[i.createIndexedAccessTypeNode(i.createTypeReferenceNode(e),t)]),xr=()=>i.createTypeReferenceNode("Promise",[i.createKeywordTypeNode(D.default.SyntaxKind.AnyKeyword)]),Zt=(e,t,r)=>i.createInterfaceDeclaration(re,e,void 0,t,r),Tr=e=>Object.keys(e).reduce((t,r)=>t.concat(i.createTypeParameterDeclaration([],r,i.createTypeReferenceNode(e[r]))),[]),Sr=(e,t)=>i.createArrowFunction(wo,void 0,e.map(r=>$e(r)),void 0,void 0,i.createCallExpression(i.createPropertyAccessExpression(i.createThis(),"implementation"),void 0,t)),Et=(e,t,r)=>i.createCallExpression(i.createPropertyAccessExpression(i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("Object"),"keys"),void 0,[i.createIdentifier(e)]),"reduce"),void 0,[i.createArrowFunction(void 0,void 0,_e({acc:void 0,key:void 0}),void 0,void 0,t),r]);var f=R(require("typescript")),Pr=require("zod");var _=R(require("typescript")),{factory:qe}=_.default,At=(e,t)=>{_.default.addSyntheticLeadingComment(e,_.default.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0)},Ve=(e,t,r)=>{let o=qe.createTypeAliasDeclaration(void 0,qe.createIdentifier(t),void 0,e);return r&&At(o,r),o},Or=(e,t)=>{let r=_.default.createSourceFile("print.ts","",_.default.ScriptTarget.Latest,!1,_.default.ScriptKind.TS);return _.default.createPrinter(t).printNode(_.default.EmitHint.Unspecified,e,r)},Lo=/^[A-Za-z_$][A-Za-z0-9_$]*$/,br=e=>Lo.test(e)?qe.createIdentifier(e):qe.createStringLiteral(e);var{factory:u}=f.default,ko={[f.default.SyntaxKind.AnyKeyword]:"",[f.default.SyntaxKind.BigIntKeyword]:BigInt(0),[f.default.SyntaxKind.BooleanKeyword]:!1,[f.default.SyntaxKind.NumberKeyword]:0,[f.default.SyntaxKind.ObjectKeyword]:{},[f.default.SyntaxKind.StringKeyword]:"",[f.default.SyntaxKind.UndefinedKeyword]:void 0},Ho=({schema:{value:e}})=>u.createLiteralTypeNode(typeof e=="number"?u.createNumericLiteral(e):typeof e=="boolean"?e?u.createTrue():u.createFalse():u.createStringLiteral(e)),Uo=({schema:{shape:e},isResponse:t,next:r,optionalPropStyle:{withQuestionMark:o}})=>{let n=Object.entries(e).map(([s,a])=>{let p=t&&Te(a)?a instanceof Pr.z.ZodOptional:a.isOptional(),d=u.createPropertySignature(void 0,br(s),p&&o?u.createToken(f.default.SyntaxKind.QuestionToken):void 0,r({schema:a}));return a.description&&At(d,a.description),d});return u.createTypeLiteralNode(n)},Ko=({schema:{element:e},next:t})=>u.createArrayTypeNode(t({schema:e})),Fo=({schema:{options:e}})=>u.createUnionTypeNode(e.map(t=>u.createLiteralTypeNode(u.createStringLiteral(t)))),Rr=({schema:{options:e},next:t})=>u.createUnionTypeNode(e.map(r=>t({schema:r}))),$o=e=>ko?.[e.kind],_o=({schema:e,next:t,isResponse:r})=>{let o=t({schema:e.innerType()}),n=e._def.effect;if(r&&n.type==="transform"){let s=Ne({effect:n,sample:$o(o)}),a={number:f.default.SyntaxKind.NumberKeyword,bigint:f.default.SyntaxKind.BigIntKeyword,boolean:f.default.SyntaxKind.BooleanKeyword,string:f.default.SyntaxKind.StringKeyword,undefined:f.default.SyntaxKind.UndefinedKeyword,object:f.default.SyntaxKind.ObjectKeyword};return u.createKeywordTypeNode(s&&a[s]||f.default.SyntaxKind.AnyKeyword)}return o},Go=({schema:e})=>u.createUnionTypeNode(Object.values(e.enum).map(t=>u.createLiteralTypeNode(typeof t=="number"?u.createNumericLiteral(t):u.createStringLiteral(t)))),qo=({next:e,schema:t,optionalPropStyle:{withUndefined:r}})=>{let o=e({schema:t.unwrap()});return r?u.createUnionTypeNode([o,u.createKeywordTypeNode(f.default.SyntaxKind.UndefinedKeyword)]):o},Vo=({next:e,schema:t})=>u.createUnionTypeNode([e({schema:t.unwrap()}),u.createLiteralTypeNode(u.createNull())]),Bo=({next:e,schema:{items:t}})=>u.createTupleTypeNode(t.map(r=>e({schema:r}))),Yo=({next:e,schema:{keySchema:t,valueSchema:r}})=>u.createExpressionWithTypeArguments(u.createIdentifier("Record"),[e({schema:t}),e({schema:r})]),Jo=({next:e,schema:t})=>u.createIntersectionTypeNode([t._def.left,t._def.right].map(r=>e({schema:r}))),Qo=({next:e,schema:t})=>e({schema:t._def.innerType}),Y=e=>()=>u.createKeywordTypeNode(e),Wo=({next:e,schema:t})=>e({schema:t.unwrap()}),Xo=({next:e,schema:t})=>e({schema:t._def.innerType}),en=({next:e,schema:t})=>e({schema:t._def.innerType}),tn=({schema:e,next:t,isResponse:r})=>t({schema:e._def[r?"out":"in"]}),rn=()=>u.createLiteralTypeNode(u.createNull()),on=({getAlias:e,makeAlias:t,next:r,serializer:o,schema:n})=>{let s=`Type${o(n.schema)}`;return e(s)||(()=>(t(s,u.createLiteralTypeNode(u.createNull())),t(s,r({schema:n.schema}))))()},nn={ZodString:Y(f.default.SyntaxKind.StringKeyword),ZodNumber:Y(f.default.SyntaxKind.NumberKeyword),ZodBigInt:Y(f.default.SyntaxKind.BigIntKeyword),ZodBoolean:Y(f.default.SyntaxKind.BooleanKeyword),ZodDateIn:Y(f.default.SyntaxKind.StringKeyword),ZodDateOut:Y(f.default.SyntaxKind.StringKeyword),ZodNull:rn,ZodArray:Ko,ZodTuple:Bo,ZodRecord:Yo,ZodObject:Uo,ZodLiteral:Ho,ZodIntersection:Jo,ZodUnion:Rr,ZodFile:Y(f.default.SyntaxKind.StringKeyword),ZodAny:Y(f.default.SyntaxKind.AnyKeyword),ZodDefault:Qo,ZodEnum:Fo,ZodNativeEnum:Go,ZodEffects:_o,ZodOptional:qo,ZodNullable:Vo,ZodDiscriminatedUnion:Rr,ZodBranded:Wo,ZodCatch:en,ZodPipeline:tn,ZodLazy:on,ZodReadonly:Xo},It=({schema:e,...t})=>te({schema:e,rules:nn,onMissing:()=>u.createKeywordTypeNode(f.default.SyntaxKind.AnyKeyword),...t});var Be=class{agg=[];registry={};paths=[];aliases={};getAlias(t){return t in this.aliases?i.createTypeReferenceNode(t):void 0}makeAlias(t,r){return this.aliases[t]=Ve(r,t),this.getAlias(t)}constructor({routing:t,variant:r="client",serializer:o=Ce,optionalPropStyle:n={withQuestionMark:!0,withUndefined:!0}}){ee({routing:t,onEndpoint:(m,O,v)=>{let fe=H(O,v,"input"),Qe=H(O,v,"response"),N={serializer:o,getAlias:this.getAlias.bind(this),makeAlias:this.makeAlias.bind(this),optionalPropStyle:n},Re=It({...N,schema:m.getSchema("input"),isResponse:!1}),We=It({...N,isResponse:!0,schema:m.getSchema("positive").or(m.getSchema("negative"))});this.agg.push(Ve(Re,fe),Ve(We,Qe)),v!=="options"&&(this.paths.push(O),this.registry[`${v} ${O}`]={in:fe,out:Qe,isJson:m.getMimeTypes("positive").includes(J),tags:m.getTags()})}}),this.agg=Object.values(this.aliases).concat(this.agg);let s=Pt("Path",this.paths),a=Pt("Method",Ft),p=Ge("MethodPath",Tt([a.name,s.name])),d=[i.createHeritageClause(G.default.SyntaxKind.ExtendsKeyword,[Ot(p.name,G.default.SyntaxKind.AnyKeyword)])],c=Zt("Input",d,Object.keys(this.registry).map(m=>bt(m,this.registry[m].in))),l=Zt("Response",d,Object.keys(this.registry).map(m=>bt(m,this.registry[m].out)));if(this.agg.push(s,a,p,c,l),r==="types")return;let g=i.createVariableStatement(re,Rt("jsonEndpoints",i.createObjectLiteralExpression(Object.keys(this.registry).filter(m=>this.registry[m].isJson).map(m=>i.createPropertyAssignment(`"${m}"`,i.createTrue()))))),y=i.createVariableStatement(re,Rt("endpointTags",i.createObjectLiteralExpression(Object.keys(this.registry).map(m=>i.createPropertyAssignment(`"${m}"`,i.createArrayLiteralExpression(this.registry[m].tags.map(O=>i.createStringLiteral(O)))))))),S=Ge("Provider",i.createFunctionTypeNode(Tr({M:a.name,P:s.name}),_e({method:i.createTypeReferenceNode("M"),path:i.createTypeReferenceNode("P"),params:i.createIndexedAccessTypeNode(i.createTypeReferenceNode(c.name),St)}),hr(l.name,St))),I=Ge("Implementation",i.createFunctionTypeNode(void 0,_e({method:i.createTypeReferenceNode(a.name),path:i.createKeywordTypeNode(G.default.SyntaxKind.StringKeyword),params:Ot(G.default.SyntaxKind.StringKeyword,G.default.SyntaxKind.AnyKeyword)}),xr())),h=i.createTemplateExpression(i.createTemplateHead(":"),[i.createTemplateSpan(i.createIdentifier("key"),i.createTemplateTail(""))]),z=gr("ExpressZodAPIClient",fr([$e("implementation",i.createTypeReferenceNode(I.name),ur)]),[yr("provide",i.createTypeReferenceNode(S.name),Sr(["method","path","params"],[i.createIdentifier("method"),Et("params",i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("acc"),"replace"),void 0,[h,i.createElementAccessExpression(i.createIdentifier("params"),i.createIdentifier("key"))]),i.createIdentifier("path")),Et("params",i.createConditionalExpression(i.createBinaryExpression(i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("path"),"indexOf"),void 0,[h]),G.default.SyntaxKind.GreaterThanEqualsToken,i.createNumericLiteral(0)),void 0,i.createIdentifier("acc"),void 0,i.createObjectLiteralExpression([i.createSpreadAssignment(i.createIdentifier("acc")),i.createPropertyAssignment(i.createComputedPropertyName(i.createIdentifier("key")),i.createElementAccessExpression(i.createIdentifier("params"),i.createIdentifier("key")))])),i.createObjectLiteralExpression())]))]);G.default.addSyntheticLeadingComment(z,G.default.SyntaxKind.MultiLineCommentTrivia,`
|
|
35
35
|
export const exampleImplementation: Implementation = async (
|
|
36
36
|
method,
|
|
37
37
|
path,
|
package/dist/index.mjs
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 Qe=({app:e,logger:t,config:r,routing:o})=>{r.startupLogo!==!1&&console.log(It()),G({routing:o,hasCors:!!r.cors,onEndpoint:(n,s,a)=>{e[a](s,async(p,d)=>{t.info(`${p.method}: ${s}`),await n.execute({request:p,response:d,logger:t,config:r})})},onStatic:(n,s)=>{e.use(n,s)}})};import Fr,{json as $r}from"express";import _r from"compression";import Gr from"express-fileupload";import qr from"https";import Ct from"http-errors";var Vr=(e,t)=>(r,o,n,s)=>{if(!r)return s();e.handler({error:Ct(400,Y(r).message),request:o,response:n,logger:t,input:o.body,output:null})},Nt=(e,t)=>(r,o)=>{let n=Ct(404,`Can not ${r.method} ${r.path}`);try{e.handler({request:r,response:o,logger:t,error:n,input:null,output:null})}catch(s){Re({response:o,logger:t,error:new Q(Y(s).message,n)})}},Br=(e,t)=>{let r=$e(e.logger)?Ee(e.logger):e.logger;Qe({app:e.app,routing:t,logger:r,config:e});let o=e.errorHandler||ee;return{notFoundHandler:Nt(o,r),logger:r}},Yr=(e,t)=>{let r=$e(e.logger)?Ee(e.logger):e.logger,o=Fr();o.disable("x-powered-by");let n=e.errorHandler||ee,s=e.server.compression?_r({...typeof e.server.compression=="object"?e.server.compression:{}}):void 0,a=e.server.jsonParser||$r(),p=e.server.upload?Gr({...typeof e.server.upload=="object"?e.server.upload:{},abortOnLimit:!1,parseNested:!0}):void 0,d=[].concat(s||[]).concat(a).concat(p||[]);o.use(d),o.use(Vr(n,r)),Qe({app:o,routing:t,logger:r,config:e}),o.use(Nt(n,r));let c=o.listen(e.server.listen,()=>{r.info(`Listening ${e.server.listen}`)}),l;return e.https&&(l=qr.createServer(e.https.options,o).listen(e.https.listen,()=>{r.info(`Listening ${e.https.listen}`)})),{app:o,httpServer:c,httpsServer:l,logger:r}};import{OpenApiBuilder as Lo}from"openapi3-ts/oas30";import{isReferenceObject as vt,isSchemaObject as ue}from"openapi3-ts/oas30";import{omit as me}from"ramda";import{z as x}from"zod";import{INVALID as Mt,ZodIssueCode as We,ZodParsedType as wt,ZodType as Jr,addIssueToContext as Xe}from"zod";var et=/^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(\.\d+)?)?Z?$/,Qr="ZodDateIn",Ae=class e extends Jr{_parse(t){let{status:r,ctx:o}=this._processInputParams(t);if(o.parsedType!==wt.string)return Xe(o,{code:We.invalid_type,expected:wt.string,received:o.parsedType}),Mt;et.test(o.data)||(Xe(o,{code:We.invalid_string,validation:"regex"}),r.dirty());let n=new Date(o.data);return he(n)?{status:r.value,value:n}:(Xe(o,{code:We.invalid_date}),Mt)}static create=()=>new e({typeName:Qr})};var q=({schema:e,onEach:t,rules:r,onMissing:o,...n})=>{let s="typeName"in e._def?r[e._def.typeName]:void 0,p=s?s({schema:e,...n,next:c=>q({...c,...n,onEach:t,rules:r,onMissing:o})}):o({schema:e,...n}),d=t&&t({schema:e,prev:p,...n});return d?{...p,...d}:p};var Dt=50,jt="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString",Wr={integer:0,number:0,string:"",boolean:!1,object:{},null:null,array:[]},Lt=e=>e.replace(Ue,t=>`{${t.slice(1)}}`),Xr=({schema:{_def:{innerType:e,defaultValue:t}},next:r})=>({...r({schema:e}),default:t()}),eo=({schema:{_def:{innerType:e}},next:t})=>t({schema:e}),to=()=>({format:"any"}),ro=e=>{if(e.isResponse)throw new R({message:"Please use z.upload() only for input.",...e});return{type:"string",format:"binary"}},oo=({schema:{isBinary:e,isBase64:t},...r})=>{if(!r.isResponse)throw new R({message:"Please use z.file() only within ResultHandler.",...r});return{type:"string",format:e?"binary":t?"byte":"file"}},no=({schema:{options:e},next:t})=>({oneOf:e.map(r=>t({schema:r}))}),so=({schema:{options:e,discriminator:t},next:r})=>({discriminator:{propertyName:t},oneOf:Array.from(e.values()).map(o=>r({schema:o}))}),io=({schema:{_def:{left:e,right:t}},next:r})=>({allOf:[e,t].map(o=>r({schema:o}))}),ao=({schema:e,next:t})=>t({schema:e.unwrap()}),po=({schema:e,next:t})=>t({schema:e._def.innerType}),co=({schema:e,next:t})=>({nullable:!0,...t({schema:e.unwrap()})}),zt=({schema:e})=>({type:typeof Object.values(e.enum)[0],enum:Object.values(e.enum)}),lo=({schema:{value:e}})=>({type:typeof e,enum:[e]}),mo=({schema:e,isResponse:t,...r})=>{let o=Object.keys(e.shape).filter(n=>{let s=e.shape[n];return!(t&&ie(s)?s instanceof x.ZodOptional:s.isOptional())});return{type:"object",properties:Ie({schema:e,isResponse:t,...r}),...o.length?{required:o}:{}}},uo=()=>({type:"string",nullable:!0,format:"null"}),fo=e=>{if(e.isResponse)throw new R({message:"Please use z.dateOut() for output.",...e});return{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",pattern:et.source,externalDocs:{url:jt}}},yo=e=>{if(!e.isResponse)throw new R({message:"Please use z.dateIn() for input.",...e});return{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",externalDocs:{url:jt}}},go=e=>{throw new R({message:`Using z.date() within ${e.isResponse?"output":"input"} schema is forbidden. Please use z.date${e.isResponse?"Out":"In"}() instead. Check out the documentation for details.`,...e})},ho=()=>({type:"boolean"}),xo=()=>({type:"integer",format:"bigint"}),To=({schema:{keySchema:e,valueSchema:t},...r})=>{if(e instanceof x.ZodEnum||e instanceof x.ZodNativeEnum){let o=Object.values(e.enum),n=o.reduce((s,a)=>({...s,[a]:t}),{});return{type:"object",properties:Ie({schema:x.object(n),...r}),...o.length?{required:o}:{}}}if(e instanceof x.ZodLiteral)return{type:"object",properties:Ie({schema:x.object({[e.value]:t}),...r}),required:[e.value]};if(e instanceof x.ZodUnion&&e.options.reduce((n,s)=>n&&s instanceof x.ZodLiteral,!0)){let n=e.options.reduce((s,a)=>({...s,[a.value]:t}),{});return{type:"object",properties:Ie({schema:x.object(n),...r}),required:e.options.map(s=>s.value)}}return{type:"object",additionalProperties:r.next({schema:t})}},So=({schema:{_def:e,element:t},next:r})=>({type:"array",items:r({schema:t}),...e.minLength!==null&&{minItems:e.minLength.value},...e.maxLength!==null&&{maxItems:e.maxLength.value}}),Oo=({schema:{items:e},next:t})=>{let r=e.map(o=>t({schema:o}));return{type:"array",minItems:r.length,maxItems:r.length,items:{oneOf:r,format:"tuple",...r.length>0&&{description:r.map((o,n)=>`${n}: ${ue(o)?o.type:o.$ref}`).join(", ")}}}},bo=({schema:{isEmail:e,isURL:t,minLength:r,maxLength:o,isUUID:n,isCUID:s,isCUID2:a,isULID:p,isIP:d,isEmoji:c,isDatetime:l,_def:{checks:g}}})=>{let y=g.find(h=>h.kind==="regex"),T=g.find(h=>h.kind==="datetime"),P=y?y.regex:T?T.offset?new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(([+-]\\d{2}:\\d{2})|Z)$"):new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?Z$"):void 0;return{type:"string",...l&&{format:"date-time"},...e&&{format:"email"},...t&&{format:"url"},...n&&{format:"uuid"},...s&&{format:"cuid"},...a&&{format:"cuid2"},...p&&{format:"ulid"},...d&&{format:"ip"},...c&&{format:"emoji"},...r!==null&&{minLength:r},...o!==null&&{maxLength:o},...P&&{pattern:`/${P.source}/${P.flags}`}}},Ro=({schema:e})=>{let t=e._def.checks.find(({kind:s})=>s==="min"),r=t?t.inclusive:!0,o=e._def.checks.find(({kind:s})=>s==="max"),n=o?o.inclusive:!0;return{type:e.isInt?"integer":"number",format:e.isInt?"int64":"double",minimum:e.minValue===null?e.isInt?Number.MIN_SAFE_INTEGER:Number.MIN_VALUE:e.minValue,exclusiveMinimum:!r,maximum:e.maxValue===null?e.isInt?Number.MAX_SAFE_INTEGER:Number.MAX_VALUE:e.maxValue,exclusiveMaximum:!n}},Ie=({schema:{shape:e},next:t})=>Object.keys(e).reduce((r,o)=>({...r,[o]:t({schema:e[o]})}),{}),Po=e=>{let t=Array.isArray(e.type)?e.type[0]:e.type;return Wr?.[t]},Zo=({schema:e,isResponse:t,next:r})=>{let o=r({schema:e.innerType()}),{effect:n}=e._def;if(t&&n.type==="transform"&&ue(o)){let s=Se({effect:n,sample:Po(o)});return s&&["number","string","boolean"].includes(s)?{type:s}:r({schema:x.any()})}if(!t&&n.type==="preprocess"&&ue(o)){let{type:s,...a}=o;return{...a,format:`${a.format||s} (preprocessed)`}}return o},Eo=({schema:e,isResponse:t,next:r})=>r({schema:e._def[t?"out":"in"]}),Ao=({schema:e,next:t})=>t({schema:e.unwrap()}),Io=({next:e,schema:t,serializer:r,getRef:o,makeRef:n})=>{let s=r(t.schema);return o(s)||(()=>(n(s,{}),n(s,e({schema:t.schema}))))()},kt=(e,t,r=[])=>{let o=j({schema:e,variant:t?"parsed":"original",validate:!0});return o.length===0?{}:{examples:o.reduce((n,s,a)=>({...n,[`example${a+1}`]:{value:typeof s=="object"&&!Array.isArray(s)?me(r,s):s}}),{})}},Co=(e,t,r)=>{let o=j({schema:e,variant:t?"parsed":"original",validate:!0});return o.length===0?{}:{examples:o.reduce((n,s,a)=>r in s?{...n,[`example${a+1}`]:{value:s[r]}}:n,{})}},le=(e,t)=>{if(e instanceof x.ZodObject)return e;let r;if(e instanceof x.ZodUnion||e instanceof x.ZodDiscriminatedUnion)r=Array.from(e.options.values()).map(o=>le(o,t)).reduce((o,n)=>o.merge(n.partial()),x.object({}));else if(e instanceof x.ZodEffects){if(z(e))throw new R({message:`Using transformations on the top level of ${t.isResponse?"response":"input"} schema is not allowed.`,...t});r=le(e._def.schema,t)}else r=le(e._def.left,t).merge(le(e._def.right,t));return ye(e,r)},Ht=({path:e,method:t,endpoint:r,inputSources:o,serializer:n,getRef:s,makeRef:a,composition:p,clue:d="parameter"})=>{let c=r.getSchema("input"),l=le(c,{path:e,method:t,isResponse:!1}).shape,g=Ge(e),y=o.includes("query"),T=o.includes("params"),P=o.includes("headers"),h=m=>T&&g.includes(m),I=m=>P&&Fe(m);return Object.keys(l).filter(m=>y||h(m)).map(m=>{let S=q({schema:l[m],isResponse:!1,rules:rt,onEach:ot,onMissing:nt,serializer:n,getRef:s,makeRef:a,path:e,method:t}),C=p==="components"?a(N(e,t,`${d} ${m}`),S):S;return{name:m,in:h(m)?"path":I(m)?"header":"query",required:!l[m].isOptional(),description:ue(S)&&S.description||`${t.toUpperCase()} ${e} ${d}`,schema:C,...Co(c,!1,m)}})},rt={ZodString:bo,ZodNumber:Ro,ZodBigInt:xo,ZodBoolean:ho,ZodDateIn:fo,ZodDateOut:yo,ZodNull:uo,ZodArray:So,ZodTuple:Oo,ZodRecord:To,ZodObject:mo,ZodLiteral:lo,ZodIntersection:io,ZodUnion:no,ZodFile:oo,ZodUpload:ro,ZodAny:to,ZodDefault:Xr,ZodEnum:zt,ZodNativeEnum:zt,ZodEffects:Zo,ZodOptional:ao,ZodNullable:co,ZodDiscriminatedUnion:so,ZodBranded:Ao,ZodDate:go,ZodCatch:eo,ZodPipeline:Eo,ZodLazy:Io,ZodReadonly:po},ot=({schema:e,isResponse:t,prev:r})=>{if(vt(r))return{};let{description:o}=e,n=e instanceof x.ZodLazy,s=r.type!==void 0,a=t&&ie(e),p=!n&&s&&!a&&e.isNullable(),d=n?[]:j({schema:e,variant:t?"parsed":"original",validate:!0});return{...o&&{description:o},...p&&{nullable:!0},...d.length>0&&{example:d[0]}}},nt=({schema:e,...t})=>{throw new R({message:`Zod type ${e.constructor.name} is unsupported.`,...t})},tt=(e,t)=>{if(vt(e))return e;let r=e.properties?me(t,e.properties):void 0,o=e.example?me(t,e.example):void 0,n=e.required?e.required.filter(p=>!t.includes(p)):void 0,s=e.allOf?e.allOf.map(p=>tt(p,t)):void 0,a=e.oneOf?e.oneOf.map(p=>tt(p,t)):void 0;return me(Object.entries({properties:r,required:n,example:o,allOf:s,oneOf:a}).filter(([{},p])=>p===void 0).map(([p])=>p),{...e,properties:r,required:n,example:o,allOf:s,oneOf:a})},Ut=e=>ue(e)?me(["example"],e):e,st=({method:e,path:t,endpoint:r,isPositive:o,serializer:n,getRef:s,makeRef:a,composition:p,clue:d="response"})=>{let c=r.getSchema(o?"positive":"negative"),l=r.getMimeTypes(o?"positive":"negative"),g=Ut(q({schema:c,isResponse:!0,rules:rt,onEach:ot,onMissing:nt,serializer:n,getRef:s,makeRef:a,path:t,method:e})),y=kt(c,!0),T=p==="components"?a(N(t,e,d),g):g;return{description:`${e.toUpperCase()} ${t} ${d}`,content:l.reduce((P,h)=>({...P,[h]:{schema:T,...y}}),{})}},No=()=>({type:"http",scheme:"basic"}),Mo=({format:e})=>({type:"http",scheme:"bearer",...e&&{bearerFormat:e}}),wo=({name:e})=>({type:"apiKey",in:"query",name:e}),Do=({name:e})=>({type:"apiKey",in:"header",name:e}),zo=({name:e})=>({type:"apiKey",in:"cookie",name:e}),vo=({url:e})=>({type:"openIdConnect",openIdConnectUrl:e}),jo=({flows:e={}})=>({type:"oauth2",flows:Object.keys(e).reduce((t,r)=>{let o=e[r];if(!o)return t;let{scopes:n={},...s}=o;return{...t,[r]:{...s,scopes:n}}},{})}),Kt=e=>{let t={basic:No,bearer:Mo,input:wo,header:Do,cookie:zo,openid:vo,oauth2:jo};return be(e,r=>t[r.type](r))},Ce=e=>{if(typeof e=="object"){if("or"in e)return e.or.map(t=>("and"in t?t.and:[t]).reduce((r,{name:o,scopes:n})=>({...r,[o]:n}),{}));if("and"in e)return Ce(Ve(e))}return Ce({or:[e]})},Ft=({method:e,path:t,endpoint:r,serializer:o,getRef:n,makeRef:s,composition:a,clue:p="request body"})=>{let d=Ge(t),c=Ut(tt(q({schema:r.getSchema("input"),isResponse:!1,rules:rt,onEach:ot,onMissing:nt,serializer:o,getRef:n,makeRef:s,path:t,method:e}),d)),l=kt(r.getSchema("input"),!1,d),g=a==="components"?s(N(t,e,p),c):c;return{description:`${e.toUpperCase()} ${t} ${p}`,content:r.getMimeTypes("input").reduce((y,T)=>({...y,[T]:{schema:g,...l}}),{})}},$t=e=>Object.keys(e).map(t=>{let r=e[t];return{name:t,description:typeof r=="string"?r:r.description,...typeof r=="object"&&r.url&&{externalDocs:{url:r.url}}}}),it=e=>e.length<=Dt?e:e.slice(0,Dt-1)+"\u2026";var at=class extends Lo{lastSecuritySchemaIds={};lastOperationIdSuffixes={};makeRef(t,r){return this.addSchema(t,r),this.getRef(t)}getRef(t){return t in(this.rootDoc.components?.schemas||{})?{$ref:`#/components/schemas/${t}`}:void 0}ensureUniqOperationId(t,r,o){if(o){if(o in this.lastOperationIdSuffixes)throw new R({message:`Duplicated operationId: "${o}"`,method:r,isResponse:!1,path:t});return this.lastOperationIdSuffixes[o]=1,o}let n=N(t,r);return n in this.lastOperationIdSuffixes?(this.lastOperationIdSuffixes[n]++,`${n}${this.lastOperationIdSuffixes[n]}`):(this.lastOperationIdSuffixes[n]=1,n)}ensureUniqSecuritySchemaName(t){let r=JSON.stringify(t);for(let o in this.rootDoc.components?.securitySchemes||{})if(r===JSON.stringify(this.rootDoc.components?.securitySchemes?.[o]))return o;return this.lastSecuritySchemaIds[t.type]=(this.lastSecuritySchemaIds?.[t.type]||0)+1,`${t.type.toUpperCase()}_${this.lastSecuritySchemaIds[t.type]}`}constructor({routing:t,config:r,title:o,version:n,serverUrl:s,successfulResponseDescription:a="Successful response",errorResponseDescription:p="Error response",hasSummaryFromDescription:d=!0,composition:c="inline",serializer:l=Te}){super(),this.addInfo({title:o,version:n}).addServer({url:s}),G({routing:t,onEndpoint:(y,T,P)=>{let h=P,I={path:T,method:h,endpoint:y,composition:c,serializer:l,getRef:this.getRef.bind(this),makeRef:this.makeRef.bind(this)},[m,S]=["short","long"].map(y.getDescription.bind(y)),C=r.inputSources?.[h]||ge[h],re=Ht({...I,inputSources:C}),Z={operationId:this.ensureUniqOperationId(T,h,y.getOperationId(h)),responses:{[y.getStatusCode("positive")]:st({...I,clue:a,isPositive:!0}),[y.getStatusCode("negative")]:st({...I,clue:p,isPositive:!1})}};S&&(Z.description=S,d&&m===void 0&&(Z.summary=it(S))),m&&(Z.summary=it(m)),y.getTags().length>0&&(Z.tags=y.getTags()),re.length>0&&(Z.parameters=re),C.includes("body")&&(Z.requestBody=Ft(I));let fe=Ce(be(Kt(y.getSecurity()),He=>{let Tt=this.ensureUniqSecuritySchemaName(He),cr=["oauth2","openIdConnect"].includes(He.type)?y.getScopes():[];return this.addSecurityScheme(Tt,He),{name:Tt,scopes:cr}}));fe.length>0&&(Z.security=fe);let ke=Lt(T);this.addPath(ke,{[h]:Z})}}),this.rootDoc.tags=r.tags?$t(r.tags):[]}};import _t from"http";var ko=e=>({method:"GET",header:jest.fn(()=>$),...e}),Ho=e=>{let t={writableEnded:!1,statusCode:200,statusMessage:_t.STATUS_CODES[200],set:jest.fn(()=>t),setHeader:jest.fn(()=>t),header:jest.fn(()=>t),status:jest.fn(r=>(t.statusCode=r,t.statusMessage=_t.STATUS_CODES[r],t)),json:jest.fn(()=>t),send:jest.fn(()=>t),end:jest.fn(()=>(t.writableEnded=!0,t)),...e};return t},Uo=async({endpoint:e,requestProps:t,responseProps:r,configProps:o,loggerProps:n,__noJest:s})=>{if(!jest||s)throw new Error("You need to install Jest in order to use testEndpoint().");let a=ko(t),p=Ho(r),d={info:jest.fn(),warn:jest.fn(),error:jest.fn(),debug:jest.fn(),...n},c={cors:!1,logger:d,...o};return await e.execute({request:a,response:p,config:c,logger:d}),{requestMock:a,responseMock:p,loggerMock:d}};import F from"typescript";import w from"typescript";var i=w.factory,V=[i.createModifier(w.SyntaxKind.ExportKeyword)],Ko=[i.createModifier(w.SyntaxKind.AsyncKeyword)],Fo=[i.createModifier(w.SyntaxKind.PublicKeyword),i.createModifier(w.SyntaxKind.ReadonlyKeyword)],Gt=[i.createModifier(w.SyntaxKind.ProtectedKeyword),i.createModifier(w.SyntaxKind.ReadonlyKeyword)],$o=i.createTemplateHead(""),_o=i.createTemplateTail(""),Go=i.createTemplateMiddle(" "),dt=e=>i.createTemplateLiteralType($o,e.map((t,r)=>i.createTemplateLiteralTypeSpan(i.createTypeReferenceNode(t),r===e.length-1?_o:Go))),pt=dt(["M","P"]),Ne=(e,t,r)=>i.createParameterDeclaration(r,void 0,e,void 0,t,void 0),Me=(e,t)=>Object.keys(e).reduce((r,o)=>r.concat(Ne(o,e[o],t)),[]),ct=(e,t)=>i.createExpressionWithTypeArguments(i.createIdentifier("Record"),[typeof e=="number"?i.createKeywordTypeNode(e):i.createTypeReferenceNode(e),i.createKeywordTypeNode(t)]),qt=e=>i.createConstructorDeclaration(void 0,e,i.createBlock([])),lt=(e,t)=>i.createPropertySignature(void 0,`"${e}"`,void 0,i.createTypeReferenceNode(t)),mt=(e,t)=>i.createVariableDeclarationList([i.createVariableDeclaration(e,void 0,void 0,t)],w.NodeFlags.Const),ut=(e,t)=>i.createTypeAliasDeclaration(V,e,void 0,i.createUnionTypeNode(t.map(r=>i.createLiteralTypeNode(i.createStringLiteral(r))))),we=(e,t)=>i.createTypeAliasDeclaration(V,e,void 0,t),Vt=(e,t,r)=>i.createPropertyDeclaration(Fo,e,void 0,t,r),Bt=(e,t,r=[])=>i.createClassDeclaration(V,e,void 0,void 0,[t,...r]),Yt=(e,t)=>i.createTypeReferenceNode("Promise",[i.createIndexedAccessTypeNode(i.createTypeReferenceNode(e),t)]),Jt=()=>i.createTypeReferenceNode("Promise",[i.createKeywordTypeNode(w.SyntaxKind.AnyKeyword)]),ft=(e,t,r)=>i.createInterfaceDeclaration(V,e,void 0,t,r),Qt=e=>Object.keys(e).reduce((t,r)=>t.concat(i.createTypeParameterDeclaration([],r,i.createTypeReferenceNode(e[r]))),[]),Wt=(e,t)=>i.createArrowFunction(Ko,void 0,e.map(r=>Ne(r)),void 0,void 0,i.createCallExpression(i.createPropertyAccessExpression(i.createThis(),"implementation"),void 0,t)),yt=(e,t,r)=>i.createCallExpression(i.createPropertyAccessExpression(i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("Object"),"keys"),void 0,[i.createIdentifier(e)]),"reduce"),void 0,[i.createArrowFunction(void 0,void 0,Me({acc:void 0,key:void 0}),void 0,void 0,t),r]);import f from"typescript";import{z as Vo}from"zod";import U from"typescript";var{factory:De}=U,gt=(e,t)=>{U.addSyntheticLeadingComment(e,U.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0)},ze=(e,t,r)=>{let o=De.createTypeAliasDeclaration(void 0,De.createIdentifier(t),void 0,e);return r&>(o,r),o},Xt=(e,t)=>{let r=U.createSourceFile("print.ts","",U.ScriptTarget.Latest,!1,U.ScriptKind.TS);return U.createPrinter(t).printNode(U.EmitHint.Unspecified,e,r)},qo=/^[A-Za-z_$][A-Za-z0-9_$]*$/,er=e=>qo.test(e)?De.createIdentifier(e):De.createStringLiteral(e);var{factory:u}=f,Bo={[f.SyntaxKind.AnyKeyword]:"",[f.SyntaxKind.BigIntKeyword]:BigInt(0),[f.SyntaxKind.BooleanKeyword]:!1,[f.SyntaxKind.NumberKeyword]:0,[f.SyntaxKind.ObjectKeyword]:{},[f.SyntaxKind.StringKeyword]:"",[f.SyntaxKind.UndefinedKeyword]:void 0},Yo=({schema:{value:e}})=>u.createLiteralTypeNode(typeof e=="number"?u.createNumericLiteral(e):typeof e=="boolean"?e?u.createTrue():u.createFalse():u.createStringLiteral(e)),Jo=({schema:{shape:e},isResponse:t,next:r,optionalPropStyle:{withQuestionMark:o}})=>{let n=Object.entries(e).map(([s,a])=>{let p=t&&ie(a)?a instanceof Vo.ZodOptional:a.isOptional(),d=u.createPropertySignature(void 0,er(s),p&&o?u.createToken(f.SyntaxKind.QuestionToken):void 0,r({schema:a}));return a.description&>(d,a.description),d});return u.createTypeLiteralNode(n)},Qo=({schema:{element:e},next:t})=>u.createArrayTypeNode(t({schema:e})),Wo=({schema:{options:e}})=>u.createUnionTypeNode(e.map(t=>u.createLiteralTypeNode(u.createStringLiteral(t)))),tr=({schema:{options:e},next:t})=>u.createUnionTypeNode(e.map(r=>t({schema:r}))),Xo=e=>Bo?.[e.kind],en=({schema:e,next:t,isResponse:r})=>{let o=t({schema:e.innerType()}),n=e._def.effect;if(r&&n.type==="transform"){let s=Se({effect:n,sample:Xo(o)}),a={number:f.SyntaxKind.NumberKeyword,bigint:f.SyntaxKind.BigIntKeyword,boolean:f.SyntaxKind.BooleanKeyword,string:f.SyntaxKind.StringKeyword,undefined:f.SyntaxKind.UndefinedKeyword,object:f.SyntaxKind.ObjectKeyword};return u.createKeywordTypeNode(s&&a[s]||f.SyntaxKind.AnyKeyword)}return o},tn=({schema:e})=>u.createUnionTypeNode(Object.values(e.enum).map(t=>u.createLiteralTypeNode(typeof t=="number"?u.createNumericLiteral(t):u.createStringLiteral(t)))),rn=({next:e,schema:t,optionalPropStyle:{withUndefined:r}})=>{let o=e({schema:t.unwrap()});return r?u.createUnionTypeNode([o,u.createKeywordTypeNode(f.SyntaxKind.UndefinedKeyword)]):o},on=({next:e,schema:t})=>u.createUnionTypeNode([e({schema:t.unwrap()}),u.createLiteralTypeNode(u.createNull())]),nn=({next:e,schema:{items:t}})=>u.createTupleTypeNode(t.map(r=>e({schema:r}))),sn=({next:e,schema:{keySchema:t,valueSchema:r}})=>u.createExpressionWithTypeArguments(u.createIdentifier("Record"),[e({schema:t}),e({schema:r})]),an=({next:e,schema:t})=>u.createIntersectionTypeNode([t._def.left,t._def.right].map(r=>e({schema:r}))),dn=({next:e,schema:t})=>e({schema:t._def.innerType}),K=e=>()=>u.createKeywordTypeNode(e),pn=({next:e,schema:t})=>e({schema:t.unwrap()}),cn=({next:e,schema:t})=>e({schema:t._def.innerType}),ln=({next:e,schema:t})=>e({schema:t._def.innerType}),mn=({schema:e,next:t,isResponse:r})=>t({schema:e._def[r?"out":"in"]}),un=()=>u.createLiteralTypeNode(u.createNull()),fn=({getAlias:e,makeAlias:t,next:r,serializer:o,schema:n})=>{let s=`Type${o(n.schema)}`;return e(s)||(()=>(t(s,u.createLiteralTypeNode(u.createNull())),t(s,r({schema:n.schema}))))()},yn={ZodString:K(f.SyntaxKind.StringKeyword),ZodNumber:K(f.SyntaxKind.NumberKeyword),ZodBigInt:K(f.SyntaxKind.BigIntKeyword),ZodBoolean:K(f.SyntaxKind.BooleanKeyword),ZodDateIn:K(f.SyntaxKind.StringKeyword),ZodDateOut:K(f.SyntaxKind.StringKeyword),ZodNull:un,ZodArray:Qo,ZodTuple:nn,ZodRecord:sn,ZodObject:Jo,ZodLiteral:Yo,ZodIntersection:an,ZodUnion:tr,ZodFile:K(f.SyntaxKind.StringKeyword),ZodAny:K(f.SyntaxKind.AnyKeyword),ZodDefault:dn,ZodEnum:Wo,ZodNativeEnum:tn,ZodEffects:en,ZodOptional:rn,ZodNullable:on,ZodDiscriminatedUnion:tr,ZodBranded:pn,ZodCatch:ln,ZodPipeline:mn,ZodLazy:fn,ZodReadonly:cn},ht=({schema:e,...t})=>q({schema:e,rules:yn,onMissing:()=>u.createKeywordTypeNode(f.SyntaxKind.AnyKeyword),...t});var xt=class{agg=[];registry={};paths=[];aliases={};getAlias(t){return t in this.aliases?i.createTypeReferenceNode(t):void 0}makeAlias(t,r){return this.aliases[t]=ze(r,t),this.getAlias(t)}constructor({routing:t,variant:r="client",serializer:o=Te,optionalPropStyle:n={withQuestionMark:!0,withUndefined:!0}}){G({routing:t,onEndpoint:(m,S,C)=>{let re=N(S,C,"input"),Le=N(S,C,"response"),Z={serializer:o,getAlias:this.getAlias.bind(this),makeAlias:this.makeAlias.bind(this),optionalPropStyle:n},fe=ht({...Z,schema:m.getSchema("input"),isResponse:!1}),ke=ht({...Z,isResponse:!0,schema:m.getSchema("positive").or(m.getSchema("negative"))});this.agg.push(ze(fe,re),ze(ke,Le)),C!=="options"&&(this.paths.push(S),this.registry[`${C} ${S}`]={in:re,out:Le,isJson:m.getMimeTypes("positive").includes($),tags:m.getTags()})}}),this.agg=Object.values(this.aliases).concat(this.agg);let s=ut("Path",this.paths),a=ut("Method",Zt),p=we("MethodPath",dt([a.name,s.name])),d=[i.createHeritageClause(F.SyntaxKind.ExtendsKeyword,[ct(p.name,F.SyntaxKind.AnyKeyword)])],c=ft("Input",d,Object.keys(this.registry).map(m=>lt(m,this.registry[m].in))),l=ft("Response",d,Object.keys(this.registry).map(m=>lt(m,this.registry[m].out)));if(this.agg.push(s,a,p,c,l),r==="types")return;let g=i.createVariableStatement(V,mt("jsonEndpoints",i.createObjectLiteralExpression(Object.keys(this.registry).filter(m=>this.registry[m].isJson).map(m=>i.createPropertyAssignment(`"${m}"`,i.createTrue()))))),y=i.createVariableStatement(V,mt("endpointTags",i.createObjectLiteralExpression(Object.keys(this.registry).map(m=>i.createPropertyAssignment(`"${m}"`,i.createArrayLiteralExpression(this.registry[m].tags.map(S=>i.createStringLiteral(S)))))))),T=we("Provider",i.createFunctionTypeNode(Qt({M:a.name,P:s.name}),Me({method:i.createTypeReferenceNode("M"),path:i.createTypeReferenceNode("P"),params:i.createIndexedAccessTypeNode(i.createTypeReferenceNode(c.name),pt)}),Yt(l.name,pt))),P=we("Implementation",i.createFunctionTypeNode(void 0,Me({method:i.createTypeReferenceNode(a.name),path:i.createKeywordTypeNode(F.SyntaxKind.StringKeyword),params:ct(F.SyntaxKind.StringKeyword,F.SyntaxKind.AnyKeyword)}),Jt())),h=i.createTemplateExpression(i.createTemplateHead(":"),[i.createTemplateSpan(i.createIdentifier("key"),i.createTemplateTail(""))]),I=Bt("ExpressZodAPIClient",qt([Ne("implementation",i.createTypeReferenceNode(P.name),Gt)]),[Vt("provide",i.createTypeReferenceNode(T.name),Wt(["method","path","params"],[i.createIdentifier("method"),yt("params",i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("acc"),"replace"),void 0,[h,i.createElementAccessExpression(i.createIdentifier("params"),i.createIdentifier("key"))]),i.createIdentifier("path")),yt("params",i.createConditionalExpression(i.createBinaryExpression(i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("path"),"indexOf"),void 0,[h]),F.SyntaxKind.GreaterThanEqualsToken,i.createNumericLiteral(0)),void 0,i.createIdentifier("acc"),void 0,i.createObjectLiteralExpression([i.createSpreadAssignment(i.createIdentifier("acc")),i.createPropertyAssignment(i.createComputedPropertyName(i.createIdentifier("key")),i.createElementAccessExpression(i.createIdentifier("params"),i.createIdentifier("key")))])),i.createObjectLiteralExpression())]))]);F.addSyntheticLeadingComment(I,F.SyntaxKind.MultiLineCommentTrivia,`
|
|
34
|
+
`.trim();var Qe=({app:e,logger:t,config:r,routing:o})=>{r.startupLogo!==!1&&console.log(It()),G({routing:o,hasCors:!!r.cors,onEndpoint:(n,s,a)=>{e[a](s,async(p,d)=>{t.info(`${p.method}: ${s}`),await n.execute({request:p,response:d,logger:t,config:r})})},onStatic:(n,s)=>{e.use(n,s)}})};import Fr,{json as $r}from"express";import _r from"compression";import Gr from"express-fileupload";import qr from"https";import Ct from"http-errors";var Vr=(e,t)=>(r,o,n,s)=>{if(!r)return s();e.handler({error:Ct(400,Y(r).message),request:o,response:n,logger:t,input:o.body,output:null})},Nt=(e,t)=>(r,o)=>{let n=Ct(404,`Can not ${r.method} ${r.path}`);try{e.handler({request:r,response:o,logger:t,error:n,input:null,output:null})}catch(s){Re({response:o,logger:t,error:new Q(Y(s).message,n)})}},Br=(e,t)=>{let r=$e(e.logger)?Ee(e.logger):e.logger;Qe({app:e.app,routing:t,logger:r,config:e});let o=e.errorHandler||ee;return{notFoundHandler:Nt(o,r),logger:r}},Yr=(e,t)=>{let r=$e(e.logger)?Ee(e.logger):e.logger,o=Fr();o.disable("x-powered-by");let n=e.errorHandler||ee,s=e.server.compression?_r({...typeof e.server.compression=="object"?e.server.compression:{}}):void 0,a=e.server.jsonParser||$r(),p=e.server.upload?Gr({...typeof e.server.upload=="object"?e.server.upload:{},abortOnLimit:!1,parseNested:!0}):void 0,d=[].concat(s||[]).concat(a).concat(p||[]);o.use(d),o.use(Vr(n,r)),Qe({app:o,routing:t,logger:r,config:e}),o.use(Nt(n,r));let c=o.listen(e.server.listen,()=>{r.info(`Listening ${e.server.listen}`)}),l;return e.https&&(l=qr.createServer(e.https.options,o).listen(e.https.listen,()=>{r.info(`Listening ${e.https.listen}`)})),{app:o,httpServer:c,httpsServer:l,logger:r}};import{OpenApiBuilder as Lo}from"openapi3-ts/oas30";import{isReferenceObject as vt,isSchemaObject as ue}from"openapi3-ts/oas30";import{omit as me}from"ramda";import{z as x}from"zod";import{INVALID as Mt,ZodIssueCode as We,ZodParsedType as wt,ZodType as Jr,addIssueToContext as Xe}from"zod";var et=/^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(\.\d+)?)?Z?$/,Qr="ZodDateIn",Ae=class e extends Jr{_parse(t){let{status:r,ctx:o}=this._processInputParams(t);if(o.parsedType!==wt.string)return Xe(o,{code:We.invalid_type,expected:wt.string,received:o.parsedType}),Mt;et.test(o.data)||(Xe(o,{code:We.invalid_string,validation:"regex"}),r.dirty());let n=new Date(o.data);return he(n)?{status:r.value,value:n}:(Xe(o,{code:We.invalid_date}),Mt)}static create=()=>new e({typeName:Qr})};var q=({schema:e,onEach:t,rules:r,onMissing:o,...n})=>{let s="typeName"in e._def?r[e._def.typeName]:void 0,p=s?s({schema:e,...n,next:c=>q({...c,...n,onEach:t,rules:r,onMissing:o})}):o({schema:e,...n}),d=t&&t({schema:e,prev:p,...n});return d?{...p,...d}:p};var Dt=50,jt="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString",Wr={integer:0,number:0,string:"",boolean:!1,object:{},null:null,array:[]},Lt=e=>e.replace(Ue,t=>`{${t.slice(1)}}`),Xr=({schema:{_def:{innerType:e,defaultValue:t}},next:r})=>({...r({schema:e}),default:t()}),eo=({schema:{_def:{innerType:e}},next:t})=>t({schema:e}),to=()=>({format:"any"}),ro=e=>{if(e.isResponse)throw new R({message:"Please use z.upload() only for input.",...e});return{type:"string",format:"binary"}},oo=({schema:{isBinary:e,isBase64:t},...r})=>{if(!r.isResponse)throw new R({message:"Please use z.file() only within ResultHandler.",...r});return{type:"string",format:e?"binary":t?"byte":"file"}},no=({schema:{options:e},next:t})=>({oneOf:e.map(r=>t({schema:r}))}),so=({schema:{options:e,discriminator:t},next:r})=>({discriminator:{propertyName:t},oneOf:Array.from(e.values()).map(o=>r({schema:o}))}),io=({schema:{_def:{left:e,right:t}},next:r})=>({allOf:[e,t].map(o=>r({schema:o}))}),ao=({schema:e,next:t})=>t({schema:e.unwrap()}),po=({schema:e,next:t})=>t({schema:e._def.innerType}),co=({schema:e,next:t})=>({nullable:!0,...t({schema:e.unwrap()})}),zt=({schema:e})=>({type:typeof Object.values(e.enum)[0],enum:Object.values(e.enum)}),lo=({schema:{value:e}})=>({type:typeof e,enum:[e]}),mo=({schema:e,isResponse:t,...r})=>{let o=Object.keys(e.shape).filter(n=>{let s=e.shape[n];return!(t&&ie(s)?s instanceof x.ZodOptional:s.isOptional())});return{type:"object",properties:Ie({schema:e,isResponse:t,...r}),...o.length?{required:o}:{}}},uo=()=>({type:"string",nullable:!0,format:"null"}),fo=e=>{if(e.isResponse)throw new R({message:"Please use z.dateOut() for output.",...e});return{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",pattern:et.source,externalDocs:{url:jt}}},yo=e=>{if(!e.isResponse)throw new R({message:"Please use z.dateIn() for input.",...e});return{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",externalDocs:{url:jt}}},go=e=>{throw new R({message:`Using z.date() within ${e.isResponse?"output":"input"} schema is forbidden. Please use z.date${e.isResponse?"Out":"In"}() instead. Check out the documentation for details.`,...e})},ho=()=>({type:"boolean"}),xo=()=>({type:"integer",format:"bigint"}),To=({schema:{keySchema:e,valueSchema:t},...r})=>{if(e instanceof x.ZodEnum||e instanceof x.ZodNativeEnum){let o=Object.values(e.enum),n=o.reduce((s,a)=>({...s,[a]:t}),{});return{type:"object",properties:Ie({schema:x.object(n),...r}),...o.length?{required:o}:{}}}if(e instanceof x.ZodLiteral)return{type:"object",properties:Ie({schema:x.object({[e.value]:t}),...r}),required:[e.value]};if(e instanceof x.ZodUnion&&e.options.reduce((n,s)=>n&&s instanceof x.ZodLiteral,!0)){let n=e.options.reduce((s,a)=>({...s,[a.value]:t}),{});return{type:"object",properties:Ie({schema:x.object(n),...r}),required:e.options.map(s=>s.value)}}return{type:"object",additionalProperties:r.next({schema:t})}},So=({schema:{_def:e,element:t},next:r})=>({type:"array",items:r({schema:t}),...e.minLength!==null&&{minItems:e.minLength.value},...e.maxLength!==null&&{maxItems:e.maxLength.value}}),Oo=({schema:{items:e},next:t})=>{let r=e.map(o=>t({schema:o}));return{type:"array",minItems:r.length,maxItems:r.length,items:{oneOf:r,format:"tuple",...r.length>0&&{description:r.map((o,n)=>`${n}: ${ue(o)?o.type:o.$ref}`).join(", ")}}}},bo=({schema:{isEmail:e,isURL:t,minLength:r,maxLength:o,isUUID:n,isCUID:s,isCUID2:a,isULID:p,isIP:d,isEmoji:c,isDatetime:l,_def:{checks:g}}})=>{let y=g.find(h=>h.kind==="regex"),T=g.find(h=>h.kind==="datetime"),P=y?y.regex:T?T.offset?new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(([+-]\\d{2}:\\d{2})|Z)$"):new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?Z$"):void 0;return{type:"string",...l&&{format:"date-time"},...e&&{format:"email"},...t&&{format:"url"},...n&&{format:"uuid"},...s&&{format:"cuid"},...a&&{format:"cuid2"},...p&&{format:"ulid"},...d&&{format:"ip"},...c&&{format:"emoji"},...r!==null&&{minLength:r},...o!==null&&{maxLength:o},...P&&{pattern:`/${P.source}/${P.flags}`}}},Ro=({schema:e})=>{let t=e._def.checks.find(({kind:s})=>s==="min"),r=t?t.inclusive:!0,o=e._def.checks.find(({kind:s})=>s==="max"),n=o?o.inclusive:!0;return{type:e.isInt?"integer":"number",format:e.isInt?"int64":"double",minimum:e.minValue===null?e.isInt?Number.MIN_SAFE_INTEGER:Number.MIN_VALUE:e.minValue,exclusiveMinimum:!r,maximum:e.maxValue===null?e.isInt?Number.MAX_SAFE_INTEGER:Number.MAX_VALUE:e.maxValue,exclusiveMaximum:!n}},Ie=({schema:{shape:e},next:t})=>Object.keys(e).reduce((r,o)=>({...r,[o]:t({schema:e[o]})}),{}),Po=e=>{let t=Array.isArray(e.type)?e.type[0]:e.type;return Wr?.[t]},Zo=({schema:e,isResponse:t,next:r})=>{let o=r({schema:e.innerType()}),{effect:n}=e._def;if(t&&n.type==="transform"&&ue(o)){let s=Se({effect:n,sample:Po(o)});return s&&["number","string","boolean"].includes(s)?{type:s}:r({schema:x.any()})}if(!t&&n.type==="preprocess"&&ue(o)){let{type:s,...a}=o;return{...a,format:`${a.format||s} (preprocessed)`}}return o},Eo=({schema:e,isResponse:t,next:r})=>r({schema:e._def[t?"out":"in"]}),Ao=({schema:e,next:t})=>t({schema:e.unwrap()}),Io=({next:e,schema:t,serializer:r,getRef:o,makeRef:n})=>{let s=r(t.schema);return o(s)||(()=>(n(s,{}),n(s,e({schema:t.schema}))))()},kt=(e,t,r=[])=>{let o=j({schema:e,variant:t?"parsed":"original",validate:!0});return o.length===0?{}:{examples:o.reduce((n,s,a)=>({...n,[`example${a+1}`]:{value:typeof s=="object"&&!Array.isArray(s)?me(r,s):s}}),{})}},Co=(e,t,r)=>{let o=j({schema:e,variant:t?"parsed":"original",validate:!0});return o.length===0?{}:{examples:o.reduce((n,s,a)=>r in s?{...n,[`example${a+1}`]:{value:s[r]}}:n,{})}},le=(e,t)=>{if(e instanceof x.ZodObject)return e;let r;if(e instanceof x.ZodUnion||e instanceof x.ZodDiscriminatedUnion)r=Array.from(e.options.values()).map(o=>le(o,t)).reduce((o,n)=>o.merge(n.partial()),x.object({}));else if(e instanceof x.ZodEffects){if(z(e))throw new R({message:`Using transformations on the top level of ${t.isResponse?"response":"input"} schema is not allowed.`,...t});r=le(e._def.schema,t)}else r=le(e._def.left,t).merge(le(e._def.right,t));return ye(e,r)},Ht=({path:e,method:t,endpoint:r,inputSources:o,serializer:n,getRef:s,makeRef:a,composition:p,clue:d="parameter"})=>{let c=r.getSchema("input"),l=le(c,{path:e,method:t,isResponse:!1}).shape,g=Ge(e),y=o.includes("query"),T=o.includes("params"),P=o.includes("headers"),h=m=>T&&g.includes(m),I=m=>P&&Fe(m);return Object.keys(l).filter(m=>y||h(m)).map(m=>{let S=q({schema:l[m],isResponse:!1,rules:rt,onEach:ot,onMissing:nt,serializer:n,getRef:s,makeRef:a,path:e,method:t}),C=p==="components"?a(N(e,t,`${d} ${m}`),S):S;return{name:m,in:h(m)?"path":I(m)?"header":"query",required:!l[m].isOptional(),description:ue(S)&&S.description||`${t.toUpperCase()} ${e} ${d}`,schema:C,...Co(c,!1,m)}})},rt={ZodString:bo,ZodNumber:Ro,ZodBigInt:xo,ZodBoolean:ho,ZodDateIn:fo,ZodDateOut:yo,ZodNull:uo,ZodArray:So,ZodTuple:Oo,ZodRecord:To,ZodObject:mo,ZodLiteral:lo,ZodIntersection:io,ZodUnion:no,ZodFile:oo,ZodUpload:ro,ZodAny:to,ZodDefault:Xr,ZodEnum:zt,ZodNativeEnum:zt,ZodEffects:Zo,ZodOptional:ao,ZodNullable:co,ZodDiscriminatedUnion:so,ZodBranded:Ao,ZodDate:go,ZodCatch:eo,ZodPipeline:Eo,ZodLazy:Io,ZodReadonly:po},ot=({schema:e,isResponse:t,prev:r})=>{if(vt(r))return{};let{description:o}=e,n=e instanceof x.ZodLazy,s=r.type!==void 0,a=t&&ie(e),p=!n&&s&&!a&&e.isNullable(),d=n?[]:j({schema:e,variant:t?"parsed":"original",validate:!0});return{...o&&{description:o},...p&&{nullable:!0},...d.length>0&&{example:d[0]}}},nt=({schema:e,...t})=>{throw new R({message:`Zod type ${e.constructor.name} is unsupported.`,...t})},tt=(e,t)=>{if(vt(e))return e;let r=e.properties?me(t,e.properties):void 0,o=e.example?me(t,e.example):void 0,n=e.required?e.required.filter(p=>!t.includes(p)):void 0,s=e.allOf?e.allOf.map(p=>tt(p,t)):void 0,a=e.oneOf?e.oneOf.map(p=>tt(p,t)):void 0;return me(Object.entries({properties:r,required:n,example:o,allOf:s,oneOf:a}).filter(([{},p])=>p===void 0).map(([p])=>p),{...e,properties:r,required:n,example:o,allOf:s,oneOf:a})},Ut=e=>ue(e)?me(["example"],e):e,st=({method:e,path:t,endpoint:r,isPositive:o,serializer:n,getRef:s,makeRef:a,composition:p,clue:d="response"})=>{let c=r.getSchema(o?"positive":"negative"),l=r.getMimeTypes(o?"positive":"negative"),g=Ut(q({schema:c,isResponse:!0,rules:rt,onEach:ot,onMissing:nt,serializer:n,getRef:s,makeRef:a,path:t,method:e})),y=kt(c,!0),T=p==="components"?a(N(t,e,d),g):g;return{description:`${e.toUpperCase()} ${t} ${d}`,content:l.reduce((P,h)=>({...P,[h]:{schema:T,...y}}),{})}},No=()=>({type:"http",scheme:"basic"}),Mo=({format:e})=>({type:"http",scheme:"bearer",...e&&{bearerFormat:e}}),wo=({name:e})=>({type:"apiKey",in:"query",name:e}),Do=({name:e})=>({type:"apiKey",in:"header",name:e}),zo=({name:e})=>({type:"apiKey",in:"cookie",name:e}),vo=({url:e})=>({type:"openIdConnect",openIdConnectUrl:e}),jo=({flows:e={}})=>({type:"oauth2",flows:Object.keys(e).reduce((t,r)=>{let o=e[r];if(!o)return t;let{scopes:n={},...s}=o;return{...t,[r]:{...s,scopes:n}}},{})}),Kt=e=>{let t={basic:No,bearer:Mo,input:wo,header:Do,cookie:zo,openid:vo,oauth2:jo};return be(e,r=>t[r.type](r))},Ce=e=>{if(typeof e=="object"){if("or"in e)return e.or.map(t=>("and"in t?t.and:[t]).reduce((r,{name:o,scopes:n})=>({...r,[o]:n}),{}));if("and"in e)return Ce(Ve(e))}return Ce({or:[e]})},Ft=({method:e,path:t,endpoint:r,serializer:o,getRef:n,makeRef:s,composition:a,clue:p="request body"})=>{let d=Ge(t),c=Ut(tt(q({schema:r.getSchema("input"),isResponse:!1,rules:rt,onEach:ot,onMissing:nt,serializer:o,getRef:n,makeRef:s,path:t,method:e}),d)),l=kt(r.getSchema("input"),!1,d),g=a==="components"?s(N(t,e,p),c):c;return{description:`${e.toUpperCase()} ${t} ${p}`,content:r.getMimeTypes("input").reduce((y,T)=>({...y,[T]:{schema:g,...l}}),{})}},$t=e=>Object.keys(e).map(t=>{let r=e[t];return{name:t,description:typeof r=="string"?r:r.description,...typeof r=="object"&&r.url&&{externalDocs:{url:r.url}}}}),it=e=>e.length<=Dt?e:e.slice(0,Dt-1)+"\u2026";var at=class extends Lo{lastSecuritySchemaIds={};lastOperationIdSuffixes={};makeRef(t,r){return this.addSchema(t,r),this.getRef(t)}getRef(t){return t in(this.rootDoc.components?.schemas||{})?{$ref:`#/components/schemas/${t}`}:void 0}ensureUniqOperationId(t,r,o){if(o){if(o in this.lastOperationIdSuffixes)throw new R({message:`Duplicated operationId: "${o}"`,method:r,isResponse:!1,path:t});return this.lastOperationIdSuffixes[o]=1,o}let n=N(t,r);return n in this.lastOperationIdSuffixes?(this.lastOperationIdSuffixes[n]++,`${n}${this.lastOperationIdSuffixes[n]}`):(this.lastOperationIdSuffixes[n]=1,n)}ensureUniqSecuritySchemaName(t){let r=JSON.stringify(t);for(let o in this.rootDoc.components?.securitySchemes||{})if(r===JSON.stringify(this.rootDoc.components?.securitySchemes?.[o]))return o;return this.lastSecuritySchemaIds[t.type]=(this.lastSecuritySchemaIds?.[t.type]||0)+1,`${t.type.toUpperCase()}_${this.lastSecuritySchemaIds[t.type]}`}constructor({routing:t,config:r,title:o,version:n,serverUrl:s,successfulResponseDescription:a="Successful response",errorResponseDescription:p="Error response",hasSummaryFromDescription:d=!0,composition:c="inline",serializer:l=Te}){super(),this.addInfo({title:o,version:n});for(let y of typeof s=="string"?[s]:s)this.addServer({url:y});G({routing:t,onEndpoint:(y,T,P)=>{let h=P,I={path:T,method:h,endpoint:y,composition:c,serializer:l,getRef:this.getRef.bind(this),makeRef:this.makeRef.bind(this)},[m,S]=["short","long"].map(y.getDescription.bind(y)),C=r.inputSources?.[h]||ge[h],re=Ht({...I,inputSources:C}),Z={operationId:this.ensureUniqOperationId(T,h,y.getOperationId(h)),responses:{[y.getStatusCode("positive")]:st({...I,clue:a,isPositive:!0}),[y.getStatusCode("negative")]:st({...I,clue:p,isPositive:!1})}};S&&(Z.description=S,d&&m===void 0&&(Z.summary=it(S))),m&&(Z.summary=it(m)),y.getTags().length>0&&(Z.tags=y.getTags()),re.length>0&&(Z.parameters=re),C.includes("body")&&(Z.requestBody=Ft(I));let fe=Ce(be(Kt(y.getSecurity()),He=>{let Tt=this.ensureUniqSecuritySchemaName(He),cr=["oauth2","openIdConnect"].includes(He.type)?y.getScopes():[];return this.addSecurityScheme(Tt,He),{name:Tt,scopes:cr}}));fe.length>0&&(Z.security=fe);let ke=Lt(T);this.addPath(ke,{[h]:Z})}}),this.rootDoc.tags=r.tags?$t(r.tags):[]}};import _t from"http";var ko=e=>({method:"GET",header:jest.fn(()=>$),...e}),Ho=e=>{let t={writableEnded:!1,statusCode:200,statusMessage:_t.STATUS_CODES[200],set:jest.fn(()=>t),setHeader:jest.fn(()=>t),header:jest.fn(()=>t),status:jest.fn(r=>(t.statusCode=r,t.statusMessage=_t.STATUS_CODES[r],t)),json:jest.fn(()=>t),send:jest.fn(()=>t),end:jest.fn(()=>(t.writableEnded=!0,t)),...e};return t},Uo=async({endpoint:e,requestProps:t,responseProps:r,configProps:o,loggerProps:n,__noJest:s})=>{if(!jest||s)throw new Error("You need to install Jest in order to use testEndpoint().");let a=ko(t),p=Ho(r),d={info:jest.fn(),warn:jest.fn(),error:jest.fn(),debug:jest.fn(),...n},c={cors:!1,logger:d,...o};return await e.execute({request:a,response:p,config:c,logger:d}),{requestMock:a,responseMock:p,loggerMock:d}};import F from"typescript";import w from"typescript";var i=w.factory,V=[i.createModifier(w.SyntaxKind.ExportKeyword)],Ko=[i.createModifier(w.SyntaxKind.AsyncKeyword)],Fo=[i.createModifier(w.SyntaxKind.PublicKeyword),i.createModifier(w.SyntaxKind.ReadonlyKeyword)],Gt=[i.createModifier(w.SyntaxKind.ProtectedKeyword),i.createModifier(w.SyntaxKind.ReadonlyKeyword)],$o=i.createTemplateHead(""),_o=i.createTemplateTail(""),Go=i.createTemplateMiddle(" "),dt=e=>i.createTemplateLiteralType($o,e.map((t,r)=>i.createTemplateLiteralTypeSpan(i.createTypeReferenceNode(t),r===e.length-1?_o:Go))),pt=dt(["M","P"]),Ne=(e,t,r)=>i.createParameterDeclaration(r,void 0,e,void 0,t,void 0),Me=(e,t)=>Object.keys(e).reduce((r,o)=>r.concat(Ne(o,e[o],t)),[]),ct=(e,t)=>i.createExpressionWithTypeArguments(i.createIdentifier("Record"),[typeof e=="number"?i.createKeywordTypeNode(e):i.createTypeReferenceNode(e),i.createKeywordTypeNode(t)]),qt=e=>i.createConstructorDeclaration(void 0,e,i.createBlock([])),lt=(e,t)=>i.createPropertySignature(void 0,`"${e}"`,void 0,i.createTypeReferenceNode(t)),mt=(e,t)=>i.createVariableDeclarationList([i.createVariableDeclaration(e,void 0,void 0,t)],w.NodeFlags.Const),ut=(e,t)=>i.createTypeAliasDeclaration(V,e,void 0,i.createUnionTypeNode(t.map(r=>i.createLiteralTypeNode(i.createStringLiteral(r))))),we=(e,t)=>i.createTypeAliasDeclaration(V,e,void 0,t),Vt=(e,t,r)=>i.createPropertyDeclaration(Fo,e,void 0,t,r),Bt=(e,t,r=[])=>i.createClassDeclaration(V,e,void 0,void 0,[t,...r]),Yt=(e,t)=>i.createTypeReferenceNode("Promise",[i.createIndexedAccessTypeNode(i.createTypeReferenceNode(e),t)]),Jt=()=>i.createTypeReferenceNode("Promise",[i.createKeywordTypeNode(w.SyntaxKind.AnyKeyword)]),ft=(e,t,r)=>i.createInterfaceDeclaration(V,e,void 0,t,r),Qt=e=>Object.keys(e).reduce((t,r)=>t.concat(i.createTypeParameterDeclaration([],r,i.createTypeReferenceNode(e[r]))),[]),Wt=(e,t)=>i.createArrowFunction(Ko,void 0,e.map(r=>Ne(r)),void 0,void 0,i.createCallExpression(i.createPropertyAccessExpression(i.createThis(),"implementation"),void 0,t)),yt=(e,t,r)=>i.createCallExpression(i.createPropertyAccessExpression(i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("Object"),"keys"),void 0,[i.createIdentifier(e)]),"reduce"),void 0,[i.createArrowFunction(void 0,void 0,Me({acc:void 0,key:void 0}),void 0,void 0,t),r]);import f from"typescript";import{z as Vo}from"zod";import U from"typescript";var{factory:De}=U,gt=(e,t)=>{U.addSyntheticLeadingComment(e,U.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0)},ze=(e,t,r)=>{let o=De.createTypeAliasDeclaration(void 0,De.createIdentifier(t),void 0,e);return r&>(o,r),o},Xt=(e,t)=>{let r=U.createSourceFile("print.ts","",U.ScriptTarget.Latest,!1,U.ScriptKind.TS);return U.createPrinter(t).printNode(U.EmitHint.Unspecified,e,r)},qo=/^[A-Za-z_$][A-Za-z0-9_$]*$/,er=e=>qo.test(e)?De.createIdentifier(e):De.createStringLiteral(e);var{factory:u}=f,Bo={[f.SyntaxKind.AnyKeyword]:"",[f.SyntaxKind.BigIntKeyword]:BigInt(0),[f.SyntaxKind.BooleanKeyword]:!1,[f.SyntaxKind.NumberKeyword]:0,[f.SyntaxKind.ObjectKeyword]:{},[f.SyntaxKind.StringKeyword]:"",[f.SyntaxKind.UndefinedKeyword]:void 0},Yo=({schema:{value:e}})=>u.createLiteralTypeNode(typeof e=="number"?u.createNumericLiteral(e):typeof e=="boolean"?e?u.createTrue():u.createFalse():u.createStringLiteral(e)),Jo=({schema:{shape:e},isResponse:t,next:r,optionalPropStyle:{withQuestionMark:o}})=>{let n=Object.entries(e).map(([s,a])=>{let p=t&&ie(a)?a instanceof Vo.ZodOptional:a.isOptional(),d=u.createPropertySignature(void 0,er(s),p&&o?u.createToken(f.SyntaxKind.QuestionToken):void 0,r({schema:a}));return a.description&>(d,a.description),d});return u.createTypeLiteralNode(n)},Qo=({schema:{element:e},next:t})=>u.createArrayTypeNode(t({schema:e})),Wo=({schema:{options:e}})=>u.createUnionTypeNode(e.map(t=>u.createLiteralTypeNode(u.createStringLiteral(t)))),tr=({schema:{options:e},next:t})=>u.createUnionTypeNode(e.map(r=>t({schema:r}))),Xo=e=>Bo?.[e.kind],en=({schema:e,next:t,isResponse:r})=>{let o=t({schema:e.innerType()}),n=e._def.effect;if(r&&n.type==="transform"){let s=Se({effect:n,sample:Xo(o)}),a={number:f.SyntaxKind.NumberKeyword,bigint:f.SyntaxKind.BigIntKeyword,boolean:f.SyntaxKind.BooleanKeyword,string:f.SyntaxKind.StringKeyword,undefined:f.SyntaxKind.UndefinedKeyword,object:f.SyntaxKind.ObjectKeyword};return u.createKeywordTypeNode(s&&a[s]||f.SyntaxKind.AnyKeyword)}return o},tn=({schema:e})=>u.createUnionTypeNode(Object.values(e.enum).map(t=>u.createLiteralTypeNode(typeof t=="number"?u.createNumericLiteral(t):u.createStringLiteral(t)))),rn=({next:e,schema:t,optionalPropStyle:{withUndefined:r}})=>{let o=e({schema:t.unwrap()});return r?u.createUnionTypeNode([o,u.createKeywordTypeNode(f.SyntaxKind.UndefinedKeyword)]):o},on=({next:e,schema:t})=>u.createUnionTypeNode([e({schema:t.unwrap()}),u.createLiteralTypeNode(u.createNull())]),nn=({next:e,schema:{items:t}})=>u.createTupleTypeNode(t.map(r=>e({schema:r}))),sn=({next:e,schema:{keySchema:t,valueSchema:r}})=>u.createExpressionWithTypeArguments(u.createIdentifier("Record"),[e({schema:t}),e({schema:r})]),an=({next:e,schema:t})=>u.createIntersectionTypeNode([t._def.left,t._def.right].map(r=>e({schema:r}))),dn=({next:e,schema:t})=>e({schema:t._def.innerType}),K=e=>()=>u.createKeywordTypeNode(e),pn=({next:e,schema:t})=>e({schema:t.unwrap()}),cn=({next:e,schema:t})=>e({schema:t._def.innerType}),ln=({next:e,schema:t})=>e({schema:t._def.innerType}),mn=({schema:e,next:t,isResponse:r})=>t({schema:e._def[r?"out":"in"]}),un=()=>u.createLiteralTypeNode(u.createNull()),fn=({getAlias:e,makeAlias:t,next:r,serializer:o,schema:n})=>{let s=`Type${o(n.schema)}`;return e(s)||(()=>(t(s,u.createLiteralTypeNode(u.createNull())),t(s,r({schema:n.schema}))))()},yn={ZodString:K(f.SyntaxKind.StringKeyword),ZodNumber:K(f.SyntaxKind.NumberKeyword),ZodBigInt:K(f.SyntaxKind.BigIntKeyword),ZodBoolean:K(f.SyntaxKind.BooleanKeyword),ZodDateIn:K(f.SyntaxKind.StringKeyword),ZodDateOut:K(f.SyntaxKind.StringKeyword),ZodNull:un,ZodArray:Qo,ZodTuple:nn,ZodRecord:sn,ZodObject:Jo,ZodLiteral:Yo,ZodIntersection:an,ZodUnion:tr,ZodFile:K(f.SyntaxKind.StringKeyword),ZodAny:K(f.SyntaxKind.AnyKeyword),ZodDefault:dn,ZodEnum:Wo,ZodNativeEnum:tn,ZodEffects:en,ZodOptional:rn,ZodNullable:on,ZodDiscriminatedUnion:tr,ZodBranded:pn,ZodCatch:ln,ZodPipeline:mn,ZodLazy:fn,ZodReadonly:cn},ht=({schema:e,...t})=>q({schema:e,rules:yn,onMissing:()=>u.createKeywordTypeNode(f.SyntaxKind.AnyKeyword),...t});var xt=class{agg=[];registry={};paths=[];aliases={};getAlias(t){return t in this.aliases?i.createTypeReferenceNode(t):void 0}makeAlias(t,r){return this.aliases[t]=ze(r,t),this.getAlias(t)}constructor({routing:t,variant:r="client",serializer:o=Te,optionalPropStyle:n={withQuestionMark:!0,withUndefined:!0}}){G({routing:t,onEndpoint:(m,S,C)=>{let re=N(S,C,"input"),Le=N(S,C,"response"),Z={serializer:o,getAlias:this.getAlias.bind(this),makeAlias:this.makeAlias.bind(this),optionalPropStyle:n},fe=ht({...Z,schema:m.getSchema("input"),isResponse:!1}),ke=ht({...Z,isResponse:!0,schema:m.getSchema("positive").or(m.getSchema("negative"))});this.agg.push(ze(fe,re),ze(ke,Le)),C!=="options"&&(this.paths.push(S),this.registry[`${C} ${S}`]={in:re,out:Le,isJson:m.getMimeTypes("positive").includes($),tags:m.getTags()})}}),this.agg=Object.values(this.aliases).concat(this.agg);let s=ut("Path",this.paths),a=ut("Method",Zt),p=we("MethodPath",dt([a.name,s.name])),d=[i.createHeritageClause(F.SyntaxKind.ExtendsKeyword,[ct(p.name,F.SyntaxKind.AnyKeyword)])],c=ft("Input",d,Object.keys(this.registry).map(m=>lt(m,this.registry[m].in))),l=ft("Response",d,Object.keys(this.registry).map(m=>lt(m,this.registry[m].out)));if(this.agg.push(s,a,p,c,l),r==="types")return;let g=i.createVariableStatement(V,mt("jsonEndpoints",i.createObjectLiteralExpression(Object.keys(this.registry).filter(m=>this.registry[m].isJson).map(m=>i.createPropertyAssignment(`"${m}"`,i.createTrue()))))),y=i.createVariableStatement(V,mt("endpointTags",i.createObjectLiteralExpression(Object.keys(this.registry).map(m=>i.createPropertyAssignment(`"${m}"`,i.createArrayLiteralExpression(this.registry[m].tags.map(S=>i.createStringLiteral(S)))))))),T=we("Provider",i.createFunctionTypeNode(Qt({M:a.name,P:s.name}),Me({method:i.createTypeReferenceNode("M"),path:i.createTypeReferenceNode("P"),params:i.createIndexedAccessTypeNode(i.createTypeReferenceNode(c.name),pt)}),Yt(l.name,pt))),P=we("Implementation",i.createFunctionTypeNode(void 0,Me({method:i.createTypeReferenceNode(a.name),path:i.createKeywordTypeNode(F.SyntaxKind.StringKeyword),params:ct(F.SyntaxKind.StringKeyword,F.SyntaxKind.AnyKeyword)}),Jt())),h=i.createTemplateExpression(i.createTemplateHead(":"),[i.createTemplateSpan(i.createIdentifier("key"),i.createTemplateTail(""))]),I=Bt("ExpressZodAPIClient",qt([Ne("implementation",i.createTypeReferenceNode(P.name),Gt)]),[Vt("provide",i.createTypeReferenceNode(T.name),Wt(["method","path","params"],[i.createIdentifier("method"),yt("params",i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("acc"),"replace"),void 0,[h,i.createElementAccessExpression(i.createIdentifier("params"),i.createIdentifier("key"))]),i.createIdentifier("path")),yt("params",i.createConditionalExpression(i.createBinaryExpression(i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("path"),"indexOf"),void 0,[h]),F.SyntaxKind.GreaterThanEqualsToken,i.createNumericLiteral(0)),void 0,i.createIdentifier("acc"),void 0,i.createObjectLiteralExpression([i.createSpreadAssignment(i.createIdentifier("acc")),i.createPropertyAssignment(i.createComputedPropertyName(i.createIdentifier("key")),i.createElementAccessExpression(i.createIdentifier("params"),i.createIdentifier("key")))])),i.createObjectLiteralExpression())]))]);F.addSyntheticLeadingComment(I,F.SyntaxKind.MultiLineCommentTrivia,`
|
|
35
35
|
export const exampleImplementation: Implementation = async (
|
|
36
36
|
method,
|
|
37
37
|
path,
|
package/package.json
CHANGED