express-zod-api 21.1.0-beta.1 → 21.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +1 -1
- package/dist/index.js +1 -1
- package/migration/index.cjs +1 -1
- package/migration/index.js +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -15,7 +15,7 @@ ${n}888${r}
|
|
|
15
15
|
${o}
|
|
16
16
|
`;e.write(d.split(`
|
|
17
17
|
`).map((c,u)=>p[u]?p[u](c):c).join(`
|
|
18
|
-
`))};var ao=e=>{e.startupLogo!==!1&&no(process.stdout);let t=e.errorHandler||Ce,r=Lr(e.logger)?e.logger:new Ze(e.logger);r.debug("Running",{build:"v21.1.0-beta.1 (CJS)",env:process.env.NODE_ENV||"development"}),ro(r);let o=eo({logger:r,config:e}),i={getLogger:to(r),errorHandler:t},a=Jr(i),p=Qr(i);return{...i,logger:r,notFoundHandler:a,parserFailureHandler:p,loggingMiddleware:o}},po=(e,t)=>{let{logger:r,getLogger:o,notFoundHandler:n,loggingMiddleware:i}=ao(e);return Vt({app:e.app.use(i),routing:t,getLogger:o,config:e}),{notFoundHandler:n,logger:r}},co=async(e,t)=>{let{logger:r,getLogger:o,notFoundHandler:n,parserFailureHandler:i,loggingMiddleware:a}=ao(e),p=(0,xt.default)().disable("x-powered-by").use(a);if(e.compression){let y=await Ne("compression");p.use(y(typeof e.compression=="object"?e.compression:void 0))}let d={json:[e.jsonParser||xt.default.json()],raw:[e.rawParser||xt.default.raw(),Xr],upload:e.upload?await Wr({config:e,getLogger:o}):[]};await e.beforeRouting?.({app:p,getLogger:o}),Vt({app:p,routing:t,getLogger:o,config:e,parsers:d}),p.use(i,n);let c=[],u=(y,b)=>()=>y.listen(b,()=>r.info("Listening",b)),m=[];if(e.http){let y=so.default.createServer(p);c.push(y),m.push(u(y,e.http.listen))}if(e.https){let y=io.default.createServer(e.https.options,p);c.push(y),m.push(u(y,e.https.listen))}return e.gracefulShutdown&&oo({logger:r,servers:c,options:e.gracefulShutdown===!0?{}:e.gracefulShutdown}),{app:p,logger:r,servers:m.map(y=>y())}};var wo=require("openapi3-ts/oas31"),Ot=require("ramda");var Y=require("openapi3-ts/oas31"),l=require("ramda"),S=require("zod");var fe=(e,{onEach:t,rules:r,onMissing:o,ctx:n={}})=>{let i=r[e._def[x]?.brand]||r[e._def.typeName],p=i?i(e,{...n,next:c=>fe(c,{ctx:n,onEach:t,rules:r,onMissing:o})}):o(e,n),d=t&&t(e,{prev:p,...n});return d?{...p,...d}:p};var lo=50,uo="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString",fn={integer:0,number:0,string:"",boolean:!1,object:{},null:null,array:[]},fo=/:([A-Za-z0-9_]+)/g,yn=e=>e.match(fo)?.map(t=>t.slice(1))||[],yo=e=>e.replace(fo,t=>`{${t.slice(1)}}`),gn=({_def:e},{next:t})=>({...t(e.innerType),default:e[x]?.defaultLabel||e.defaultValue()}),hn=({_def:{innerType:e}},{next:t})=>t(e),xn=()=>({format:"any"}),bn=({},e)=>{if(e.isResponse)throw new I("Please use ez.upload() only for input.",e);return{type:"string",format:"binary"}},Sn=e=>{let t=e.unwrap();return{type:"string",format:t instanceof S.z.ZodString?t._def.checks.find(r=>r.kind==="base64")?"byte":"file":"binary"}},Tn=({options:e},{next:t})=>({oneOf:e.map(t)}),On=({options:e,discriminator:t},{next:r})=>({discriminator:{propertyName:t},oneOf:e.map(r)}),Rn=(e,t)=>{if(Array.isArray(e)&&Array.isArray(t))return(0,l.concat)(e,t);if(e===t)return t;throw new Error("Can not flatten properties")},An=e=>{let[t,r]=e.filter(Y.isSchemaObject).filter(n=>n.type==="object"&&Object.keys(n).every(i=>["type","properties","required","examples"].includes(i)));if(!t||!r)throw new Error("Can not flatten objects");let o={type:"object"};return(t.properties||r.properties)&&(o.properties=(0,l.mergeDeepWith)(Rn,t.properties||{},r.properties||{})),(t.required||r.required)&&(o.required=(0,l.union)(t.required||[],r.required||[])),(t.examples||r.examples)&&(o.examples=ae(t.examples||[],r.examples||[],([n,i])=>(0,l.mergeDeepRight)(n,i))),o},Pn=({_def:{left:e,right:t}},{next:r})=>{let o=[e,t].map(r);try{return An(o)}catch{}return{allOf:o}},wn=(e,{next:t})=>t(e.unwrap()),zn=(e,{next:t})=>t(e.unwrap()),Cn=(e,{next:t})=>{let r=t(e.unwrap());return(0,Y.isSchemaObject)(r)&&(r.type=ho(r)),r},go=e=>{let t=(0,l.toLower)((0,l.type)(e));return typeof e=="bigint"?"integer":t==="number"||t==="string"||t==="boolean"||t==="object"||t==="null"||t==="array"?t:void 0},mo=e=>({type:go(Object.values(e.enum)[0]),enum:Object.values(e.enum)}),In=({value:e})=>({type:go(e),const:e}),Zn=(e,{isResponse:t,next:r})=>{let o=Object.keys(e.shape),n=p=>t&&Fe(p)?p instanceof S.z.ZodOptional:p.isOptional(),i=o.filter(p=>!n(e.shape[p])),a={type:"object"};return o.length&&(a.properties=bt(e,r)),i.length&&(a.required=i),a},En=()=>({type:"null"}),vn=({},e)=>{if(e.isResponse)throw new I("Please use ez.dateOut() for output.",e);return{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",pattern:/^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(\.\d+)?)?Z?$/.source,externalDocs:{url:uo}}},jn=({},e)=>{if(!e.isResponse)throw new I("Please use ez.dateIn() for input.",e);return{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",externalDocs:{url:uo}}},Nn=({},e)=>{throw new I(`Using z.date() within ${e.isResponse?"output":"input"} schema is forbidden. Please use ez.date${e.isResponse?"Out":"In"}() instead. Check out the documentation for details.`,e)},Ln=()=>({type:"boolean"}),kn=()=>({type:"integer",format:"bigint"}),Mn=e=>e.every(t=>t instanceof S.z.ZodLiteral),Un=({keySchema:e,valueSchema:t},{next:r})=>{if(e instanceof S.z.ZodEnum||e instanceof S.z.ZodNativeEnum){let o=Object.values(e.enum),n={type:"object"};return o.length&&(n.properties=bt(S.z.object((0,l.fromPairs)((0,l.xprod)(o,[t]))),r),n.required=o),n}if(e instanceof S.z.ZodLiteral)return{type:"object",properties:bt(S.z.object({[e.value]:t}),r),required:[e.value]};if(e instanceof S.z.ZodUnion&&Mn(e.options)){let o=(0,l.map)(i=>`${i.value}`,e.options),n=(0,l.fromPairs)((0,l.xprod)(o,[t]));return{type:"object",properties:bt(S.z.object(n),r),required:o}}return{type:"object",additionalProperties:r(t)}},Hn=({_def:{minLength:e,maxLength:t},element:r},{next:o})=>{let n={type:"array",items:o(r)};return e&&(n.minItems=e.value),t&&(n.maxItems=t.value),n},Kn=({items:e,_def:{rest:t}},{next:r})=>({type:"array",prefixItems:e.map(r),items:t===null?{not:{}}:r(t)}),Dn=({isEmail:e,isURL:t,minLength:r,maxLength:o,isUUID:n,isCUID:i,isCUID2:a,isULID:p,isIP:d,isEmoji:c,isDatetime:u,_def:{checks:m}})=>{let y=m.find(w=>w.kind==="regex"),b=m.find(w=>w.kind==="datetime"),O=y?y.regex:b?b.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,R={type:"string"},h={"date-time":u,email:e,url:t,uuid:n,cuid:i,cuid2:a,ulid:p,ip:d,emoji:c};for(let w in h)if(h[w]){R.format=w;break}return r!==null&&(R.minLength=r),o!==null&&(R.maxLength=o),O&&(R.pattern=O.source),R},Fn=({isInt:e,maxValue:t,minValue:r,_def:{checks:o}})=>{let n=o.find(m=>m.kind==="min"),i=r===null?e?Number.MIN_SAFE_INTEGER:-Number.MAX_VALUE:r,a=n?n.inclusive:!0,p=o.find(m=>m.kind==="max"),d=t===null?e?Number.MAX_SAFE_INTEGER:Number.MAX_VALUE:t,c=p?p.inclusive:!0,u={type:e?"integer":"number",format:e?"int64":"double"};return a?u.minimum=i:u.exclusiveMinimum=i,c?u.maximum=d:u.exclusiveMaximum=d,u},bt=({shape:e},t)=>(0,l.map)(t,e),Bn=e=>{let t=Array.isArray(e.type)?e.type[0]:e.type;return fn?.[t]},ho=({type:e})=>e==="null"?e:typeof e=="string"?[e,"null"]:e?[...new Set(e).add("null")]:"null",qn=(e,{isResponse:t,next:r})=>{let o=r(e.innerType()),{effect:n}=e._def;if(t&&n.type==="transform"&&(0,Y.isSchemaObject)(o)){let i=ot(e,Bn(o));return i&&["number","string","boolean"].includes(i)?{type:i}:r(S.z.any())}if(!t&&n.type==="preprocess"&&(0,Y.isSchemaObject)(o)){let{type:i,...a}=o;return{...a,format:`${a.format||i} (preprocessed)`}}return o},$n=({_def:e},{isResponse:t,next:r})=>r(e[t?"out":"in"]),Gn=(e,{next:t})=>t(e.unwrap()),Vn=(e,{next:t,makeRef:r})=>r(e,()=>t(e.schema)),_n=(e,{next:t})=>t(e.unwrap().shape.raw),xo=e=>e.length?(0,l.fromPairs)((0,l.zip)((0,l.range)(1,e.length+1).map(t=>`example${t}`),(0,l.map)((0,l.objOf)("value"),e))):void 0,bo=(e,t,r=[])=>(0,l.pipe)(V,(0,l.map)((0,l.when)(o=>(0,l.type)(o)==="Object",(0,l.omit)(r))),xo)({schema:e,variant:t?"parsed":"original",validate:!0}),Yn=(e,t)=>(0,l.pipe)(V,(0,l.filter)((0,l.has)(t)),(0,l.pluck)(t),xo)({schema:e,variant:"original",validate:!0}),ye=e=>e instanceof S.z.ZodObject?e:e instanceof S.z.ZodBranded?ye(e.unwrap()):e instanceof S.z.ZodUnion||e instanceof S.z.ZodDiscriminatedUnion?e.options.map(t=>ye(t)).reduce((t,r)=>t.merge(r.partial()),S.z.object({})):e instanceof S.z.ZodEffects?ye(e._def.schema):e instanceof S.z.ZodPipeline?ye(e._def.in):ye(e._def.left).merge(ye(e._def.right)),So=({path:e,method:t,schema:r,inputSources:o,makeRef:n,composition:i,brandHandling:a,description:p=`${t.toUpperCase()} ${e} Parameter`})=>{let{shape:d}=ye(r),c=yn(e),u=o.includes("query"),m=o.includes("params"),y=o.includes("headers"),b=h=>m&&c.includes(h),O=h=>y&&Nt(h);return Object.keys(d).map(h=>({name:h,location:b(h)?"path":O(h)?"header":u?"query":void 0})).filter(h=>h.location!==void 0).map(({name:h,location:w})=>{let N=fe(d[h],{rules:{...a,...Yt},onEach:Qt,onMissing:Jt,ctx:{isResponse:!1,makeRef:n,path:e,method:t}}),U=i==="components"?n(d[h],N,k(p,h)):N;return{name:h,in:w,required:!d[h].isOptional(),description:N.description||p,schema:U,examples:Yn(r,h)}})},Yt={ZodString:Dn,ZodNumber:Fn,ZodBigInt:kn,ZodBoolean:Ln,ZodNull:En,ZodArray:Hn,ZodTuple:Kn,ZodRecord:Un,ZodObject:Zn,ZodLiteral:In,ZodIntersection:Pn,ZodUnion:Tn,ZodAny:xn,ZodDefault:gn,ZodEnum:mo,ZodNativeEnum:mo,ZodEffects:qn,ZodOptional:wn,ZodNullable:Cn,ZodDiscriminatedUnion:On,ZodBranded:Gn,ZodDate:Nn,ZodCatch:hn,ZodPipeline:$n,ZodLazy:Vn,ZodReadonly:zn,[D]:Sn,[Oe]:bn,[le]:jn,[de]:vn,[ee]:_n},Qt=(e,{isResponse:t,prev:r})=>{if((0,Y.isReferenceObject)(r))return{};let{description:o}=e,n=e instanceof S.z.ZodLazy,i=r.type!==void 0,a=t&&Fe(e),p=!n&&i&&!a&&e.isNullable(),d={};if(o&&(d.description=o),p&&(d.type=ho(r)),!n){let c=V({schema:e,variant:t?"parsed":"original",validate:!0});c.length&&(d.examples=c.slice())}return d},Jt=(e,t)=>{throw new I(`Zod type ${e.constructor.name} is unsupported.`,t)},_t=(e,t)=>{if((0,Y.isReferenceObject)(e))return e;let r={...e};return r.properties&&(r.properties=(0,l.omit)(t,r.properties)),r.examples&&(r.examples=r.examples.map(o=>(0,l.omit)(t,o))),r.required&&(r.required=r.required.filter(o=>!t.includes(o))),r.allOf&&(r.allOf=r.allOf.map(o=>_t(o,t))),r.oneOf&&(r.oneOf=r.oneOf.map(o=>_t(o,t))),r},To=e=>(0,Y.isReferenceObject)(e)?e:(0,l.omit)(["examples"],e),Oo=({method:e,path:t,schema:r,mimeTypes:o,variant:n,makeRef:i,composition:a,hasMultipleStatusCodes:p,statusCode:d,brandHandling:c,description:u=`${e.toUpperCase()} ${t} ${Lt(n)} response ${p?d:""}`.trim()})=>{if(!o)return{description:u};let m=To(fe(r,{rules:{...c,...Yt},onEach:Qt,onMissing:Jt,ctx:{isResponse:!0,makeRef:i,path:t,method:e}})),y={schema:a==="components"?i(r,m,k(u)):m,examples:bo(r,!0)};return{description:u,content:(0,l.fromPairs)((0,l.xprod)(o,[y]))}},Qn=()=>({type:"http",scheme:"basic"}),Jn=({format:e})=>{let t={type:"http",scheme:"bearer"};return e&&(t.bearerFormat=e),t},Wn=({name:e},t)=>{let r={type:"apiKey",in:"query",name:e};return t?.includes("body")&&(t?.includes("query")?(r["x-in-alternative"]="body",r.description=`${e} CAN also be supplied within the request body`):(r["x-in-actual"]="body",r.description=`${e} MUST be supplied within the request body instead of query`)),r},Xn=({name:e})=>({type:"apiKey",in:"header",name:e}),es=({name:e})=>({type:"apiKey",in:"cookie",name:e}),ts=({url:e})=>({type:"openIdConnect",openIdConnectUrl:e}),rs=({flows:e={}})=>({type:"oauth2",flows:(0,l.map)(t=>({...t,scopes:t.scopes||{}}),(0,l.reject)(l.isNil,e))}),Ro=(e,t)=>{let r={basic:Qn,bearer:Jn,input:Wn,header:Xn,cookie:es,openid:ts,oauth2:rs};return mt(e,o=>r[o.type](o,t))},St=e=>"or"in e?e.or.map(t=>"and"in t?(0,l.mergeAll)((0,l.map)(({name:r,scopes:o})=>(0,l.objOf)(r,o),t.and)):{[t.name]:t.scopes}):"and"in e?St(Dt(e)):St({or:[e]}),Ao=({method:e,path:t,schema:r,mimeType:o,makeRef:n,composition:i,brandHandling:a,paramNames:p,description:d=`${e.toUpperCase()} ${t} Request body`})=>{let c=To(_t(fe(r,{rules:{...a,...Yt},onEach:Qt,onMissing:Jt,ctx:{isResponse:!1,makeRef:n,path:t,method:e}}),p)),u={schema:i==="components"?n(r,c,k(d)):c,examples:bo(r,!1,p)};return{description:d,content:{[o]:u}}},Po=e=>Object.keys(e).map(t=>{let r=e[t],o={name:t,description:typeof r=="string"?r:r.description};return typeof r=="object"&&r.url&&(o.externalDocs={url:r.url}),o}),Wt=e=>e.length<=lo?e:e.slice(0,lo-1)+"\u2026";var Tt=class extends wo.OpenApiBuilder{lastSecuritySchemaIds=new Map;lastOperationIdSuffixes=new Map;responseVariants=(0,Ot.keys)(ue);references=new Map;makeRef(t,r,o=this.references.get(t)){return o||(o=`Schema${this.references.size+1}`,this.references.set(t,o),typeof r=="function"&&(r=r())),typeof r=="object"&&this.addSchema(o,r),{$ref:`#/components/schemas/${o}`}}ensureUniqOperationId(t,r,o){let n=o||k(r,t),i=this.lastOperationIdSuffixes.get(n);if(i===void 0)return this.lastOperationIdSuffixes.set(n,1),n;if(o)throw new I(`Duplicated operationId: "${o}"`,{method:r,isResponse:!1,path:t});return i++,this.lastOperationIdSuffixes.set(n,i),`${n}${i}`}ensureUniqSecuritySchemaName(t){let r=JSON.stringify(t);for(let n in this.rootDoc.components?.securitySchemes||{})if(r===JSON.stringify(this.rootDoc.components?.securitySchemes?.[n]))return n;let o=(this.lastSecuritySchemaIds.get(t.type)||0)+1;return this.lastSecuritySchemaIds.set(t.type,o),`${t.type.toUpperCase()}_${o}`}constructor({routing:t,config:r,title:o,version:n,serverUrl:i,descriptions:a,brandHandling:p,hasSummaryFromDescription:d=!0,composition:c="inline"}){super(),this.addInfo({title:o,version:n});for(let m of typeof i=="string"?[i]:i)this.addServer({url:m});Le({routing:t,onEndpoint:(m,y,b)=>{let O={path:y,method:b,endpoint:m,composition:c,brandHandling:p,makeRef:this.makeRef.bind(this)},[R,h]=["short","long"].map(m.getDescription.bind(m)),w=R?Wt(R):d&&h?Wt(h):void 0,N=m.getTags(),U=r.inputSources?.[b]||vt[b],B=this.ensureUniqOperationId(y,b,m.getOperationId(b)),ke=So({...O,inputSources:U,schema:m.getSchema("input"),description:a?.requestParameter?.call(null,{method:b,path:y,operationId:B})}),Je={};for(let q of this.responseVariants){let oe=m.getResponses(q);for(let{mimeTypes:Me,schema:Et,statusCodes:Xe}of oe)for(let Ue of Xe)Je[Ue]=Oo({...O,variant:q,schema:Et,mimeTypes:Me,statusCode:Ue,hasMultipleStatusCodes:oe.length>1||Xe.length>1,description:a?.[`${q}Response`]?.call(null,{method:b,path:y,operationId:B,statusCode:Ue})})}let Zt=U.includes("body")?Ao({...O,paramNames:(0,Ot.pluck)("name",ke),schema:m.getSchema("input"),mimeType:A[m.getRequestType()],description:a?.requestBody?.call(null,{method:b,path:y,operationId:B})}):void 0,We=St(mt(Ro(m.getSecurity(),U),q=>{let oe=this.ensureUniqSecuritySchemaName(q),Me=["oauth2","openIdConnect"].includes(q.type)?m.getScopes().slice():[];return this.addSecurityScheme(oe,q),{name:oe,scopes:Me}}));this.addPath(yo(y),{[b]:{operationId:B,summary:w,description:h,tags:N.length>0?N:void 0,parameters:ke.length>0?ke:void 0,requestBody:Zt,security:We.length>0?We:void 0,responses:Je}})}}),this.rootDoc.tags=r.tags?Po(r.tags):[]}};var Rt=require("node-mocks-http"),os=e=>(0,Rt.createRequest)({...e,headers:{"content-type":A.json,...e?.headers}}),ns=e=>(0,Rt.createResponse)(e),ss=e=>{let t={warn:[],error:[],info:[],debug:[]};return new Proxy(e||{},{get(r,o,n){return o==="_getLogs"?()=>t:kr(o)?(...i)=>t[o].push(i):Reflect.get(r,o,n)}})},zo=({requestProps:e,responseOptions:t,configProps:r,loggerProps:o})=>{let n=os(e),i=ns({req:n,...t});i.req=t?.req||n,n.res=i;let a=ss(o),p={cors:!1,logger:a,...r};return{requestMock:n,responseMock:i,loggerMock:a,configMock:p}},Co=async({endpoint:e,...t})=>{let{requestMock:r,responseMock:o,loggerMock:n,configMock:i}=zo(t);return await e.execute({request:r,response:o,config:i,logger:n}),{requestMock:r,responseMock:o,loggerMock:n}},Io=async({middleware:e,options:t={},errorHandler:r,...o})=>{let{requestMock:n,responseMock:i,loggerMock:a,configMock:p}=zo(o),d=rt(n,p.inputSources);try{let c=await e.execute({request:n,response:i,logger:a,input:d,options:t});return{requestMock:n,responseMock:i,loggerMock:a,output:c}}catch(c){if(!r)throw c;return r(X(c),i),{requestMock:n,responseMock:i,loggerMock:a,output:{}}}};var j=z(require("typescript"),1),$o=require("zod");var v=z(require("typescript"),1),Xt=require("ramda"),s=v.default.factory,te=[s.createModifier(v.default.SyntaxKind.ExportKeyword)],is=[s.createModifier(v.default.SyntaxKind.AsyncKeyword)],as=[s.createModifier(v.default.SyntaxKind.PublicKeyword),s.createModifier(v.default.SyntaxKind.ReadonlyKeyword)],Zo=[s.createModifier(v.default.SyntaxKind.ProtectedKeyword),s.createModifier(v.default.SyntaxKind.ReadonlyKeyword)],ps=s.createTemplateHead(""),cs=s.createTemplateMiddle(" "),Ye=s.createTemplateTail(""),er=e=>s.createTemplateLiteralType(ps,e.map((t,r)=>s.createTemplateLiteralTypeSpan(s.createTypeReferenceNode(t),r===e.length-1?Ye:cs))),tr=er(["M","P"]),At=(e,t,r)=>s.createParameterDeclaration(r,void 0,e,void 0,t,void 0),Pt=(e,t)=>(0,Xt.chain)(([r,o])=>[At(s.createIdentifier(r),o,t)],Object.entries(e)),rr=(e,t)=>s.createExpressionWithTypeArguments(s.createIdentifier("Record"),[typeof e=="number"?s.createKeywordTypeNode(e):s.createTypeReferenceNode(e),s.createKeywordTypeNode(t)]),Eo=e=>s.createConstructorDeclaration(void 0,e,s.createBlock([])),vo=(e,t)=>s.createPropertySignature(void 0,e,void 0,s.createTypeReferenceNode(t)),F=(e,t,r)=>s.createVariableDeclarationList([s.createVariableDeclaration(e,void 0,r,t)],v.default.NodeFlags.Const),or=(e,t)=>s.createTypeAliasDeclaration(te,e,void 0,s.createUnionTypeNode(t.map(r=>s.createLiteralTypeNode(s.createStringLiteral(r))))),wt=(e,t)=>s.createTypeAliasDeclaration(te,e,void 0,t),jo=(e,t,r)=>s.createPropertyDeclaration(as,e,void 0,t,r),No=(e,t,r)=>s.createClassDeclaration(te,e,void 0,void 0,[t,...r]),Lo=(e,t)=>s.createTypeReferenceNode("Promise",[s.createIndexedAccessTypeNode(s.createTypeReferenceNode(e),t)]),ko=()=>s.createTypeReferenceNode("Promise",[s.createKeywordTypeNode(v.default.SyntaxKind.AnyKeyword)]),Mo=(e,t,r)=>s.createInterfaceDeclaration(te,e,void 0,t,r),ds=(0,Xt.chain)(([e,t])=>[s.createTypeParameterDeclaration([],e,s.createTypeReferenceNode(t))]),Uo=e=>ds(Object.entries(e)),nr=(e,t,r)=>s.createArrowFunction(r?is:void 0,void 0,e.map(o=>At(o)),void 0,void 0,t),sr=(e,t,r)=>s.createCallExpression(s.createPropertyAccessExpression(s.createCallExpression(s.createPropertyAccessExpression(s.createIdentifier("Object"),"keys"),void 0,[e]),"reduce"),void 0,[s.createArrowFunction(void 0,void 0,Pt({acc:void 0,key:void 0}),void 0,void 0,t),r]),Ho=(...e)=>`"${e.join(" ")}"`,Ko=(e,t,r)=>s.createConditionalExpression(e,s.createToken(v.default.SyntaxKind.QuestionToken),t,s.createToken(v.default.SyntaxKind.ColonToken),r);var Do=["get","post","put","delete","patch"];var g=z(require("typescript"),1),Ct=require("zod");var T=z(require("typescript"),1),{factory:zt}=T.default,ir=(e,t)=>T.default.addSyntheticLeadingComment(e,T.default.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0),ge=(e,t,r)=>{let o=zt.createTypeAliasDeclaration(void 0,zt.createIdentifier(t),void 0,e);return r?ir(o,r):o},ar=(e,t)=>{let r=T.default.createSourceFile("print.ts","",T.default.ScriptTarget.Latest,!1,T.default.ScriptKind.TS);return T.default.createPrinter(t).printNode(T.default.EmitHint.Unspecified,e,r)},ls=/^[A-Za-z_$][A-Za-z0-9_$]*$/,Fo=e=>ls.test(e)?zt.createIdentifier(e):zt.createStringLiteral(e),ms=[T.default.SyntaxKind.AnyKeyword,T.default.SyntaxKind.BigIntKeyword,T.default.SyntaxKind.BooleanKeyword,T.default.SyntaxKind.NeverKeyword,T.default.SyntaxKind.NumberKeyword,T.default.SyntaxKind.ObjectKeyword,T.default.SyntaxKind.StringKeyword,T.default.SyntaxKind.SymbolKeyword,T.default.SyntaxKind.UndefinedKeyword,T.default.SyntaxKind.UnknownKeyword,T.default.SyntaxKind.VoidKeyword],Bo=e=>ms.includes(e.kind);var{factory:f}=g.default,us={[g.default.SyntaxKind.AnyKeyword]:"",[g.default.SyntaxKind.BigIntKeyword]:BigInt(0),[g.default.SyntaxKind.BooleanKeyword]:!1,[g.default.SyntaxKind.NumberKeyword]:0,[g.default.SyntaxKind.ObjectKeyword]:{},[g.default.SyntaxKind.StringKeyword]:"",[g.default.SyntaxKind.UndefinedKeyword]:void 0},fs=({value:e})=>f.createLiteralTypeNode(typeof e=="number"?f.createNumericLiteral(e):typeof e=="boolean"?e?f.createTrue():f.createFalse():f.createStringLiteral(e)),ys=({shape:e},{isResponse:t,next:r,optionalPropStyle:{withQuestionMark:o}})=>{let n=Object.entries(e).map(([i,a])=>{let p=t&&Fe(a)?a instanceof Ct.z.ZodOptional:a.isOptional(),d=f.createPropertySignature(void 0,Fo(i),p&&o?f.createToken(g.default.SyntaxKind.QuestionToken):void 0,r(a));return a.description?ir(d,a.description):d});return f.createTypeLiteralNode(n)},gs=({element:e},{next:t})=>f.createArrayTypeNode(t(e)),hs=({options:e})=>f.createUnionTypeNode(e.map(t=>f.createLiteralTypeNode(f.createStringLiteral(t)))),qo=({options:e},{next:t})=>{let r=new Map;for(let o of e){let n=t(o);r.set(Bo(n)?n.kind:n,n)}return f.createUnionTypeNode(Array.from(r.values()))},xs=e=>us?.[e.kind],bs=(e,{next:t,isResponse:r})=>{let o=t(e.innerType());if(r&&e._def.effect.type==="transform"){let n=ot(e,xs(o)),i={number:g.default.SyntaxKind.NumberKeyword,bigint:g.default.SyntaxKind.BigIntKeyword,boolean:g.default.SyntaxKind.BooleanKeyword,string:g.default.SyntaxKind.StringKeyword,undefined:g.default.SyntaxKind.UndefinedKeyword,object:g.default.SyntaxKind.ObjectKeyword};return f.createKeywordTypeNode(n&&i[n]||g.default.SyntaxKind.AnyKeyword)}return o},Ss=e=>f.createUnionTypeNode(Object.values(e.enum).map(t=>f.createLiteralTypeNode(typeof t=="number"?f.createNumericLiteral(t):f.createStringLiteral(t)))),Ts=(e,{next:t,optionalPropStyle:{withUndefined:r}})=>{let o=t(e.unwrap());return r?f.createUnionTypeNode([o,f.createKeywordTypeNode(g.default.SyntaxKind.UndefinedKeyword)]):o},Os=(e,{next:t})=>f.createUnionTypeNode([t(e.unwrap()),f.createLiteralTypeNode(f.createNull())]),Rs=({items:e,_def:{rest:t}},{next:r})=>f.createTupleTypeNode(e.map(r).concat(t===null?[]:f.createRestTypeNode(r(t)))),As=({keySchema:e,valueSchema:t},{next:r})=>f.createExpressionWithTypeArguments(f.createIdentifier("Record"),[e,t].map(r)),Ps=({_def:{left:e,right:t}},{next:r})=>{let o=[e,t].map(r);return o.every(g.default.isTypeLiteralNode)?f.createTypeLiteralNode(o.flatMap(({members:i})=>i)):f.createIntersectionTypeNode(o)},ws=({_def:e},{next:t})=>t(e.innerType),re=e=>()=>f.createKeywordTypeNode(e),zs=(e,{next:t})=>t(e.unwrap()),Cs=(e,{next:t})=>t(e.unwrap()),Is=({_def:e},{next:t})=>t(e.innerType),Zs=({_def:e},{next:t,isResponse:r})=>t(e[r?"out":"in"]),Es=()=>f.createLiteralTypeNode(f.createNull()),vs=(e,{makeAlias:t,next:r})=>t(e,()=>r(e.schema)),js=e=>{let t=e.unwrap(),r=f.createKeywordTypeNode(g.default.SyntaxKind.StringKeyword),o=f.createTypeReferenceNode("Buffer"),n=f.createUnionTypeNode([r,o]);return t instanceof Ct.z.ZodString?r:t instanceof Ct.z.ZodUnion?n:o},Ns=(e,{next:t})=>t(e.unwrap().shape.raw),Ls={ZodString:re(g.default.SyntaxKind.StringKeyword),ZodNumber:re(g.default.SyntaxKind.NumberKeyword),ZodBigInt:re(g.default.SyntaxKind.BigIntKeyword),ZodBoolean:re(g.default.SyntaxKind.BooleanKeyword),ZodAny:re(g.default.SyntaxKind.AnyKeyword),ZodUndefined:re(g.default.SyntaxKind.UndefinedKeyword),[de]:re(g.default.SyntaxKind.StringKeyword),[le]:re(g.default.SyntaxKind.StringKeyword),ZodNull:Es,ZodArray:gs,ZodTuple:Rs,ZodRecord:As,ZodObject:ys,ZodLiteral:fs,ZodIntersection:Ps,ZodUnion:qo,ZodDefault:ws,ZodEnum:hs,ZodNativeEnum:Ss,ZodEffects:bs,ZodOptional:Ts,ZodNullable:Os,ZodDiscriminatedUnion:qo,ZodBranded:zs,ZodCatch:Is,ZodPipeline:Zs,ZodLazy:vs,ZodReadonly:Cs,[D]:js,[ee]:Ns},Qe=(e,{brandHandling:t,ctx:r})=>fe(e,{rules:{...t,...Ls},onMissing:()=>f.createKeywordTypeNode(g.default.SyntaxKind.AnyKeyword),ctx:r});var It=class{program=[];usage=[];registry=new Map;paths=[];aliases=new Map;ids={pathType:s.createIdentifier("Path"),methodType:s.createIdentifier("Method"),methodPathType:s.createIdentifier("MethodPath"),inputInterface:s.createIdentifier("Input"),posResponseInterface:s.createIdentifier("PositiveResponse"),negResponseInterface:s.createIdentifier("NegativeResponse"),responseInterface:s.createIdentifier("Response"),jsonEndpointsConst:s.createIdentifier("jsonEndpoints"),endpointTagsConst:s.createIdentifier("endpointTags"),providerType:s.createIdentifier("Provider"),implementationType:s.createIdentifier("Implementation"),clientClass:s.createIdentifier("ExpressZodAPIClient"),keyParameter:s.createIdentifier("key"),pathParameter:s.createIdentifier("path"),paramsArgument:s.createIdentifier("params"),methodParameter:s.createIdentifier("method"),accumulator:s.createIdentifier("acc"),provideMethod:s.createIdentifier("provide"),implementationArgument:s.createIdentifier("implementation"),headersProperty:s.createIdentifier("headers"),hasBodyConst:s.createIdentifier("hasBody"),undefinedValue:s.createIdentifier("undefined"),bodyProperty:s.createIdentifier("body"),responseConst:s.createIdentifier("response"),searchParamsConst:s.createIdentifier("searchParams"),exampleImplementationConst:s.createIdentifier("exampleImplementation"),clientConst:s.createIdentifier("client"),contentTypeConst:s.createIdentifier("contentType"),isJsonConst:s.createIdentifier("isJSON")};interfaces=[];makeAlias(t,r){let o=this.aliases.get(t)?.name?.text;if(!o){o=`Type${this.aliases.size+1}`;let n=s.createLiteralTypeNode(s.createNull());this.aliases.set(t,ge(n,o)),this.aliases.set(t,ge(r(),o))}return s.createTypeReferenceNode(o)}constructor({routing:t,brandHandling:r,variant:o="client",splitResponse:n=!1,optionalPropStyle:i={withQuestionMark:!0,withUndefined:!0},noContent:a=$o.z.undefined()}){Le({routing:t,onEndpoint:($,H,ne)=>{let he={makeAlias:this.makeAlias.bind(this),optionalPropStyle:i},He=k(ne,H,"input"),Ke=Qe($.getSchema("input"),{brandHandling:r,ctx:{...he,isResponse:!1}}),L=n?k(ne,H,"positive.response"):void 0,pr=$.getResponses("positive").map(({schema:G,mimeTypes:se})=>se?G:a).reduce((G,se)=>G.or(se)),cr=n?Qe(pr,{brandHandling:r,ctx:{...he,isResponse:!0}}):void 0,De=n?k(ne,H,"negative.response"):void 0,dr=$.getResponses("negative").map(({schema:G,mimeTypes:se})=>se?G:a).reduce((G,se)=>G.or(se)),lr=n?Qe(dr,{brandHandling:r,ctx:{...he,isResponse:!0}}):void 0,mr=k(ne,H,"response"),Vo=L&&De?s.createUnionTypeNode([s.createTypeReferenceNode(L),s.createTypeReferenceNode(De)]):Qe(pr.or(dr),{brandHandling:r,ctx:{...he,isResponse:!0}});this.program.push(ge(Ke,He)),cr&&L&&this.program.push(ge(cr,L)),lr&&De&&this.program.push(ge(lr,De)),this.program.push(ge(Vo,mr)),this.paths.push(H),this.registry.set({method:ne,path:H},{input:He,positive:L,negative:De,response:mr,isJson:$.getResponses("positive").some(G=>G.mimeTypes?.includes(A.json)),tags:$.getTags()})}}),this.program.unshift(...this.aliases.values()),this.program.push(or(this.ids.pathType,this.paths)),this.program.push(or(this.ids.methodType,Do)),this.program.push(wt(this.ids.methodPathType,er([this.ids.methodType,this.ids.pathType])));let p=[s.createHeritageClause(j.default.SyntaxKind.ExtendsKeyword,[rr(this.ids.methodPathType,j.default.SyntaxKind.AnyKeyword)])];this.interfaces.push({id:this.ids.inputInterface,kind:"input",props:[]}),n&&this.interfaces.push({id:this.ids.posResponseInterface,kind:"positive",props:[]},{id:this.ids.negResponseInterface,kind:"negative",props:[]}),this.interfaces.push({id:this.ids.responseInterface,kind:"response",props:[]});let d=[],c=[];for(let[{method:$,path:H},{isJson:ne,tags:he,...He}]of this.registry){let Ke=Ho($,H);for(let L of this.interfaces)L.kind in He&&L.props.push(vo(Ke,He[L.kind]));o!=="types"&&(ne&&d.push(s.createPropertyAssignment(Ke,s.createTrue())),c.push(s.createPropertyAssignment(Ke,s.createArrayLiteralExpression(he.map(L=>s.createStringLiteral(L))))))}for(let{id:$,props:H}of this.interfaces)this.program.push(Mo($,p,H));if(o==="types")return;let u=s.createVariableStatement(te,F(this.ids.jsonEndpointsConst,s.createObjectLiteralExpression(d))),m=s.createVariableStatement(te,F(this.ids.endpointTagsConst,s.createObjectLiteralExpression(c))),y=wt(this.ids.providerType,s.createFunctionTypeNode(Uo({M:this.ids.methodType,P:this.ids.pathType}),Pt({method:s.createTypeReferenceNode("M"),path:s.createTypeReferenceNode("P"),params:s.createIndexedAccessTypeNode(s.createTypeReferenceNode(this.ids.inputInterface),tr)}),Lo(this.ids.responseInterface,tr))),b=wt(this.ids.implementationType,s.createFunctionTypeNode(void 0,Pt({method:s.createTypeReferenceNode(this.ids.methodType),path:s.createKeywordTypeNode(j.default.SyntaxKind.StringKeyword),params:rr(j.default.SyntaxKind.StringKeyword,j.default.SyntaxKind.AnyKeyword)}),ko())),O=s.createTemplateExpression(s.createTemplateHead(":"),[s.createTemplateSpan(this.ids.keyParameter,Ye)]),R=sr(this.ids.paramsArgument,s.createCallExpression(s.createPropertyAccessExpression(this.ids.accumulator,"replace"),void 0,[O,s.createElementAccessExpression(this.ids.paramsArgument,this.ids.keyParameter)]),this.ids.pathParameter),h=sr(this.ids.paramsArgument,s.createConditionalExpression(s.createBinaryExpression(s.createCallExpression(s.createPropertyAccessExpression(this.ids.pathParameter,"indexOf"),void 0,[O]),j.default.SyntaxKind.GreaterThanEqualsToken,s.createNumericLiteral(0)),void 0,this.ids.accumulator,void 0,s.createObjectLiteralExpression([s.createSpreadAssignment(this.ids.accumulator),s.createPropertyAssignment(s.createComputedPropertyName(this.ids.keyParameter),s.createElementAccessExpression(this.ids.paramsArgument,this.ids.keyParameter))])),s.createObjectLiteralExpression()),w=No(this.ids.clientClass,Eo([At(this.ids.implementationArgument,s.createTypeReferenceNode(this.ids.implementationType),Zo)]),[jo(this.ids.provideMethod,s.createTypeReferenceNode(this.ids.providerType),nr([this.ids.methodParameter,this.ids.pathParameter,this.ids.paramsArgument],s.createCallExpression(s.createPropertyAccessExpression(s.createThis(),this.ids.implementationArgument),void 0,[this.ids.methodParameter,R,h]),!0))]);this.program.push(u,m,y,b,w);let N=s.createPropertyAssignment(this.ids.methodParameter,s.createCallExpression(s.createPropertyAccessExpression(this.ids.methodParameter,"toUpperCase"),void 0,void 0)),U=s.createPropertyAssignment(this.ids.headersProperty,s.createConditionalExpression(this.ids.hasBodyConst,void 0,s.createObjectLiteralExpression([s.createPropertyAssignment(s.createStringLiteral("Content-Type"),s.createStringLiteral(A.json))]),void 0,this.ids.undefinedValue)),B=s.createPropertyAssignment(this.ids.bodyProperty,s.createConditionalExpression(this.ids.hasBodyConst,void 0,s.createCallExpression(s.createPropertyAccessExpression(s.createIdentifier("JSON"),"stringify"),void 0,[this.ids.paramsArgument]),void 0,this.ids.undefinedValue)),ke=s.createVariableStatement(void 0,F(this.ids.responseConst,s.createAwaitExpression(s.createCallExpression(s.createIdentifier("fetch"),void 0,[s.createTemplateExpression(s.createTemplateHead("https://example.com"),[s.createTemplateSpan(this.ids.pathParameter,s.createTemplateMiddle("")),s.createTemplateSpan(this.ids.searchParamsConst,Ye)]),s.createObjectLiteralExpression([N,U,B])])))),Je=s.createVariableStatement(void 0,F(this.ids.hasBodyConst,s.createLogicalNot(s.createCallExpression(s.createPropertyAccessExpression(s.createArrayLiteralExpression([s.createStringLiteral("get"),s.createStringLiteral("delete")]),"includes"),void 0,[this.ids.methodParameter])))),Zt=s.createVariableStatement(void 0,F(this.ids.searchParamsConst,s.createConditionalExpression(this.ids.hasBodyConst,void 0,s.createStringLiteral(""),void 0,s.createTemplateExpression(s.createTemplateHead("?"),[s.createTemplateSpan(s.createNewExpression(s.createIdentifier("URLSearchParams"),void 0,[this.ids.paramsArgument]),Ye)])))),We=s.createVariableStatement(void 0,F(this.ids.contentTypeConst,s.createCallExpression(s.createPropertyAccessExpression(s.createPropertyAccessExpression(this.ids.responseConst,this.ids.headersProperty),s.createIdentifier("get")),void 0,[s.createStringLiteral("content-type")]))),q=s.createIfStatement(s.createPrefixUnaryExpression(j.default.SyntaxKind.ExclamationToken,this.ids.contentTypeConst),s.createReturnStatement(void 0),void 0),oe=s.createVariableStatement(void 0,F(this.ids.isJsonConst,s.createCallChain(s.createPropertyAccessChain(this.ids.contentTypeConst,void 0,s.createIdentifier("startsWith")),void 0,void 0,[s.createStringLiteral(A.json)]))),Me=s.createReturnStatement(s.createCallExpression(s.createElementAccessExpression(this.ids.responseConst,Ko(this.ids.isJsonConst,s.createStringLiteral("json"),s.createStringLiteral("text"))),void 0,[])),Et=s.createVariableStatement(te,F(this.ids.exampleImplementationConst,nr([this.ids.methodParameter,this.ids.pathParameter,this.ids.paramsArgument],s.createBlock([Je,Zt,ke,We,q,oe,Me]),!0),s.createTypeReferenceNode(this.ids.implementationType))),Xe=s.createExpressionStatement(s.createCallExpression(s.createPropertyAccessExpression(this.ids.clientConst,this.ids.provideMethod),void 0,[s.createStringLiteral("get"),s.createStringLiteral("/v1/user/retrieve"),s.createObjectLiteralExpression([s.createPropertyAssignment("id",s.createStringLiteral("10"))])])),Ue=s.createVariableStatement(void 0,F(this.ids.clientConst,s.createNewExpression(this.ids.clientClass,void 0,[this.ids.exampleImplementationConst])));this.usage.push(Et,Ue,Xe)}printUsage(t){return this.usage.length?this.usage.map(r=>typeof r=="string"?r:ar(r,t)).join(`
|
|
18
|
+
`))};var ao=e=>{e.startupLogo!==!1&&no(process.stdout);let t=e.errorHandler||Ce,r=Lr(e.logger)?e.logger:new Ze(e.logger);r.debug("Running",{build:"v21.1.0 (CJS)",env:process.env.NODE_ENV||"development"}),ro(r);let o=eo({logger:r,config:e}),i={getLogger:to(r),errorHandler:t},a=Jr(i),p=Qr(i);return{...i,logger:r,notFoundHandler:a,parserFailureHandler:p,loggingMiddleware:o}},po=(e,t)=>{let{logger:r,getLogger:o,notFoundHandler:n,loggingMiddleware:i}=ao(e);return Vt({app:e.app.use(i),routing:t,getLogger:o,config:e}),{notFoundHandler:n,logger:r}},co=async(e,t)=>{let{logger:r,getLogger:o,notFoundHandler:n,parserFailureHandler:i,loggingMiddleware:a}=ao(e),p=(0,xt.default)().disable("x-powered-by").use(a);if(e.compression){let y=await Ne("compression");p.use(y(typeof e.compression=="object"?e.compression:void 0))}let d={json:[e.jsonParser||xt.default.json()],raw:[e.rawParser||xt.default.raw(),Xr],upload:e.upload?await Wr({config:e,getLogger:o}):[]};await e.beforeRouting?.({app:p,getLogger:o}),Vt({app:p,routing:t,getLogger:o,config:e,parsers:d}),p.use(i,n);let c=[],u=(y,b)=>()=>y.listen(b,()=>r.info("Listening",b)),m=[];if(e.http){let y=so.default.createServer(p);c.push(y),m.push(u(y,e.http.listen))}if(e.https){let y=io.default.createServer(e.https.options,p);c.push(y),m.push(u(y,e.https.listen))}return e.gracefulShutdown&&oo({logger:r,servers:c,options:e.gracefulShutdown===!0?{}:e.gracefulShutdown}),{app:p,logger:r,servers:m.map(y=>y())}};var wo=require("openapi3-ts/oas31"),Ot=require("ramda");var Y=require("openapi3-ts/oas31"),l=require("ramda"),S=require("zod");var fe=(e,{onEach:t,rules:r,onMissing:o,ctx:n={}})=>{let i=r[e._def[x]?.brand]||r[e._def.typeName],p=i?i(e,{...n,next:c=>fe(c,{ctx:n,onEach:t,rules:r,onMissing:o})}):o(e,n),d=t&&t(e,{prev:p,...n});return d?{...p,...d}:p};var lo=50,uo="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString",fn={integer:0,number:0,string:"",boolean:!1,object:{},null:null,array:[]},fo=/:([A-Za-z0-9_]+)/g,yn=e=>e.match(fo)?.map(t=>t.slice(1))||[],yo=e=>e.replace(fo,t=>`{${t.slice(1)}}`),gn=({_def:e},{next:t})=>({...t(e.innerType),default:e[x]?.defaultLabel||e.defaultValue()}),hn=({_def:{innerType:e}},{next:t})=>t(e),xn=()=>({format:"any"}),bn=({},e)=>{if(e.isResponse)throw new I("Please use ez.upload() only for input.",e);return{type:"string",format:"binary"}},Sn=e=>{let t=e.unwrap();return{type:"string",format:t instanceof S.z.ZodString?t._def.checks.find(r=>r.kind==="base64")?"byte":"file":"binary"}},Tn=({options:e},{next:t})=>({oneOf:e.map(t)}),On=({options:e,discriminator:t},{next:r})=>({discriminator:{propertyName:t},oneOf:e.map(r)}),Rn=(e,t)=>{if(Array.isArray(e)&&Array.isArray(t))return(0,l.concat)(e,t);if(e===t)return t;throw new Error("Can not flatten properties")},An=e=>{let[t,r]=e.filter(Y.isSchemaObject).filter(n=>n.type==="object"&&Object.keys(n).every(i=>["type","properties","required","examples"].includes(i)));if(!t||!r)throw new Error("Can not flatten objects");let o={type:"object"};return(t.properties||r.properties)&&(o.properties=(0,l.mergeDeepWith)(Rn,t.properties||{},r.properties||{})),(t.required||r.required)&&(o.required=(0,l.union)(t.required||[],r.required||[])),(t.examples||r.examples)&&(o.examples=ae(t.examples||[],r.examples||[],([n,i])=>(0,l.mergeDeepRight)(n,i))),o},Pn=({_def:{left:e,right:t}},{next:r})=>{let o=[e,t].map(r);try{return An(o)}catch{}return{allOf:o}},wn=(e,{next:t})=>t(e.unwrap()),zn=(e,{next:t})=>t(e.unwrap()),Cn=(e,{next:t})=>{let r=t(e.unwrap());return(0,Y.isSchemaObject)(r)&&(r.type=ho(r)),r},go=e=>{let t=(0,l.toLower)((0,l.type)(e));return typeof e=="bigint"?"integer":t==="number"||t==="string"||t==="boolean"||t==="object"||t==="null"||t==="array"?t:void 0},mo=e=>({type:go(Object.values(e.enum)[0]),enum:Object.values(e.enum)}),In=({value:e})=>({type:go(e),const:e}),Zn=(e,{isResponse:t,next:r})=>{let o=Object.keys(e.shape),n=p=>t&&Fe(p)?p instanceof S.z.ZodOptional:p.isOptional(),i=o.filter(p=>!n(e.shape[p])),a={type:"object"};return o.length&&(a.properties=bt(e,r)),i.length&&(a.required=i),a},En=()=>({type:"null"}),vn=({},e)=>{if(e.isResponse)throw new I("Please use ez.dateOut() for output.",e);return{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",pattern:/^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(\.\d+)?)?Z?$/.source,externalDocs:{url:uo}}},jn=({},e)=>{if(!e.isResponse)throw new I("Please use ez.dateIn() for input.",e);return{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",externalDocs:{url:uo}}},Nn=({},e)=>{throw new I(`Using z.date() within ${e.isResponse?"output":"input"} schema is forbidden. Please use ez.date${e.isResponse?"Out":"In"}() instead. Check out the documentation for details.`,e)},Ln=()=>({type:"boolean"}),kn=()=>({type:"integer",format:"bigint"}),Mn=e=>e.every(t=>t instanceof S.z.ZodLiteral),Un=({keySchema:e,valueSchema:t},{next:r})=>{if(e instanceof S.z.ZodEnum||e instanceof S.z.ZodNativeEnum){let o=Object.values(e.enum),n={type:"object"};return o.length&&(n.properties=bt(S.z.object((0,l.fromPairs)((0,l.xprod)(o,[t]))),r),n.required=o),n}if(e instanceof S.z.ZodLiteral)return{type:"object",properties:bt(S.z.object({[e.value]:t}),r),required:[e.value]};if(e instanceof S.z.ZodUnion&&Mn(e.options)){let o=(0,l.map)(i=>`${i.value}`,e.options),n=(0,l.fromPairs)((0,l.xprod)(o,[t]));return{type:"object",properties:bt(S.z.object(n),r),required:o}}return{type:"object",additionalProperties:r(t)}},Hn=({_def:{minLength:e,maxLength:t},element:r},{next:o})=>{let n={type:"array",items:o(r)};return e&&(n.minItems=e.value),t&&(n.maxItems=t.value),n},Kn=({items:e,_def:{rest:t}},{next:r})=>({type:"array",prefixItems:e.map(r),items:t===null?{not:{}}:r(t)}),Dn=({isEmail:e,isURL:t,minLength:r,maxLength:o,isUUID:n,isCUID:i,isCUID2:a,isULID:p,isIP:d,isEmoji:c,isDatetime:u,_def:{checks:m}})=>{let y=m.find(w=>w.kind==="regex"),b=m.find(w=>w.kind==="datetime"),O=y?y.regex:b?b.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,R={type:"string"},h={"date-time":u,email:e,url:t,uuid:n,cuid:i,cuid2:a,ulid:p,ip:d,emoji:c};for(let w in h)if(h[w]){R.format=w;break}return r!==null&&(R.minLength=r),o!==null&&(R.maxLength=o),O&&(R.pattern=O.source),R},Fn=({isInt:e,maxValue:t,minValue:r,_def:{checks:o}})=>{let n=o.find(m=>m.kind==="min"),i=r===null?e?Number.MIN_SAFE_INTEGER:-Number.MAX_VALUE:r,a=n?n.inclusive:!0,p=o.find(m=>m.kind==="max"),d=t===null?e?Number.MAX_SAFE_INTEGER:Number.MAX_VALUE:t,c=p?p.inclusive:!0,u={type:e?"integer":"number",format:e?"int64":"double"};return a?u.minimum=i:u.exclusiveMinimum=i,c?u.maximum=d:u.exclusiveMaximum=d,u},bt=({shape:e},t)=>(0,l.map)(t,e),Bn=e=>{let t=Array.isArray(e.type)?e.type[0]:e.type;return fn?.[t]},ho=({type:e})=>e==="null"?e:typeof e=="string"?[e,"null"]:e?[...new Set(e).add("null")]:"null",qn=(e,{isResponse:t,next:r})=>{let o=r(e.innerType()),{effect:n}=e._def;if(t&&n.type==="transform"&&(0,Y.isSchemaObject)(o)){let i=ot(e,Bn(o));return i&&["number","string","boolean"].includes(i)?{type:i}:r(S.z.any())}if(!t&&n.type==="preprocess"&&(0,Y.isSchemaObject)(o)){let{type:i,...a}=o;return{...a,format:`${a.format||i} (preprocessed)`}}return o},$n=({_def:e},{isResponse:t,next:r})=>r(e[t?"out":"in"]),Gn=(e,{next:t})=>t(e.unwrap()),Vn=(e,{next:t,makeRef:r})=>r(e,()=>t(e.schema)),_n=(e,{next:t})=>t(e.unwrap().shape.raw),xo=e=>e.length?(0,l.fromPairs)((0,l.zip)((0,l.range)(1,e.length+1).map(t=>`example${t}`),(0,l.map)((0,l.objOf)("value"),e))):void 0,bo=(e,t,r=[])=>(0,l.pipe)(V,(0,l.map)((0,l.when)(o=>(0,l.type)(o)==="Object",(0,l.omit)(r))),xo)({schema:e,variant:t?"parsed":"original",validate:!0}),Yn=(e,t)=>(0,l.pipe)(V,(0,l.filter)((0,l.has)(t)),(0,l.pluck)(t),xo)({schema:e,variant:"original",validate:!0}),ye=e=>e instanceof S.z.ZodObject?e:e instanceof S.z.ZodBranded?ye(e.unwrap()):e instanceof S.z.ZodUnion||e instanceof S.z.ZodDiscriminatedUnion?e.options.map(t=>ye(t)).reduce((t,r)=>t.merge(r.partial()),S.z.object({})):e instanceof S.z.ZodEffects?ye(e._def.schema):e instanceof S.z.ZodPipeline?ye(e._def.in):ye(e._def.left).merge(ye(e._def.right)),So=({path:e,method:t,schema:r,inputSources:o,makeRef:n,composition:i,brandHandling:a,description:p=`${t.toUpperCase()} ${e} Parameter`})=>{let{shape:d}=ye(r),c=yn(e),u=o.includes("query"),m=o.includes("params"),y=o.includes("headers"),b=h=>m&&c.includes(h),O=h=>y&&Nt(h);return Object.keys(d).map(h=>({name:h,location:b(h)?"path":O(h)?"header":u?"query":void 0})).filter(h=>h.location!==void 0).map(({name:h,location:w})=>{let N=fe(d[h],{rules:{...a,...Yt},onEach:Qt,onMissing:Jt,ctx:{isResponse:!1,makeRef:n,path:e,method:t}}),U=i==="components"?n(d[h],N,k(p,h)):N;return{name:h,in:w,required:!d[h].isOptional(),description:N.description||p,schema:U,examples:Yn(r,h)}})},Yt={ZodString:Dn,ZodNumber:Fn,ZodBigInt:kn,ZodBoolean:Ln,ZodNull:En,ZodArray:Hn,ZodTuple:Kn,ZodRecord:Un,ZodObject:Zn,ZodLiteral:In,ZodIntersection:Pn,ZodUnion:Tn,ZodAny:xn,ZodDefault:gn,ZodEnum:mo,ZodNativeEnum:mo,ZodEffects:qn,ZodOptional:wn,ZodNullable:Cn,ZodDiscriminatedUnion:On,ZodBranded:Gn,ZodDate:Nn,ZodCatch:hn,ZodPipeline:$n,ZodLazy:Vn,ZodReadonly:zn,[D]:Sn,[Oe]:bn,[le]:jn,[de]:vn,[ee]:_n},Qt=(e,{isResponse:t,prev:r})=>{if((0,Y.isReferenceObject)(r))return{};let{description:o}=e,n=e instanceof S.z.ZodLazy,i=r.type!==void 0,a=t&&Fe(e),p=!n&&i&&!a&&e.isNullable(),d={};if(o&&(d.description=o),p&&(d.type=ho(r)),!n){let c=V({schema:e,variant:t?"parsed":"original",validate:!0});c.length&&(d.examples=c.slice())}return d},Jt=(e,t)=>{throw new I(`Zod type ${e.constructor.name} is unsupported.`,t)},_t=(e,t)=>{if((0,Y.isReferenceObject)(e))return e;let r={...e};return r.properties&&(r.properties=(0,l.omit)(t,r.properties)),r.examples&&(r.examples=r.examples.map(o=>(0,l.omit)(t,o))),r.required&&(r.required=r.required.filter(o=>!t.includes(o))),r.allOf&&(r.allOf=r.allOf.map(o=>_t(o,t))),r.oneOf&&(r.oneOf=r.oneOf.map(o=>_t(o,t))),r},To=e=>(0,Y.isReferenceObject)(e)?e:(0,l.omit)(["examples"],e),Oo=({method:e,path:t,schema:r,mimeTypes:o,variant:n,makeRef:i,composition:a,hasMultipleStatusCodes:p,statusCode:d,brandHandling:c,description:u=`${e.toUpperCase()} ${t} ${Lt(n)} response ${p?d:""}`.trim()})=>{if(!o)return{description:u};let m=To(fe(r,{rules:{...c,...Yt},onEach:Qt,onMissing:Jt,ctx:{isResponse:!0,makeRef:i,path:t,method:e}})),y={schema:a==="components"?i(r,m,k(u)):m,examples:bo(r,!0)};return{description:u,content:(0,l.fromPairs)((0,l.xprod)(o,[y]))}},Qn=()=>({type:"http",scheme:"basic"}),Jn=({format:e})=>{let t={type:"http",scheme:"bearer"};return e&&(t.bearerFormat=e),t},Wn=({name:e},t)=>{let r={type:"apiKey",in:"query",name:e};return t?.includes("body")&&(t?.includes("query")?(r["x-in-alternative"]="body",r.description=`${e} CAN also be supplied within the request body`):(r["x-in-actual"]="body",r.description=`${e} MUST be supplied within the request body instead of query`)),r},Xn=({name:e})=>({type:"apiKey",in:"header",name:e}),es=({name:e})=>({type:"apiKey",in:"cookie",name:e}),ts=({url:e})=>({type:"openIdConnect",openIdConnectUrl:e}),rs=({flows:e={}})=>({type:"oauth2",flows:(0,l.map)(t=>({...t,scopes:t.scopes||{}}),(0,l.reject)(l.isNil,e))}),Ro=(e,t)=>{let r={basic:Qn,bearer:Jn,input:Wn,header:Xn,cookie:es,openid:ts,oauth2:rs};return mt(e,o=>r[o.type](o,t))},St=e=>"or"in e?e.or.map(t=>"and"in t?(0,l.mergeAll)((0,l.map)(({name:r,scopes:o})=>(0,l.objOf)(r,o),t.and)):{[t.name]:t.scopes}):"and"in e?St(Dt(e)):St({or:[e]}),Ao=({method:e,path:t,schema:r,mimeType:o,makeRef:n,composition:i,brandHandling:a,paramNames:p,description:d=`${e.toUpperCase()} ${t} Request body`})=>{let c=To(_t(fe(r,{rules:{...a,...Yt},onEach:Qt,onMissing:Jt,ctx:{isResponse:!1,makeRef:n,path:t,method:e}}),p)),u={schema:i==="components"?n(r,c,k(d)):c,examples:bo(r,!1,p)};return{description:d,content:{[o]:u}}},Po=e=>Object.keys(e).map(t=>{let r=e[t],o={name:t,description:typeof r=="string"?r:r.description};return typeof r=="object"&&r.url&&(o.externalDocs={url:r.url}),o}),Wt=e=>e.length<=lo?e:e.slice(0,lo-1)+"\u2026";var Tt=class extends wo.OpenApiBuilder{lastSecuritySchemaIds=new Map;lastOperationIdSuffixes=new Map;responseVariants=(0,Ot.keys)(ue);references=new Map;makeRef(t,r,o=this.references.get(t)){return o||(o=`Schema${this.references.size+1}`,this.references.set(t,o),typeof r=="function"&&(r=r())),typeof r=="object"&&this.addSchema(o,r),{$ref:`#/components/schemas/${o}`}}ensureUniqOperationId(t,r,o){let n=o||k(r,t),i=this.lastOperationIdSuffixes.get(n);if(i===void 0)return this.lastOperationIdSuffixes.set(n,1),n;if(o)throw new I(`Duplicated operationId: "${o}"`,{method:r,isResponse:!1,path:t});return i++,this.lastOperationIdSuffixes.set(n,i),`${n}${i}`}ensureUniqSecuritySchemaName(t){let r=JSON.stringify(t);for(let n in this.rootDoc.components?.securitySchemes||{})if(r===JSON.stringify(this.rootDoc.components?.securitySchemes?.[n]))return n;let o=(this.lastSecuritySchemaIds.get(t.type)||0)+1;return this.lastSecuritySchemaIds.set(t.type,o),`${t.type.toUpperCase()}_${o}`}constructor({routing:t,config:r,title:o,version:n,serverUrl:i,descriptions:a,brandHandling:p,hasSummaryFromDescription:d=!0,composition:c="inline"}){super(),this.addInfo({title:o,version:n});for(let m of typeof i=="string"?[i]:i)this.addServer({url:m});Le({routing:t,onEndpoint:(m,y,b)=>{let O={path:y,method:b,endpoint:m,composition:c,brandHandling:p,makeRef:this.makeRef.bind(this)},[R,h]=["short","long"].map(m.getDescription.bind(m)),w=R?Wt(R):d&&h?Wt(h):void 0,N=m.getTags(),U=r.inputSources?.[b]||vt[b],B=this.ensureUniqOperationId(y,b,m.getOperationId(b)),ke=So({...O,inputSources:U,schema:m.getSchema("input"),description:a?.requestParameter?.call(null,{method:b,path:y,operationId:B})}),Je={};for(let q of this.responseVariants){let oe=m.getResponses(q);for(let{mimeTypes:Me,schema:Et,statusCodes:Xe}of oe)for(let Ue of Xe)Je[Ue]=Oo({...O,variant:q,schema:Et,mimeTypes:Me,statusCode:Ue,hasMultipleStatusCodes:oe.length>1||Xe.length>1,description:a?.[`${q}Response`]?.call(null,{method:b,path:y,operationId:B,statusCode:Ue})})}let Zt=U.includes("body")?Ao({...O,paramNames:(0,Ot.pluck)("name",ke),schema:m.getSchema("input"),mimeType:A[m.getRequestType()],description:a?.requestBody?.call(null,{method:b,path:y,operationId:B})}):void 0,We=St(mt(Ro(m.getSecurity(),U),q=>{let oe=this.ensureUniqSecuritySchemaName(q),Me=["oauth2","openIdConnect"].includes(q.type)?m.getScopes().slice():[];return this.addSecurityScheme(oe,q),{name:oe,scopes:Me}}));this.addPath(yo(y),{[b]:{operationId:B,summary:w,description:h,tags:N.length>0?N:void 0,parameters:ke.length>0?ke:void 0,requestBody:Zt,security:We.length>0?We:void 0,responses:Je}})}}),this.rootDoc.tags=r.tags?Po(r.tags):[]}};var Rt=require("node-mocks-http"),os=e=>(0,Rt.createRequest)({...e,headers:{"content-type":A.json,...e?.headers}}),ns=e=>(0,Rt.createResponse)(e),ss=e=>{let t={warn:[],error:[],info:[],debug:[]};return new Proxy(e||{},{get(r,o,n){return o==="_getLogs"?()=>t:kr(o)?(...i)=>t[o].push(i):Reflect.get(r,o,n)}})},zo=({requestProps:e,responseOptions:t,configProps:r,loggerProps:o})=>{let n=os(e),i=ns({req:n,...t});i.req=t?.req||n,n.res=i;let a=ss(o),p={cors:!1,logger:a,...r};return{requestMock:n,responseMock:i,loggerMock:a,configMock:p}},Co=async({endpoint:e,...t})=>{let{requestMock:r,responseMock:o,loggerMock:n,configMock:i}=zo(t);return await e.execute({request:r,response:o,config:i,logger:n}),{requestMock:r,responseMock:o,loggerMock:n}},Io=async({middleware:e,options:t={},errorHandler:r,...o})=>{let{requestMock:n,responseMock:i,loggerMock:a,configMock:p}=zo(o),d=rt(n,p.inputSources);try{let c=await e.execute({request:n,response:i,logger:a,input:d,options:t});return{requestMock:n,responseMock:i,loggerMock:a,output:c}}catch(c){if(!r)throw c;return r(X(c),i),{requestMock:n,responseMock:i,loggerMock:a,output:{}}}};var j=z(require("typescript"),1),$o=require("zod");var v=z(require("typescript"),1),Xt=require("ramda"),s=v.default.factory,te=[s.createModifier(v.default.SyntaxKind.ExportKeyword)],is=[s.createModifier(v.default.SyntaxKind.AsyncKeyword)],as=[s.createModifier(v.default.SyntaxKind.PublicKeyword),s.createModifier(v.default.SyntaxKind.ReadonlyKeyword)],Zo=[s.createModifier(v.default.SyntaxKind.ProtectedKeyword),s.createModifier(v.default.SyntaxKind.ReadonlyKeyword)],ps=s.createTemplateHead(""),cs=s.createTemplateMiddle(" "),Ye=s.createTemplateTail(""),er=e=>s.createTemplateLiteralType(ps,e.map((t,r)=>s.createTemplateLiteralTypeSpan(s.createTypeReferenceNode(t),r===e.length-1?Ye:cs))),tr=er(["M","P"]),At=(e,t,r)=>s.createParameterDeclaration(r,void 0,e,void 0,t,void 0),Pt=(e,t)=>(0,Xt.chain)(([r,o])=>[At(s.createIdentifier(r),o,t)],Object.entries(e)),rr=(e,t)=>s.createExpressionWithTypeArguments(s.createIdentifier("Record"),[typeof e=="number"?s.createKeywordTypeNode(e):s.createTypeReferenceNode(e),s.createKeywordTypeNode(t)]),Eo=e=>s.createConstructorDeclaration(void 0,e,s.createBlock([])),vo=(e,t)=>s.createPropertySignature(void 0,e,void 0,s.createTypeReferenceNode(t)),F=(e,t,r)=>s.createVariableDeclarationList([s.createVariableDeclaration(e,void 0,r,t)],v.default.NodeFlags.Const),or=(e,t)=>s.createTypeAliasDeclaration(te,e,void 0,s.createUnionTypeNode(t.map(r=>s.createLiteralTypeNode(s.createStringLiteral(r))))),wt=(e,t)=>s.createTypeAliasDeclaration(te,e,void 0,t),jo=(e,t,r)=>s.createPropertyDeclaration(as,e,void 0,t,r),No=(e,t,r)=>s.createClassDeclaration(te,e,void 0,void 0,[t,...r]),Lo=(e,t)=>s.createTypeReferenceNode("Promise",[s.createIndexedAccessTypeNode(s.createTypeReferenceNode(e),t)]),ko=()=>s.createTypeReferenceNode("Promise",[s.createKeywordTypeNode(v.default.SyntaxKind.AnyKeyword)]),Mo=(e,t,r)=>s.createInterfaceDeclaration(te,e,void 0,t,r),ds=(0,Xt.chain)(([e,t])=>[s.createTypeParameterDeclaration([],e,s.createTypeReferenceNode(t))]),Uo=e=>ds(Object.entries(e)),nr=(e,t,r)=>s.createArrowFunction(r?is:void 0,void 0,e.map(o=>At(o)),void 0,void 0,t),sr=(e,t,r)=>s.createCallExpression(s.createPropertyAccessExpression(s.createCallExpression(s.createPropertyAccessExpression(s.createIdentifier("Object"),"keys"),void 0,[e]),"reduce"),void 0,[s.createArrowFunction(void 0,void 0,Pt({acc:void 0,key:void 0}),void 0,void 0,t),r]),Ho=(...e)=>`"${e.join(" ")}"`,Ko=(e,t,r)=>s.createConditionalExpression(e,s.createToken(v.default.SyntaxKind.QuestionToken),t,s.createToken(v.default.SyntaxKind.ColonToken),r);var Do=["get","post","put","delete","patch"];var g=z(require("typescript"),1),Ct=require("zod");var T=z(require("typescript"),1),{factory:zt}=T.default,ir=(e,t)=>T.default.addSyntheticLeadingComment(e,T.default.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0),ge=(e,t,r)=>{let o=zt.createTypeAliasDeclaration(void 0,zt.createIdentifier(t),void 0,e);return r?ir(o,r):o},ar=(e,t)=>{let r=T.default.createSourceFile("print.ts","",T.default.ScriptTarget.Latest,!1,T.default.ScriptKind.TS);return T.default.createPrinter(t).printNode(T.default.EmitHint.Unspecified,e,r)},ls=/^[A-Za-z_$][A-Za-z0-9_$]*$/,Fo=e=>ls.test(e)?zt.createIdentifier(e):zt.createStringLiteral(e),ms=[T.default.SyntaxKind.AnyKeyword,T.default.SyntaxKind.BigIntKeyword,T.default.SyntaxKind.BooleanKeyword,T.default.SyntaxKind.NeverKeyword,T.default.SyntaxKind.NumberKeyword,T.default.SyntaxKind.ObjectKeyword,T.default.SyntaxKind.StringKeyword,T.default.SyntaxKind.SymbolKeyword,T.default.SyntaxKind.UndefinedKeyword,T.default.SyntaxKind.UnknownKeyword,T.default.SyntaxKind.VoidKeyword],Bo=e=>ms.includes(e.kind);var{factory:f}=g.default,us={[g.default.SyntaxKind.AnyKeyword]:"",[g.default.SyntaxKind.BigIntKeyword]:BigInt(0),[g.default.SyntaxKind.BooleanKeyword]:!1,[g.default.SyntaxKind.NumberKeyword]:0,[g.default.SyntaxKind.ObjectKeyword]:{},[g.default.SyntaxKind.StringKeyword]:"",[g.default.SyntaxKind.UndefinedKeyword]:void 0},fs=({value:e})=>f.createLiteralTypeNode(typeof e=="number"?f.createNumericLiteral(e):typeof e=="boolean"?e?f.createTrue():f.createFalse():f.createStringLiteral(e)),ys=({shape:e},{isResponse:t,next:r,optionalPropStyle:{withQuestionMark:o}})=>{let n=Object.entries(e).map(([i,a])=>{let p=t&&Fe(a)?a instanceof Ct.z.ZodOptional:a.isOptional(),d=f.createPropertySignature(void 0,Fo(i),p&&o?f.createToken(g.default.SyntaxKind.QuestionToken):void 0,r(a));return a.description?ir(d,a.description):d});return f.createTypeLiteralNode(n)},gs=({element:e},{next:t})=>f.createArrayTypeNode(t(e)),hs=({options:e})=>f.createUnionTypeNode(e.map(t=>f.createLiteralTypeNode(f.createStringLiteral(t)))),qo=({options:e},{next:t})=>{let r=new Map;for(let o of e){let n=t(o);r.set(Bo(n)?n.kind:n,n)}return f.createUnionTypeNode(Array.from(r.values()))},xs=e=>us?.[e.kind],bs=(e,{next:t,isResponse:r})=>{let o=t(e.innerType());if(r&&e._def.effect.type==="transform"){let n=ot(e,xs(o)),i={number:g.default.SyntaxKind.NumberKeyword,bigint:g.default.SyntaxKind.BigIntKeyword,boolean:g.default.SyntaxKind.BooleanKeyword,string:g.default.SyntaxKind.StringKeyword,undefined:g.default.SyntaxKind.UndefinedKeyword,object:g.default.SyntaxKind.ObjectKeyword};return f.createKeywordTypeNode(n&&i[n]||g.default.SyntaxKind.AnyKeyword)}return o},Ss=e=>f.createUnionTypeNode(Object.values(e.enum).map(t=>f.createLiteralTypeNode(typeof t=="number"?f.createNumericLiteral(t):f.createStringLiteral(t)))),Ts=(e,{next:t,optionalPropStyle:{withUndefined:r}})=>{let o=t(e.unwrap());return r?f.createUnionTypeNode([o,f.createKeywordTypeNode(g.default.SyntaxKind.UndefinedKeyword)]):o},Os=(e,{next:t})=>f.createUnionTypeNode([t(e.unwrap()),f.createLiteralTypeNode(f.createNull())]),Rs=({items:e,_def:{rest:t}},{next:r})=>f.createTupleTypeNode(e.map(r).concat(t===null?[]:f.createRestTypeNode(r(t)))),As=({keySchema:e,valueSchema:t},{next:r})=>f.createExpressionWithTypeArguments(f.createIdentifier("Record"),[e,t].map(r)),Ps=({_def:{left:e,right:t}},{next:r})=>{let o=[e,t].map(r);return o.every(g.default.isTypeLiteralNode)?f.createTypeLiteralNode(o.flatMap(({members:i})=>i)):f.createIntersectionTypeNode(o)},ws=({_def:e},{next:t})=>t(e.innerType),re=e=>()=>f.createKeywordTypeNode(e),zs=(e,{next:t})=>t(e.unwrap()),Cs=(e,{next:t})=>t(e.unwrap()),Is=({_def:e},{next:t})=>t(e.innerType),Zs=({_def:e},{next:t,isResponse:r})=>t(e[r?"out":"in"]),Es=()=>f.createLiteralTypeNode(f.createNull()),vs=(e,{makeAlias:t,next:r})=>t(e,()=>r(e.schema)),js=e=>{let t=e.unwrap(),r=f.createKeywordTypeNode(g.default.SyntaxKind.StringKeyword),o=f.createTypeReferenceNode("Buffer"),n=f.createUnionTypeNode([r,o]);return t instanceof Ct.z.ZodString?r:t instanceof Ct.z.ZodUnion?n:o},Ns=(e,{next:t})=>t(e.unwrap().shape.raw),Ls={ZodString:re(g.default.SyntaxKind.StringKeyword),ZodNumber:re(g.default.SyntaxKind.NumberKeyword),ZodBigInt:re(g.default.SyntaxKind.BigIntKeyword),ZodBoolean:re(g.default.SyntaxKind.BooleanKeyword),ZodAny:re(g.default.SyntaxKind.AnyKeyword),ZodUndefined:re(g.default.SyntaxKind.UndefinedKeyword),[de]:re(g.default.SyntaxKind.StringKeyword),[le]:re(g.default.SyntaxKind.StringKeyword),ZodNull:Es,ZodArray:gs,ZodTuple:Rs,ZodRecord:As,ZodObject:ys,ZodLiteral:fs,ZodIntersection:Ps,ZodUnion:qo,ZodDefault:ws,ZodEnum:hs,ZodNativeEnum:Ss,ZodEffects:bs,ZodOptional:Ts,ZodNullable:Os,ZodDiscriminatedUnion:qo,ZodBranded:zs,ZodCatch:Is,ZodPipeline:Zs,ZodLazy:vs,ZodReadonly:Cs,[D]:js,[ee]:Ns},Qe=(e,{brandHandling:t,ctx:r})=>fe(e,{rules:{...t,...Ls},onMissing:()=>f.createKeywordTypeNode(g.default.SyntaxKind.AnyKeyword),ctx:r});var It=class{program=[];usage=[];registry=new Map;paths=[];aliases=new Map;ids={pathType:s.createIdentifier("Path"),methodType:s.createIdentifier("Method"),methodPathType:s.createIdentifier("MethodPath"),inputInterface:s.createIdentifier("Input"),posResponseInterface:s.createIdentifier("PositiveResponse"),negResponseInterface:s.createIdentifier("NegativeResponse"),responseInterface:s.createIdentifier("Response"),jsonEndpointsConst:s.createIdentifier("jsonEndpoints"),endpointTagsConst:s.createIdentifier("endpointTags"),providerType:s.createIdentifier("Provider"),implementationType:s.createIdentifier("Implementation"),clientClass:s.createIdentifier("ExpressZodAPIClient"),keyParameter:s.createIdentifier("key"),pathParameter:s.createIdentifier("path"),paramsArgument:s.createIdentifier("params"),methodParameter:s.createIdentifier("method"),accumulator:s.createIdentifier("acc"),provideMethod:s.createIdentifier("provide"),implementationArgument:s.createIdentifier("implementation"),headersProperty:s.createIdentifier("headers"),hasBodyConst:s.createIdentifier("hasBody"),undefinedValue:s.createIdentifier("undefined"),bodyProperty:s.createIdentifier("body"),responseConst:s.createIdentifier("response"),searchParamsConst:s.createIdentifier("searchParams"),exampleImplementationConst:s.createIdentifier("exampleImplementation"),clientConst:s.createIdentifier("client"),contentTypeConst:s.createIdentifier("contentType"),isJsonConst:s.createIdentifier("isJSON")};interfaces=[];makeAlias(t,r){let o=this.aliases.get(t)?.name?.text;if(!o){o=`Type${this.aliases.size+1}`;let n=s.createLiteralTypeNode(s.createNull());this.aliases.set(t,ge(n,o)),this.aliases.set(t,ge(r(),o))}return s.createTypeReferenceNode(o)}constructor({routing:t,brandHandling:r,variant:o="client",splitResponse:n=!1,optionalPropStyle:i={withQuestionMark:!0,withUndefined:!0},noContent:a=$o.z.undefined()}){Le({routing:t,onEndpoint:($,H,ne)=>{let he={makeAlias:this.makeAlias.bind(this),optionalPropStyle:i},He=k(ne,H,"input"),Ke=Qe($.getSchema("input"),{brandHandling:r,ctx:{...he,isResponse:!1}}),L=n?k(ne,H,"positive.response"):void 0,pr=$.getResponses("positive").map(({schema:G,mimeTypes:se})=>se?G:a).reduce((G,se)=>G.or(se)),cr=n?Qe(pr,{brandHandling:r,ctx:{...he,isResponse:!0}}):void 0,De=n?k(ne,H,"negative.response"):void 0,dr=$.getResponses("negative").map(({schema:G,mimeTypes:se})=>se?G:a).reduce((G,se)=>G.or(se)),lr=n?Qe(dr,{brandHandling:r,ctx:{...he,isResponse:!0}}):void 0,mr=k(ne,H,"response"),Vo=L&&De?s.createUnionTypeNode([s.createTypeReferenceNode(L),s.createTypeReferenceNode(De)]):Qe(pr.or(dr),{brandHandling:r,ctx:{...he,isResponse:!0}});this.program.push(ge(Ke,He)),cr&&L&&this.program.push(ge(cr,L)),lr&&De&&this.program.push(ge(lr,De)),this.program.push(ge(Vo,mr)),this.paths.push(H),this.registry.set({method:ne,path:H},{input:He,positive:L,negative:De,response:mr,isJson:$.getResponses("positive").some(G=>G.mimeTypes?.includes(A.json)),tags:$.getTags()})}}),this.program.unshift(...this.aliases.values()),this.program.push(or(this.ids.pathType,this.paths)),this.program.push(or(this.ids.methodType,Do)),this.program.push(wt(this.ids.methodPathType,er([this.ids.methodType,this.ids.pathType])));let p=[s.createHeritageClause(j.default.SyntaxKind.ExtendsKeyword,[rr(this.ids.methodPathType,j.default.SyntaxKind.AnyKeyword)])];this.interfaces.push({id:this.ids.inputInterface,kind:"input",props:[]}),n&&this.interfaces.push({id:this.ids.posResponseInterface,kind:"positive",props:[]},{id:this.ids.negResponseInterface,kind:"negative",props:[]}),this.interfaces.push({id:this.ids.responseInterface,kind:"response",props:[]});let d=[],c=[];for(let[{method:$,path:H},{isJson:ne,tags:he,...He}]of this.registry){let Ke=Ho($,H);for(let L of this.interfaces)L.kind in He&&L.props.push(vo(Ke,He[L.kind]));o!=="types"&&(ne&&d.push(s.createPropertyAssignment(Ke,s.createTrue())),c.push(s.createPropertyAssignment(Ke,s.createArrayLiteralExpression(he.map(L=>s.createStringLiteral(L))))))}for(let{id:$,props:H}of this.interfaces)this.program.push(Mo($,p,H));if(o==="types")return;let u=s.createVariableStatement(te,F(this.ids.jsonEndpointsConst,s.createObjectLiteralExpression(d))),m=s.createVariableStatement(te,F(this.ids.endpointTagsConst,s.createObjectLiteralExpression(c))),y=wt(this.ids.providerType,s.createFunctionTypeNode(Uo({M:this.ids.methodType,P:this.ids.pathType}),Pt({method:s.createTypeReferenceNode("M"),path:s.createTypeReferenceNode("P"),params:s.createIndexedAccessTypeNode(s.createTypeReferenceNode(this.ids.inputInterface),tr)}),Lo(this.ids.responseInterface,tr))),b=wt(this.ids.implementationType,s.createFunctionTypeNode(void 0,Pt({method:s.createTypeReferenceNode(this.ids.methodType),path:s.createKeywordTypeNode(j.default.SyntaxKind.StringKeyword),params:rr(j.default.SyntaxKind.StringKeyword,j.default.SyntaxKind.AnyKeyword)}),ko())),O=s.createTemplateExpression(s.createTemplateHead(":"),[s.createTemplateSpan(this.ids.keyParameter,Ye)]),R=sr(this.ids.paramsArgument,s.createCallExpression(s.createPropertyAccessExpression(this.ids.accumulator,"replace"),void 0,[O,s.createElementAccessExpression(this.ids.paramsArgument,this.ids.keyParameter)]),this.ids.pathParameter),h=sr(this.ids.paramsArgument,s.createConditionalExpression(s.createBinaryExpression(s.createCallExpression(s.createPropertyAccessExpression(this.ids.pathParameter,"indexOf"),void 0,[O]),j.default.SyntaxKind.GreaterThanEqualsToken,s.createNumericLiteral(0)),void 0,this.ids.accumulator,void 0,s.createObjectLiteralExpression([s.createSpreadAssignment(this.ids.accumulator),s.createPropertyAssignment(s.createComputedPropertyName(this.ids.keyParameter),s.createElementAccessExpression(this.ids.paramsArgument,this.ids.keyParameter))])),s.createObjectLiteralExpression()),w=No(this.ids.clientClass,Eo([At(this.ids.implementationArgument,s.createTypeReferenceNode(this.ids.implementationType),Zo)]),[jo(this.ids.provideMethod,s.createTypeReferenceNode(this.ids.providerType),nr([this.ids.methodParameter,this.ids.pathParameter,this.ids.paramsArgument],s.createCallExpression(s.createPropertyAccessExpression(s.createThis(),this.ids.implementationArgument),void 0,[this.ids.methodParameter,R,h]),!0))]);this.program.push(u,m,y,b,w);let N=s.createPropertyAssignment(this.ids.methodParameter,s.createCallExpression(s.createPropertyAccessExpression(this.ids.methodParameter,"toUpperCase"),void 0,void 0)),U=s.createPropertyAssignment(this.ids.headersProperty,s.createConditionalExpression(this.ids.hasBodyConst,void 0,s.createObjectLiteralExpression([s.createPropertyAssignment(s.createStringLiteral("Content-Type"),s.createStringLiteral(A.json))]),void 0,this.ids.undefinedValue)),B=s.createPropertyAssignment(this.ids.bodyProperty,s.createConditionalExpression(this.ids.hasBodyConst,void 0,s.createCallExpression(s.createPropertyAccessExpression(s.createIdentifier("JSON"),"stringify"),void 0,[this.ids.paramsArgument]),void 0,this.ids.undefinedValue)),ke=s.createVariableStatement(void 0,F(this.ids.responseConst,s.createAwaitExpression(s.createCallExpression(s.createIdentifier("fetch"),void 0,[s.createTemplateExpression(s.createTemplateHead("https://example.com"),[s.createTemplateSpan(this.ids.pathParameter,s.createTemplateMiddle("")),s.createTemplateSpan(this.ids.searchParamsConst,Ye)]),s.createObjectLiteralExpression([N,U,B])])))),Je=s.createVariableStatement(void 0,F(this.ids.hasBodyConst,s.createLogicalNot(s.createCallExpression(s.createPropertyAccessExpression(s.createArrayLiteralExpression([s.createStringLiteral("get"),s.createStringLiteral("delete")]),"includes"),void 0,[this.ids.methodParameter])))),Zt=s.createVariableStatement(void 0,F(this.ids.searchParamsConst,s.createConditionalExpression(this.ids.hasBodyConst,void 0,s.createStringLiteral(""),void 0,s.createTemplateExpression(s.createTemplateHead("?"),[s.createTemplateSpan(s.createNewExpression(s.createIdentifier("URLSearchParams"),void 0,[this.ids.paramsArgument]),Ye)])))),We=s.createVariableStatement(void 0,F(this.ids.contentTypeConst,s.createCallExpression(s.createPropertyAccessExpression(s.createPropertyAccessExpression(this.ids.responseConst,this.ids.headersProperty),s.createIdentifier("get")),void 0,[s.createStringLiteral("content-type")]))),q=s.createIfStatement(s.createPrefixUnaryExpression(j.default.SyntaxKind.ExclamationToken,this.ids.contentTypeConst),s.createReturnStatement(void 0),void 0),oe=s.createVariableStatement(void 0,F(this.ids.isJsonConst,s.createCallChain(s.createPropertyAccessChain(this.ids.contentTypeConst,void 0,s.createIdentifier("startsWith")),void 0,void 0,[s.createStringLiteral(A.json)]))),Me=s.createReturnStatement(s.createCallExpression(s.createElementAccessExpression(this.ids.responseConst,Ko(this.ids.isJsonConst,s.createStringLiteral("json"),s.createStringLiteral("text"))),void 0,[])),Et=s.createVariableStatement(te,F(this.ids.exampleImplementationConst,nr([this.ids.methodParameter,this.ids.pathParameter,this.ids.paramsArgument],s.createBlock([Je,Zt,ke,We,q,oe,Me]),!0),s.createTypeReferenceNode(this.ids.implementationType))),Xe=s.createExpressionStatement(s.createCallExpression(s.createPropertyAccessExpression(this.ids.clientConst,this.ids.provideMethod),void 0,[s.createStringLiteral("get"),s.createStringLiteral("/v1/user/retrieve"),s.createObjectLiteralExpression([s.createPropertyAssignment("id",s.createStringLiteral("10"))])])),Ue=s.createVariableStatement(void 0,F(this.ids.clientConst,s.createNewExpression(this.ids.clientClass,void 0,[this.ids.exampleImplementationConst])));this.usage.push(Et,Ue,Xe)}printUsage(t){return this.usage.length?this.usage.map(r=>typeof r=="string"?r:ar(r,t)).join(`
|
|
19
19
|
`):void 0}print(t){let r=this.printUsage(t),o=r&&j.default.addSyntheticLeadingComment(j.default.addSyntheticLeadingComment(s.createEmptyStatement(),j.default.SyntaxKind.SingleLineCommentTrivia," Usage example:"),j.default.SyntaxKind.MultiLineCommentTrivia,`
|
|
20
20
|
${r}`);return this.program.concat(o||[]).map((n,i)=>ar(n,i<this.program.length?t:{...t,omitTrailingSemicolon:!0})).join(`
|
|
21
21
|
|
package/dist/index.js
CHANGED
|
@@ -15,7 +15,7 @@ ${n}888${r}
|
|
|
15
15
|
${o}
|
|
16
16
|
`;e.write(d.split(`
|
|
17
17
|
`).map((c,m)=>p[m]?p[m](c):c).join(`
|
|
18
|
-
`))};var Kr=e=>{e.startupLogo!==!1&&Hr(process.stdout);let t=e.errorHandler||je,r=gr(e.logger)?e.logger:new Le(e.logger);r.debug("Running",{build:"v21.1.0-beta.1 (ESM)",env:process.env.NODE_ENV||"development"}),kr(r);let o=Nr({logger:r,config:e}),i={getLogger:Lr(r),errorHandler:t},a=Er(i),p=Zr(i);return{...i,logger:r,notFoundHandler:a,parserFailureHandler:p,loggingMiddleware:o}},Rn=(e,t)=>{let{logger:r,getLogger:o,notFoundHandler:n,loggingMiddleware:i}=Kr(e);return Zt({app:e.app.use(i),routing:t,getLogger:o,config:e}),{notFoundHandler:n,logger:r}},An=async(e,t)=>{let{logger:r,getLogger:o,notFoundHandler:n,parserFailureHandler:i,loggingMiddleware:a}=Kr(e),p=Et().disable("x-powered-by").use(a);if(e.compression){let f=await xe("compression");p.use(f(typeof e.compression=="object"?e.compression:void 0))}let d={json:[e.jsonParser||Et.json()],raw:[e.rawParser||Et.raw(),jr],upload:e.upload?await vr({config:e,getLogger:o}):[]};await e.beforeRouting?.({app:p,getLogger:o}),Zt({app:p,routing:t,getLogger:o,config:e,parsers:d}),p.use(i,n);let c=[],m=(f,x)=>()=>f.listen(x,()=>r.info("Listening",x)),l=[];if(e.http){let f=Tn.createServer(p);c.push(f),l.push(m(f,e.http.listen))}if(e.https){let f=On.createServer(e.https.options,p);c.push(f),l.push(m(f,e.https.listen))}return e.gracefulShutdown&&Mr({logger:r,servers:c,options:e.gracefulShutdown===!0?{}:e.gracefulShutdown}),{app:p,logger:r,servers:l.map(f=>f())}};import{OpenApiBuilder as Cs}from"openapi3-ts/oas31";import{keys as Is,pluck as Zs}from"ramda";import{isReferenceObject as Nt,isSchemaObject as at}from"openapi3-ts/oas31";import{concat as Pn,type as Br,filter as wn,fromPairs as pt,has as zn,isNil as Cn,map as Se,mergeAll as In,mergeDeepRight as Zn,mergeDeepWith as En,objOf as qr,omit as ct,pipe as $r,pluck as vn,range as jn,reject as Nn,toLower as Ln,union as kn,when as Mn,xprod as vt,zip as Un}from"ramda";import{z as b}from"zod";var ie=(e,{onEach:t,rules:r,onMissing:o,ctx:n={}})=>{let i=r[e._def[h]?.brand]||r[e._def.typeName],p=i?i(e,{...n,next:c=>ie(c,{ctx:n,onEach:t,rules:r,onMissing:o})}):o(e,n),d=t&&t(e,{prev:p,...n});return d?{...p,...d}:p};var Dr=50,Gr="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString",Hn={integer:0,number:0,string:"",boolean:!1,object:{},null:null,array:[]},Vr=/:([A-Za-z0-9_]+)/g,Kn=e=>e.match(Vr)?.map(t=>t.slice(1))||[],_r=e=>e.replace(Vr,t=>`{${t.slice(1)}}`),Dn=({_def:e},{next:t})=>({...t(e.innerType),default:e[h]?.defaultLabel||e.defaultValue()}),Fn=({_def:{innerType:e}},{next:t})=>t(e),Bn=()=>({format:"any"}),qn=({},e)=>{if(e.isResponse)throw new C("Please use ez.upload() only for input.",e);return{type:"string",format:"binary"}},$n=e=>{let t=e.unwrap();return{type:"string",format:t instanceof b.ZodString?t._def.checks.find(r=>r.kind==="base64")?"byte":"file":"binary"}},Gn=({options:e},{next:t})=>({oneOf:e.map(t)}),Vn=({options:e,discriminator:t},{next:r})=>({discriminator:{propertyName:t},oneOf:e.map(r)}),_n=(e,t)=>{if(Array.isArray(e)&&Array.isArray(t))return Pn(e,t);if(e===t)return t;throw new Error("Can not flatten properties")},Yn=e=>{let[t,r]=e.filter(at).filter(n=>n.type==="object"&&Object.keys(n).every(i=>["type","properties","required","examples"].includes(i)));if(!t||!r)throw new Error("Can not flatten objects");let o={type:"object"};return(t.properties||r.properties)&&(o.properties=En(_n,t.properties||{},r.properties||{})),(t.required||r.required)&&(o.required=kn(t.required||[],r.required||[])),(t.examples||r.examples)&&(o.examples=ee(t.examples||[],r.examples||[],([n,i])=>Zn(n,i))),o},Qn=({_def:{left:e,right:t}},{next:r})=>{let o=[e,t].map(r);try{return Yn(o)}catch{}return{allOf:o}},Jn=(e,{next:t})=>t(e.unwrap()),Wn=(e,{next:t})=>t(e.unwrap()),Xn=(e,{next:t})=>{let r=t(e.unwrap());return at(r)&&(r.type=Qr(r)),r},Yr=e=>{let t=Ln(Br(e));return typeof e=="bigint"?"integer":t==="number"||t==="string"||t==="boolean"||t==="object"||t==="null"||t==="array"?t:void 0},Fr=e=>({type:Yr(Object.values(e.enum)[0]),enum:Object.values(e.enum)}),es=({value:e})=>({type:Yr(e),const:e}),ts=(e,{isResponse:t,next:r})=>{let o=Object.keys(e.shape),n=p=>t&&Ce(p)?p instanceof b.ZodOptional:p.isOptional(),i=o.filter(p=>!n(e.shape[p])),a={type:"object"};return o.length&&(a.properties=it(e,r)),i.length&&(a.required=i),a},rs=()=>({type:"null"}),os=({},e)=>{if(e.isResponse)throw new C("Please use ez.dateOut() for output.",e);return{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",pattern:/^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(\.\d+)?)?Z?$/.source,externalDocs:{url:Gr}}},ns=({},e)=>{if(!e.isResponse)throw new C("Please use ez.dateIn() for input.",e);return{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",externalDocs:{url:Gr}}},ss=({},e)=>{throw new C(`Using z.date() within ${e.isResponse?"output":"input"} schema is forbidden. Please use ez.date${e.isResponse?"Out":"In"}() instead. Check out the documentation for details.`,e)},is=()=>({type:"boolean"}),as=()=>({type:"integer",format:"bigint"}),ps=e=>e.every(t=>t instanceof b.ZodLiteral),cs=({keySchema:e,valueSchema:t},{next:r})=>{if(e instanceof b.ZodEnum||e instanceof b.ZodNativeEnum){let o=Object.values(e.enum),n={type:"object"};return o.length&&(n.properties=it(b.object(pt(vt(o,[t]))),r),n.required=o),n}if(e instanceof b.ZodLiteral)return{type:"object",properties:it(b.object({[e.value]:t}),r),required:[e.value]};if(e instanceof b.ZodUnion&&ps(e.options)){let o=Se(i=>`${i.value}`,e.options),n=pt(vt(o,[t]));return{type:"object",properties:it(b.object(n),r),required:o}}return{type:"object",additionalProperties:r(t)}},ds=({_def:{minLength:e,maxLength:t},element:r},{next:o})=>{let n={type:"array",items:o(r)};return e&&(n.minItems=e.value),t&&(n.maxItems=t.value),n},ls=({items:e,_def:{rest:t}},{next:r})=>({type:"array",prefixItems:e.map(r),items:t===null?{not:{}}:r(t)}),ms=({isEmail:e,isURL:t,minLength:r,maxLength:o,isUUID:n,isCUID:i,isCUID2:a,isULID:p,isIP:d,isEmoji:c,isDatetime:m,_def:{checks:l}})=>{let f=l.find(P=>P.kind==="regex"),x=l.find(P=>P.kind==="datetime"),T=f?f.regex:x?x.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,O={type:"string"},g={"date-time":m,email:e,url:t,uuid:n,cuid:i,cuid2:a,ulid:p,ip:d,emoji:c};for(let P in g)if(g[P]){O.format=P;break}return r!==null&&(O.minLength=r),o!==null&&(O.maxLength=o),T&&(O.pattern=T.source),O},us=({isInt:e,maxValue:t,minValue:r,_def:{checks:o}})=>{let n=o.find(l=>l.kind==="min"),i=r===null?e?Number.MIN_SAFE_INTEGER:-Number.MAX_VALUE:r,a=n?n.inclusive:!0,p=o.find(l=>l.kind==="max"),d=t===null?e?Number.MAX_SAFE_INTEGER:Number.MAX_VALUE:t,c=p?p.inclusive:!0,m={type:e?"integer":"number",format:e?"int64":"double"};return a?m.minimum=i:m.exclusiveMinimum=i,c?m.maximum=d:m.exclusiveMaximum=d,m},it=({shape:e},t)=>Se(t,e),fs=e=>{let t=Array.isArray(e.type)?e.type[0]:e.type;return Hn?.[t]},Qr=({type:e})=>e==="null"?e:typeof e=="string"?[e,"null"]:e?[...new Set(e).add("null")]:"null",ys=(e,{isResponse:t,next:r})=>{let o=r(e.innerType()),{effect:n}=e._def;if(t&&n.type==="transform"&&at(o)){let i=$e(e,fs(o));return i&&["number","string","boolean"].includes(i)?{type:i}:r(b.any())}if(!t&&n.type==="preprocess"&&at(o)){let{type:i,...a}=o;return{...a,format:`${a.format||i} (preprocessed)`}}return o},gs=({_def:e},{isResponse:t,next:r})=>r(e[t?"out":"in"]),hs=(e,{next:t})=>t(e.unwrap()),xs=(e,{next:t,makeRef:r})=>r(e,()=>t(e.schema)),bs=(e,{next:t})=>t(e.unwrap().shape.raw),Jr=e=>e.length?pt(Un(jn(1,e.length+1).map(t=>`example${t}`),Se(qr("value"),e))):void 0,Wr=(e,t,r=[])=>$r(q,Se(Mn(o=>Br(o)==="Object",ct(r))),Jr)({schema:e,variant:t?"parsed":"original",validate:!0}),Ss=(e,t)=>$r(q,wn(zn(t)),vn(t),Jr)({schema:e,variant:"original",validate:!0}),ae=e=>e instanceof b.ZodObject?e:e instanceof b.ZodBranded?ae(e.unwrap()):e instanceof b.ZodUnion||e instanceof b.ZodDiscriminatedUnion?e.options.map(t=>ae(t)).reduce((t,r)=>t.merge(r.partial()),b.object({})):e instanceof b.ZodEffects?ae(e._def.schema):e instanceof b.ZodPipeline?ae(e._def.in):ae(e._def.left).merge(ae(e._def.right)),Xr=({path:e,method:t,schema:r,inputSources:o,makeRef:n,composition:i,brandHandling:a,description:p=`${t.toUpperCase()} ${e} Parameter`})=>{let{shape:d}=ae(r),c=Kn(e),m=o.includes("query"),l=o.includes("params"),f=o.includes("headers"),x=g=>l&&c.includes(g),T=g=>f&&bt(g);return Object.keys(d).map(g=>({name:g,location:x(g)?"path":T(g)?"header":m?"query":void 0})).filter(g=>g.location!==void 0).map(({name:g,location:P})=>{let w=ie(d[g],{rules:{...a,...Lt},onEach:kt,onMissing:Mt,ctx:{isResponse:!1,makeRef:n,path:e,method:t}}),v=i==="components"?n(d[g],w,I(p,g)):w;return{name:g,in:P,required:!d[g].isOptional(),description:w.description||p,schema:v,examples:Ss(r,g)}})},Lt={ZodString:ms,ZodNumber:us,ZodBigInt:as,ZodBoolean:is,ZodNull:rs,ZodArray:ds,ZodTuple:ls,ZodRecord:cs,ZodObject:ts,ZodLiteral:es,ZodIntersection:Qn,ZodUnion:Gn,ZodAny:Bn,ZodDefault:Dn,ZodEnum:Fr,ZodNativeEnum:Fr,ZodEffects:ys,ZodOptional:Jn,ZodNullable:Xn,ZodDiscriminatedUnion:Vn,ZodBranded:hs,ZodDate:ss,ZodCatch:Fn,ZodPipeline:gs,ZodLazy:xs,ZodReadonly:Wn,[N]:$n,[ue]:qn,[oe]:ns,[re]:os,[$]:bs},kt=(e,{isResponse:t,prev:r})=>{if(Nt(r))return{};let{description:o}=e,n=e instanceof b.ZodLazy,i=r.type!==void 0,a=t&&Ce(e),p=!n&&i&&!a&&e.isNullable(),d={};if(o&&(d.description=o),p&&(d.type=Qr(r)),!n){let c=q({schema:e,variant:t?"parsed":"original",validate:!0});c.length&&(d.examples=c.slice())}return d},Mt=(e,t)=>{throw new C(`Zod type ${e.constructor.name} is unsupported.`,t)},jt=(e,t)=>{if(Nt(e))return e;let r={...e};return r.properties&&(r.properties=ct(t,r.properties)),r.examples&&(r.examples=r.examples.map(o=>ct(t,o))),r.required&&(r.required=r.required.filter(o=>!t.includes(o))),r.allOf&&(r.allOf=r.allOf.map(o=>jt(o,t))),r.oneOf&&(r.oneOf=r.oneOf.map(o=>jt(o,t))),r},eo=e=>Nt(e)?e:ct(["examples"],e),to=({method:e,path:t,schema:r,mimeTypes:o,variant:n,makeRef:i,composition:a,hasMultipleStatusCodes:p,statusCode:d,brandHandling:c,description:m=`${e.toUpperCase()} ${t} ${St(n)} response ${p?d:""}`.trim()})=>{if(!o)return{description:m};let l=eo(ie(r,{rules:{...c,...Lt},onEach:kt,onMissing:Mt,ctx:{isResponse:!0,makeRef:i,path:t,method:e}})),f={schema:a==="components"?i(r,l,I(m)):l,examples:Wr(r,!0)};return{description:m,content:pt(vt(o,[f]))}},Ts=()=>({type:"http",scheme:"basic"}),Os=({format:e})=>{let t={type:"http",scheme:"bearer"};return e&&(t.bearerFormat=e),t},Rs=({name:e},t)=>{let r={type:"apiKey",in:"query",name:e};return t?.includes("body")&&(t?.includes("query")?(r["x-in-alternative"]="body",r.description=`${e} CAN also be supplied within the request body`):(r["x-in-actual"]="body",r.description=`${e} MUST be supplied within the request body instead of query`)),r},As=({name:e})=>({type:"apiKey",in:"header",name:e}),Ps=({name:e})=>({type:"apiKey",in:"cookie",name:e}),ws=({url:e})=>({type:"openIdConnect",openIdConnectUrl:e}),zs=({flows:e={}})=>({type:"oauth2",flows:Se(t=>({...t,scopes:t.scopes||{}}),Nn(Cn,e))}),ro=(e,t)=>{let r={basic:Ts,bearer:Os,input:Rs,header:As,cookie:Ps,openid:ws,oauth2:zs};return et(e,o=>r[o.type](o,t))},dt=e=>"or"in e?e.or.map(t=>"and"in t?In(Se(({name:r,scopes:o})=>qr(r,o),t.and)):{[t.name]:t.scopes}):"and"in e?dt(wt(e)):dt({or:[e]}),oo=({method:e,path:t,schema:r,mimeType:o,makeRef:n,composition:i,brandHandling:a,paramNames:p,description:d=`${e.toUpperCase()} ${t} Request body`})=>{let c=eo(jt(ie(r,{rules:{...a,...Lt},onEach:kt,onMissing:Mt,ctx:{isResponse:!1,makeRef:n,path:t,method:e}}),p)),m={schema:i==="components"?n(r,c,I(d)):c,examples:Wr(r,!1,p)};return{description:d,content:{[o]:m}}},no=e=>Object.keys(e).map(t=>{let r=e[t],o={name:t,description:typeof r=="string"?r:r.description};return typeof r=="object"&&r.url&&(o.externalDocs={url:r.url}),o}),Ut=e=>e.length<=Dr?e:e.slice(0,Dr-1)+"\u2026";var Ht=class extends Cs{lastSecuritySchemaIds=new Map;lastOperationIdSuffixes=new Map;responseVariants=Is(se);references=new Map;makeRef(t,r,o=this.references.get(t)){return o||(o=`Schema${this.references.size+1}`,this.references.set(t,o),typeof r=="function"&&(r=r())),typeof r=="object"&&this.addSchema(o,r),{$ref:`#/components/schemas/${o}`}}ensureUniqOperationId(t,r,o){let n=o||I(r,t),i=this.lastOperationIdSuffixes.get(n);if(i===void 0)return this.lastOperationIdSuffixes.set(n,1),n;if(o)throw new C(`Duplicated operationId: "${o}"`,{method:r,isResponse:!1,path:t});return i++,this.lastOperationIdSuffixes.set(n,i),`${n}${i}`}ensureUniqSecuritySchemaName(t){let r=JSON.stringify(t);for(let n in this.rootDoc.components?.securitySchemes||{})if(r===JSON.stringify(this.rootDoc.components?.securitySchemes?.[n]))return n;let o=(this.lastSecuritySchemaIds.get(t.type)||0)+1;return this.lastSecuritySchemaIds.set(t.type,o),`${t.type.toUpperCase()}_${o}`}constructor({routing:t,config:r,title:o,version:n,serverUrl:i,descriptions:a,brandHandling:p,hasSummaryFromDescription:d=!0,composition:c="inline"}){super(),this.addInfo({title:o,version:n});for(let l of typeof i=="string"?[i]:i)this.addServer({url:l});be({routing:t,onEndpoint:(l,f,x)=>{let T={path:f,method:x,endpoint:l,composition:c,brandHandling:p,makeRef:this.makeRef.bind(this)},[O,g]=["short","long"].map(l.getDescription.bind(l)),P=O?Ut(O):d&&g?Ut(g):void 0,w=l.getTags(),v=r.inputSources?.[x]||ht[x],M=this.ensureUniqOperationId(f,x,l.getOperationId(x)),Te=Xr({...T,inputSources:v,schema:l.getSchema("input"),description:a?.requestParameter?.call(null,{method:x,path:f,operationId:M})}),Ke={};for(let U of this.responseVariants){let Y=l.getResponses(U);for(let{mimeTypes:Oe,schema:gt,statusCodes:Fe}of Y)for(let Re of Fe)Ke[Re]=to({...T,variant:U,schema:gt,mimeTypes:Oe,statusCode:Re,hasMultipleStatusCodes:Y.length>1||Fe.length>1,description:a?.[`${U}Response`]?.call(null,{method:x,path:f,operationId:M,statusCode:Re})})}let yt=v.includes("body")?oo({...T,paramNames:Zs("name",Te),schema:l.getSchema("input"),mimeType:R[l.getRequestType()],description:a?.requestBody?.call(null,{method:x,path:f,operationId:M})}):void 0,De=dt(et(ro(l.getSecurity(),v),U=>{let Y=this.ensureUniqSecuritySchemaName(U),Oe=["oauth2","openIdConnect"].includes(U.type)?l.getScopes().slice():[];return this.addSecurityScheme(Y,U),{name:Y,scopes:Oe}}));this.addPath(_r(f),{[x]:{operationId:M,summary:P,description:g,tags:w.length>0?w:void 0,parameters:Te.length>0?Te:void 0,requestBody:yt,security:De.length>0?De:void 0,responses:Ke}})}}),this.rootDoc.tags=r.tags?no(r.tags):[]}};import{createRequest as Es,createResponse as vs}from"node-mocks-http";var js=e=>Es({...e,headers:{"content-type":R.json,...e?.headers}}),Ns=e=>vs(e),Ls=e=>{let t={warn:[],error:[],info:[],debug:[]};return new Proxy(e||{},{get(r,o,n){return o==="_getLogs"?()=>t:hr(o)?(...i)=>t[o].push(i):Reflect.get(r,o,n)}})},so=({requestProps:e,responseOptions:t,configProps:r,loggerProps:o})=>{let n=js(e),i=Ns({req:n,...t});i.req=t?.req||n,n.res=i;let a=Ls(o),p={cors:!1,logger:a,...r};return{requestMock:n,responseMock:i,loggerMock:a,configMock:p}},ks=async({endpoint:e,...t})=>{let{requestMock:r,responseMock:o,loggerMock:n,configMock:i}=so(t);return await e.execute({request:r,response:o,config:i,logger:n}),{requestMock:r,responseMock:o,loggerMock:n}},Ms=async({middleware:e,options:t={},errorHandler:r,...o})=>{let{requestMock:n,responseMock:i,loggerMock:a,configMock:p}=so(o),d=qe(n,p.inputSources);try{let c=await e.execute({request:n,response:i,logger:a,input:d,options:t});return{requestMock:n,responseMock:i,loggerMock:a,output:c}}catch(c){if(!r)throw c;return r(B(c),i),{requestMock:n,responseMock:i,loggerMock:a,output:{}}}};import E from"typescript";import{z as fi}from"zod";import Z from"typescript";import{chain as io}from"ramda";var s=Z.factory,V=[s.createModifier(Z.SyntaxKind.ExportKeyword)],Us=[s.createModifier(Z.SyntaxKind.AsyncKeyword)],Hs=[s.createModifier(Z.SyntaxKind.PublicKeyword),s.createModifier(Z.SyntaxKind.ReadonlyKeyword)],ao=[s.createModifier(Z.SyntaxKind.ProtectedKeyword),s.createModifier(Z.SyntaxKind.ReadonlyKeyword)],Ks=s.createTemplateHead(""),Ds=s.createTemplateMiddle(" "),Ue=s.createTemplateTail(""),Kt=e=>s.createTemplateLiteralType(Ks,e.map((t,r)=>s.createTemplateLiteralTypeSpan(s.createTypeReferenceNode(t),r===e.length-1?Ue:Ds))),Dt=Kt(["M","P"]),lt=(e,t,r)=>s.createParameterDeclaration(r,void 0,e,void 0,t,void 0),mt=(e,t)=>io(([r,o])=>[lt(s.createIdentifier(r),o,t)],Object.entries(e)),Ft=(e,t)=>s.createExpressionWithTypeArguments(s.createIdentifier("Record"),[typeof e=="number"?s.createKeywordTypeNode(e):s.createTypeReferenceNode(e),s.createKeywordTypeNode(t)]),po=e=>s.createConstructorDeclaration(void 0,e,s.createBlock([])),co=(e,t)=>s.createPropertySignature(void 0,e,void 0,s.createTypeReferenceNode(t)),k=(e,t,r)=>s.createVariableDeclarationList([s.createVariableDeclaration(e,void 0,r,t)],Z.NodeFlags.Const),Bt=(e,t)=>s.createTypeAliasDeclaration(V,e,void 0,s.createUnionTypeNode(t.map(r=>s.createLiteralTypeNode(s.createStringLiteral(r))))),ut=(e,t)=>s.createTypeAliasDeclaration(V,e,void 0,t),lo=(e,t,r)=>s.createPropertyDeclaration(Hs,e,void 0,t,r),mo=(e,t,r)=>s.createClassDeclaration(V,e,void 0,void 0,[t,...r]),uo=(e,t)=>s.createTypeReferenceNode("Promise",[s.createIndexedAccessTypeNode(s.createTypeReferenceNode(e),t)]),fo=()=>s.createTypeReferenceNode("Promise",[s.createKeywordTypeNode(Z.SyntaxKind.AnyKeyword)]),yo=(e,t,r)=>s.createInterfaceDeclaration(V,e,void 0,t,r),Fs=io(([e,t])=>[s.createTypeParameterDeclaration([],e,s.createTypeReferenceNode(t))]),go=e=>Fs(Object.entries(e)),qt=(e,t,r)=>s.createArrowFunction(r?Us:void 0,void 0,e.map(o=>lt(o)),void 0,void 0,t),$t=(e,t,r)=>s.createCallExpression(s.createPropertyAccessExpression(s.createCallExpression(s.createPropertyAccessExpression(s.createIdentifier("Object"),"keys"),void 0,[e]),"reduce"),void 0,[s.createArrowFunction(void 0,void 0,mt({acc:void 0,key:void 0}),void 0,void 0,t),r]),ho=(...e)=>`"${e.join(" ")}"`,xo=(e,t,r)=>s.createConditionalExpression(e,s.createToken(Z.SyntaxKind.QuestionToken),t,s.createToken(Z.SyntaxKind.ColonToken),r);var bo=["get","post","put","delete","patch"];import y from"typescript";import{z as _t}from"zod";import S from"typescript";var{factory:ft}=S,Gt=(e,t)=>S.addSyntheticLeadingComment(e,S.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0),pe=(e,t,r)=>{let o=ft.createTypeAliasDeclaration(void 0,ft.createIdentifier(t),void 0,e);return r?Gt(o,r):o},Vt=(e,t)=>{let r=S.createSourceFile("print.ts","",S.ScriptTarget.Latest,!1,S.ScriptKind.TS);return S.createPrinter(t).printNode(S.EmitHint.Unspecified,e,r)},Bs=/^[A-Za-z_$][A-Za-z0-9_$]*$/,So=e=>Bs.test(e)?ft.createIdentifier(e):ft.createStringLiteral(e),qs=[S.SyntaxKind.AnyKeyword,S.SyntaxKind.BigIntKeyword,S.SyntaxKind.BooleanKeyword,S.SyntaxKind.NeverKeyword,S.SyntaxKind.NumberKeyword,S.SyntaxKind.ObjectKeyword,S.SyntaxKind.StringKeyword,S.SyntaxKind.SymbolKeyword,S.SyntaxKind.UndefinedKeyword,S.SyntaxKind.UnknownKeyword,S.SyntaxKind.VoidKeyword],To=e=>qs.includes(e.kind);var{factory:u}=y,$s={[y.SyntaxKind.AnyKeyword]:"",[y.SyntaxKind.BigIntKeyword]:BigInt(0),[y.SyntaxKind.BooleanKeyword]:!1,[y.SyntaxKind.NumberKeyword]:0,[y.SyntaxKind.ObjectKeyword]:{},[y.SyntaxKind.StringKeyword]:"",[y.SyntaxKind.UndefinedKeyword]:void 0},Gs=({value:e})=>u.createLiteralTypeNode(typeof e=="number"?u.createNumericLiteral(e):typeof e=="boolean"?e?u.createTrue():u.createFalse():u.createStringLiteral(e)),Vs=({shape:e},{isResponse:t,next:r,optionalPropStyle:{withQuestionMark:o}})=>{let n=Object.entries(e).map(([i,a])=>{let p=t&&Ce(a)?a instanceof _t.ZodOptional:a.isOptional(),d=u.createPropertySignature(void 0,So(i),p&&o?u.createToken(y.SyntaxKind.QuestionToken):void 0,r(a));return a.description?Gt(d,a.description):d});return u.createTypeLiteralNode(n)},_s=({element:e},{next:t})=>u.createArrayTypeNode(t(e)),Ys=({options:e})=>u.createUnionTypeNode(e.map(t=>u.createLiteralTypeNode(u.createStringLiteral(t)))),Oo=({options:e},{next:t})=>{let r=new Map;for(let o of e){let n=t(o);r.set(To(n)?n.kind:n,n)}return u.createUnionTypeNode(Array.from(r.values()))},Qs=e=>$s?.[e.kind],Js=(e,{next:t,isResponse:r})=>{let o=t(e.innerType());if(r&&e._def.effect.type==="transform"){let n=$e(e,Qs(o)),i={number:y.SyntaxKind.NumberKeyword,bigint:y.SyntaxKind.BigIntKeyword,boolean:y.SyntaxKind.BooleanKeyword,string:y.SyntaxKind.StringKeyword,undefined:y.SyntaxKind.UndefinedKeyword,object:y.SyntaxKind.ObjectKeyword};return u.createKeywordTypeNode(n&&i[n]||y.SyntaxKind.AnyKeyword)}return o},Ws=e=>u.createUnionTypeNode(Object.values(e.enum).map(t=>u.createLiteralTypeNode(typeof t=="number"?u.createNumericLiteral(t):u.createStringLiteral(t)))),Xs=(e,{next:t,optionalPropStyle:{withUndefined:r}})=>{let o=t(e.unwrap());return r?u.createUnionTypeNode([o,u.createKeywordTypeNode(y.SyntaxKind.UndefinedKeyword)]):o},ei=(e,{next:t})=>u.createUnionTypeNode([t(e.unwrap()),u.createLiteralTypeNode(u.createNull())]),ti=({items:e,_def:{rest:t}},{next:r})=>u.createTupleTypeNode(e.map(r).concat(t===null?[]:u.createRestTypeNode(r(t)))),ri=({keySchema:e,valueSchema:t},{next:r})=>u.createExpressionWithTypeArguments(u.createIdentifier("Record"),[e,t].map(r)),oi=({_def:{left:e,right:t}},{next:r})=>{let o=[e,t].map(r);return o.every(y.isTypeLiteralNode)?u.createTypeLiteralNode(o.flatMap(({members:i})=>i)):u.createIntersectionTypeNode(o)},ni=({_def:e},{next:t})=>t(e.innerType),_=e=>()=>u.createKeywordTypeNode(e),si=(e,{next:t})=>t(e.unwrap()),ii=(e,{next:t})=>t(e.unwrap()),ai=({_def:e},{next:t})=>t(e.innerType),pi=({_def:e},{next:t,isResponse:r})=>t(e[r?"out":"in"]),ci=()=>u.createLiteralTypeNode(u.createNull()),di=(e,{makeAlias:t,next:r})=>t(e,()=>r(e.schema)),li=e=>{let t=e.unwrap(),r=u.createKeywordTypeNode(y.SyntaxKind.StringKeyword),o=u.createTypeReferenceNode("Buffer"),n=u.createUnionTypeNode([r,o]);return t instanceof _t.ZodString?r:t instanceof _t.ZodUnion?n:o},mi=(e,{next:t})=>t(e.unwrap().shape.raw),ui={ZodString:_(y.SyntaxKind.StringKeyword),ZodNumber:_(y.SyntaxKind.NumberKeyword),ZodBigInt:_(y.SyntaxKind.BigIntKeyword),ZodBoolean:_(y.SyntaxKind.BooleanKeyword),ZodAny:_(y.SyntaxKind.AnyKeyword),ZodUndefined:_(y.SyntaxKind.UndefinedKeyword),[re]:_(y.SyntaxKind.StringKeyword),[oe]:_(y.SyntaxKind.StringKeyword),ZodNull:ci,ZodArray:_s,ZodTuple:ti,ZodRecord:ri,ZodObject:Vs,ZodLiteral:Gs,ZodIntersection:oi,ZodUnion:Oo,ZodDefault:ni,ZodEnum:Ys,ZodNativeEnum:Ws,ZodEffects:Js,ZodOptional:Xs,ZodNullable:ei,ZodDiscriminatedUnion:Oo,ZodBranded:si,ZodCatch:ai,ZodPipeline:pi,ZodLazy:di,ZodReadonly:ii,[N]:li,[$]:mi},He=(e,{brandHandling:t,ctx:r})=>ie(e,{rules:{...t,...ui},onMissing:()=>u.createKeywordTypeNode(y.SyntaxKind.AnyKeyword),ctx:r});var Yt=class{program=[];usage=[];registry=new Map;paths=[];aliases=new Map;ids={pathType:s.createIdentifier("Path"),methodType:s.createIdentifier("Method"),methodPathType:s.createIdentifier("MethodPath"),inputInterface:s.createIdentifier("Input"),posResponseInterface:s.createIdentifier("PositiveResponse"),negResponseInterface:s.createIdentifier("NegativeResponse"),responseInterface:s.createIdentifier("Response"),jsonEndpointsConst:s.createIdentifier("jsonEndpoints"),endpointTagsConst:s.createIdentifier("endpointTags"),providerType:s.createIdentifier("Provider"),implementationType:s.createIdentifier("Implementation"),clientClass:s.createIdentifier("ExpressZodAPIClient"),keyParameter:s.createIdentifier("key"),pathParameter:s.createIdentifier("path"),paramsArgument:s.createIdentifier("params"),methodParameter:s.createIdentifier("method"),accumulator:s.createIdentifier("acc"),provideMethod:s.createIdentifier("provide"),implementationArgument:s.createIdentifier("implementation"),headersProperty:s.createIdentifier("headers"),hasBodyConst:s.createIdentifier("hasBody"),undefinedValue:s.createIdentifier("undefined"),bodyProperty:s.createIdentifier("body"),responseConst:s.createIdentifier("response"),searchParamsConst:s.createIdentifier("searchParams"),exampleImplementationConst:s.createIdentifier("exampleImplementation"),clientConst:s.createIdentifier("client"),contentTypeConst:s.createIdentifier("contentType"),isJsonConst:s.createIdentifier("isJSON")};interfaces=[];makeAlias(t,r){let o=this.aliases.get(t)?.name?.text;if(!o){o=`Type${this.aliases.size+1}`;let n=s.createLiteralTypeNode(s.createNull());this.aliases.set(t,pe(n,o)),this.aliases.set(t,pe(r(),o))}return s.createTypeReferenceNode(o)}constructor({routing:t,brandHandling:r,variant:o="client",splitResponse:n=!1,optionalPropStyle:i={withQuestionMark:!0,withUndefined:!0},noContent:a=fi.undefined()}){be({routing:t,onEndpoint:(H,j,Q)=>{let ce={makeAlias:this.makeAlias.bind(this),optionalPropStyle:i},Ae=I(Q,j,"input"),Pe=He(H.getSchema("input"),{brandHandling:r,ctx:{...ce,isResponse:!1}}),z=n?I(Q,j,"positive.response"):void 0,Qt=H.getResponses("positive").map(({schema:K,mimeTypes:J})=>J?K:a).reduce((K,J)=>K.or(J)),Jt=n?He(Qt,{brandHandling:r,ctx:{...ce,isResponse:!0}}):void 0,we=n?I(Q,j,"negative.response"):void 0,Wt=H.getResponses("negative").map(({schema:K,mimeTypes:J})=>J?K:a).reduce((K,J)=>K.or(J)),Xt=n?He(Wt,{brandHandling:r,ctx:{...ce,isResponse:!0}}):void 0,er=I(Q,j,"response"),Ro=z&&we?s.createUnionTypeNode([s.createTypeReferenceNode(z),s.createTypeReferenceNode(we)]):He(Qt.or(Wt),{brandHandling:r,ctx:{...ce,isResponse:!0}});this.program.push(pe(Pe,Ae)),Jt&&z&&this.program.push(pe(Jt,z)),Xt&&we&&this.program.push(pe(Xt,we)),this.program.push(pe(Ro,er)),this.paths.push(j),this.registry.set({method:Q,path:j},{input:Ae,positive:z,negative:we,response:er,isJson:H.getResponses("positive").some(K=>K.mimeTypes?.includes(R.json)),tags:H.getTags()})}}),this.program.unshift(...this.aliases.values()),this.program.push(Bt(this.ids.pathType,this.paths)),this.program.push(Bt(this.ids.methodType,bo)),this.program.push(ut(this.ids.methodPathType,Kt([this.ids.methodType,this.ids.pathType])));let p=[s.createHeritageClause(E.SyntaxKind.ExtendsKeyword,[Ft(this.ids.methodPathType,E.SyntaxKind.AnyKeyword)])];this.interfaces.push({id:this.ids.inputInterface,kind:"input",props:[]}),n&&this.interfaces.push({id:this.ids.posResponseInterface,kind:"positive",props:[]},{id:this.ids.negResponseInterface,kind:"negative",props:[]}),this.interfaces.push({id:this.ids.responseInterface,kind:"response",props:[]});let d=[],c=[];for(let[{method:H,path:j},{isJson:Q,tags:ce,...Ae}]of this.registry){let Pe=ho(H,j);for(let z of this.interfaces)z.kind in Ae&&z.props.push(co(Pe,Ae[z.kind]));o!=="types"&&(Q&&d.push(s.createPropertyAssignment(Pe,s.createTrue())),c.push(s.createPropertyAssignment(Pe,s.createArrayLiteralExpression(ce.map(z=>s.createStringLiteral(z))))))}for(let{id:H,props:j}of this.interfaces)this.program.push(yo(H,p,j));if(o==="types")return;let m=s.createVariableStatement(V,k(this.ids.jsonEndpointsConst,s.createObjectLiteralExpression(d))),l=s.createVariableStatement(V,k(this.ids.endpointTagsConst,s.createObjectLiteralExpression(c))),f=ut(this.ids.providerType,s.createFunctionTypeNode(go({M:this.ids.methodType,P:this.ids.pathType}),mt({method:s.createTypeReferenceNode("M"),path:s.createTypeReferenceNode("P"),params:s.createIndexedAccessTypeNode(s.createTypeReferenceNode(this.ids.inputInterface),Dt)}),uo(this.ids.responseInterface,Dt))),x=ut(this.ids.implementationType,s.createFunctionTypeNode(void 0,mt({method:s.createTypeReferenceNode(this.ids.methodType),path:s.createKeywordTypeNode(E.SyntaxKind.StringKeyword),params:Ft(E.SyntaxKind.StringKeyword,E.SyntaxKind.AnyKeyword)}),fo())),T=s.createTemplateExpression(s.createTemplateHead(":"),[s.createTemplateSpan(this.ids.keyParameter,Ue)]),O=$t(this.ids.paramsArgument,s.createCallExpression(s.createPropertyAccessExpression(this.ids.accumulator,"replace"),void 0,[T,s.createElementAccessExpression(this.ids.paramsArgument,this.ids.keyParameter)]),this.ids.pathParameter),g=$t(this.ids.paramsArgument,s.createConditionalExpression(s.createBinaryExpression(s.createCallExpression(s.createPropertyAccessExpression(this.ids.pathParameter,"indexOf"),void 0,[T]),E.SyntaxKind.GreaterThanEqualsToken,s.createNumericLiteral(0)),void 0,this.ids.accumulator,void 0,s.createObjectLiteralExpression([s.createSpreadAssignment(this.ids.accumulator),s.createPropertyAssignment(s.createComputedPropertyName(this.ids.keyParameter),s.createElementAccessExpression(this.ids.paramsArgument,this.ids.keyParameter))])),s.createObjectLiteralExpression()),P=mo(this.ids.clientClass,po([lt(this.ids.implementationArgument,s.createTypeReferenceNode(this.ids.implementationType),ao)]),[lo(this.ids.provideMethod,s.createTypeReferenceNode(this.ids.providerType),qt([this.ids.methodParameter,this.ids.pathParameter,this.ids.paramsArgument],s.createCallExpression(s.createPropertyAccessExpression(s.createThis(),this.ids.implementationArgument),void 0,[this.ids.methodParameter,O,g]),!0))]);this.program.push(m,l,f,x,P);let w=s.createPropertyAssignment(this.ids.methodParameter,s.createCallExpression(s.createPropertyAccessExpression(this.ids.methodParameter,"toUpperCase"),void 0,void 0)),v=s.createPropertyAssignment(this.ids.headersProperty,s.createConditionalExpression(this.ids.hasBodyConst,void 0,s.createObjectLiteralExpression([s.createPropertyAssignment(s.createStringLiteral("Content-Type"),s.createStringLiteral(R.json))]),void 0,this.ids.undefinedValue)),M=s.createPropertyAssignment(this.ids.bodyProperty,s.createConditionalExpression(this.ids.hasBodyConst,void 0,s.createCallExpression(s.createPropertyAccessExpression(s.createIdentifier("JSON"),"stringify"),void 0,[this.ids.paramsArgument]),void 0,this.ids.undefinedValue)),Te=s.createVariableStatement(void 0,k(this.ids.responseConst,s.createAwaitExpression(s.createCallExpression(s.createIdentifier("fetch"),void 0,[s.createTemplateExpression(s.createTemplateHead("https://example.com"),[s.createTemplateSpan(this.ids.pathParameter,s.createTemplateMiddle("")),s.createTemplateSpan(this.ids.searchParamsConst,Ue)]),s.createObjectLiteralExpression([w,v,M])])))),Ke=s.createVariableStatement(void 0,k(this.ids.hasBodyConst,s.createLogicalNot(s.createCallExpression(s.createPropertyAccessExpression(s.createArrayLiteralExpression([s.createStringLiteral("get"),s.createStringLiteral("delete")]),"includes"),void 0,[this.ids.methodParameter])))),yt=s.createVariableStatement(void 0,k(this.ids.searchParamsConst,s.createConditionalExpression(this.ids.hasBodyConst,void 0,s.createStringLiteral(""),void 0,s.createTemplateExpression(s.createTemplateHead("?"),[s.createTemplateSpan(s.createNewExpression(s.createIdentifier("URLSearchParams"),void 0,[this.ids.paramsArgument]),Ue)])))),De=s.createVariableStatement(void 0,k(this.ids.contentTypeConst,s.createCallExpression(s.createPropertyAccessExpression(s.createPropertyAccessExpression(this.ids.responseConst,this.ids.headersProperty),s.createIdentifier("get")),void 0,[s.createStringLiteral("content-type")]))),U=s.createIfStatement(s.createPrefixUnaryExpression(E.SyntaxKind.ExclamationToken,this.ids.contentTypeConst),s.createReturnStatement(void 0),void 0),Y=s.createVariableStatement(void 0,k(this.ids.isJsonConst,s.createCallChain(s.createPropertyAccessChain(this.ids.contentTypeConst,void 0,s.createIdentifier("startsWith")),void 0,void 0,[s.createStringLiteral(R.json)]))),Oe=s.createReturnStatement(s.createCallExpression(s.createElementAccessExpression(this.ids.responseConst,xo(this.ids.isJsonConst,s.createStringLiteral("json"),s.createStringLiteral("text"))),void 0,[])),gt=s.createVariableStatement(V,k(this.ids.exampleImplementationConst,qt([this.ids.methodParameter,this.ids.pathParameter,this.ids.paramsArgument],s.createBlock([Ke,yt,Te,De,U,Y,Oe]),!0),s.createTypeReferenceNode(this.ids.implementationType))),Fe=s.createExpressionStatement(s.createCallExpression(s.createPropertyAccessExpression(this.ids.clientConst,this.ids.provideMethod),void 0,[s.createStringLiteral("get"),s.createStringLiteral("/v1/user/retrieve"),s.createObjectLiteralExpression([s.createPropertyAssignment("id",s.createStringLiteral("10"))])])),Re=s.createVariableStatement(void 0,k(this.ids.clientConst,s.createNewExpression(this.ids.clientClass,void 0,[this.ids.exampleImplementationConst])));this.usage.push(gt,Re,Fe)}printUsage(t){return this.usage.length?this.usage.map(r=>typeof r=="string"?r:Vt(r,t)).join(`
|
|
18
|
+
`))};var Kr=e=>{e.startupLogo!==!1&&Hr(process.stdout);let t=e.errorHandler||je,r=gr(e.logger)?e.logger:new Le(e.logger);r.debug("Running",{build:"v21.1.0 (ESM)",env:process.env.NODE_ENV||"development"}),kr(r);let o=Nr({logger:r,config:e}),i={getLogger:Lr(r),errorHandler:t},a=Er(i),p=Zr(i);return{...i,logger:r,notFoundHandler:a,parserFailureHandler:p,loggingMiddleware:o}},Rn=(e,t)=>{let{logger:r,getLogger:o,notFoundHandler:n,loggingMiddleware:i}=Kr(e);return Zt({app:e.app.use(i),routing:t,getLogger:o,config:e}),{notFoundHandler:n,logger:r}},An=async(e,t)=>{let{logger:r,getLogger:o,notFoundHandler:n,parserFailureHandler:i,loggingMiddleware:a}=Kr(e),p=Et().disable("x-powered-by").use(a);if(e.compression){let f=await xe("compression");p.use(f(typeof e.compression=="object"?e.compression:void 0))}let d={json:[e.jsonParser||Et.json()],raw:[e.rawParser||Et.raw(),jr],upload:e.upload?await vr({config:e,getLogger:o}):[]};await e.beforeRouting?.({app:p,getLogger:o}),Zt({app:p,routing:t,getLogger:o,config:e,parsers:d}),p.use(i,n);let c=[],m=(f,x)=>()=>f.listen(x,()=>r.info("Listening",x)),l=[];if(e.http){let f=Tn.createServer(p);c.push(f),l.push(m(f,e.http.listen))}if(e.https){let f=On.createServer(e.https.options,p);c.push(f),l.push(m(f,e.https.listen))}return e.gracefulShutdown&&Mr({logger:r,servers:c,options:e.gracefulShutdown===!0?{}:e.gracefulShutdown}),{app:p,logger:r,servers:l.map(f=>f())}};import{OpenApiBuilder as Cs}from"openapi3-ts/oas31";import{keys as Is,pluck as Zs}from"ramda";import{isReferenceObject as Nt,isSchemaObject as at}from"openapi3-ts/oas31";import{concat as Pn,type as Br,filter as wn,fromPairs as pt,has as zn,isNil as Cn,map as Se,mergeAll as In,mergeDeepRight as Zn,mergeDeepWith as En,objOf as qr,omit as ct,pipe as $r,pluck as vn,range as jn,reject as Nn,toLower as Ln,union as kn,when as Mn,xprod as vt,zip as Un}from"ramda";import{z as b}from"zod";var ie=(e,{onEach:t,rules:r,onMissing:o,ctx:n={}})=>{let i=r[e._def[h]?.brand]||r[e._def.typeName],p=i?i(e,{...n,next:c=>ie(c,{ctx:n,onEach:t,rules:r,onMissing:o})}):o(e,n),d=t&&t(e,{prev:p,...n});return d?{...p,...d}:p};var Dr=50,Gr="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString",Hn={integer:0,number:0,string:"",boolean:!1,object:{},null:null,array:[]},Vr=/:([A-Za-z0-9_]+)/g,Kn=e=>e.match(Vr)?.map(t=>t.slice(1))||[],_r=e=>e.replace(Vr,t=>`{${t.slice(1)}}`),Dn=({_def:e},{next:t})=>({...t(e.innerType),default:e[h]?.defaultLabel||e.defaultValue()}),Fn=({_def:{innerType:e}},{next:t})=>t(e),Bn=()=>({format:"any"}),qn=({},e)=>{if(e.isResponse)throw new C("Please use ez.upload() only for input.",e);return{type:"string",format:"binary"}},$n=e=>{let t=e.unwrap();return{type:"string",format:t instanceof b.ZodString?t._def.checks.find(r=>r.kind==="base64")?"byte":"file":"binary"}},Gn=({options:e},{next:t})=>({oneOf:e.map(t)}),Vn=({options:e,discriminator:t},{next:r})=>({discriminator:{propertyName:t},oneOf:e.map(r)}),_n=(e,t)=>{if(Array.isArray(e)&&Array.isArray(t))return Pn(e,t);if(e===t)return t;throw new Error("Can not flatten properties")},Yn=e=>{let[t,r]=e.filter(at).filter(n=>n.type==="object"&&Object.keys(n).every(i=>["type","properties","required","examples"].includes(i)));if(!t||!r)throw new Error("Can not flatten objects");let o={type:"object"};return(t.properties||r.properties)&&(o.properties=En(_n,t.properties||{},r.properties||{})),(t.required||r.required)&&(o.required=kn(t.required||[],r.required||[])),(t.examples||r.examples)&&(o.examples=ee(t.examples||[],r.examples||[],([n,i])=>Zn(n,i))),o},Qn=({_def:{left:e,right:t}},{next:r})=>{let o=[e,t].map(r);try{return Yn(o)}catch{}return{allOf:o}},Jn=(e,{next:t})=>t(e.unwrap()),Wn=(e,{next:t})=>t(e.unwrap()),Xn=(e,{next:t})=>{let r=t(e.unwrap());return at(r)&&(r.type=Qr(r)),r},Yr=e=>{let t=Ln(Br(e));return typeof e=="bigint"?"integer":t==="number"||t==="string"||t==="boolean"||t==="object"||t==="null"||t==="array"?t:void 0},Fr=e=>({type:Yr(Object.values(e.enum)[0]),enum:Object.values(e.enum)}),es=({value:e})=>({type:Yr(e),const:e}),ts=(e,{isResponse:t,next:r})=>{let o=Object.keys(e.shape),n=p=>t&&Ce(p)?p instanceof b.ZodOptional:p.isOptional(),i=o.filter(p=>!n(e.shape[p])),a={type:"object"};return o.length&&(a.properties=it(e,r)),i.length&&(a.required=i),a},rs=()=>({type:"null"}),os=({},e)=>{if(e.isResponse)throw new C("Please use ez.dateOut() for output.",e);return{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",pattern:/^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(\.\d+)?)?Z?$/.source,externalDocs:{url:Gr}}},ns=({},e)=>{if(!e.isResponse)throw new C("Please use ez.dateIn() for input.",e);return{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",externalDocs:{url:Gr}}},ss=({},e)=>{throw new C(`Using z.date() within ${e.isResponse?"output":"input"} schema is forbidden. Please use ez.date${e.isResponse?"Out":"In"}() instead. Check out the documentation for details.`,e)},is=()=>({type:"boolean"}),as=()=>({type:"integer",format:"bigint"}),ps=e=>e.every(t=>t instanceof b.ZodLiteral),cs=({keySchema:e,valueSchema:t},{next:r})=>{if(e instanceof b.ZodEnum||e instanceof b.ZodNativeEnum){let o=Object.values(e.enum),n={type:"object"};return o.length&&(n.properties=it(b.object(pt(vt(o,[t]))),r),n.required=o),n}if(e instanceof b.ZodLiteral)return{type:"object",properties:it(b.object({[e.value]:t}),r),required:[e.value]};if(e instanceof b.ZodUnion&&ps(e.options)){let o=Se(i=>`${i.value}`,e.options),n=pt(vt(o,[t]));return{type:"object",properties:it(b.object(n),r),required:o}}return{type:"object",additionalProperties:r(t)}},ds=({_def:{minLength:e,maxLength:t},element:r},{next:o})=>{let n={type:"array",items:o(r)};return e&&(n.minItems=e.value),t&&(n.maxItems=t.value),n},ls=({items:e,_def:{rest:t}},{next:r})=>({type:"array",prefixItems:e.map(r),items:t===null?{not:{}}:r(t)}),ms=({isEmail:e,isURL:t,minLength:r,maxLength:o,isUUID:n,isCUID:i,isCUID2:a,isULID:p,isIP:d,isEmoji:c,isDatetime:m,_def:{checks:l}})=>{let f=l.find(P=>P.kind==="regex"),x=l.find(P=>P.kind==="datetime"),T=f?f.regex:x?x.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,O={type:"string"},g={"date-time":m,email:e,url:t,uuid:n,cuid:i,cuid2:a,ulid:p,ip:d,emoji:c};for(let P in g)if(g[P]){O.format=P;break}return r!==null&&(O.minLength=r),o!==null&&(O.maxLength=o),T&&(O.pattern=T.source),O},us=({isInt:e,maxValue:t,minValue:r,_def:{checks:o}})=>{let n=o.find(l=>l.kind==="min"),i=r===null?e?Number.MIN_SAFE_INTEGER:-Number.MAX_VALUE:r,a=n?n.inclusive:!0,p=o.find(l=>l.kind==="max"),d=t===null?e?Number.MAX_SAFE_INTEGER:Number.MAX_VALUE:t,c=p?p.inclusive:!0,m={type:e?"integer":"number",format:e?"int64":"double"};return a?m.minimum=i:m.exclusiveMinimum=i,c?m.maximum=d:m.exclusiveMaximum=d,m},it=({shape:e},t)=>Se(t,e),fs=e=>{let t=Array.isArray(e.type)?e.type[0]:e.type;return Hn?.[t]},Qr=({type:e})=>e==="null"?e:typeof e=="string"?[e,"null"]:e?[...new Set(e).add("null")]:"null",ys=(e,{isResponse:t,next:r})=>{let o=r(e.innerType()),{effect:n}=e._def;if(t&&n.type==="transform"&&at(o)){let i=$e(e,fs(o));return i&&["number","string","boolean"].includes(i)?{type:i}:r(b.any())}if(!t&&n.type==="preprocess"&&at(o)){let{type:i,...a}=o;return{...a,format:`${a.format||i} (preprocessed)`}}return o},gs=({_def:e},{isResponse:t,next:r})=>r(e[t?"out":"in"]),hs=(e,{next:t})=>t(e.unwrap()),xs=(e,{next:t,makeRef:r})=>r(e,()=>t(e.schema)),bs=(e,{next:t})=>t(e.unwrap().shape.raw),Jr=e=>e.length?pt(Un(jn(1,e.length+1).map(t=>`example${t}`),Se(qr("value"),e))):void 0,Wr=(e,t,r=[])=>$r(q,Se(Mn(o=>Br(o)==="Object",ct(r))),Jr)({schema:e,variant:t?"parsed":"original",validate:!0}),Ss=(e,t)=>$r(q,wn(zn(t)),vn(t),Jr)({schema:e,variant:"original",validate:!0}),ae=e=>e instanceof b.ZodObject?e:e instanceof b.ZodBranded?ae(e.unwrap()):e instanceof b.ZodUnion||e instanceof b.ZodDiscriminatedUnion?e.options.map(t=>ae(t)).reduce((t,r)=>t.merge(r.partial()),b.object({})):e instanceof b.ZodEffects?ae(e._def.schema):e instanceof b.ZodPipeline?ae(e._def.in):ae(e._def.left).merge(ae(e._def.right)),Xr=({path:e,method:t,schema:r,inputSources:o,makeRef:n,composition:i,brandHandling:a,description:p=`${t.toUpperCase()} ${e} Parameter`})=>{let{shape:d}=ae(r),c=Kn(e),m=o.includes("query"),l=o.includes("params"),f=o.includes("headers"),x=g=>l&&c.includes(g),T=g=>f&&bt(g);return Object.keys(d).map(g=>({name:g,location:x(g)?"path":T(g)?"header":m?"query":void 0})).filter(g=>g.location!==void 0).map(({name:g,location:P})=>{let w=ie(d[g],{rules:{...a,...Lt},onEach:kt,onMissing:Mt,ctx:{isResponse:!1,makeRef:n,path:e,method:t}}),v=i==="components"?n(d[g],w,I(p,g)):w;return{name:g,in:P,required:!d[g].isOptional(),description:w.description||p,schema:v,examples:Ss(r,g)}})},Lt={ZodString:ms,ZodNumber:us,ZodBigInt:as,ZodBoolean:is,ZodNull:rs,ZodArray:ds,ZodTuple:ls,ZodRecord:cs,ZodObject:ts,ZodLiteral:es,ZodIntersection:Qn,ZodUnion:Gn,ZodAny:Bn,ZodDefault:Dn,ZodEnum:Fr,ZodNativeEnum:Fr,ZodEffects:ys,ZodOptional:Jn,ZodNullable:Xn,ZodDiscriminatedUnion:Vn,ZodBranded:hs,ZodDate:ss,ZodCatch:Fn,ZodPipeline:gs,ZodLazy:xs,ZodReadonly:Wn,[N]:$n,[ue]:qn,[oe]:ns,[re]:os,[$]:bs},kt=(e,{isResponse:t,prev:r})=>{if(Nt(r))return{};let{description:o}=e,n=e instanceof b.ZodLazy,i=r.type!==void 0,a=t&&Ce(e),p=!n&&i&&!a&&e.isNullable(),d={};if(o&&(d.description=o),p&&(d.type=Qr(r)),!n){let c=q({schema:e,variant:t?"parsed":"original",validate:!0});c.length&&(d.examples=c.slice())}return d},Mt=(e,t)=>{throw new C(`Zod type ${e.constructor.name} is unsupported.`,t)},jt=(e,t)=>{if(Nt(e))return e;let r={...e};return r.properties&&(r.properties=ct(t,r.properties)),r.examples&&(r.examples=r.examples.map(o=>ct(t,o))),r.required&&(r.required=r.required.filter(o=>!t.includes(o))),r.allOf&&(r.allOf=r.allOf.map(o=>jt(o,t))),r.oneOf&&(r.oneOf=r.oneOf.map(o=>jt(o,t))),r},eo=e=>Nt(e)?e:ct(["examples"],e),to=({method:e,path:t,schema:r,mimeTypes:o,variant:n,makeRef:i,composition:a,hasMultipleStatusCodes:p,statusCode:d,brandHandling:c,description:m=`${e.toUpperCase()} ${t} ${St(n)} response ${p?d:""}`.trim()})=>{if(!o)return{description:m};let l=eo(ie(r,{rules:{...c,...Lt},onEach:kt,onMissing:Mt,ctx:{isResponse:!0,makeRef:i,path:t,method:e}})),f={schema:a==="components"?i(r,l,I(m)):l,examples:Wr(r,!0)};return{description:m,content:pt(vt(o,[f]))}},Ts=()=>({type:"http",scheme:"basic"}),Os=({format:e})=>{let t={type:"http",scheme:"bearer"};return e&&(t.bearerFormat=e),t},Rs=({name:e},t)=>{let r={type:"apiKey",in:"query",name:e};return t?.includes("body")&&(t?.includes("query")?(r["x-in-alternative"]="body",r.description=`${e} CAN also be supplied within the request body`):(r["x-in-actual"]="body",r.description=`${e} MUST be supplied within the request body instead of query`)),r},As=({name:e})=>({type:"apiKey",in:"header",name:e}),Ps=({name:e})=>({type:"apiKey",in:"cookie",name:e}),ws=({url:e})=>({type:"openIdConnect",openIdConnectUrl:e}),zs=({flows:e={}})=>({type:"oauth2",flows:Se(t=>({...t,scopes:t.scopes||{}}),Nn(Cn,e))}),ro=(e,t)=>{let r={basic:Ts,bearer:Os,input:Rs,header:As,cookie:Ps,openid:ws,oauth2:zs};return et(e,o=>r[o.type](o,t))},dt=e=>"or"in e?e.or.map(t=>"and"in t?In(Se(({name:r,scopes:o})=>qr(r,o),t.and)):{[t.name]:t.scopes}):"and"in e?dt(wt(e)):dt({or:[e]}),oo=({method:e,path:t,schema:r,mimeType:o,makeRef:n,composition:i,brandHandling:a,paramNames:p,description:d=`${e.toUpperCase()} ${t} Request body`})=>{let c=eo(jt(ie(r,{rules:{...a,...Lt},onEach:kt,onMissing:Mt,ctx:{isResponse:!1,makeRef:n,path:t,method:e}}),p)),m={schema:i==="components"?n(r,c,I(d)):c,examples:Wr(r,!1,p)};return{description:d,content:{[o]:m}}},no=e=>Object.keys(e).map(t=>{let r=e[t],o={name:t,description:typeof r=="string"?r:r.description};return typeof r=="object"&&r.url&&(o.externalDocs={url:r.url}),o}),Ut=e=>e.length<=Dr?e:e.slice(0,Dr-1)+"\u2026";var Ht=class extends Cs{lastSecuritySchemaIds=new Map;lastOperationIdSuffixes=new Map;responseVariants=Is(se);references=new Map;makeRef(t,r,o=this.references.get(t)){return o||(o=`Schema${this.references.size+1}`,this.references.set(t,o),typeof r=="function"&&(r=r())),typeof r=="object"&&this.addSchema(o,r),{$ref:`#/components/schemas/${o}`}}ensureUniqOperationId(t,r,o){let n=o||I(r,t),i=this.lastOperationIdSuffixes.get(n);if(i===void 0)return this.lastOperationIdSuffixes.set(n,1),n;if(o)throw new C(`Duplicated operationId: "${o}"`,{method:r,isResponse:!1,path:t});return i++,this.lastOperationIdSuffixes.set(n,i),`${n}${i}`}ensureUniqSecuritySchemaName(t){let r=JSON.stringify(t);for(let n in this.rootDoc.components?.securitySchemes||{})if(r===JSON.stringify(this.rootDoc.components?.securitySchemes?.[n]))return n;let o=(this.lastSecuritySchemaIds.get(t.type)||0)+1;return this.lastSecuritySchemaIds.set(t.type,o),`${t.type.toUpperCase()}_${o}`}constructor({routing:t,config:r,title:o,version:n,serverUrl:i,descriptions:a,brandHandling:p,hasSummaryFromDescription:d=!0,composition:c="inline"}){super(),this.addInfo({title:o,version:n});for(let l of typeof i=="string"?[i]:i)this.addServer({url:l});be({routing:t,onEndpoint:(l,f,x)=>{let T={path:f,method:x,endpoint:l,composition:c,brandHandling:p,makeRef:this.makeRef.bind(this)},[O,g]=["short","long"].map(l.getDescription.bind(l)),P=O?Ut(O):d&&g?Ut(g):void 0,w=l.getTags(),v=r.inputSources?.[x]||ht[x],M=this.ensureUniqOperationId(f,x,l.getOperationId(x)),Te=Xr({...T,inputSources:v,schema:l.getSchema("input"),description:a?.requestParameter?.call(null,{method:x,path:f,operationId:M})}),Ke={};for(let U of this.responseVariants){let Y=l.getResponses(U);for(let{mimeTypes:Oe,schema:gt,statusCodes:Fe}of Y)for(let Re of Fe)Ke[Re]=to({...T,variant:U,schema:gt,mimeTypes:Oe,statusCode:Re,hasMultipleStatusCodes:Y.length>1||Fe.length>1,description:a?.[`${U}Response`]?.call(null,{method:x,path:f,operationId:M,statusCode:Re})})}let yt=v.includes("body")?oo({...T,paramNames:Zs("name",Te),schema:l.getSchema("input"),mimeType:R[l.getRequestType()],description:a?.requestBody?.call(null,{method:x,path:f,operationId:M})}):void 0,De=dt(et(ro(l.getSecurity(),v),U=>{let Y=this.ensureUniqSecuritySchemaName(U),Oe=["oauth2","openIdConnect"].includes(U.type)?l.getScopes().slice():[];return this.addSecurityScheme(Y,U),{name:Y,scopes:Oe}}));this.addPath(_r(f),{[x]:{operationId:M,summary:P,description:g,tags:w.length>0?w:void 0,parameters:Te.length>0?Te:void 0,requestBody:yt,security:De.length>0?De:void 0,responses:Ke}})}}),this.rootDoc.tags=r.tags?no(r.tags):[]}};import{createRequest as Es,createResponse as vs}from"node-mocks-http";var js=e=>Es({...e,headers:{"content-type":R.json,...e?.headers}}),Ns=e=>vs(e),Ls=e=>{let t={warn:[],error:[],info:[],debug:[]};return new Proxy(e||{},{get(r,o,n){return o==="_getLogs"?()=>t:hr(o)?(...i)=>t[o].push(i):Reflect.get(r,o,n)}})},so=({requestProps:e,responseOptions:t,configProps:r,loggerProps:o})=>{let n=js(e),i=Ns({req:n,...t});i.req=t?.req||n,n.res=i;let a=Ls(o),p={cors:!1,logger:a,...r};return{requestMock:n,responseMock:i,loggerMock:a,configMock:p}},ks=async({endpoint:e,...t})=>{let{requestMock:r,responseMock:o,loggerMock:n,configMock:i}=so(t);return await e.execute({request:r,response:o,config:i,logger:n}),{requestMock:r,responseMock:o,loggerMock:n}},Ms=async({middleware:e,options:t={},errorHandler:r,...o})=>{let{requestMock:n,responseMock:i,loggerMock:a,configMock:p}=so(o),d=qe(n,p.inputSources);try{let c=await e.execute({request:n,response:i,logger:a,input:d,options:t});return{requestMock:n,responseMock:i,loggerMock:a,output:c}}catch(c){if(!r)throw c;return r(B(c),i),{requestMock:n,responseMock:i,loggerMock:a,output:{}}}};import E from"typescript";import{z as fi}from"zod";import Z from"typescript";import{chain as io}from"ramda";var s=Z.factory,V=[s.createModifier(Z.SyntaxKind.ExportKeyword)],Us=[s.createModifier(Z.SyntaxKind.AsyncKeyword)],Hs=[s.createModifier(Z.SyntaxKind.PublicKeyword),s.createModifier(Z.SyntaxKind.ReadonlyKeyword)],ao=[s.createModifier(Z.SyntaxKind.ProtectedKeyword),s.createModifier(Z.SyntaxKind.ReadonlyKeyword)],Ks=s.createTemplateHead(""),Ds=s.createTemplateMiddle(" "),Ue=s.createTemplateTail(""),Kt=e=>s.createTemplateLiteralType(Ks,e.map((t,r)=>s.createTemplateLiteralTypeSpan(s.createTypeReferenceNode(t),r===e.length-1?Ue:Ds))),Dt=Kt(["M","P"]),lt=(e,t,r)=>s.createParameterDeclaration(r,void 0,e,void 0,t,void 0),mt=(e,t)=>io(([r,o])=>[lt(s.createIdentifier(r),o,t)],Object.entries(e)),Ft=(e,t)=>s.createExpressionWithTypeArguments(s.createIdentifier("Record"),[typeof e=="number"?s.createKeywordTypeNode(e):s.createTypeReferenceNode(e),s.createKeywordTypeNode(t)]),po=e=>s.createConstructorDeclaration(void 0,e,s.createBlock([])),co=(e,t)=>s.createPropertySignature(void 0,e,void 0,s.createTypeReferenceNode(t)),k=(e,t,r)=>s.createVariableDeclarationList([s.createVariableDeclaration(e,void 0,r,t)],Z.NodeFlags.Const),Bt=(e,t)=>s.createTypeAliasDeclaration(V,e,void 0,s.createUnionTypeNode(t.map(r=>s.createLiteralTypeNode(s.createStringLiteral(r))))),ut=(e,t)=>s.createTypeAliasDeclaration(V,e,void 0,t),lo=(e,t,r)=>s.createPropertyDeclaration(Hs,e,void 0,t,r),mo=(e,t,r)=>s.createClassDeclaration(V,e,void 0,void 0,[t,...r]),uo=(e,t)=>s.createTypeReferenceNode("Promise",[s.createIndexedAccessTypeNode(s.createTypeReferenceNode(e),t)]),fo=()=>s.createTypeReferenceNode("Promise",[s.createKeywordTypeNode(Z.SyntaxKind.AnyKeyword)]),yo=(e,t,r)=>s.createInterfaceDeclaration(V,e,void 0,t,r),Fs=io(([e,t])=>[s.createTypeParameterDeclaration([],e,s.createTypeReferenceNode(t))]),go=e=>Fs(Object.entries(e)),qt=(e,t,r)=>s.createArrowFunction(r?Us:void 0,void 0,e.map(o=>lt(o)),void 0,void 0,t),$t=(e,t,r)=>s.createCallExpression(s.createPropertyAccessExpression(s.createCallExpression(s.createPropertyAccessExpression(s.createIdentifier("Object"),"keys"),void 0,[e]),"reduce"),void 0,[s.createArrowFunction(void 0,void 0,mt({acc:void 0,key:void 0}),void 0,void 0,t),r]),ho=(...e)=>`"${e.join(" ")}"`,xo=(e,t,r)=>s.createConditionalExpression(e,s.createToken(Z.SyntaxKind.QuestionToken),t,s.createToken(Z.SyntaxKind.ColonToken),r);var bo=["get","post","put","delete","patch"];import y from"typescript";import{z as _t}from"zod";import S from"typescript";var{factory:ft}=S,Gt=(e,t)=>S.addSyntheticLeadingComment(e,S.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0),pe=(e,t,r)=>{let o=ft.createTypeAliasDeclaration(void 0,ft.createIdentifier(t),void 0,e);return r?Gt(o,r):o},Vt=(e,t)=>{let r=S.createSourceFile("print.ts","",S.ScriptTarget.Latest,!1,S.ScriptKind.TS);return S.createPrinter(t).printNode(S.EmitHint.Unspecified,e,r)},Bs=/^[A-Za-z_$][A-Za-z0-9_$]*$/,So=e=>Bs.test(e)?ft.createIdentifier(e):ft.createStringLiteral(e),qs=[S.SyntaxKind.AnyKeyword,S.SyntaxKind.BigIntKeyword,S.SyntaxKind.BooleanKeyword,S.SyntaxKind.NeverKeyword,S.SyntaxKind.NumberKeyword,S.SyntaxKind.ObjectKeyword,S.SyntaxKind.StringKeyword,S.SyntaxKind.SymbolKeyword,S.SyntaxKind.UndefinedKeyword,S.SyntaxKind.UnknownKeyword,S.SyntaxKind.VoidKeyword],To=e=>qs.includes(e.kind);var{factory:u}=y,$s={[y.SyntaxKind.AnyKeyword]:"",[y.SyntaxKind.BigIntKeyword]:BigInt(0),[y.SyntaxKind.BooleanKeyword]:!1,[y.SyntaxKind.NumberKeyword]:0,[y.SyntaxKind.ObjectKeyword]:{},[y.SyntaxKind.StringKeyword]:"",[y.SyntaxKind.UndefinedKeyword]:void 0},Gs=({value:e})=>u.createLiteralTypeNode(typeof e=="number"?u.createNumericLiteral(e):typeof e=="boolean"?e?u.createTrue():u.createFalse():u.createStringLiteral(e)),Vs=({shape:e},{isResponse:t,next:r,optionalPropStyle:{withQuestionMark:o}})=>{let n=Object.entries(e).map(([i,a])=>{let p=t&&Ce(a)?a instanceof _t.ZodOptional:a.isOptional(),d=u.createPropertySignature(void 0,So(i),p&&o?u.createToken(y.SyntaxKind.QuestionToken):void 0,r(a));return a.description?Gt(d,a.description):d});return u.createTypeLiteralNode(n)},_s=({element:e},{next:t})=>u.createArrayTypeNode(t(e)),Ys=({options:e})=>u.createUnionTypeNode(e.map(t=>u.createLiteralTypeNode(u.createStringLiteral(t)))),Oo=({options:e},{next:t})=>{let r=new Map;for(let o of e){let n=t(o);r.set(To(n)?n.kind:n,n)}return u.createUnionTypeNode(Array.from(r.values()))},Qs=e=>$s?.[e.kind],Js=(e,{next:t,isResponse:r})=>{let o=t(e.innerType());if(r&&e._def.effect.type==="transform"){let n=$e(e,Qs(o)),i={number:y.SyntaxKind.NumberKeyword,bigint:y.SyntaxKind.BigIntKeyword,boolean:y.SyntaxKind.BooleanKeyword,string:y.SyntaxKind.StringKeyword,undefined:y.SyntaxKind.UndefinedKeyword,object:y.SyntaxKind.ObjectKeyword};return u.createKeywordTypeNode(n&&i[n]||y.SyntaxKind.AnyKeyword)}return o},Ws=e=>u.createUnionTypeNode(Object.values(e.enum).map(t=>u.createLiteralTypeNode(typeof t=="number"?u.createNumericLiteral(t):u.createStringLiteral(t)))),Xs=(e,{next:t,optionalPropStyle:{withUndefined:r}})=>{let o=t(e.unwrap());return r?u.createUnionTypeNode([o,u.createKeywordTypeNode(y.SyntaxKind.UndefinedKeyword)]):o},ei=(e,{next:t})=>u.createUnionTypeNode([t(e.unwrap()),u.createLiteralTypeNode(u.createNull())]),ti=({items:e,_def:{rest:t}},{next:r})=>u.createTupleTypeNode(e.map(r).concat(t===null?[]:u.createRestTypeNode(r(t)))),ri=({keySchema:e,valueSchema:t},{next:r})=>u.createExpressionWithTypeArguments(u.createIdentifier("Record"),[e,t].map(r)),oi=({_def:{left:e,right:t}},{next:r})=>{let o=[e,t].map(r);return o.every(y.isTypeLiteralNode)?u.createTypeLiteralNode(o.flatMap(({members:i})=>i)):u.createIntersectionTypeNode(o)},ni=({_def:e},{next:t})=>t(e.innerType),_=e=>()=>u.createKeywordTypeNode(e),si=(e,{next:t})=>t(e.unwrap()),ii=(e,{next:t})=>t(e.unwrap()),ai=({_def:e},{next:t})=>t(e.innerType),pi=({_def:e},{next:t,isResponse:r})=>t(e[r?"out":"in"]),ci=()=>u.createLiteralTypeNode(u.createNull()),di=(e,{makeAlias:t,next:r})=>t(e,()=>r(e.schema)),li=e=>{let t=e.unwrap(),r=u.createKeywordTypeNode(y.SyntaxKind.StringKeyword),o=u.createTypeReferenceNode("Buffer"),n=u.createUnionTypeNode([r,o]);return t instanceof _t.ZodString?r:t instanceof _t.ZodUnion?n:o},mi=(e,{next:t})=>t(e.unwrap().shape.raw),ui={ZodString:_(y.SyntaxKind.StringKeyword),ZodNumber:_(y.SyntaxKind.NumberKeyword),ZodBigInt:_(y.SyntaxKind.BigIntKeyword),ZodBoolean:_(y.SyntaxKind.BooleanKeyword),ZodAny:_(y.SyntaxKind.AnyKeyword),ZodUndefined:_(y.SyntaxKind.UndefinedKeyword),[re]:_(y.SyntaxKind.StringKeyword),[oe]:_(y.SyntaxKind.StringKeyword),ZodNull:ci,ZodArray:_s,ZodTuple:ti,ZodRecord:ri,ZodObject:Vs,ZodLiteral:Gs,ZodIntersection:oi,ZodUnion:Oo,ZodDefault:ni,ZodEnum:Ys,ZodNativeEnum:Ws,ZodEffects:Js,ZodOptional:Xs,ZodNullable:ei,ZodDiscriminatedUnion:Oo,ZodBranded:si,ZodCatch:ai,ZodPipeline:pi,ZodLazy:di,ZodReadonly:ii,[N]:li,[$]:mi},He=(e,{brandHandling:t,ctx:r})=>ie(e,{rules:{...t,...ui},onMissing:()=>u.createKeywordTypeNode(y.SyntaxKind.AnyKeyword),ctx:r});var Yt=class{program=[];usage=[];registry=new Map;paths=[];aliases=new Map;ids={pathType:s.createIdentifier("Path"),methodType:s.createIdentifier("Method"),methodPathType:s.createIdentifier("MethodPath"),inputInterface:s.createIdentifier("Input"),posResponseInterface:s.createIdentifier("PositiveResponse"),negResponseInterface:s.createIdentifier("NegativeResponse"),responseInterface:s.createIdentifier("Response"),jsonEndpointsConst:s.createIdentifier("jsonEndpoints"),endpointTagsConst:s.createIdentifier("endpointTags"),providerType:s.createIdentifier("Provider"),implementationType:s.createIdentifier("Implementation"),clientClass:s.createIdentifier("ExpressZodAPIClient"),keyParameter:s.createIdentifier("key"),pathParameter:s.createIdentifier("path"),paramsArgument:s.createIdentifier("params"),methodParameter:s.createIdentifier("method"),accumulator:s.createIdentifier("acc"),provideMethod:s.createIdentifier("provide"),implementationArgument:s.createIdentifier("implementation"),headersProperty:s.createIdentifier("headers"),hasBodyConst:s.createIdentifier("hasBody"),undefinedValue:s.createIdentifier("undefined"),bodyProperty:s.createIdentifier("body"),responseConst:s.createIdentifier("response"),searchParamsConst:s.createIdentifier("searchParams"),exampleImplementationConst:s.createIdentifier("exampleImplementation"),clientConst:s.createIdentifier("client"),contentTypeConst:s.createIdentifier("contentType"),isJsonConst:s.createIdentifier("isJSON")};interfaces=[];makeAlias(t,r){let o=this.aliases.get(t)?.name?.text;if(!o){o=`Type${this.aliases.size+1}`;let n=s.createLiteralTypeNode(s.createNull());this.aliases.set(t,pe(n,o)),this.aliases.set(t,pe(r(),o))}return s.createTypeReferenceNode(o)}constructor({routing:t,brandHandling:r,variant:o="client",splitResponse:n=!1,optionalPropStyle:i={withQuestionMark:!0,withUndefined:!0},noContent:a=fi.undefined()}){be({routing:t,onEndpoint:(H,j,Q)=>{let ce={makeAlias:this.makeAlias.bind(this),optionalPropStyle:i},Ae=I(Q,j,"input"),Pe=He(H.getSchema("input"),{brandHandling:r,ctx:{...ce,isResponse:!1}}),z=n?I(Q,j,"positive.response"):void 0,Qt=H.getResponses("positive").map(({schema:K,mimeTypes:J})=>J?K:a).reduce((K,J)=>K.or(J)),Jt=n?He(Qt,{brandHandling:r,ctx:{...ce,isResponse:!0}}):void 0,we=n?I(Q,j,"negative.response"):void 0,Wt=H.getResponses("negative").map(({schema:K,mimeTypes:J})=>J?K:a).reduce((K,J)=>K.or(J)),Xt=n?He(Wt,{brandHandling:r,ctx:{...ce,isResponse:!0}}):void 0,er=I(Q,j,"response"),Ro=z&&we?s.createUnionTypeNode([s.createTypeReferenceNode(z),s.createTypeReferenceNode(we)]):He(Qt.or(Wt),{brandHandling:r,ctx:{...ce,isResponse:!0}});this.program.push(pe(Pe,Ae)),Jt&&z&&this.program.push(pe(Jt,z)),Xt&&we&&this.program.push(pe(Xt,we)),this.program.push(pe(Ro,er)),this.paths.push(j),this.registry.set({method:Q,path:j},{input:Ae,positive:z,negative:we,response:er,isJson:H.getResponses("positive").some(K=>K.mimeTypes?.includes(R.json)),tags:H.getTags()})}}),this.program.unshift(...this.aliases.values()),this.program.push(Bt(this.ids.pathType,this.paths)),this.program.push(Bt(this.ids.methodType,bo)),this.program.push(ut(this.ids.methodPathType,Kt([this.ids.methodType,this.ids.pathType])));let p=[s.createHeritageClause(E.SyntaxKind.ExtendsKeyword,[Ft(this.ids.methodPathType,E.SyntaxKind.AnyKeyword)])];this.interfaces.push({id:this.ids.inputInterface,kind:"input",props:[]}),n&&this.interfaces.push({id:this.ids.posResponseInterface,kind:"positive",props:[]},{id:this.ids.negResponseInterface,kind:"negative",props:[]}),this.interfaces.push({id:this.ids.responseInterface,kind:"response",props:[]});let d=[],c=[];for(let[{method:H,path:j},{isJson:Q,tags:ce,...Ae}]of this.registry){let Pe=ho(H,j);for(let z of this.interfaces)z.kind in Ae&&z.props.push(co(Pe,Ae[z.kind]));o!=="types"&&(Q&&d.push(s.createPropertyAssignment(Pe,s.createTrue())),c.push(s.createPropertyAssignment(Pe,s.createArrayLiteralExpression(ce.map(z=>s.createStringLiteral(z))))))}for(let{id:H,props:j}of this.interfaces)this.program.push(yo(H,p,j));if(o==="types")return;let m=s.createVariableStatement(V,k(this.ids.jsonEndpointsConst,s.createObjectLiteralExpression(d))),l=s.createVariableStatement(V,k(this.ids.endpointTagsConst,s.createObjectLiteralExpression(c))),f=ut(this.ids.providerType,s.createFunctionTypeNode(go({M:this.ids.methodType,P:this.ids.pathType}),mt({method:s.createTypeReferenceNode("M"),path:s.createTypeReferenceNode("P"),params:s.createIndexedAccessTypeNode(s.createTypeReferenceNode(this.ids.inputInterface),Dt)}),uo(this.ids.responseInterface,Dt))),x=ut(this.ids.implementationType,s.createFunctionTypeNode(void 0,mt({method:s.createTypeReferenceNode(this.ids.methodType),path:s.createKeywordTypeNode(E.SyntaxKind.StringKeyword),params:Ft(E.SyntaxKind.StringKeyword,E.SyntaxKind.AnyKeyword)}),fo())),T=s.createTemplateExpression(s.createTemplateHead(":"),[s.createTemplateSpan(this.ids.keyParameter,Ue)]),O=$t(this.ids.paramsArgument,s.createCallExpression(s.createPropertyAccessExpression(this.ids.accumulator,"replace"),void 0,[T,s.createElementAccessExpression(this.ids.paramsArgument,this.ids.keyParameter)]),this.ids.pathParameter),g=$t(this.ids.paramsArgument,s.createConditionalExpression(s.createBinaryExpression(s.createCallExpression(s.createPropertyAccessExpression(this.ids.pathParameter,"indexOf"),void 0,[T]),E.SyntaxKind.GreaterThanEqualsToken,s.createNumericLiteral(0)),void 0,this.ids.accumulator,void 0,s.createObjectLiteralExpression([s.createSpreadAssignment(this.ids.accumulator),s.createPropertyAssignment(s.createComputedPropertyName(this.ids.keyParameter),s.createElementAccessExpression(this.ids.paramsArgument,this.ids.keyParameter))])),s.createObjectLiteralExpression()),P=mo(this.ids.clientClass,po([lt(this.ids.implementationArgument,s.createTypeReferenceNode(this.ids.implementationType),ao)]),[lo(this.ids.provideMethod,s.createTypeReferenceNode(this.ids.providerType),qt([this.ids.methodParameter,this.ids.pathParameter,this.ids.paramsArgument],s.createCallExpression(s.createPropertyAccessExpression(s.createThis(),this.ids.implementationArgument),void 0,[this.ids.methodParameter,O,g]),!0))]);this.program.push(m,l,f,x,P);let w=s.createPropertyAssignment(this.ids.methodParameter,s.createCallExpression(s.createPropertyAccessExpression(this.ids.methodParameter,"toUpperCase"),void 0,void 0)),v=s.createPropertyAssignment(this.ids.headersProperty,s.createConditionalExpression(this.ids.hasBodyConst,void 0,s.createObjectLiteralExpression([s.createPropertyAssignment(s.createStringLiteral("Content-Type"),s.createStringLiteral(R.json))]),void 0,this.ids.undefinedValue)),M=s.createPropertyAssignment(this.ids.bodyProperty,s.createConditionalExpression(this.ids.hasBodyConst,void 0,s.createCallExpression(s.createPropertyAccessExpression(s.createIdentifier("JSON"),"stringify"),void 0,[this.ids.paramsArgument]),void 0,this.ids.undefinedValue)),Te=s.createVariableStatement(void 0,k(this.ids.responseConst,s.createAwaitExpression(s.createCallExpression(s.createIdentifier("fetch"),void 0,[s.createTemplateExpression(s.createTemplateHead("https://example.com"),[s.createTemplateSpan(this.ids.pathParameter,s.createTemplateMiddle("")),s.createTemplateSpan(this.ids.searchParamsConst,Ue)]),s.createObjectLiteralExpression([w,v,M])])))),Ke=s.createVariableStatement(void 0,k(this.ids.hasBodyConst,s.createLogicalNot(s.createCallExpression(s.createPropertyAccessExpression(s.createArrayLiteralExpression([s.createStringLiteral("get"),s.createStringLiteral("delete")]),"includes"),void 0,[this.ids.methodParameter])))),yt=s.createVariableStatement(void 0,k(this.ids.searchParamsConst,s.createConditionalExpression(this.ids.hasBodyConst,void 0,s.createStringLiteral(""),void 0,s.createTemplateExpression(s.createTemplateHead("?"),[s.createTemplateSpan(s.createNewExpression(s.createIdentifier("URLSearchParams"),void 0,[this.ids.paramsArgument]),Ue)])))),De=s.createVariableStatement(void 0,k(this.ids.contentTypeConst,s.createCallExpression(s.createPropertyAccessExpression(s.createPropertyAccessExpression(this.ids.responseConst,this.ids.headersProperty),s.createIdentifier("get")),void 0,[s.createStringLiteral("content-type")]))),U=s.createIfStatement(s.createPrefixUnaryExpression(E.SyntaxKind.ExclamationToken,this.ids.contentTypeConst),s.createReturnStatement(void 0),void 0),Y=s.createVariableStatement(void 0,k(this.ids.isJsonConst,s.createCallChain(s.createPropertyAccessChain(this.ids.contentTypeConst,void 0,s.createIdentifier("startsWith")),void 0,void 0,[s.createStringLiteral(R.json)]))),Oe=s.createReturnStatement(s.createCallExpression(s.createElementAccessExpression(this.ids.responseConst,xo(this.ids.isJsonConst,s.createStringLiteral("json"),s.createStringLiteral("text"))),void 0,[])),gt=s.createVariableStatement(V,k(this.ids.exampleImplementationConst,qt([this.ids.methodParameter,this.ids.pathParameter,this.ids.paramsArgument],s.createBlock([Ke,yt,Te,De,U,Y,Oe]),!0),s.createTypeReferenceNode(this.ids.implementationType))),Fe=s.createExpressionStatement(s.createCallExpression(s.createPropertyAccessExpression(this.ids.clientConst,this.ids.provideMethod),void 0,[s.createStringLiteral("get"),s.createStringLiteral("/v1/user/retrieve"),s.createObjectLiteralExpression([s.createPropertyAssignment("id",s.createStringLiteral("10"))])])),Re=s.createVariableStatement(void 0,k(this.ids.clientConst,s.createNewExpression(this.ids.clientClass,void 0,[this.ids.exampleImplementationConst])));this.usage.push(gt,Re,Fe)}printUsage(t){return this.usage.length?this.usage.map(r=>typeof r=="string"?r:Vt(r,t)).join(`
|
|
19
19
|
`):void 0}print(t){let r=this.printUsage(t),o=r&&E.addSyntheticLeadingComment(E.addSyntheticLeadingComment(s.createEmptyStatement(),E.SyntaxKind.SingleLineCommentTrivia," Usage example:"),E.SyntaxKind.MultiLineCommentTrivia,`
|
|
20
20
|
${r}`);return this.program.concat(o||[]).map((n,i)=>Vt(n,i<this.program.length?t:{...t,omitTrailingSemicolon:!0})).join(`
|
|
21
21
|
|
package/migration/index.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var d=Object.defineProperty;var A=Object.getOwnPropertyDescriptor;var L=Object.getOwnPropertyNames;var z=Object.prototype.hasOwnProperty;var M=(s,e)=>{for(var t in e)d(s,t,{get:e[t],enumerable:!0})},O=(s,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of L(e))!z.call(s,a)&&a!==t&&d(s,a,{get:()=>e[a],enumerable:!(r=A(e,a))||r.enumerable});return s};var R=s=>O(d({},"__esModule",{value:!0}),s);var Y={};M(Y,{default:()=>U});module.exports=R(Y);var o=require("@typescript-eslint/utils");var h="express-zod-api";var F="createConfig",W="createServer",
|
|
1
|
+
"use strict";var d=Object.defineProperty;var A=Object.getOwnPropertyDescriptor;var L=Object.getOwnPropertyNames;var z=Object.prototype.hasOwnProperty;var M=(s,e)=>{for(var t in e)d(s,t,{get:e[t],enumerable:!0})},O=(s,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of L(e))!z.call(s,a)&&a!==t&&d(s,a,{get:()=>e[a],enumerable:!(r=A(e,a))||r.enumerable});return s};var R=s=>O(d({},"__esModule",{value:!0}),s);var Y={};M(Y,{default:()=>U});module.exports=R(Y);var o=require("@typescript-eslint/utils");var h="express-zod-api";var F="createConfig",W="createServer",b="server",x="beforeRouting",v="httpServer",T="httpsServer",k="originalError",P="getStatusCodeFromError",S="logger",E="getChildLogger",I="methods",j="tags",w="scopes",N="statusCodes",$="mimeTypes",H="build",_="ResultHandler",q="handler",i={[b]:"http",[v]:"servers",[T]:"servers",[k]:"cause",[S]:"getLogger",[E]:"getLogger",[I]:"method",[j]:"tag",[w]:"scope",[N]:"statusCode",[$]:"mimeType"},g={[P]:"ensureHttpError"},B=["jsonParser","upload","compression","rawParser","beforeRouting"],u={loggerArgument:`${o.AST_NODE_TYPES.Property}[key.name="${x}"] ${o.AST_NODE_TYPES.ArrowFunctionExpression} ${o.AST_NODE_TYPES.Identifier}[name="${S}"]`,getChildLoggerArgument:`${o.AST_NODE_TYPES.Property}[key.name="${x}"] ${o.AST_NODE_TYPES.ArrowFunctionExpression} ${o.AST_NODE_TYPES.Identifier}[name="${E}"]`,responseFeatures:`${o.AST_NODE_TYPES.NewExpression}[callee.name='${_}'] > ${o.AST_NODE_TYPES.ObjectExpression} > ${o.AST_NODE_TYPES.Property}[key.name!='${q}'] ${o.AST_NODE_TYPES.Property}[key.name=/(${N}|${$})/]`},m=s=>s.type===o.AST_NODE_TYPES.Property&&s.key.type===o.AST_NODE_TYPES.Identifier,V=s=>s.type===o.AST_NODE_TYPES.VariableDeclarator&&s.id.type===o.AST_NODE_TYPES.ObjectPattern,c=s=>e=>m(e)&&(Array.isArray(s)?s.includes(e.key.name):e.key.name===s),Q=o.ESLintUtils.RuleCreator.withoutDocs({meta:{type:"problem",fixable:"code",schema:[],messages:{change:"Change {{subject}} {{from}} to {{to}}.",move:"Move {{subject}} from {{from}} to {{to}}."}},defaultOptions:[],create:s=>({[o.AST_NODE_TYPES.ImportDeclaration]:e=>{if(e.source.value===h){for(let t of e.specifiers)if(t.type===o.AST_NODE_TYPES.ImportSpecifier&&t.imported.type===o.AST_NODE_TYPES.Identifier&&t.imported.name in g){let r=g[t.imported.name];s.report({node:t.imported,messageId:"change",data:{subject:"import",from:t.imported.name,to:r},fix:a=>a.replaceText(t,r)})}}},[o.AST_NODE_TYPES.MemberExpression]:e=>{if(e.property.type===o.AST_NODE_TYPES.Identifier&&e.property.name===k&&e.object.type===o.AST_NODE_TYPES.Identifier&&e.object.name.match(/err/i)){let t=i[e.property.name];s.report({node:e.property,messageId:"change",data:{subject:"property",from:e.property.name,to:t}})}},[o.AST_NODE_TYPES.CallExpression]:e=>{if(e.callee.type===o.AST_NODE_TYPES.MemberExpression&&e.callee.property.type===o.AST_NODE_TYPES.Identifier&&e.callee.property.name===H&&e.arguments.length===1&&e.arguments[0].type===o.AST_NODE_TYPES.ObjectExpression){let t=e.arguments[0].properties.filter(c([I,j,w]));for(let r of t){let a=i[r.key.name];s.report({node:r,messageId:"change",data:{subject:"property",from:r.key.name,to:a},fix:n=>n.replaceText(r.key,a)})}}if(e.callee.type===o.AST_NODE_TYPES.Identifier){if(e.callee.name===F&&e.arguments.length===1){let t=e.arguments[0];if(t.type===o.AST_NODE_TYPES.ObjectExpression){let r=t.properties.find(c(b));if(r){let n=i[r.key.name];s.report({node:r,messageId:"change",data:{subject:"property",from:r.key.name,to:n},fix:l=>l.replaceText(r.key,n)})}let a=t.properties.find(c(i.server));if(a&&a.value.type===o.AST_NODE_TYPES.ObjectExpression){let l=a.value.properties.filter(c(B));for(let p of l){let C=s.sourceCode.text.slice(...p.range),y=s.sourceCode.getTokenAfter(p);s.report({node:a,messageId:"move",data:{subject:m(p)?p.key.name:"the property",from:a.key.name,to:`the top level of ${e.callee.name} argument`},fix:f=>[f.insertTextAfter(a,`, ${C}`),f.removeRange([p.range[0],y?.value===","?y.range[1]:p.range[1]])]})}}}}if(e.callee.name===W){let t=s.sourceCode.getAncestors(e).findLast(V);if(t){let r=t.id.properties.filter(c([v,T]));for(let a of r)s.report({node:a,messageId:"change",data:{subject:"property",from:a.key.name,to:i[a.key.name]}})}}if(e.callee.name===P){let t=g[e.callee.name];s.report({node:e.callee,messageId:"change",data:{subject:"method",from:e.callee.name,to:`${t}().statusCode`},fix:r=>[r.replaceText(e.callee,t),r.insertTextAfter(e,".statusCode")]})}}},[u.loggerArgument]:e=>{let{parent:t}=e,r=m(t);if(r&&t.value===e)return;let a=`${i[e.name]}${r?"":"()"}`;s.report({node:e,messageId:"change",data:{subject:r?"property":"const",from:e.name,to:a},fix:n=>n.replaceText(e,a)})},[u.getChildLoggerArgument]:e=>{let{parent:t}=e,r=m(t);if(r&&t.value===e)return;let a=i[e.name];s.report({node:e,messageId:"change",data:{subject:r?"property":"method",from:e.name,to:a},fix:n=>n.replaceText(e,a)})},[u.responseFeatures]:e=>{if(!m(e))return;let t=i[e.key.name];s.report({node:e,messageId:"change",data:{subject:"property",from:e.key.name,to:t},fix:r=>r.replaceText(e.key,t)})}})}),U={rules:{v21:Q}};
|
package/migration/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{ESLintUtils as A,AST_NODE_TYPES as r}from"@typescript-eslint/utils";var f="express-zod-api";var L="createConfig",z="createServer",
|
|
1
|
+
import{ESLintUtils as A,AST_NODE_TYPES as r}from"@typescript-eslint/utils";var f="express-zod-api";var L="createConfig",z="createServer",x="server",h="beforeRouting",b="httpServer",v="httpsServer",T="originalError",k="getStatusCodeFromError",P="logger",S="getChildLogger",E="methods",I="tags",j="scopes",w="statusCodes",N="mimeTypes",M="build",O="ResultHandler",R="handler",i={[x]:"http",[b]:"servers",[v]:"servers",[T]:"cause",[P]:"getLogger",[S]:"getLogger",[E]:"method",[I]:"tag",[j]:"scope",[w]:"statusCode",[N]:"mimeType"},d={[k]:"ensureHttpError"},D=["jsonParser","upload","compression","rawParser","beforeRouting"],g={loggerArgument:`${r.Property}[key.name="${h}"] ${r.ArrowFunctionExpression} ${r.Identifier}[name="${P}"]`,getChildLoggerArgument:`${r.Property}[key.name="${h}"] ${r.ArrowFunctionExpression} ${r.Identifier}[name="${S}"]`,responseFeatures:`${r.NewExpression}[callee.name='${O}'] > ${r.ObjectExpression} > ${r.Property}[key.name!='${R}'] ${r.Property}[key.name=/(${w}|${N})/]`},m=o=>o.type===r.Property&&o.key.type===r.Identifier,F=o=>o.type===r.VariableDeclarator&&o.id.type===r.ObjectPattern,c=o=>e=>m(e)&&(Array.isArray(o)?o.includes(e.key.name):e.key.name===o),W=A.RuleCreator.withoutDocs({meta:{type:"problem",fixable:"code",schema:[],messages:{change:"Change {{subject}} {{from}} to {{to}}.",move:"Move {{subject}} from {{from}} to {{to}}."}},defaultOptions:[],create:o=>({[r.ImportDeclaration]:e=>{if(e.source.value===f){for(let t of e.specifiers)if(t.type===r.ImportSpecifier&&t.imported.type===r.Identifier&&t.imported.name in d){let s=d[t.imported.name];o.report({node:t.imported,messageId:"change",data:{subject:"import",from:t.imported.name,to:s},fix:a=>a.replaceText(t,s)})}}},[r.MemberExpression]:e=>{if(e.property.type===r.Identifier&&e.property.name===T&&e.object.type===r.Identifier&&e.object.name.match(/err/i)){let t=i[e.property.name];o.report({node:e.property,messageId:"change",data:{subject:"property",from:e.property.name,to:t}})}},[r.CallExpression]:e=>{if(e.callee.type===r.MemberExpression&&e.callee.property.type===r.Identifier&&e.callee.property.name===M&&e.arguments.length===1&&e.arguments[0].type===r.ObjectExpression){let t=e.arguments[0].properties.filter(c([E,I,j]));for(let s of t){let a=i[s.key.name];o.report({node:s,messageId:"change",data:{subject:"property",from:s.key.name,to:a},fix:n=>n.replaceText(s.key,a)})}}if(e.callee.type===r.Identifier){if(e.callee.name===L&&e.arguments.length===1){let t=e.arguments[0];if(t.type===r.ObjectExpression){let s=t.properties.find(c(x));if(s){let n=i[s.key.name];o.report({node:s,messageId:"change",data:{subject:"property",from:s.key.name,to:n},fix:l=>l.replaceText(s.key,n)})}let a=t.properties.find(c(i.server));if(a&&a.value.type===r.ObjectExpression){let l=a.value.properties.filter(c(D));for(let p of l){let $=o.sourceCode.text.slice(...p.range),u=o.sourceCode.getTokenAfter(p);o.report({node:a,messageId:"move",data:{subject:m(p)?p.key.name:"the property",from:a.key.name,to:`the top level of ${e.callee.name} argument`},fix:y=>[y.insertTextAfter(a,`, ${$}`),y.removeRange([p.range[0],u?.value===","?u.range[1]:p.range[1]])]})}}}}if(e.callee.name===z){let t=o.sourceCode.getAncestors(e).findLast(F);if(t){let s=t.id.properties.filter(c([b,v]));for(let a of s)o.report({node:a,messageId:"change",data:{subject:"property",from:a.key.name,to:i[a.key.name]}})}}if(e.callee.name===k){let t=d[e.callee.name];o.report({node:e.callee,messageId:"change",data:{subject:"method",from:e.callee.name,to:`${t}().statusCode`},fix:s=>[s.replaceText(e.callee,t),s.insertTextAfter(e,".statusCode")]})}}},[g.loggerArgument]:e=>{let{parent:t}=e,s=m(t);if(s&&t.value===e)return;let a=`${i[e.name]}${s?"":"()"}`;o.report({node:e,messageId:"change",data:{subject:s?"property":"const",from:e.name,to:a},fix:n=>n.replaceText(e,a)})},[g.getChildLoggerArgument]:e=>{let{parent:t}=e,s=m(t);if(s&&t.value===e)return;let a=i[e.name];o.report({node:e,messageId:"change",data:{subject:s?"property":"method",from:e.name,to:a},fix:n=>n.replaceText(e,a)})},[g.responseFeatures]:e=>{if(!m(e))return;let t=i[e.key.name];o.report({node:e,messageId:"change",data:{subject:"property",from:e.key.name,to:t},fix:s=>s.replaceText(e.key,t)})}})}),B={rules:{v21:W}};export{B as default};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "express-zod-api",
|
|
3
|
-
"version": "21.1.0
|
|
3
|
+
"version": "21.1.0",
|
|
4
4
|
"description": "A Typescript framework to help you get an API server up and running with I/O schema validation and custom middlewares in minutes.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|