express-zod-api
Advanced tools
Comparing version 21.0.0-beta.6 to 21.0.0
@@ -18,3 +18,3 @@ import{clone as Xt,fromPairs as Zo,map as Eo,pipe as vo,toPairs as jo,pair as No}from"ramda";import{z as le}from"zod";import{memoizeWith as To,pickBy as Oo,xprod as Ro}from"ramda";import{z as Ao}from"zod";var R={json:"application/json",upload:"multipart/form-data",raw:"application/octet-stream"};var ce=class extends Error{name="RoutingError"},E=class extends Error{name="DocumentationError";cause;constructor(t,{method:r,path:o,isResponse:n}){super(t),this.cause=`${n?"Response":"Input"} schema of an Endpoint assigned to ${r.toUpperCase()} method of ${o} path.`}},De=class extends Error{name="IOSchemaError"},Q=class extends De{constructor(r){super(J(r),{cause:r});this.cause=r}name="OutputValidationError"},K=class extends De{constructor(r){super(J(r),{cause:r});this.cause=r}name="InputValidationError"},B=class extends Error{constructor(r,o){super(J(r),{cause:r});this.cause=r;this.handled=o}name="ResultHandlerError"},Pe=class extends Error{name="MissingPeerError";constructor(t){super(`Missing peer dependency: ${t}. Please install it to use the feature.`)}};var Po=e=>{let r=(e.header("content-type")||"").toLowerCase().startsWith(R.upload);return"files"in e&&r},ft={get:["query","params"],post:["body","params","files"],put:["body","params"],patch:["body","params"],delete:["query","params"]},wo=["body","query","params"],yt=e=>e.method.toLowerCase(),gt=e=>e.startsWith("x-"),zo=e=>Oo((t,r)=>gt(r),e),Ke=(e,t={})=>{let r=yt(e);return r==="options"?{}:(t[r]||ft[r]||wo).filter(o=>o==="files"?Po(e):!0).map(o=>o==="headers"?zo(e[o]):e[o]).reduce((o,n)=>Object.assign(o,n),{})},q=e=>e instanceof Error?e:new Error(String(e)),J=e=>e instanceof Ao.ZodError?e.issues.map(({path:t,message:r})=>(t.length?[t.join("/")]:[]).concat(r).join(": ")).join("; "):e instanceof Q?`output${e.cause.issues[0]?.path.length>0?"/":": "}${e.message}`:e.message,$=({schema:e,variant:t="original",validate:r=t==="parsed"})=>{let o=e._def[x]?.examples||[];if(!r&&t==="original")return o;let n=[];for(let i of o){let a=e.safeParse(i);a.success&&n.push(t==="parsed"?a.data:i)}return n},W=(e,t,r)=>e.length&&t.length?Ro(e,t).map(r):e.concat(t),we=e=>"coerce"in e._def&&typeof e._def.coerce=="boolean"?e._def.coerce:!1,ht=e=>e.charAt(0).toUpperCase()+e.slice(1).toLowerCase(),v=(...e)=>e.flatMap(t=>t.split(/[^A-Z0-9]/gi)).flatMap(t=>t.replaceAll(/[A-Z]+/g,r=>`/${r}`).split("/")).map(ht).join(""),Fe=(e,t)=>{try{return typeof e.parse(t)}catch{return}},X=e=>typeof e=="object"&&e!==null,de=To(()=>"static",()=>process.env.NODE_ENV==="production");import{clone as Io,mergeDeepRight as Co}from"ramda";var x=Symbol.for("express-zod-api"),Be=e=>{let t=e.describe(e.description);return t._def[x]=Io(t._def[x])||{examples:[]},t},Wt=(e,t)=>{if(!(x in e._def))return t;let r=Be(t);return r._def[x].examples=W(r._def[x].examples,e._def[x].examples,([o,n])=>typeof o=="object"&&typeof n=="object"?Co({...o},{...n}):n),r};var Lo=function(e){let t=Be(this);return t._def[x].examples.push(e),t},ko=function(e){let t=Be(this);return t._def[x].defaultLabel=e,t},Mo=function(e){return new le.ZodBranded({typeName:le.ZodFirstPartyTypeKind.ZodBranded,type:this,description:this._def.description,errorMap:this._def.errorMap,[x]:{examples:[],...Xt(this._def[x]),brand:e}})},Ho=function(e){let t=typeof e=="function"?e:vo(jo,Eo(([n,i])=>No(e[String(n)]||n,i)),Zo),r=t(Xt(this.shape)),o=le.object(r)[this._def.unknownKeys]();return this.transform(t).pipe(o)};x in globalThis||(globalThis[x]=!0,Object.defineProperties(le.ZodType.prototype,{example:{get(){return Lo.bind(this)}},brand:{set(){},get(){return Mo.bind(this)}}}),Object.defineProperty(le.ZodDefault.prototype,"label",{get(){return ko.bind(this)}}),Object.defineProperty(le.ZodObject.prototype,"remap",{get(){return Ho.bind(this)}}));function Uo(e){return e}import{z as Qo}from"zod";import{z as dr}from"zod";import{fail as A}from"node:assert/strict";import{z as ze}from"zod";var qe=e=>!isNaN(e.getTime());var ee=Symbol("DateIn"),er=()=>ze.union([ze.string().date(),ze.string().datetime(),ze.string().datetime({local:!0})]).transform(t=>new Date(t)).pipe(ze.date().refine(qe)).brand(ee);import{z as Do}from"zod";var te=Symbol("DateOut"),tr=()=>Do.date().refine(qe).transform(e=>e.toISOString()).brand(te);import{z as $e}from"zod";var k=Symbol("File"),rr=$e.custom(e=>Buffer.isBuffer(e),{message:"Expected Buffer"}),Ko={buffer:()=>rr.brand(k),string:()=>$e.string().brand(k),binary:()=>rr.or($e.string()).brand(k),base64:()=>$e.string().base64().brand(k)};function Ge(e){return Ko[e||"string"]()}import{z as Fo}from"zod";var G=Symbol("Raw"),or=(e={})=>Fo.object({raw:Ge("buffer")}).extend(e).brand(G);import{z as Bo}from"zod";var me=Symbol("Upload"),nr=()=>Bo.custom(e=>typeof e=="object"&&e!==null&&"name"in e&&"encoding"in e&&"mimetype"in e&&"data"in e&&"tempFilePath"in e&&"truncated"in e&&"size"in e&&"md5"in e&&"mv"in e&&typeof e.name=="string"&&typeof e.encoding=="string"&&typeof e.mimetype=="string"&&Buffer.isBuffer(e.data)&&typeof e.tempFilePath=="string"&&typeof e.truncated=="boolean"&&typeof e.size=="number"&&typeof e.md5=="string"&&typeof e.mv=="function",e=>({message:`Expected file upload, received ${typeof e}`})).brand(me);var sr=(e,{next:t})=>e.options.some(t),qo=({_def:e},{next:t})=>[e.left,e.right].some(t),Ve=(e,{next:t})=>t(e.unwrap()),xt={ZodObject:({shape:e},{next:t})=>Object.values(e).some(t),ZodUnion:sr,ZodDiscriminatedUnion:sr,ZodIntersection:qo,ZodEffects:(e,{next:t})=>t(e.innerType()),ZodOptional:Ve,ZodNullable:Ve,ZodRecord:({valueSchema:e},{next:t})=>t(e),ZodArray:({element:e},{next:t})=>t(e),ZodDefault:({_def:e},{next:t})=>t(e.innerType)},_e=(e,{condition:t,rules:r=xt,depth:o=1,maxDepth:n=Number.POSITIVE_INFINITY})=>{if(t?.(e))return!0;let i=o<n?r[e._def[x]?.brand]||r[e._def.typeName]:void 0;return i?i(e,{next:a=>_e(a,{condition:t,rules:r,maxDepth:n,depth:o+1})}):!1},ir=e=>_e(e,{condition:t=>t._def[x]?.brand===me}),ar=e=>_e(e,{condition:t=>t._def[x]?.brand===G,maxDepth:3}),bt=(e,t)=>{let r=new WeakSet;return _e(e,{maxDepth:300,rules:{...xt,ZodBranded:Ve,ZodReadonly:Ve,ZodCatch:({_def:{innerType:o}},{next:n})=>n(o),ZodPipeline:({_def:o},{next:n})=>n(o[t]),ZodLazy:(o,{next:n})=>r.has(o)?!1:r.add(o)&&n(o.schema),ZodTuple:({items:o,_def:{rest:n}},{next:i})=>[...o].concat(n??[]).some(i),ZodEffects:{out:void 0,in:xt.ZodEffects}[t],ZodNaN:()=>A("z.nan()"),ZodSymbol:()=>A("z.symbol()"),ZodFunction:()=>A("z.function()"),ZodMap:()=>A("z.map()"),ZodSet:()=>A("z.set()"),ZodBigInt:()=>A("z.bigint()"),ZodVoid:()=>A("z.void()"),ZodPromise:()=>A("z.promise()"),ZodNever:()=>A("z.never()"),ZodDate:()=>t==="in"&&A("z.date()"),[te]:()=>t==="in"&&A("ez.dateOut()"),[ee]:()=>t==="out"&&A("ez.dateIn()"),[G]:()=>t==="out"&&A("ez.raw()"),[me]:()=>t==="out"&&A("ez.upload()"),[k]:()=>!1}})};import Vo,{isHttpError as _o}from"http-errors";import pr,{isHttpError as $o}from"http-errors";import{z as Go}from"zod";var St=(e,{variant:t,args:r,...o})=>{if(typeof e=="function"&&(e=e(...r)),e instanceof Go.ZodType)return[{schema:e,...o}];if(Array.isArray(e)&&!e.length){let n=new Error(`At least one ${t} response schema required.`);throw new B(n)}return(Array.isArray(e)?e:[e]).map(({schema:n,statusCode:i,mimeType:a})=>({schema:n,statusCodes:typeof i=="number"?[i]:i||o.statusCodes,mimeTypes:typeof a=="string"?[a]:a||o.mimeTypes}))},Tt=(e,t,{url:r},o)=>!e.expose&&t.error("Server side error",{error:e,url:r,payload:o}),Ye=e=>$o(e)?e:pr(e instanceof K?400:500,J(e),{cause:e.cause||e}),Ie=e=>de()&&!e.expose?pr(e.statusCode).message:e.message;var Qe=({error:e,logger:t,response:r})=>{t.error("Result handler failure",e);let o=Ie(Vo(500,`An error occurred while serving the result: ${e.message}.`+(e.handled?` | ||
`).map((c,m)=>p[m]?p[m](c):c).join(` | ||
`))};var Mr=e=>{e.startupLogo!==!1&&kr(process.stdout);let t=e.errorHandler||Ee,r=ur(e.logger)?e.logger:new je(e.logger);r.debug("Running",{build:"v21.0.0-beta.6 (ESM)",env:process.env.NODE_ENV||"development"}),jr(r);let o=Er({logger:r,config:e}),i={getLogger:vr(r),errorHandler:t},a=Ir(i),p=zr(i);return{...i,logger:r,notFoundHandler:a,parserFailureHandler:p,loggingMiddleware:o}},Sn=(e,t)=>{let{logger:r,getLogger:o,notFoundHandler:n,loggingMiddleware:i}=Mr(e);return zt({app:e.app.use(i),routing:t,getLogger:o,config:e}),{notFoundHandler:n,logger:r}},Tn=async(e,t)=>{let{logger:r,getLogger:o,notFoundHandler:n,parserFailureHandler:i,loggingMiddleware:a}=Mr(e),p=It().disable("x-powered-by").use(a);if(e.compression){let f=await he("compression");p.use(f(typeof e.compression=="object"?e.compression:void 0))}let d={json:[e.jsonParser||It.json()],raw:[e.rawParser||It.raw(),Zr],upload:e.upload?await Cr({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,g)=>()=>f.listen(g,()=>r.info("Listening",g)),l=[];if(e.http){let f=xn.createServer(p);c.push(f),l.push(m(f,e.http.listen))}if(e.https){let f=bn.createServer(e.https.options,p);c.push(f),l.push(m(f,e.https.listen))}return e.gracefulShutdown&&Nr({logger:r,servers:c,options:e.gracefulShutdown===!0?{}:e.gracefulShutdown}),{app:p,logger:r,servers:l.map(f=>f())}};import{OpenApiBuilder as Ps}from"openapi3-ts/oas31";import{keys as ws,pluck as zs}from"ramda";import{isReferenceObject as Et,isSchemaObject as nt}from"openapi3-ts/oas31";import{concat as On,type as Dr,filter as Rn,fromPairs as st,has as An,isNil as Pn,map as be,mergeAll as wn,mergeDeepRight as zn,mergeDeepWith as In,objOf as Kr,omit as it,pipe as Fr,pluck as Cn,range as Zn,reject as En,toLower as vn,union as jn,when as Nn,xprod as Ct,zip as Ln}from"ramda";import{z as b}from"zod";var ne=(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=>ne(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 Hr=50,Br="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString",kn={integer:0,number:0,string:"",boolean:!1,object:{},null:null,array:[]},qr=/:([A-Za-z0-9_]+)/g,Mn=e=>e.match(qr)?.map(t=>t.slice(1))||[],$r=e=>e.replace(qr,t=>`{${t.slice(1)}}`),Hn=({_def:e},{next:t})=>({...t(e.innerType),default:e[x]?.defaultLabel||e.defaultValue()}),Un=({_def:{innerType:e}},{next:t})=>t(e),Dn=()=>({format:"any"}),Kn=({},e)=>{if(e.isResponse)throw new E("Please use ez.upload() only for input.",e);return{type:"string",format:"binary"}},Fn=e=>{let t=e.unwrap();return{type:"string",format:t instanceof b.ZodString?t._def.checks.find(r=>r.kind==="base64")?"byte":"file":"binary"}},Bn=({options:e},{next:t})=>({oneOf:e.map(t)}),qn=({options:e,discriminator:t},{next:r})=>({discriminator:{propertyName:t},oneOf:e.map(r)}),$n=(e,t)=>{if(Array.isArray(e)&&Array.isArray(t))return On(e,t);if(e===t)return t;throw new Error("Can not flatten properties")},Gn=e=>{let[t,r]=e.filter(nt).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=In($n,t.properties||{},r.properties||{})),(t.required||r.required)&&(o.required=jn(t.required||[],r.required||[])),(t.examples||r.examples)&&(o.examples=W(t.examples||[],r.examples||[],([n,i])=>zn(n,i))),o},Vn=({_def:{left:e,right:t}},{next:r})=>{let o=[e,t].map(r);try{return Gn(o)}catch{}return{allOf:o}},_n=(e,{next:t})=>t(e.unwrap()),Yn=(e,{next:t})=>t(e.unwrap()),Qn=(e,{next:t})=>{let r=t(e.unwrap());return nt(r)&&(r.type=Vr(r)),r},Gr=e=>{let t=vn(Dr(e));return typeof e=="bigint"?"integer":t==="number"||t==="string"||t==="boolean"||t==="object"||t==="null"||t==="array"?t:void 0},Ur=e=>({type:Gr(Object.values(e.enum)[0]),enum:Object.values(e.enum)}),Jn=({value:e})=>({type:Gr(e),const:e}),Wn=(e,{isResponse:t,next:r})=>{let o=Object.keys(e.shape),n=p=>t&&we(p)?p instanceof b.ZodOptional:p.isOptional(),i=o.filter(p=>!n(e.shape[p])),a={type:"object"};return o.length&&(a.properties=ot(e,r)),i.length&&(a.required=i),a},Xn=()=>({type:"null"}),es=({},e)=>{if(e.isResponse)throw new E("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:Br}}},ts=({},e)=>{if(!e.isResponse)throw new E("Please use ez.dateIn() for input.",e);return{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",externalDocs:{url:Br}}},rs=({},e)=>{throw new E(`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)},os=()=>({type:"boolean"}),ns=()=>({type:"integer",format:"bigint"}),ss=e=>e.every(t=>t instanceof b.ZodLiteral),is=({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=ot(b.object(st(Ct(o,[t]))),r),n.required=o),n}if(e instanceof b.ZodLiteral)return{type:"object",properties:ot(b.object({[e.value]:t}),r),required:[e.value]};if(e instanceof b.ZodUnion&&ss(e.options)){let o=be(i=>`${i.value}`,e.options),n=st(Ct(o,[t]));return{type:"object",properties:ot(b.object(n),r),required:o}}return{type:"object",additionalProperties:r(t)}},as=({_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},ps=({items:e,_def:{rest:t}},{next:r})=>({type:"array",prefixItems:e.map(r),items:t===null?{not:{}}:r(t)}),cs=({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"),g=l.find(P=>P.kind==="datetime"),O=f?f.regex:g?g.offset?new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(([+-]\\d{2}:\\d{2})|Z)$"):new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?Z$"):void 0,T={type:"string"},h={"date-time":m,email:e,url:t,uuid:n,cuid:i,cuid2:a,ulid:p,ip:d,emoji:c};for(let P in h)if(h[P]){T.format=P;break}return r!==null&&(T.minLength=r),o!==null&&(T.maxLength=o),O&&(T.pattern=O.source),T},ds=({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},ot=({shape:e},t)=>be(t,e),ls=e=>{let t=Array.isArray(e.type)?e.type[0]:e.type;return kn?.[t]},Vr=({type:e})=>e==="null"?e:typeof e=="string"?[e,"null"]:e?[...new Set(e).add("null")]:"null",ms=(e,{isResponse:t,next:r})=>{let o=r(e.innerType()),{effect:n}=e._def;if(t&&n.type==="transform"&&nt(o)){let i=Fe(e,ls(o));return i&&["number","string","boolean"].includes(i)?{type:i}:r(b.any())}if(!t&&n.type==="preprocess"&&nt(o)){let{type:i,...a}=o;return{...a,format:`${a.format||i} (preprocessed)`}}return o},us=({_def:e},{isResponse:t,next:r})=>r(e[t?"out":"in"]),fs=(e,{next:t})=>t(e.unwrap()),ys=(e,{next:t,makeRef:r})=>r(e,()=>t(e.schema)),gs=(e,{next:t})=>t(e.unwrap().shape.raw),_r=e=>e.length?st(Ln(Zn(1,e.length+1).map(t=>`example${t}`),be(Kr("value"),e))):void 0,Yr=(e,t,r=[])=>Fr($,be(Nn(o=>Dr(o)==="Object",it(r))),_r)({schema:e,variant:t?"parsed":"original",validate:!0}),hs=(e,t)=>Fr($,Rn(An(t)),Cn(t),_r)({schema:e,variant:"original",validate:!0}),se=e=>e instanceof b.ZodObject?e:e instanceof b.ZodBranded?se(e.unwrap()):e instanceof b.ZodUnion||e instanceof b.ZodDiscriminatedUnion?e.options.map(t=>se(t)).reduce((t,r)=>t.merge(r.partial()),b.object({})):e instanceof b.ZodEffects?se(e._def.schema):e instanceof b.ZodPipeline?se(e._def.in):se(e._def.left).merge(se(e._def.right)),Qr=({path:e,method:t,schema:r,inputSources:o,makeRef:n,composition:i,brandHandling:a,description:p=`${t.toUpperCase()} ${e} Parameter`})=>{let{shape:d}=se(r),c=Mn(e),m=o.includes("query"),l=o.includes("params"),f=o.includes("headers"),g=h=>l&&c.includes(h),O=h=>f&>(h);return Object.keys(d).map(h=>({name:h,location:g(h)?"path":O(h)?"header":m?"query":void 0})).filter(h=>h.location!==void 0).map(({name:h,location:P})=>{let z=ne(d[h],{rules:{...a,...vt},onEach:jt,onMissing:Nt,ctx:{isResponse:!1,makeRef:n,path:e,method:t}}),L=i==="components"?n(d[h],z,v(p,h)):z;return{name:h,in:P,required:!d[h].isOptional(),description:z.description||p,schema:L,examples:hs(r,h)}})},vt={ZodString:cs,ZodNumber:ds,ZodBigInt:ns,ZodBoolean:os,ZodNull:Xn,ZodArray:as,ZodTuple:ps,ZodRecord:is,ZodObject:Wn,ZodLiteral:Jn,ZodIntersection:Vn,ZodUnion:Bn,ZodAny:Dn,ZodDefault:Hn,ZodEnum:Ur,ZodNativeEnum:Ur,ZodEffects:ms,ZodOptional:_n,ZodNullable:Qn,ZodDiscriminatedUnion:qn,ZodBranded:fs,ZodDate:rs,ZodCatch:Un,ZodPipeline:us,ZodLazy:ys,ZodReadonly:Yn,[k]:Fn,[me]:Kn,[te]:ts,[ee]:es,[G]:gs},jt=(e,{isResponse:t,prev:r})=>{if(Et(r))return{};let{description:o}=e,n=e instanceof b.ZodLazy,i=r.type!==void 0,a=t&&we(e),p=!n&&i&&!a&&e.isNullable(),d={};if(o&&(d.description=o),p&&(d.type=Vr(r)),!n){let c=$({schema:e,variant:t?"parsed":"original",validate:!0});c.length&&(d.examples=c.slice())}return d},Nt=(e,t)=>{throw new E(`Zod type ${e.constructor.name} is unsupported.`,t)},Zt=(e,t)=>{if(Et(e))return e;let r={...e};return r.properties&&(r.properties=it(t,r.properties)),r.examples&&(r.examples=r.examples.map(o=>it(t,o))),r.required&&(r.required=r.required.filter(o=>!t.includes(o))),r.allOf&&(r.allOf=r.allOf.map(o=>Zt(o,t))),r.oneOf&&(r.oneOf=r.oneOf.map(o=>Zt(o,t))),r},Jr=e=>Et(e)?e:it(["examples"],e),Wr=({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} ${ht(n)} response ${p?d:""}`.trim()})=>{let l=Jr(ne(r,{rules:{...c,...vt},onEach:jt,onMissing:Nt,ctx:{isResponse:!0,makeRef:i,path:t,method:e}})),f={schema:a==="components"?i(r,l,v(m)):l,examples:Yr(r,!0)};return{description:m,content:st(Ct(o,[f]))}},xs=()=>({type:"http",scheme:"basic"}),bs=({format:e})=>{let t={type:"http",scheme:"bearer"};return e&&(t.bearerFormat=e),t},Ss=({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},Ts=({name:e})=>({type:"apiKey",in:"header",name:e}),Os=({name:e})=>({type:"apiKey",in:"cookie",name:e}),Rs=({url:e})=>({type:"openIdConnect",openIdConnectUrl:e}),As=({flows:e={}})=>({type:"oauth2",flows:be(t=>({...t,scopes:t.scopes||{}}),En(Pn,e))}),Xr=(e,t)=>{let r={basic:xs,bearer:bs,input:Ss,header:Ts,cookie:Os,openid:Rs,oauth2:As};return Je(e,o=>r[o.type](o,t))},at=e=>"or"in e?e.or.map(t=>"and"in t?wn(be(({name:r,scopes:o})=>Kr(r,o),t.and)):{[t.name]:t.scopes}):"and"in e?at(Rt(e)):at({or:[e]}),eo=({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=Jr(Zt(ne(r,{rules:{...a,...vt},onEach:jt,onMissing:Nt,ctx:{isResponse:!1,makeRef:n,path:t,method:e}}),p)),m={schema:i==="components"?n(r,c,v(d)):c,examples:Yr(r,!1,p)};return{description:d,content:{[o]:m}}},to=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}),Lt=e=>e.length<=Hr?e:e.slice(0,Hr-1)+"\u2026";var kt=class extends Ps{lastSecuritySchemaIds=new Map;lastOperationIdSuffixes=new Map;responseVariants=ws(oe);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||v(r,t),i=this.lastOperationIdSuffixes.get(n);if(i===void 0)return this.lastOperationIdSuffixes.set(n,1),n;if(o)throw new E(`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});xe({routing:t,onEndpoint:(l,f,g)=>{let O={path:f,method:g,endpoint:l,composition:c,brandHandling:p,makeRef:this.makeRef.bind(this)},[T,h]=["short","long"].map(l.getDescription.bind(l)),P=T?Lt(T):d&&h?Lt(h):void 0,z=l.getTags(),L=r.inputSources?.[g]||ft[g],H=this.ensureUniqOperationId(f,g,l.getOperationId(g)),Se=Qr({...O,inputSources:L,schema:l.getSchema("input"),description:a?.requestParameter?.call(null,{method:g,path:f,operationId:H})}),He={};for(let U of this.responseVariants){let Y=l.getResponses(U);for(let{mimeTypes:Te,schema:I,statusCodes:w}of Y)for(let C of w)He[C]=Wr({...O,variant:U,schema:I,mimeTypes:Te,statusCode:C,hasMultipleStatusCodes:Y.length>1||w.length>1,description:a?.[`${U}Response`]?.call(null,{method:g,path:f,operationId:H,statusCode:C})})}let mt=L.includes("body")?eo({...O,paramNames:zs("name",Se),schema:l.getSchema("input"),mimeType:R[l.getRequestType()],description:a?.requestBody?.call(null,{method:g,path:f,operationId:H})}):void 0,Ue=at(Je(Xr(l.getSecurity(),L),U=>{let Y=this.ensureUniqSecuritySchemaName(U),Te=["oauth2","openIdConnect"].includes(U.type)?l.getScopes().slice():[];return this.addSecurityScheme(Y,U),{name:Y,scopes:Te}}));this.addPath($r(f),{[g]:{operationId:H,summary:P,description:h,tags:z.length>0?z:void 0,parameters:Se.length>0?Se:void 0,requestBody:mt,security:Ue.length>0?Ue:void 0,responses:He}})}}),this.rootDoc.tags=r.tags?to(r.tags):[]}};import{createRequest as Is,createResponse as Cs}from"node-mocks-http";var Zs=e=>Is({...e,headers:{"content-type":R.json,...e?.headers}}),Es=e=>Cs(e),vs=e=>{let t={warn:[],error:[],info:[],debug:[]};return new Proxy(e||{},{get(r,o,n){return o==="_getLogs"?()=>t:fr(o)?(...i)=>t[o].push(i):Reflect.get(r,o,n)}})},ro=({requestProps:e,responseOptions:t,configProps:r,loggerProps:o})=>{let n=Zs(e),i=Es({req:n,...t});i.req=t?.req||n,n.res=i;let a=vs(o),p={cors:!1,logger:a,...r};return{requestMock:n,responseMock:i,loggerMock:a,configMock:p}},js=async({endpoint:e,...t})=>{let{requestMock:r,responseMock:o,loggerMock:n,configMock:i}=ro(t);return await e.execute({request:r,response:o,config:i,logger:n}),{requestMock:r,responseMock:o,loggerMock:n}},Ns=async({middleware:e,options:t={},errorHandler:r,...o})=>{let{requestMock:n,responseMock:i,loggerMock:a,configMock:p}=ro(o),d=Ke(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(q(c),i),{requestMock:n,responseMock:i,loggerMock:a,output:{}}}};import N from"typescript";import j from"typescript";import{chain as oo}from"ramda";var s=j.factory,_=[s.createModifier(j.SyntaxKind.ExportKeyword)],Ls=[s.createModifier(j.SyntaxKind.AsyncKeyword)],ks=[s.createModifier(j.SyntaxKind.PublicKeyword),s.createModifier(j.SyntaxKind.ReadonlyKeyword)],no=[s.createModifier(j.SyntaxKind.ProtectedKeyword),s.createModifier(j.SyntaxKind.ReadonlyKeyword)],Ms=s.createTemplateHead(""),Hs=s.createTemplateMiddle(" "),ke=s.createTemplateTail(""),Mt=e=>s.createTemplateLiteralType(Ms,e.map((t,r)=>s.createTemplateLiteralTypeSpan(s.createTypeReferenceNode(t),r===e.length-1?ke:Hs))),Ht=Mt(["M","P"]),pt=(e,t,r)=>s.createParameterDeclaration(r,void 0,e,void 0,t,void 0),ct=(e,t)=>oo(([r,o])=>[pt(s.createIdentifier(r),o,t)],Object.entries(e)),Ut=(e,t)=>s.createExpressionWithTypeArguments(s.createIdentifier("Record"),[typeof e=="number"?s.createKeywordTypeNode(e):s.createTypeReferenceNode(e),s.createKeywordTypeNode(t)]),so=e=>s.createConstructorDeclaration(void 0,e,s.createBlock([])),io=(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)],j.NodeFlags.Const),Dt=(e,t)=>s.createTypeAliasDeclaration(_,e,void 0,s.createUnionTypeNode(t.map(r=>s.createLiteralTypeNode(s.createStringLiteral(r))))),dt=(e,t)=>s.createTypeAliasDeclaration(_,e,void 0,t),ao=(e,t,r)=>s.createPropertyDeclaration(ks,e,void 0,t,r),po=(e,t,r)=>s.createClassDeclaration(_,e,void 0,void 0,[t,...r]),co=(e,t)=>s.createTypeReferenceNode("Promise",[s.createIndexedAccessTypeNode(s.createTypeReferenceNode(e),t)]),lo=()=>s.createTypeReferenceNode("Promise",[s.createKeywordTypeNode(j.SyntaxKind.AnyKeyword)]),mo=(e,t,r)=>s.createInterfaceDeclaration(_,e,void 0,t,r),Us=oo(([e,t])=>[s.createTypeParameterDeclaration([],e,s.createTypeReferenceNode(t))]),uo=e=>Us(Object.entries(e)),Kt=(e,t,r)=>s.createArrowFunction(r?Ls:void 0,void 0,e.map(o=>pt(o)),void 0,void 0,t),Ft=(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,ct({acc:void 0,key:void 0}),void 0,void 0,t),r]),fo=(...e)=>`"${e.join(" ")}"`,yo=(e,t,r)=>s.createConditionalExpression(e,s.createToken(j.SyntaxKind.QuestionToken),t,s.createToken(j.SyntaxKind.ColonToken),r);var go=["get","post","put","delete","patch"];import y from"typescript";import{z as $t}from"zod";import S from"typescript";var{factory:lt}=S,Bt=(e,t)=>S.addSyntheticLeadingComment(e,S.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0),ie=(e,t,r)=>{let o=lt.createTypeAliasDeclaration(void 0,lt.createIdentifier(t),void 0,e);return r?Bt(o,r):o},qt=(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)},Ds=/^[A-Za-z_$][A-Za-z0-9_$]*$/,ho=e=>Ds.test(e)?lt.createIdentifier(e):lt.createStringLiteral(e),Ks=[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],xo=e=>Ks.includes(e.kind);var{factory:u}=y,Fs={[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},Bs=({value:e})=>u.createLiteralTypeNode(typeof e=="number"?u.createNumericLiteral(e):typeof e=="boolean"?e?u.createTrue():u.createFalse():u.createStringLiteral(e)),qs=({shape:e},{isResponse:t,next:r,optionalPropStyle:{withQuestionMark:o}})=>{let n=Object.entries(e).map(([i,a])=>{let p=t&&we(a)?a instanceof $t.ZodOptional:a.isOptional(),d=u.createPropertySignature(void 0,ho(i),p&&o?u.createToken(y.SyntaxKind.QuestionToken):void 0,r(a));return a.description?Bt(d,a.description):d});return u.createTypeLiteralNode(n)},$s=({element:e},{next:t})=>u.createArrayTypeNode(t(e)),Gs=({options:e})=>u.createUnionTypeNode(e.map(t=>u.createLiteralTypeNode(u.createStringLiteral(t)))),bo=({options:e},{next:t})=>{let r=new Map;for(let o of e){let n=t(o);r.set(xo(n)?n.kind:n,n)}return u.createUnionTypeNode(Array.from(r.values()))},Vs=e=>Fs?.[e.kind],_s=(e,{next:t,isResponse:r})=>{let o=t(e.innerType());if(r&&e._def.effect.type==="transform"){let n=Fe(e,Vs(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},Ys=e=>u.createUnionTypeNode(Object.values(e.enum).map(t=>u.createLiteralTypeNode(typeof t=="number"?u.createNumericLiteral(t):u.createStringLiteral(t)))),Qs=(e,{next:t,optionalPropStyle:{withUndefined:r}})=>{let o=t(e.unwrap());return r?u.createUnionTypeNode([o,u.createKeywordTypeNode(y.SyntaxKind.UndefinedKeyword)]):o},Js=(e,{next:t})=>u.createUnionTypeNode([t(e.unwrap()),u.createLiteralTypeNode(u.createNull())]),Ws=({items:e,_def:{rest:t}},{next:r})=>u.createTupleTypeNode(e.map(r).concat(t===null?[]:u.createRestTypeNode(r(t)))),Xs=({keySchema:e,valueSchema:t},{next:r})=>u.createExpressionWithTypeArguments(u.createIdentifier("Record"),[e,t].map(r)),ei=({_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)},ti=({_def:e},{next:t})=>t(e.innerType),ae=e=>()=>u.createKeywordTypeNode(e),ri=(e,{next:t})=>t(e.unwrap()),oi=(e,{next:t})=>t(e.unwrap()),ni=({_def:e},{next:t})=>t(e.innerType),si=({_def:e},{next:t,isResponse:r})=>t(e[r?"out":"in"]),ii=()=>u.createLiteralTypeNode(u.createNull()),ai=(e,{makeAlias:t,next:r})=>t(e,()=>r(e.schema)),pi=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},ci=(e,{next:t})=>t(e.unwrap().shape.raw),di={ZodString:ae(y.SyntaxKind.StringKeyword),ZodNumber:ae(y.SyntaxKind.NumberKeyword),ZodBigInt:ae(y.SyntaxKind.BigIntKeyword),ZodBoolean:ae(y.SyntaxKind.BooleanKeyword),ZodAny:ae(y.SyntaxKind.AnyKeyword),[ee]:ae(y.SyntaxKind.StringKeyword),[te]:ae(y.SyntaxKind.StringKeyword),ZodNull:ii,ZodArray:$s,ZodTuple:Ws,ZodRecord:Xs,ZodObject:qs,ZodLiteral:Bs,ZodIntersection:ei,ZodUnion:bo,ZodDefault:ti,ZodEnum:Gs,ZodNativeEnum:Ys,ZodEffects:_s,ZodOptional:Qs,ZodNullable:Js,ZodDiscriminatedUnion:bo,ZodBranded:ri,ZodCatch:ni,ZodPipeline:si,ZodLazy:ai,ZodReadonly:oi,[k]:pi,[G]:ci},Me=(e,{brandHandling:t,ctx:r})=>ne(e,{rules:{...t,...di},onMissing:()=>u.createKeywordTypeNode(y.SyntaxKind.AnyKeyword),ctx:r});var Gt=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"),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,ie(n,o)),this.aliases.set(t,ie(r(),o))}return s.createTypeReferenceNode(o)}constructor({routing:t,brandHandling:r,variant:o="client",splitResponse:n=!1,optionalPropStyle:i={withQuestionMark:!0,withUndefined:!0}}){xe({routing:t,onEndpoint:(I,w,C)=>{let pe={makeAlias:this.makeAlias.bind(this),optionalPropStyle:i},Oe=v(C,w,"input"),Re=Me(I.getSchema("input"),{brandHandling:r,ctx:{...pe,isResponse:!1}}),Z=n?v(C,w,"positive.response"):void 0,Vt=I.getResponses("positive").map(({schema:D})=>D).reduce((D,ut)=>D.or(ut)),_t=n?Me(Vt,{brandHandling:r,ctx:{...pe,isResponse:!0}}):void 0,Ae=n?v(C,w,"negative.response"):void 0,Yt=I.getResponses("negative").map(({schema:D})=>D).reduce((D,ut)=>D.or(ut)),Qt=n?Me(Yt,{brandHandling:r,ctx:{...pe,isResponse:!0}}):void 0,Jt=v(C,w,"response"),So=Z&&Ae?s.createUnionTypeNode([s.createTypeReferenceNode(Z),s.createTypeReferenceNode(Ae)]):Me(Vt.or(Yt),{brandHandling:r,ctx:{...pe,isResponse:!0}});this.program.push(ie(Re,Oe)),_t&&Z&&this.program.push(ie(_t,Z)),Qt&&Ae&&this.program.push(ie(Qt,Ae)),this.program.push(ie(So,Jt)),this.paths.push(w),this.registry.set({method:C,path:w},{input:Oe,positive:Z,negative:Ae,response:Jt,isJson:I.getResponses("positive").some(D=>D.mimeTypes.includes(R.json)),tags:I.getTags()})}}),this.program.unshift(...this.aliases.values()),this.program.push(Dt(this.ids.pathType,this.paths)),this.program.push(Dt(this.ids.methodType,go)),this.program.push(dt(this.ids.methodPathType,Mt([this.ids.methodType,this.ids.pathType])));let a=[s.createHeritageClause(N.SyntaxKind.ExtendsKeyword,[Ut(this.ids.methodPathType,N.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 p=[],d=[];for(let[{method:I,path:w},{isJson:C,tags:pe,...Oe}]of this.registry){let Re=fo(I,w);for(let Z of this.interfaces)Z.kind in Oe&&Z.props.push(io(Re,Oe[Z.kind]));o!=="types"&&(C&&p.push(s.createPropertyAssignment(Re,s.createTrue())),d.push(s.createPropertyAssignment(Re,s.createArrayLiteralExpression(pe.map(Z=>s.createStringLiteral(Z))))))}for(let{id:I,props:w}of this.interfaces)this.program.push(mo(I,a,w));if(o==="types")return;let c=s.createVariableStatement(_,F(this.ids.jsonEndpointsConst,s.createObjectLiteralExpression(p))),m=s.createVariableStatement(_,F(this.ids.endpointTagsConst,s.createObjectLiteralExpression(d))),l=dt(this.ids.providerType,s.createFunctionTypeNode(uo({M:this.ids.methodType,P:this.ids.pathType}),ct({method:s.createTypeReferenceNode("M"),path:s.createTypeReferenceNode("P"),params:s.createIndexedAccessTypeNode(s.createTypeReferenceNode(this.ids.inputInterface),Ht)}),co(this.ids.responseInterface,Ht))),f=dt(this.ids.implementationType,s.createFunctionTypeNode(void 0,ct({method:s.createTypeReferenceNode(this.ids.methodType),path:s.createKeywordTypeNode(N.SyntaxKind.StringKeyword),params:Ut(N.SyntaxKind.StringKeyword,N.SyntaxKind.AnyKeyword)}),lo())),g=s.createTemplateExpression(s.createTemplateHead(":"),[s.createTemplateSpan(this.ids.keyParameter,ke)]),O=Ft(this.ids.paramsArgument,s.createCallExpression(s.createPropertyAccessExpression(this.ids.accumulator,"replace"),void 0,[g,s.createElementAccessExpression(this.ids.paramsArgument,this.ids.keyParameter)]),this.ids.pathParameter),T=Ft(this.ids.paramsArgument,s.createConditionalExpression(s.createBinaryExpression(s.createCallExpression(s.createPropertyAccessExpression(this.ids.pathParameter,"indexOf"),void 0,[g]),N.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()),h=po(this.ids.clientClass,so([pt(this.ids.implementationArgument,s.createTypeReferenceNode(this.ids.implementationType),no)]),[ao(this.ids.provideMethod,s.createTypeReferenceNode(this.ids.providerType),Kt([this.ids.methodParameter,this.ids.pathParameter,this.ids.paramsArgument],s.createCallExpression(s.createPropertyAccessExpression(s.createThis(),this.ids.implementationArgument),void 0,[this.ids.methodParameter,O,T]),!0))]);this.program.push(c,m,l,f,h);let P=s.createPropertyAssignment(this.ids.methodParameter,s.createCallExpression(s.createPropertyAccessExpression(this.ids.methodParameter,"toUpperCase"),void 0,void 0)),z=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)),L=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)),H=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,ke)]),s.createObjectLiteralExpression([P,z,L])])))),Se=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])))),He=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]),ke)])))),mt=s.createVariableStatement(void 0,F(this.ids.isJsonConst,s.createCallChain(s.createPropertyAccessChain(s.createCallExpression(s.createPropertyAccessExpression(s.createPropertyAccessExpression(this.ids.responseConst,this.ids.headersProperty),s.createIdentifier("get")),void 0,[s.createStringLiteral("content-type")]),s.createToken(N.SyntaxKind.QuestionDotToken),s.createIdentifier("startsWith")),void 0,void 0,[s.createStringLiteral(R.json)]))),Ue=s.createReturnStatement(s.createCallExpression(s.createElementAccessExpression(this.ids.responseConst,yo(this.ids.isJsonConst,s.createStringLiteral("json"),s.createStringLiteral("text"))),void 0,[])),U=s.createVariableStatement(_,F(this.ids.exampleImplementationConst,Kt([this.ids.methodParameter,this.ids.pathParameter,this.ids.paramsArgument],s.createBlock([Se,He,H,mt,Ue]),!0),s.createTypeReferenceNode(this.ids.implementationType))),Y=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"))])])),Te=s.createVariableStatement(void 0,F(this.ids.clientConst,s.createNewExpression(this.ids.clientClass,void 0,[this.ids.exampleImplementationConst])));this.usage.push(U,Te,Y)}printUsage(t){return this.usage.length?this.usage.map(r=>typeof r=="string"?r:qt(r,t)).join(` | ||
`))};var Mr=e=>{e.startupLogo!==!1&&kr(process.stdout);let t=e.errorHandler||Ee,r=ur(e.logger)?e.logger:new je(e.logger);r.debug("Running",{build:"v21.0.0 (ESM)",env:process.env.NODE_ENV||"development"}),jr(r);let o=Er({logger:r,config:e}),i={getLogger:vr(r),errorHandler:t},a=Ir(i),p=zr(i);return{...i,logger:r,notFoundHandler:a,parserFailureHandler:p,loggingMiddleware:o}},Sn=(e,t)=>{let{logger:r,getLogger:o,notFoundHandler:n,loggingMiddleware:i}=Mr(e);return zt({app:e.app.use(i),routing:t,getLogger:o,config:e}),{notFoundHandler:n,logger:r}},Tn=async(e,t)=>{let{logger:r,getLogger:o,notFoundHandler:n,parserFailureHandler:i,loggingMiddleware:a}=Mr(e),p=It().disable("x-powered-by").use(a);if(e.compression){let f=await he("compression");p.use(f(typeof e.compression=="object"?e.compression:void 0))}let d={json:[e.jsonParser||It.json()],raw:[e.rawParser||It.raw(),Zr],upload:e.upload?await Cr({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,g)=>()=>f.listen(g,()=>r.info("Listening",g)),l=[];if(e.http){let f=xn.createServer(p);c.push(f),l.push(m(f,e.http.listen))}if(e.https){let f=bn.createServer(e.https.options,p);c.push(f),l.push(m(f,e.https.listen))}return e.gracefulShutdown&&Nr({logger:r,servers:c,options:e.gracefulShutdown===!0?{}:e.gracefulShutdown}),{app:p,logger:r,servers:l.map(f=>f())}};import{OpenApiBuilder as Ps}from"openapi3-ts/oas31";import{keys as ws,pluck as zs}from"ramda";import{isReferenceObject as Et,isSchemaObject as nt}from"openapi3-ts/oas31";import{concat as On,type as Dr,filter as Rn,fromPairs as st,has as An,isNil as Pn,map as be,mergeAll as wn,mergeDeepRight as zn,mergeDeepWith as In,objOf as Kr,omit as it,pipe as Fr,pluck as Cn,range as Zn,reject as En,toLower as vn,union as jn,when as Nn,xprod as Ct,zip as Ln}from"ramda";import{z as b}from"zod";var ne=(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=>ne(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 Hr=50,Br="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString",kn={integer:0,number:0,string:"",boolean:!1,object:{},null:null,array:[]},qr=/:([A-Za-z0-9_]+)/g,Mn=e=>e.match(qr)?.map(t=>t.slice(1))||[],$r=e=>e.replace(qr,t=>`{${t.slice(1)}}`),Hn=({_def:e},{next:t})=>({...t(e.innerType),default:e[x]?.defaultLabel||e.defaultValue()}),Un=({_def:{innerType:e}},{next:t})=>t(e),Dn=()=>({format:"any"}),Kn=({},e)=>{if(e.isResponse)throw new E("Please use ez.upload() only for input.",e);return{type:"string",format:"binary"}},Fn=e=>{let t=e.unwrap();return{type:"string",format:t instanceof b.ZodString?t._def.checks.find(r=>r.kind==="base64")?"byte":"file":"binary"}},Bn=({options:e},{next:t})=>({oneOf:e.map(t)}),qn=({options:e,discriminator:t},{next:r})=>({discriminator:{propertyName:t},oneOf:e.map(r)}),$n=(e,t)=>{if(Array.isArray(e)&&Array.isArray(t))return On(e,t);if(e===t)return t;throw new Error("Can not flatten properties")},Gn=e=>{let[t,r]=e.filter(nt).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=In($n,t.properties||{},r.properties||{})),(t.required||r.required)&&(o.required=jn(t.required||[],r.required||[])),(t.examples||r.examples)&&(o.examples=W(t.examples||[],r.examples||[],([n,i])=>zn(n,i))),o},Vn=({_def:{left:e,right:t}},{next:r})=>{let o=[e,t].map(r);try{return Gn(o)}catch{}return{allOf:o}},_n=(e,{next:t})=>t(e.unwrap()),Yn=(e,{next:t})=>t(e.unwrap()),Qn=(e,{next:t})=>{let r=t(e.unwrap());return nt(r)&&(r.type=Vr(r)),r},Gr=e=>{let t=vn(Dr(e));return typeof e=="bigint"?"integer":t==="number"||t==="string"||t==="boolean"||t==="object"||t==="null"||t==="array"?t:void 0},Ur=e=>({type:Gr(Object.values(e.enum)[0]),enum:Object.values(e.enum)}),Jn=({value:e})=>({type:Gr(e),const:e}),Wn=(e,{isResponse:t,next:r})=>{let o=Object.keys(e.shape),n=p=>t&&we(p)?p instanceof b.ZodOptional:p.isOptional(),i=o.filter(p=>!n(e.shape[p])),a={type:"object"};return o.length&&(a.properties=ot(e,r)),i.length&&(a.required=i),a},Xn=()=>({type:"null"}),es=({},e)=>{if(e.isResponse)throw new E("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:Br}}},ts=({},e)=>{if(!e.isResponse)throw new E("Please use ez.dateIn() for input.",e);return{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",externalDocs:{url:Br}}},rs=({},e)=>{throw new E(`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)},os=()=>({type:"boolean"}),ns=()=>({type:"integer",format:"bigint"}),ss=e=>e.every(t=>t instanceof b.ZodLiteral),is=({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=ot(b.object(st(Ct(o,[t]))),r),n.required=o),n}if(e instanceof b.ZodLiteral)return{type:"object",properties:ot(b.object({[e.value]:t}),r),required:[e.value]};if(e instanceof b.ZodUnion&&ss(e.options)){let o=be(i=>`${i.value}`,e.options),n=st(Ct(o,[t]));return{type:"object",properties:ot(b.object(n),r),required:o}}return{type:"object",additionalProperties:r(t)}},as=({_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},ps=({items:e,_def:{rest:t}},{next:r})=>({type:"array",prefixItems:e.map(r),items:t===null?{not:{}}:r(t)}),cs=({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"),g=l.find(P=>P.kind==="datetime"),O=f?f.regex:g?g.offset?new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(([+-]\\d{2}:\\d{2})|Z)$"):new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?Z$"):void 0,T={type:"string"},h={"date-time":m,email:e,url:t,uuid:n,cuid:i,cuid2:a,ulid:p,ip:d,emoji:c};for(let P in h)if(h[P]){T.format=P;break}return r!==null&&(T.minLength=r),o!==null&&(T.maxLength=o),O&&(T.pattern=O.source),T},ds=({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},ot=({shape:e},t)=>be(t,e),ls=e=>{let t=Array.isArray(e.type)?e.type[0]:e.type;return kn?.[t]},Vr=({type:e})=>e==="null"?e:typeof e=="string"?[e,"null"]:e?[...new Set(e).add("null")]:"null",ms=(e,{isResponse:t,next:r})=>{let o=r(e.innerType()),{effect:n}=e._def;if(t&&n.type==="transform"&&nt(o)){let i=Fe(e,ls(o));return i&&["number","string","boolean"].includes(i)?{type:i}:r(b.any())}if(!t&&n.type==="preprocess"&&nt(o)){let{type:i,...a}=o;return{...a,format:`${a.format||i} (preprocessed)`}}return o},us=({_def:e},{isResponse:t,next:r})=>r(e[t?"out":"in"]),fs=(e,{next:t})=>t(e.unwrap()),ys=(e,{next:t,makeRef:r})=>r(e,()=>t(e.schema)),gs=(e,{next:t})=>t(e.unwrap().shape.raw),_r=e=>e.length?st(Ln(Zn(1,e.length+1).map(t=>`example${t}`),be(Kr("value"),e))):void 0,Yr=(e,t,r=[])=>Fr($,be(Nn(o=>Dr(o)==="Object",it(r))),_r)({schema:e,variant:t?"parsed":"original",validate:!0}),hs=(e,t)=>Fr($,Rn(An(t)),Cn(t),_r)({schema:e,variant:"original",validate:!0}),se=e=>e instanceof b.ZodObject?e:e instanceof b.ZodBranded?se(e.unwrap()):e instanceof b.ZodUnion||e instanceof b.ZodDiscriminatedUnion?e.options.map(t=>se(t)).reduce((t,r)=>t.merge(r.partial()),b.object({})):e instanceof b.ZodEffects?se(e._def.schema):e instanceof b.ZodPipeline?se(e._def.in):se(e._def.left).merge(se(e._def.right)),Qr=({path:e,method:t,schema:r,inputSources:o,makeRef:n,composition:i,brandHandling:a,description:p=`${t.toUpperCase()} ${e} Parameter`})=>{let{shape:d}=se(r),c=Mn(e),m=o.includes("query"),l=o.includes("params"),f=o.includes("headers"),g=h=>l&&c.includes(h),O=h=>f&>(h);return Object.keys(d).map(h=>({name:h,location:g(h)?"path":O(h)?"header":m?"query":void 0})).filter(h=>h.location!==void 0).map(({name:h,location:P})=>{let z=ne(d[h],{rules:{...a,...vt},onEach:jt,onMissing:Nt,ctx:{isResponse:!1,makeRef:n,path:e,method:t}}),L=i==="components"?n(d[h],z,v(p,h)):z;return{name:h,in:P,required:!d[h].isOptional(),description:z.description||p,schema:L,examples:hs(r,h)}})},vt={ZodString:cs,ZodNumber:ds,ZodBigInt:ns,ZodBoolean:os,ZodNull:Xn,ZodArray:as,ZodTuple:ps,ZodRecord:is,ZodObject:Wn,ZodLiteral:Jn,ZodIntersection:Vn,ZodUnion:Bn,ZodAny:Dn,ZodDefault:Hn,ZodEnum:Ur,ZodNativeEnum:Ur,ZodEffects:ms,ZodOptional:_n,ZodNullable:Qn,ZodDiscriminatedUnion:qn,ZodBranded:fs,ZodDate:rs,ZodCatch:Un,ZodPipeline:us,ZodLazy:ys,ZodReadonly:Yn,[k]:Fn,[me]:Kn,[te]:ts,[ee]:es,[G]:gs},jt=(e,{isResponse:t,prev:r})=>{if(Et(r))return{};let{description:o}=e,n=e instanceof b.ZodLazy,i=r.type!==void 0,a=t&&we(e),p=!n&&i&&!a&&e.isNullable(),d={};if(o&&(d.description=o),p&&(d.type=Vr(r)),!n){let c=$({schema:e,variant:t?"parsed":"original",validate:!0});c.length&&(d.examples=c.slice())}return d},Nt=(e,t)=>{throw new E(`Zod type ${e.constructor.name} is unsupported.`,t)},Zt=(e,t)=>{if(Et(e))return e;let r={...e};return r.properties&&(r.properties=it(t,r.properties)),r.examples&&(r.examples=r.examples.map(o=>it(t,o))),r.required&&(r.required=r.required.filter(o=>!t.includes(o))),r.allOf&&(r.allOf=r.allOf.map(o=>Zt(o,t))),r.oneOf&&(r.oneOf=r.oneOf.map(o=>Zt(o,t))),r},Jr=e=>Et(e)?e:it(["examples"],e),Wr=({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} ${ht(n)} response ${p?d:""}`.trim()})=>{let l=Jr(ne(r,{rules:{...c,...vt},onEach:jt,onMissing:Nt,ctx:{isResponse:!0,makeRef:i,path:t,method:e}})),f={schema:a==="components"?i(r,l,v(m)):l,examples:Yr(r,!0)};return{description:m,content:st(Ct(o,[f]))}},xs=()=>({type:"http",scheme:"basic"}),bs=({format:e})=>{let t={type:"http",scheme:"bearer"};return e&&(t.bearerFormat=e),t},Ss=({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},Ts=({name:e})=>({type:"apiKey",in:"header",name:e}),Os=({name:e})=>({type:"apiKey",in:"cookie",name:e}),Rs=({url:e})=>({type:"openIdConnect",openIdConnectUrl:e}),As=({flows:e={}})=>({type:"oauth2",flows:be(t=>({...t,scopes:t.scopes||{}}),En(Pn,e))}),Xr=(e,t)=>{let r={basic:xs,bearer:bs,input:Ss,header:Ts,cookie:Os,openid:Rs,oauth2:As};return Je(e,o=>r[o.type](o,t))},at=e=>"or"in e?e.or.map(t=>"and"in t?wn(be(({name:r,scopes:o})=>Kr(r,o),t.and)):{[t.name]:t.scopes}):"and"in e?at(Rt(e)):at({or:[e]}),eo=({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=Jr(Zt(ne(r,{rules:{...a,...vt},onEach:jt,onMissing:Nt,ctx:{isResponse:!1,makeRef:n,path:t,method:e}}),p)),m={schema:i==="components"?n(r,c,v(d)):c,examples:Yr(r,!1,p)};return{description:d,content:{[o]:m}}},to=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}),Lt=e=>e.length<=Hr?e:e.slice(0,Hr-1)+"\u2026";var kt=class extends Ps{lastSecuritySchemaIds=new Map;lastOperationIdSuffixes=new Map;responseVariants=ws(oe);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||v(r,t),i=this.lastOperationIdSuffixes.get(n);if(i===void 0)return this.lastOperationIdSuffixes.set(n,1),n;if(o)throw new E(`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});xe({routing:t,onEndpoint:(l,f,g)=>{let O={path:f,method:g,endpoint:l,composition:c,brandHandling:p,makeRef:this.makeRef.bind(this)},[T,h]=["short","long"].map(l.getDescription.bind(l)),P=T?Lt(T):d&&h?Lt(h):void 0,z=l.getTags(),L=r.inputSources?.[g]||ft[g],H=this.ensureUniqOperationId(f,g,l.getOperationId(g)),Se=Qr({...O,inputSources:L,schema:l.getSchema("input"),description:a?.requestParameter?.call(null,{method:g,path:f,operationId:H})}),He={};for(let U of this.responseVariants){let Y=l.getResponses(U);for(let{mimeTypes:Te,schema:I,statusCodes:w}of Y)for(let C of w)He[C]=Wr({...O,variant:U,schema:I,mimeTypes:Te,statusCode:C,hasMultipleStatusCodes:Y.length>1||w.length>1,description:a?.[`${U}Response`]?.call(null,{method:g,path:f,operationId:H,statusCode:C})})}let mt=L.includes("body")?eo({...O,paramNames:zs("name",Se),schema:l.getSchema("input"),mimeType:R[l.getRequestType()],description:a?.requestBody?.call(null,{method:g,path:f,operationId:H})}):void 0,Ue=at(Je(Xr(l.getSecurity(),L),U=>{let Y=this.ensureUniqSecuritySchemaName(U),Te=["oauth2","openIdConnect"].includes(U.type)?l.getScopes().slice():[];return this.addSecurityScheme(Y,U),{name:Y,scopes:Te}}));this.addPath($r(f),{[g]:{operationId:H,summary:P,description:h,tags:z.length>0?z:void 0,parameters:Se.length>0?Se:void 0,requestBody:mt,security:Ue.length>0?Ue:void 0,responses:He}})}}),this.rootDoc.tags=r.tags?to(r.tags):[]}};import{createRequest as Is,createResponse as Cs}from"node-mocks-http";var Zs=e=>Is({...e,headers:{"content-type":R.json,...e?.headers}}),Es=e=>Cs(e),vs=e=>{let t={warn:[],error:[],info:[],debug:[]};return new Proxy(e||{},{get(r,o,n){return o==="_getLogs"?()=>t:fr(o)?(...i)=>t[o].push(i):Reflect.get(r,o,n)}})},ro=({requestProps:e,responseOptions:t,configProps:r,loggerProps:o})=>{let n=Zs(e),i=Es({req:n,...t});i.req=t?.req||n,n.res=i;let a=vs(o),p={cors:!1,logger:a,...r};return{requestMock:n,responseMock:i,loggerMock:a,configMock:p}},js=async({endpoint:e,...t})=>{let{requestMock:r,responseMock:o,loggerMock:n,configMock:i}=ro(t);return await e.execute({request:r,response:o,config:i,logger:n}),{requestMock:r,responseMock:o,loggerMock:n}},Ns=async({middleware:e,options:t={},errorHandler:r,...o})=>{let{requestMock:n,responseMock:i,loggerMock:a,configMock:p}=ro(o),d=Ke(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(q(c),i),{requestMock:n,responseMock:i,loggerMock:a,output:{}}}};import N from"typescript";import j from"typescript";import{chain as oo}from"ramda";var s=j.factory,_=[s.createModifier(j.SyntaxKind.ExportKeyword)],Ls=[s.createModifier(j.SyntaxKind.AsyncKeyword)],ks=[s.createModifier(j.SyntaxKind.PublicKeyword),s.createModifier(j.SyntaxKind.ReadonlyKeyword)],no=[s.createModifier(j.SyntaxKind.ProtectedKeyword),s.createModifier(j.SyntaxKind.ReadonlyKeyword)],Ms=s.createTemplateHead(""),Hs=s.createTemplateMiddle(" "),ke=s.createTemplateTail(""),Mt=e=>s.createTemplateLiteralType(Ms,e.map((t,r)=>s.createTemplateLiteralTypeSpan(s.createTypeReferenceNode(t),r===e.length-1?ke:Hs))),Ht=Mt(["M","P"]),pt=(e,t,r)=>s.createParameterDeclaration(r,void 0,e,void 0,t,void 0),ct=(e,t)=>oo(([r,o])=>[pt(s.createIdentifier(r),o,t)],Object.entries(e)),Ut=(e,t)=>s.createExpressionWithTypeArguments(s.createIdentifier("Record"),[typeof e=="number"?s.createKeywordTypeNode(e):s.createTypeReferenceNode(e),s.createKeywordTypeNode(t)]),so=e=>s.createConstructorDeclaration(void 0,e,s.createBlock([])),io=(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)],j.NodeFlags.Const),Dt=(e,t)=>s.createTypeAliasDeclaration(_,e,void 0,s.createUnionTypeNode(t.map(r=>s.createLiteralTypeNode(s.createStringLiteral(r))))),dt=(e,t)=>s.createTypeAliasDeclaration(_,e,void 0,t),ao=(e,t,r)=>s.createPropertyDeclaration(ks,e,void 0,t,r),po=(e,t,r)=>s.createClassDeclaration(_,e,void 0,void 0,[t,...r]),co=(e,t)=>s.createTypeReferenceNode("Promise",[s.createIndexedAccessTypeNode(s.createTypeReferenceNode(e),t)]),lo=()=>s.createTypeReferenceNode("Promise",[s.createKeywordTypeNode(j.SyntaxKind.AnyKeyword)]),mo=(e,t,r)=>s.createInterfaceDeclaration(_,e,void 0,t,r),Us=oo(([e,t])=>[s.createTypeParameterDeclaration([],e,s.createTypeReferenceNode(t))]),uo=e=>Us(Object.entries(e)),Kt=(e,t,r)=>s.createArrowFunction(r?Ls:void 0,void 0,e.map(o=>pt(o)),void 0,void 0,t),Ft=(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,ct({acc:void 0,key:void 0}),void 0,void 0,t),r]),fo=(...e)=>`"${e.join(" ")}"`,yo=(e,t,r)=>s.createConditionalExpression(e,s.createToken(j.SyntaxKind.QuestionToken),t,s.createToken(j.SyntaxKind.ColonToken),r);var go=["get","post","put","delete","patch"];import y from"typescript";import{z as $t}from"zod";import S from"typescript";var{factory:lt}=S,Bt=(e,t)=>S.addSyntheticLeadingComment(e,S.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0),ie=(e,t,r)=>{let o=lt.createTypeAliasDeclaration(void 0,lt.createIdentifier(t),void 0,e);return r?Bt(o,r):o},qt=(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)},Ds=/^[A-Za-z_$][A-Za-z0-9_$]*$/,ho=e=>Ds.test(e)?lt.createIdentifier(e):lt.createStringLiteral(e),Ks=[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],xo=e=>Ks.includes(e.kind);var{factory:u}=y,Fs={[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},Bs=({value:e})=>u.createLiteralTypeNode(typeof e=="number"?u.createNumericLiteral(e):typeof e=="boolean"?e?u.createTrue():u.createFalse():u.createStringLiteral(e)),qs=({shape:e},{isResponse:t,next:r,optionalPropStyle:{withQuestionMark:o}})=>{let n=Object.entries(e).map(([i,a])=>{let p=t&&we(a)?a instanceof $t.ZodOptional:a.isOptional(),d=u.createPropertySignature(void 0,ho(i),p&&o?u.createToken(y.SyntaxKind.QuestionToken):void 0,r(a));return a.description?Bt(d,a.description):d});return u.createTypeLiteralNode(n)},$s=({element:e},{next:t})=>u.createArrayTypeNode(t(e)),Gs=({options:e})=>u.createUnionTypeNode(e.map(t=>u.createLiteralTypeNode(u.createStringLiteral(t)))),bo=({options:e},{next:t})=>{let r=new Map;for(let o of e){let n=t(o);r.set(xo(n)?n.kind:n,n)}return u.createUnionTypeNode(Array.from(r.values()))},Vs=e=>Fs?.[e.kind],_s=(e,{next:t,isResponse:r})=>{let o=t(e.innerType());if(r&&e._def.effect.type==="transform"){let n=Fe(e,Vs(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},Ys=e=>u.createUnionTypeNode(Object.values(e.enum).map(t=>u.createLiteralTypeNode(typeof t=="number"?u.createNumericLiteral(t):u.createStringLiteral(t)))),Qs=(e,{next:t,optionalPropStyle:{withUndefined:r}})=>{let o=t(e.unwrap());return r?u.createUnionTypeNode([o,u.createKeywordTypeNode(y.SyntaxKind.UndefinedKeyword)]):o},Js=(e,{next:t})=>u.createUnionTypeNode([t(e.unwrap()),u.createLiteralTypeNode(u.createNull())]),Ws=({items:e,_def:{rest:t}},{next:r})=>u.createTupleTypeNode(e.map(r).concat(t===null?[]:u.createRestTypeNode(r(t)))),Xs=({keySchema:e,valueSchema:t},{next:r})=>u.createExpressionWithTypeArguments(u.createIdentifier("Record"),[e,t].map(r)),ei=({_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)},ti=({_def:e},{next:t})=>t(e.innerType),ae=e=>()=>u.createKeywordTypeNode(e),ri=(e,{next:t})=>t(e.unwrap()),oi=(e,{next:t})=>t(e.unwrap()),ni=({_def:e},{next:t})=>t(e.innerType),si=({_def:e},{next:t,isResponse:r})=>t(e[r?"out":"in"]),ii=()=>u.createLiteralTypeNode(u.createNull()),ai=(e,{makeAlias:t,next:r})=>t(e,()=>r(e.schema)),pi=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},ci=(e,{next:t})=>t(e.unwrap().shape.raw),di={ZodString:ae(y.SyntaxKind.StringKeyword),ZodNumber:ae(y.SyntaxKind.NumberKeyword),ZodBigInt:ae(y.SyntaxKind.BigIntKeyword),ZodBoolean:ae(y.SyntaxKind.BooleanKeyword),ZodAny:ae(y.SyntaxKind.AnyKeyword),[ee]:ae(y.SyntaxKind.StringKeyword),[te]:ae(y.SyntaxKind.StringKeyword),ZodNull:ii,ZodArray:$s,ZodTuple:Ws,ZodRecord:Xs,ZodObject:qs,ZodLiteral:Bs,ZodIntersection:ei,ZodUnion:bo,ZodDefault:ti,ZodEnum:Gs,ZodNativeEnum:Ys,ZodEffects:_s,ZodOptional:Qs,ZodNullable:Js,ZodDiscriminatedUnion:bo,ZodBranded:ri,ZodCatch:ni,ZodPipeline:si,ZodLazy:ai,ZodReadonly:oi,[k]:pi,[G]:ci},Me=(e,{brandHandling:t,ctx:r})=>ne(e,{rules:{...t,...di},onMissing:()=>u.createKeywordTypeNode(y.SyntaxKind.AnyKeyword),ctx:r});var Gt=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"),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,ie(n,o)),this.aliases.set(t,ie(r(),o))}return s.createTypeReferenceNode(o)}constructor({routing:t,brandHandling:r,variant:o="client",splitResponse:n=!1,optionalPropStyle:i={withQuestionMark:!0,withUndefined:!0}}){xe({routing:t,onEndpoint:(I,w,C)=>{let pe={makeAlias:this.makeAlias.bind(this),optionalPropStyle:i},Oe=v(C,w,"input"),Re=Me(I.getSchema("input"),{brandHandling:r,ctx:{...pe,isResponse:!1}}),Z=n?v(C,w,"positive.response"):void 0,Vt=I.getResponses("positive").map(({schema:D})=>D).reduce((D,ut)=>D.or(ut)),_t=n?Me(Vt,{brandHandling:r,ctx:{...pe,isResponse:!0}}):void 0,Ae=n?v(C,w,"negative.response"):void 0,Yt=I.getResponses("negative").map(({schema:D})=>D).reduce((D,ut)=>D.or(ut)),Qt=n?Me(Yt,{brandHandling:r,ctx:{...pe,isResponse:!0}}):void 0,Jt=v(C,w,"response"),So=Z&&Ae?s.createUnionTypeNode([s.createTypeReferenceNode(Z),s.createTypeReferenceNode(Ae)]):Me(Vt.or(Yt),{brandHandling:r,ctx:{...pe,isResponse:!0}});this.program.push(ie(Re,Oe)),_t&&Z&&this.program.push(ie(_t,Z)),Qt&&Ae&&this.program.push(ie(Qt,Ae)),this.program.push(ie(So,Jt)),this.paths.push(w),this.registry.set({method:C,path:w},{input:Oe,positive:Z,negative:Ae,response:Jt,isJson:I.getResponses("positive").some(D=>D.mimeTypes.includes(R.json)),tags:I.getTags()})}}),this.program.unshift(...this.aliases.values()),this.program.push(Dt(this.ids.pathType,this.paths)),this.program.push(Dt(this.ids.methodType,go)),this.program.push(dt(this.ids.methodPathType,Mt([this.ids.methodType,this.ids.pathType])));let a=[s.createHeritageClause(N.SyntaxKind.ExtendsKeyword,[Ut(this.ids.methodPathType,N.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 p=[],d=[];for(let[{method:I,path:w},{isJson:C,tags:pe,...Oe}]of this.registry){let Re=fo(I,w);for(let Z of this.interfaces)Z.kind in Oe&&Z.props.push(io(Re,Oe[Z.kind]));o!=="types"&&(C&&p.push(s.createPropertyAssignment(Re,s.createTrue())),d.push(s.createPropertyAssignment(Re,s.createArrayLiteralExpression(pe.map(Z=>s.createStringLiteral(Z))))))}for(let{id:I,props:w}of this.interfaces)this.program.push(mo(I,a,w));if(o==="types")return;let c=s.createVariableStatement(_,F(this.ids.jsonEndpointsConst,s.createObjectLiteralExpression(p))),m=s.createVariableStatement(_,F(this.ids.endpointTagsConst,s.createObjectLiteralExpression(d))),l=dt(this.ids.providerType,s.createFunctionTypeNode(uo({M:this.ids.methodType,P:this.ids.pathType}),ct({method:s.createTypeReferenceNode("M"),path:s.createTypeReferenceNode("P"),params:s.createIndexedAccessTypeNode(s.createTypeReferenceNode(this.ids.inputInterface),Ht)}),co(this.ids.responseInterface,Ht))),f=dt(this.ids.implementationType,s.createFunctionTypeNode(void 0,ct({method:s.createTypeReferenceNode(this.ids.methodType),path:s.createKeywordTypeNode(N.SyntaxKind.StringKeyword),params:Ut(N.SyntaxKind.StringKeyword,N.SyntaxKind.AnyKeyword)}),lo())),g=s.createTemplateExpression(s.createTemplateHead(":"),[s.createTemplateSpan(this.ids.keyParameter,ke)]),O=Ft(this.ids.paramsArgument,s.createCallExpression(s.createPropertyAccessExpression(this.ids.accumulator,"replace"),void 0,[g,s.createElementAccessExpression(this.ids.paramsArgument,this.ids.keyParameter)]),this.ids.pathParameter),T=Ft(this.ids.paramsArgument,s.createConditionalExpression(s.createBinaryExpression(s.createCallExpression(s.createPropertyAccessExpression(this.ids.pathParameter,"indexOf"),void 0,[g]),N.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()),h=po(this.ids.clientClass,so([pt(this.ids.implementationArgument,s.createTypeReferenceNode(this.ids.implementationType),no)]),[ao(this.ids.provideMethod,s.createTypeReferenceNode(this.ids.providerType),Kt([this.ids.methodParameter,this.ids.pathParameter,this.ids.paramsArgument],s.createCallExpression(s.createPropertyAccessExpression(s.createThis(),this.ids.implementationArgument),void 0,[this.ids.methodParameter,O,T]),!0))]);this.program.push(c,m,l,f,h);let P=s.createPropertyAssignment(this.ids.methodParameter,s.createCallExpression(s.createPropertyAccessExpression(this.ids.methodParameter,"toUpperCase"),void 0,void 0)),z=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)),L=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)),H=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,ke)]),s.createObjectLiteralExpression([P,z,L])])))),Se=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])))),He=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]),ke)])))),mt=s.createVariableStatement(void 0,F(this.ids.isJsonConst,s.createCallChain(s.createPropertyAccessChain(s.createCallExpression(s.createPropertyAccessExpression(s.createPropertyAccessExpression(this.ids.responseConst,this.ids.headersProperty),s.createIdentifier("get")),void 0,[s.createStringLiteral("content-type")]),s.createToken(N.SyntaxKind.QuestionDotToken),s.createIdentifier("startsWith")),void 0,void 0,[s.createStringLiteral(R.json)]))),Ue=s.createReturnStatement(s.createCallExpression(s.createElementAccessExpression(this.ids.responseConst,yo(this.ids.isJsonConst,s.createStringLiteral("json"),s.createStringLiteral("text"))),void 0,[])),U=s.createVariableStatement(_,F(this.ids.exampleImplementationConst,Kt([this.ids.methodParameter,this.ids.pathParameter,this.ids.paramsArgument],s.createBlock([Se,He,H,mt,Ue]),!0),s.createTypeReferenceNode(this.ids.implementationType))),Y=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"))])])),Te=s.createVariableStatement(void 0,F(this.ids.clientConst,s.createNewExpression(this.ids.clientClass,void 0,[this.ids.exampleImplementationConst])));this.usage.push(U,Te,Y)}printUsage(t){return this.usage.length?this.usage.map(r=>typeof r=="string"?r:qt(r,t)).join(` | ||
`):void 0}print(t){let r=this.printUsage(t),o=r&&N.addSyntheticLeadingComment(N.addSyntheticLeadingComment(s.createEmptyStatement(),N.SyntaxKind.SingleLineCommentTrivia," Usage example:"),N.SyntaxKind.MultiLineCommentTrivia,` | ||
@@ -21,0 +21,0 @@ ${r}`);return this.program.concat(o||[]).map((n,i)=>qt(n,i<this.program.length?t:{...t,omitTrailingSemicolon:!0})).join(` |
@@ -1,1 +0,1 @@ | ||
import{ESLintUtils as A,AST_NODE_TYPES as r}from"@typescript-eslint/utils";var f="express-zod-api";var L="createConfig",z="createServer",b="server",h="beforeRouting",x="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={[b]:"http",[x]:"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(b));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([x,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}; | ||
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}; |
{ | ||
"name": "express-zod-api", | ||
"version": "21.0.0-beta.6", | ||
"version": "21.0.0", | ||
"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,0 +5,0 @@ "license": "MIT", |
@@ -7,3 +7,3 @@ # Security Policy | ||
| ------: | :------ | :----------------: | | ||
| 21.x.x | 12.2024 | :white_check_mark: | | ||
| 21.x.x | 11.2024 | :white_check_mark: | | ||
| 20.x.x | 06.2024 | :white_check_mark: | | ||
@@ -10,0 +10,0 @@ | 19.x.x | 05.2024 | :white_check_mark: | |
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
No v1
QualityPackage is not semver >=1. This means it is not stable and does not support ^ ranges.
Found 1 instance in 1 package
2
448488