express-zod-api 20.6.2 → 20.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +23 -0
- package/dist/index.cjs +1 -1
- package/dist/index.js +1 -1
- package/migration/index.cjs +1 -1
- package/migration/index.d.cts +7 -11
- package/migration/index.d.ts +7 -11
- package/migration/index.js +1 -1
- package/package.json +4 -6
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,29 @@
|
|
|
2
2
|
|
|
3
3
|
## Version 20
|
|
4
4
|
|
|
5
|
+
### v20.7.0
|
|
6
|
+
|
|
7
|
+
- Changes to migration plugin (single-use tool, regardless SemVer):
|
|
8
|
+
- Requirements: `eslint@^9` and `typescript-eslint@^8` (may work with previous versions, but it's no longer tested);
|
|
9
|
+
- The `express-zod-api/migration` is a pure ESLint plugin: no rule applied by default, it must be enabled explicitly;
|
|
10
|
+
- The files requiring migration have to be defined explicitly — this should improve clarity on its operation;
|
|
11
|
+
- The ESLint plugin was introduced in v20.0.0 for automated migration from v19 (except assertions in tests);
|
|
12
|
+
- For migrating from v19 use the following minimal config and run `eslint --fix`:
|
|
13
|
+
|
|
14
|
+
```javascript
|
|
15
|
+
// eslint.config.js (or .mjs if you're developing in a CommonJS environment)
|
|
16
|
+
import parser from "@typescript-eslint/parser";
|
|
17
|
+
import migration from "express-zod-api/migration";
|
|
18
|
+
|
|
19
|
+
export default [
|
|
20
|
+
{ languageOptions: { parser }, plugins: { migration } },
|
|
21
|
+
{
|
|
22
|
+
files: ["**/*.ts"], // define the files need to be migrated (source code)
|
|
23
|
+
rules: { "migration/v20": "error" }, // enable the rule explicitly
|
|
24
|
+
},
|
|
25
|
+
];
|
|
26
|
+
```
|
|
27
|
+
|
|
5
28
|
### v20.6.2
|
|
6
29
|
|
|
7
30
|
- Small refactoring of several methods and expressions.
|
package/dist/index.cjs
CHANGED
|
@@ -17,7 +17,7 @@ ${o}888${t}
|
|
|
17
17
|
${r}
|
|
18
18
|
`.split(`
|
|
19
19
|
`).map((d,l)=>a[l]?a[l](d):d).join(`
|
|
20
|
-
`)};var Dr=e=>{e.startupLogo!==!1&&console.log(Mr());let t=e.errorHandler||xe,r=Cr(e.logger)?e.logger:new Oe(e.logger);r.debug("Running","v20.6.2 (CJS)");let o=kr({rootLogger:r,config:e}),n=Lr({rootLogger:r,errorHandler:t}),s=jr({rootLogger:r,errorHandler:t});return{rootLogger:r,errorHandler:t,notFoundHandler:n,parserFailureHandler:s,loggingMiddleware:o}},Fr=(e,t)=>{let{rootLogger:r,notFoundHandler:o,loggingMiddleware:n}=Dr(e);return Mt({app:e.app.use(n),routing:t,rootLogger:r,config:e}),{notFoundHandler:o,logger:r}},Kr=async(e,t)=>{let{rootLogger:r,notFoundHandler:o,parserFailureHandler:n,loggingMiddleware:s}=Dr(e),a=(0,ct.default)().disable("x-powered-by").use(s);if(e.server.compression){let m=await Ie("compression");a.use(m(typeof e.server.compression=="object"?e.server.compression:void 0))}let p={json:[e.server.jsonParser||ct.default.json()],raw:[e.server.rawParser||ct.default.raw(),vr],upload:e.server.upload?await Nr({config:e,rootLogger:r}):[]};e.server.beforeRouting&&await e.server.beforeRouting({app:a,logger:r}),Mt({app:a,routing:t,rootLogger:r,config:e,parsers:p}),a.use(n,o);let d=(m,y)=>m.listen(y,()=>{r.info("Listening",y)}),l={httpServer:d(Ur.default.createServer(a),e.server.listen),httpsServer:e.https?d(Hr.default.createServer(e.https.options,a),e.https.listen):void 0};return{app:a,...l,logger:r}};var ao=O(require("node:assert/strict"),1),po=require("openapi3-ts/oas31"),co=require("ramda");var Q=O(require("node:assert/strict"),1),q=require("openapi3-ts/oas31"),c=require("ramda"),x=require("zod");var Ce=require("zod");var dt=e=>!isNaN(e.getTime());var qe=Symbol("DateIn"),Br=()=>Ce.z.union([Ce.z.string().date(),Ce.z.string().datetime(),Ce.z.string().datetime({local:!0})]).transform(t=>new Date(t)).pipe(Ce.z.date().refine(dt)).brand(qe);var qr=require("zod");var $e=Symbol("DateOut"),$r=()=>qr.z.date().refine(dt).transform(e=>e.toISOString()).brand($e);var pe=(e,{onEach:t,rules:r,onMissing:o,ctx:n={}})=>{let s=r[e._def[g]?.brand]||r[e._def.typeName],p=s?s(e,{...n,next:l=>pe(l,{ctx:n,onEach:t,rules:r,onMissing:o})}):o(e,n),d=t&&t(e,{prev:p,...n});return d?{...p,...d}:p};var Vr=50,_r="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString",Go={integer:0,number:0,string:"",boolean:!1,object:{},null:null,array:[]},Yr=/:([A-Za-z0-9_]+)/g,_o=e=>e.match(Yr)?.map(t=>t.slice(1))||[],Qr=e=>e.replace(Yr,t=>`{${t.slice(1)}}`),Yo=({_def:e},{next:t})=>({...t(e.innerType),default:e[g]?.defaultLabel||e.defaultValue()}),Qo=({_def:{innerType:e}},{next:t})=>t(e),Jo=()=>({format:"any"}),Wo=({},e)=>((0,Q.default)(!e.isResponse,new z({message:"Please use ez.upload() only for input.",...e})),{type:"string",format:"binary"}),Xo=e=>{let t=e.unwrap();return{type:"string",format:t instanceof x.z.ZodString?t._def.checks.find(r=>r.kind==="base64")?"byte":"file":"binary"}},en=({options:e},{next:t})=>({oneOf:e.map(t)}),tn=({options:e,discriminator:t},{next:r})=>({discriminator:{propertyName:t},oneOf:e.map(r)}),rn=e=>{let[t,r]=e.filter(q.isSchemaObject).filter(n=>n.type==="object"&&Object.keys(n).every(s=>["type","properties","required","examples"].includes(s)));(0,Q.default)(t&&r,"Can not flatten objects");let o={type:"object"};return(t.properties||r.properties)&&(o.properties=(0,c.mergeDeepWith)((n,s)=>Array.isArray(n)&&Array.isArray(s)?(0,c.concat)(n,s):n===s?s:Q.default.fail("Can not flatten properties"),t.properties||{},r.properties||{})),(t.required||r.required)&&(o.required=(0,c.union)(t.required||[],r.required||[])),(t.examples||r.examples)&&(o.examples=re(t.examples||[],r.examples||[],([n,s])=>(0,c.mergeDeepRight)(n,s))),o},on=({_def:{left:e,right:t}},{next:r})=>{let o=[e,t].map(r);try{return rn(o)}catch{}return{allOf:o}},nn=(e,{next:t})=>t(e.unwrap()),sn=(e,{next:t})=>t(e.unwrap()),an=(e,{next:t})=>{let r=t(e.unwrap());return(0,q.isSchemaObject)(r)&&(r.type=Wr(r)),r},Jr=e=>{let t=(0,c.toLower)((0,c.type)(e));return typeof e=="bigint"?"integer":t==="number"||t==="string"||t==="boolean"||t==="object"||t==="null"||t==="array"?t:void 0},Gr=e=>({type:Jr(Object.values(e.enum)[0]),enum:Object.values(e.enum)}),pn=({value:e})=>({type:Jr(e),const:e}),cn=(e,{isResponse:t,next:r})=>{let o=Object.keys(e.shape),n=p=>t&&Ue(p)?p instanceof x.z.ZodOptional:p.isOptional(),s=o.filter(p=>!n(e.shape[p])),a={type:"object"};return o.length&&(a.properties=lt(e,r)),s.length&&(a.required=s),a},dn=()=>({type:"null"}),ln=({},e)=>((0,Q.default)(!e.isResponse,new z({message:"Please use ez.dateOut() for output.",...e})),{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:_r}}),mn=({},e)=>((0,Q.default)(e.isResponse,new z({message:"Please use ez.dateIn() for input.",...e})),{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",externalDocs:{url:_r}}),un=({},e)=>Q.default.fail(new z({message:`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})),fn=()=>({type:"boolean"}),yn=()=>({type:"integer",format:"bigint"}),gn=e=>e.every(t=>t instanceof x.z.ZodLiteral),hn=({keySchema:e,valueSchema:t},{next:r})=>{if(e instanceof x.z.ZodEnum||e instanceof x.z.ZodNativeEnum){let o=Object.values(e.enum),n={type:"object"};return o.length&&(n.properties=lt(x.z.object((0,c.fromPairs)((0,c.xprod)(o,[t]))),r),n.required=o),n}if(e instanceof x.z.ZodLiteral)return{type:"object",properties:lt(x.z.object({[e.value]:t}),r),required:[e.value]};if(e instanceof x.z.ZodUnion&&gn(e.options)){let o=(0,c.map)(s=>`${s.value}`,e.options),n=(0,c.fromPairs)((0,c.xprod)(o,[t]));return{type:"object",properties:lt(x.z.object(n),r),required:o}}return{type:"object",additionalProperties:r(t)}},bn=({_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},xn=({items:e,_def:{rest:t}},{next:r})=>({type:"array",prefixItems:e.map(r),items:t===null?{not:{}}:r(t)}),Tn=({isEmail:e,isURL:t,minLength:r,maxLength:o,isUUID:n,isCUID:s,isCUID2:a,isULID:p,isIP:d,isEmoji:l,isDatetime:m,_def:{checks:y}})=>{let f=y.find(I=>I.kind==="regex"),S=y.find(I=>I.kind==="datetime"),L=f?f.regex:S?S.offset?new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(([+-]\\d{2}:\\d{2})|Z)$"):new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?Z$"):void 0,T={type:"string"},M={"date-time":m,email:e,url:t,uuid:n,cuid:s,cuid2:a,ulid:p,ip:d,emoji:l};for(let I in M)if(M[I]){T.format=I;break}return r!==null&&(T.minLength=r),o!==null&&(T.maxLength=o),L&&(T.pattern=L.source),T},Sn=({isInt:e,maxValue:t,minValue:r,_def:{checks:o}})=>{let n=o.find(y=>y.kind==="min"),s=r===null?e?Number.MIN_SAFE_INTEGER:-Number.MAX_VALUE:r,a=n?n.inclusive:!0,p=o.find(y=>y.kind==="max"),d=t===null?e?Number.MAX_SAFE_INTEGER:Number.MAX_VALUE:t,l=p?p.inclusive:!0,m={type:e?"integer":"number",format:e?"int64":"double"};return a?m.minimum=s:m.exclusiveMinimum=s,l?m.maximum=d:m.exclusiveMaximum=d,m},lt=({shape:e},t)=>(0,c.map)(t,e),On=e=>{let t=Array.isArray(e.type)?e.type[0]:e.type;return Go?.[t]},Wr=e=>{let t=typeof e.type=="string"?[e.type]:e.type||[];return t.includes("null")?t:t.concat("null")},Rn=(e,{isResponse:t,next:r})=>{let o=r(e.innerType()),{effect:n}=e._def;if(t&&n.type==="transform"&&(0,q.isSchemaObject)(o)){let s=Xe(e,On(o));return s&&["number","string","boolean"].includes(s)?{type:s}:r(x.z.any())}if(!t&&n.type==="preprocess"&&(0,q.isSchemaObject)(o)){let{type:s,...a}=o;return{...a,format:`${a.format||s} (preprocessed)`}}return o},An=({_def:e},{isResponse:t,next:r})=>r(e[t?"out":"in"]),Pn=(e,{next:t})=>t(e.unwrap()),In=({schema:e},{next:t,serializer:r,getRef:o,makeRef:n})=>{let s=r(e);return o(s)||(n(s,{}),n(s,t(e)))},Cn=(e,{next:t})=>t(e.unwrap().shape.raw),Xr=e=>e.length?(0,c.fromPairs)((0,c.zip)((0,c.range)(1,e.length+1).map(t=>`example${t}`),(0,c.map)((0,c.objOf)("value"),e))):void 0,eo=(e,t,r=[])=>(0,c.pipe)(K,(0,c.map)((0,c.when)(o=>(0,c.type)(o)==="Object",(0,c.omit)(r))),Xr)({schema:e,variant:t?"parsed":"original",validate:!0}),zn=(e,t)=>(0,c.pipe)(K,(0,c.filter)((0,c.has)(t)),(0,c.pluck)(t),Xr)({schema:e,variant:"original",validate:!0}),ce=e=>e instanceof x.z.ZodObject?e:e instanceof x.z.ZodBranded?ce(e.unwrap()):e instanceof x.z.ZodUnion||e instanceof x.z.ZodDiscriminatedUnion?e.options.map(t=>ce(t)).reduce((t,r)=>t.merge(r.partial()),x.z.object({})):e instanceof x.z.ZodEffects?ce(e._def.schema):e instanceof x.z.ZodPipeline?ce(e._def.in):ce(e._def.left).merge(ce(e._def.right)),to=({path:e,method:t,schema:r,inputSources:o,serializer:n,getRef:s,makeRef:a,composition:p,brandHandling:d,description:l=`${t.toUpperCase()} ${e} Parameter`})=>{let{shape:m}=ce(r),y=_o(e),f=o.includes("query"),S=o.includes("params"),L=o.includes("headers"),T=b=>S&&y.includes(b),M=b=>L&&At(b);return Object.keys(m).map(b=>({name:b,location:T(b)?"path":M(b)?"header":f?"query":void 0})).filter(b=>b.location!==void 0).map(({name:b,location:Ee})=>{let V=pe(m[b],{rules:{...d,...Ht},onEach:Dt,onMissing:Ft,ctx:{isResponse:!1,serializer:n,getRef:s,makeRef:a,path:e,method:t}}),X=p==="components"?a(v(l,b),V):V;return{name:b,in:Ee,required:!m[b].isOptional(),description:V.description||l,schema:X,examples:zn(r,b)}})},Ht={ZodString:Tn,ZodNumber:Sn,ZodBigInt:yn,ZodBoolean:fn,ZodNull:dn,ZodArray:bn,ZodTuple:xn,ZodRecord:hn,ZodObject:cn,ZodLiteral:pn,ZodIntersection:on,ZodUnion:en,ZodAny:Jo,ZodDefault:Yo,ZodEnum:Gr,ZodNativeEnum:Gr,ZodEffects:Rn,ZodOptional:nn,ZodNullable:an,ZodDiscriminatedUnion:tn,ZodBranded:Pn,ZodDate:un,ZodCatch:Qo,ZodPipeline:An,ZodLazy:In,ZodReadonly:sn,[Y]:Xo,[De]:Wo,[$e]:mn,[qe]:ln,[ie]:Cn},Dt=(e,{isResponse:t,prev:r})=>{if((0,q.isReferenceObject)(r))return{};let{description:o}=e,n=e instanceof x.z.ZodLazy,s=r.type!==void 0,a=t&&Ue(e),p=!n&&s&&!a&&e.isNullable(),d=n?[]:K({schema:e,variant:t?"parsed":"original",validate:!0}),l={};return o&&(l.description=o),p&&(l.type=Wr(r)),d.length&&(l.examples=d.slice()),l},Ft=(e,t)=>Q.default.fail(new z({message:`Zod type ${e.constructor.name} is unsupported.`,...t})),Ut=(e,t)=>{if((0,q.isReferenceObject)(e))return e;let r={...e};return r.properties&&(r.properties=(0,c.omit)(t,r.properties)),r.examples&&(r.examples=r.examples.map(o=>(0,c.omit)(t,o))),r.required&&(r.required=r.required.filter(o=>!t.includes(o))),r.allOf&&(r.allOf=r.allOf.map(o=>Ut(o,t))),r.oneOf&&(r.oneOf=r.oneOf.map(o=>Ut(o,t))),r},ro=e=>(0,q.isReferenceObject)(e)?e:(0,c.omit)(["examples"],e),oo=({method:e,path:t,schema:r,mimeTypes:o,variant:n,serializer:s,getRef:a,makeRef:p,composition:d,hasMultipleStatusCodes:l,statusCode:m,brandHandling:y,description:f=`${e.toUpperCase()} ${t} ${Ct(n)} response ${l?m:""}`.trim()})=>{let S=ro(pe(r,{rules:{...y,...Ht},onEach:Dt,onMissing:Ft,ctx:{isResponse:!0,serializer:s,getRef:a,makeRef:p,path:t,method:e}})),L={schema:d==="components"?p(v(f),S):S,examples:eo(r,!0)};return{description:f,content:(0,c.fromPairs)((0,c.xprod)(o,[L]))}},wn=()=>({type:"http",scheme:"basic"}),Zn=({format:e})=>{let t={type:"http",scheme:"bearer"};return e&&(t.bearerFormat=e),t},En=({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},jn=({name:e})=>({type:"apiKey",in:"header",name:e}),Ln=({name:e})=>({type:"apiKey",in:"cookie",name:e}),Nn=({url:e})=>({type:"openIdConnect",openIdConnectUrl:e}),vn=({flows:e={}})=>({type:"oauth2",flows:(0,c.map)(t=>({...t,scopes:t.scopes||{}}),(0,c.reject)(c.isNil,e))}),no=(e,t)=>{let r={basic:wn,bearer:Zn,input:En,header:jn,cookie:Ln,openid:Nn,oauth2:vn};return nt(e,o=>r[o.type](o,t))},mt=e=>"or"in e?e.or.map(t=>"and"in t?(0,c.mergeAll)((0,c.map)(({name:r,scopes:o})=>(0,c.objOf)(r,o),t.and)):{[t.name]:t.scopes}):"and"in e?mt(Zt(e)):mt({or:[e]}),io=({method:e,path:t,schema:r,mimeTypes:o,serializer:n,getRef:s,makeRef:a,composition:p,brandHandling:d,paramNames:l,description:m=`${e.toUpperCase()} ${t} Request body`})=>{let y=ro(Ut(pe(r,{rules:{...d,...Ht},onEach:Dt,onMissing:Ft,ctx:{isResponse:!1,serializer:n,getRef:s,makeRef:a,path:t,method:e}}),l)),f={schema:p==="components"?a(v(m),y):y,examples:eo(r,!1,l)};return{description:m,content:(0,c.fromPairs)((0,c.xprod)(o,[f]))}},so=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}),Kt=e=>e.length<=Vr?e:e.slice(0,Vr-1)+"\u2026";var ut=class extends po.OpenApiBuilder{lastSecuritySchemaIds=new Map;lastOperationIdSuffixes=new Map;makeRef(t,r){return this.addSchema(t,r),this.getRef(t)}getRef(t){return t in(this.rootDoc.components?.schemas||{})?{$ref:`#/components/schemas/${t}`}:void 0}ensureUniqOperationId(t,r,o){let n=o||v(r,t),s=this.lastOperationIdSuffixes.get(n);return s===void 0?(this.lastOperationIdSuffixes.set(n,1),n):(o&&ao.default.fail(new z({message:`Duplicated operationId: "${o}"`,method:r,isResponse:!1,path:t})),s++,this.lastOperationIdSuffixes.set(n,s),`${n}${s}`)}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:s,descriptions:a,brandHandling:p,hasSummaryFromDescription:d=!0,composition:l="inline",serializer:m=We}){super(),this.addInfo({title:o,version:n});for(let f of typeof s=="string"?[s]:s)this.addServer({url:f});ae({routing:t,onEndpoint:(f,S,L)=>{let T=L,M={path:S,method:T,endpoint:f,composition:l,serializer:m,brandHandling:p,getRef:this.getRef.bind(this),makeRef:this.makeRef.bind(this)},[I,b]=["short","long"].map(f.getDescription.bind(f)),Ee=I?Kt(I):d&&b?Kt(b):void 0,V=f.getTags(),X=r.inputSources?.[T]||Ot[T],le=this.ensureUniqOperationId(S,T,f.getOperationId(T)),je=to({...M,inputSources:X,schema:f.getSchema("input"),description:a?.requestParameter?.call(null,{method:T,path:S,operationId:le})}),Ge={};for(let D of["positive","negative"]){let ee=f.getResponses(D);for(let{mimeTypes:Le,schema:R,statusCodes:A}of ee)for(let C of A)Ge[C]=oo({...M,variant:D,schema:R,mimeTypes:Le,statusCode:C,hasMultipleStatusCodes:ee.length>1||A.length>1,description:a?.[`${D}Response`]?.call(null,{method:T,path:S,operationId:le,statusCode:C})})}let St=X.includes("body")?io({...M,paramNames:(0,co.pluck)("name",je),schema:f.getSchema("input"),mimeTypes:f.getMimeTypes("input"),description:a?.requestBody?.call(null,{method:T,path:S,operationId:le})}):void 0,_e=mt(nt(no(f.getSecurity(),X),D=>{let ee=this.ensureUniqSecuritySchemaName(D),Le=["oauth2","openIdConnect"].includes(D.type)?f.getScopes().slice():[];return this.addSecurityScheme(ee,D),{name:ee,scopes:Le}}));this.addPath(Qr(S),{[T]:{operationId:le,summary:Ee,description:b,tags:V.length>0?V:void 0,parameters:je.length>0?je:void 0,requestBody:St,security:_e.length>0?_e:void 0,responses:Ge}})}}),this.rootDoc.tags=r.tags?so(r.tags):[]}};var ft=require("node-mocks-http"),kn=e=>(0,ft.createRequest)({...e,headers:{"content-type":w.json,...e?.headers}}),Mn=e=>(0,ft.createResponse)(e),Un=e=>{let t={warn:[],error:[],info:[],debug:[]};return new Proxy(e||{},{get(r,o,n){return o==="_getLogs"?()=>t:o in Se?(...s)=>t[o].push(s):Reflect.get(r,o,n)}})},Hn=({requestProps:e,responseOptions:t,configProps:r,loggerProps:o})=>{let n=kn(e),s=Mn({req:n,...t}),a=Un(o),p={cors:!1,logger:a,...r};return{requestMock:n,responseMock:s,loggerMock:a,configMock:p}},lo=async({endpoint:e,...t})=>{let{requestMock:r,responseMock:o,loggerMock:n,configMock:s}=Hn(t);return await e.execute({request:r,response:o,config:s,logger:n}),{requestMock:r,responseMock:o,loggerMock:n}};var j=O(require("typescript"),1);var H=O(require("typescript"),1),ze=require("ramda"),i=H.default.factory,J=[i.createModifier(H.default.SyntaxKind.ExportKeyword)],Dn=[i.createModifier(H.default.SyntaxKind.AsyncKeyword)],Fn=[i.createModifier(H.default.SyntaxKind.PublicKeyword),i.createModifier(H.default.SyntaxKind.ReadonlyKeyword)],mo=[i.createModifier(H.default.SyntaxKind.ProtectedKeyword),i.createModifier(H.default.SyntaxKind.ReadonlyKeyword)],Bt=i.createTemplateHead(""),we=i.createTemplateTail(""),qt=i.createTemplateMiddle(" "),$t=e=>i.createTemplateLiteralType(Bt,e.map((t,r)=>i.createTemplateLiteralTypeSpan(i.createTypeReferenceNode(t),r===e.length-1?we:qt))),Vt=$t(["M","P"]),yt=(e,t,r)=>i.createParameterDeclaration(r,void 0,e,void 0,t,void 0),gt=(e,t)=>(0,ze.chain)(([r,o])=>[yt(i.createIdentifier(r),o,t)],(0,ze.toPairs)(e)),Gt=(e,t)=>i.createExpressionWithTypeArguments(i.createIdentifier("Record"),[typeof e=="number"?i.createKeywordTypeNode(e):i.createTypeReferenceNode(e),i.createKeywordTypeNode(t)]),uo=e=>i.createConstructorDeclaration(void 0,e,i.createBlock([])),fo=(e,t)=>i.createPropertySignature(void 0,e,void 0,i.createTypeReferenceNode(t)),W=(e,t,r)=>i.createVariableDeclarationList([i.createVariableDeclaration(e,void 0,r,t)],H.default.NodeFlags.Const),_t=(e,t)=>i.createTypeAliasDeclaration(J,e,void 0,i.createUnionTypeNode(t.map(r=>i.createLiteralTypeNode(i.createStringLiteral(r))))),ht=(e,t)=>i.createTypeAliasDeclaration(J,e,void 0,t),yo=(e,t,r)=>i.createPropertyDeclaration(Fn,e,void 0,t,r),go=(e,t,r)=>i.createClassDeclaration(J,e,void 0,void 0,[t,...r]),ho=(e,t)=>i.createTypeReferenceNode("Promise",[i.createIndexedAccessTypeNode(i.createTypeReferenceNode(e),t)]),bo=()=>i.createTypeReferenceNode("Promise",[i.createKeywordTypeNode(H.default.SyntaxKind.AnyKeyword)]),xo=(e,t,r)=>i.createInterfaceDeclaration(J,e,void 0,t,r),Kn=(0,ze.chain)(([e,t])=>[i.createTypeParameterDeclaration([],e,i.createTypeReferenceNode(t))]),To=e=>Kn((0,ze.toPairs)(e)),Yt=(e,t,r)=>i.createArrowFunction(r?Dn:void 0,void 0,e.map(o=>yt(o)),void 0,void 0,t),Qt=(e,t,r)=>i.createCallExpression(i.createPropertyAccessExpression(i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("Object"),"keys"),void 0,[e]),"reduce"),void 0,[i.createArrowFunction(void 0,void 0,gt({acc:void 0,key:void 0}),void 0,void 0,t),r]),So=(...e)=>`"${e.join(" ")}"`;var Oo=["get","post","put","delete","patch"];var h=O(require("typescript"),1),xt=require("zod");var $=O(require("typescript"),1),{factory:bt}=$.default,Jt=(e,t)=>{$.default.addSyntheticLeadingComment(e,$.default.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0)},Ze=(e,t,r)=>{let o=bt.createTypeAliasDeclaration(void 0,bt.createIdentifier(t),void 0,e);return r&&Jt(o,r),o},Wt=(e,t)=>{let r=$.default.createSourceFile("print.ts","",$.default.ScriptTarget.Latest,!1,$.default.ScriptKind.TS);return $.default.createPrinter(t).printNode($.default.EmitHint.Unspecified,e,r)},Bn=/^[A-Za-z_$][A-Za-z0-9_$]*$/,Ro=e=>Bn.test(e)?bt.createIdentifier(e):bt.createStringLiteral(e);var{factory:u}=h.default,qn={[h.default.SyntaxKind.AnyKeyword]:"",[h.default.SyntaxKind.BigIntKeyword]:BigInt(0),[h.default.SyntaxKind.BooleanKeyword]:!1,[h.default.SyntaxKind.NumberKeyword]:0,[h.default.SyntaxKind.ObjectKeyword]:{},[h.default.SyntaxKind.StringKeyword]:"",[h.default.SyntaxKind.UndefinedKeyword]:void 0},$n=({value:e})=>u.createLiteralTypeNode(typeof e=="number"?u.createNumericLiteral(e):typeof e=="boolean"?e?u.createTrue():u.createFalse():u.createStringLiteral(e)),Vn=({shape:e},{isResponse:t,next:r,optionalPropStyle:{withQuestionMark:o}})=>{let n=Object.entries(e).map(([s,a])=>{let p=t&&Ue(a)?a instanceof xt.z.ZodOptional:a.isOptional(),d=u.createPropertySignature(void 0,Ro(s),p&&o?u.createToken(h.default.SyntaxKind.QuestionToken):void 0,r(a));return a.description&&Jt(d,a.description),d});return u.createTypeLiteralNode(n)},Gn=({element:e},{next:t})=>u.createArrayTypeNode(t(e)),_n=({options:e})=>u.createUnionTypeNode(e.map(t=>u.createLiteralTypeNode(u.createStringLiteral(t)))),Ao=({options:e},{next:t})=>u.createUnionTypeNode(e.map(t)),Yn=e=>qn?.[e.kind],Qn=(e,{next:t,isResponse:r})=>{let o=t(e.innerType());if(r&&e._def.effect.type==="transform"){let n=Xe(e,Yn(o)),s={number:h.default.SyntaxKind.NumberKeyword,bigint:h.default.SyntaxKind.BigIntKeyword,boolean:h.default.SyntaxKind.BooleanKeyword,string:h.default.SyntaxKind.StringKeyword,undefined:h.default.SyntaxKind.UndefinedKeyword,object:h.default.SyntaxKind.ObjectKeyword};return u.createKeywordTypeNode(n&&s[n]||h.default.SyntaxKind.AnyKeyword)}return o},Jn=e=>u.createUnionTypeNode(Object.values(e.enum).map(t=>u.createLiteralTypeNode(typeof t=="number"?u.createNumericLiteral(t):u.createStringLiteral(t)))),Wn=(e,{next:t,optionalPropStyle:{withUndefined:r}})=>{let o=t(e.unwrap());return r?u.createUnionTypeNode([o,u.createKeywordTypeNode(h.default.SyntaxKind.UndefinedKeyword)]):o},Xn=(e,{next:t})=>u.createUnionTypeNode([t(e.unwrap()),u.createLiteralTypeNode(u.createNull())]),ei=({items:e,_def:{rest:t}},{next:r})=>u.createTupleTypeNode(e.map(r).concat(t===null?[]:u.createRestTypeNode(r(t)))),ti=({keySchema:e,valueSchema:t},{next:r})=>u.createExpressionWithTypeArguments(u.createIdentifier("Record"),[e,t].map(r)),ri=({_def:e},{next:t})=>u.createIntersectionTypeNode([e.left,e.right].map(t)),oi=({_def:e},{next:t})=>t(e.innerType),de=e=>()=>u.createKeywordTypeNode(e),ni=(e,{next:t})=>t(e.unwrap()),ii=(e,{next:t})=>t(e.unwrap()),si=({_def:e},{next:t})=>t(e.innerType),ai=({_def:e},{next:t,isResponse:r})=>t(e[r?"out":"in"]),pi=()=>u.createLiteralTypeNode(u.createNull()),ci=({schema:e},{getAlias:t,makeAlias:r,next:o,serializer:n})=>{let s=`Type${n(e)}`;return t(s)||(r(s,u.createLiteralTypeNode(u.createNull())),r(s,o(e)))},di=e=>{let t=e.unwrap(),r=u.createKeywordTypeNode(h.default.SyntaxKind.StringKeyword),o=u.createTypeReferenceNode("Buffer"),n=u.createUnionTypeNode([r,o]);return t instanceof xt.z.ZodString?r:t instanceof xt.z.ZodUnion?n:o},li=(e,{next:t})=>t(e.unwrap().shape.raw),mi={ZodString:de(h.default.SyntaxKind.StringKeyword),ZodNumber:de(h.default.SyntaxKind.NumberKeyword),ZodBigInt:de(h.default.SyntaxKind.BigIntKeyword),ZodBoolean:de(h.default.SyntaxKind.BooleanKeyword),ZodAny:de(h.default.SyntaxKind.AnyKeyword),[qe]:de(h.default.SyntaxKind.StringKeyword),[$e]:de(h.default.SyntaxKind.StringKeyword),ZodNull:pi,ZodArray:Gn,ZodTuple:ei,ZodRecord:ti,ZodObject:Vn,ZodLiteral:$n,ZodIntersection:ri,ZodUnion:Ao,ZodDefault:oi,ZodEnum:_n,ZodNativeEnum:Jn,ZodEffects:Qn,ZodOptional:Wn,ZodNullable:Xn,ZodDiscriminatedUnion:Ao,ZodBranded:ni,ZodCatch:si,ZodPipeline:ai,ZodLazy:ci,ZodReadonly:ii,[Y]:di,[ie]:li},Ve=(e,{brandHandling:t,ctx:r})=>pe(e,{rules:{...t,...mi},onMissing:()=>u.createKeywordTypeNode(h.default.SyntaxKind.AnyKeyword),ctx:r});var Tt=class{program=[];usage=[];registry=new Map;paths=[];aliases=new Map;ids={pathType:i.createIdentifier("Path"),methodType:i.createIdentifier("Method"),methodPathType:i.createIdentifier("MethodPath"),inputInterface:i.createIdentifier("Input"),posResponseInterface:i.createIdentifier("PositiveResponse"),negResponseInterface:i.createIdentifier("NegativeResponse"),responseInterface:i.createIdentifier("Response"),jsonEndpointsConst:i.createIdentifier("jsonEndpoints"),endpointTagsConst:i.createIdentifier("endpointTags"),providerType:i.createIdentifier("Provider"),implementationType:i.createIdentifier("Implementation"),clientClass:i.createIdentifier("ExpressZodAPIClient"),keyParameter:i.createIdentifier("key"),pathParameter:i.createIdentifier("path"),paramsArgument:i.createIdentifier("params"),methodParameter:i.createIdentifier("method"),accumulator:i.createIdentifier("acc"),provideMethod:i.createIdentifier("provide"),implementationArgument:i.createIdentifier("implementation"),headersProperty:i.createIdentifier("headers"),hasBodyConst:i.createIdentifier("hasBody"),undefinedValue:i.createIdentifier("undefined"),bodyProperty:i.createIdentifier("body"),responseConst:i.createIdentifier("response"),searchParamsConst:i.createIdentifier("searchParams"),exampleImplementationConst:i.createIdentifier("exampleImplementation"),clientConst:i.createIdentifier("client")};interfaces=[];getAlias(t){return this.aliases.has(t)?i.createTypeReferenceNode(t):void 0}makeAlias(t,r){return this.aliases.set(t,Ze(r,t)),this.getAlias(t)}constructor({routing:t,brandHandling:r,variant:o="client",serializer:n=We,splitResponse:s=!1,optionalPropStyle:a={withQuestionMark:!0,withUndefined:!0}}){ae({routing:t,onEndpoint:(R,A,C)=>{let me={serializer:n,getAlias:this.getAlias.bind(this),makeAlias:this.makeAlias.bind(this),optionalPropStyle:a},Ne=v(C,A,"input"),ve=Ve(R.getSchema("input"),{brandHandling:r,ctx:{...me,isResponse:!1}}),N=s?v(C,A,"positive.response"):void 0,Xt=R.getSchema("positive"),er=s?Ve(Xt,{brandHandling:r,ctx:{...me,isResponse:!0}}):void 0,ke=s?v(C,A,"negative.response"):void 0,tr=R.getSchema("negative"),rr=s?Ve(tr,{brandHandling:r,ctx:{...me,isResponse:!0}}):void 0,or=v(C,A,"response"),Io=N&&ke?i.createUnionTypeNode([i.createTypeReferenceNode(N),i.createTypeReferenceNode(ke)]):Ve(Xt.or(tr),{brandHandling:r,ctx:{...me,isResponse:!0}});this.program.push(Ze(ve,Ne)),er&&N&&this.program.push(Ze(er,N)),rr&&ke&&this.program.push(Ze(rr,ke)),this.program.push(Ze(Io,or)),C!=="options"&&(this.paths.push(A),this.registry.set({method:C,path:A},{input:Ne,positive:N,negative:ke,response:or,isJson:R.getMimeTypes("positive").includes(w.json),tags:R.getTags()}))}}),this.program.unshift(...this.aliases.values()),this.program.push(_t(this.ids.pathType,this.paths)),this.program.push(_t(this.ids.methodType,Oo)),this.program.push(ht(this.ids.methodPathType,$t([this.ids.methodType,this.ids.pathType])));let p=[i.createHeritageClause(j.default.SyntaxKind.ExtendsKeyword,[Gt(this.ids.methodPathType,j.default.SyntaxKind.AnyKeyword)])];this.interfaces.push({id:this.ids.inputInterface,kind:"input",props:[]}),s&&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=[],l=[];for(let[{method:R,path:A},{isJson:C,tags:me,...Ne}]of this.registry){let ve=So(R,A);for(let N of this.interfaces)N.kind in Ne&&N.props.push(fo(ve,Ne[N.kind]));o!=="types"&&(C&&d.push(i.createPropertyAssignment(ve,i.createTrue())),l.push(i.createPropertyAssignment(ve,i.createArrayLiteralExpression(me.map(N=>i.createStringLiteral(N))))))}for(let{id:R,props:A}of this.interfaces)this.program.push(xo(R,p,A));if(o==="types")return;let m=i.createVariableStatement(J,W(this.ids.jsonEndpointsConst,i.createObjectLiteralExpression(d))),y=i.createVariableStatement(J,W(this.ids.endpointTagsConst,i.createObjectLiteralExpression(l))),f=ht(this.ids.providerType,i.createFunctionTypeNode(To({M:this.ids.methodType,P:this.ids.pathType}),gt({method:i.createTypeReferenceNode("M"),path:i.createTypeReferenceNode("P"),params:i.createIndexedAccessTypeNode(i.createTypeReferenceNode(this.ids.inputInterface),Vt)}),ho(this.ids.responseInterface,Vt))),S=ht(this.ids.implementationType,i.createFunctionTypeNode(void 0,gt({method:i.createTypeReferenceNode(this.ids.methodType),path:i.createKeywordTypeNode(j.default.SyntaxKind.StringKeyword),params:Gt(j.default.SyntaxKind.StringKeyword,j.default.SyntaxKind.AnyKeyword)}),bo())),L=i.createTemplateExpression(i.createTemplateHead(":"),[i.createTemplateSpan(this.ids.keyParameter,we)]),T=Qt(this.ids.paramsArgument,i.createCallExpression(i.createPropertyAccessExpression(this.ids.accumulator,"replace"),void 0,[L,i.createElementAccessExpression(this.ids.paramsArgument,this.ids.keyParameter)]),this.ids.pathParameter),M=Qt(this.ids.paramsArgument,i.createConditionalExpression(i.createBinaryExpression(i.createCallExpression(i.createPropertyAccessExpression(this.ids.pathParameter,"indexOf"),void 0,[L]),j.default.SyntaxKind.GreaterThanEqualsToken,i.createNumericLiteral(0)),void 0,this.ids.accumulator,void 0,i.createObjectLiteralExpression([i.createSpreadAssignment(this.ids.accumulator),i.createPropertyAssignment(i.createComputedPropertyName(this.ids.keyParameter),i.createElementAccessExpression(this.ids.paramsArgument,this.ids.keyParameter))])),i.createObjectLiteralExpression()),I=go(this.ids.clientClass,uo([yt(this.ids.implementationArgument,i.createTypeReferenceNode(this.ids.implementationType),mo)]),[yo(this.ids.provideMethod,i.createTypeReferenceNode(this.ids.providerType),Yt([this.ids.methodParameter,this.ids.pathParameter,this.ids.paramsArgument],i.createCallExpression(i.createPropertyAccessExpression(i.createThis(),this.ids.implementationArgument),void 0,[this.ids.methodParameter,T,M]),!0))]);this.program.push(m,y,f,S,I);let b=i.createPropertyAssignment(this.ids.methodParameter,i.createCallExpression(i.createPropertyAccessExpression(this.ids.methodParameter,"toUpperCase"),void 0,void 0)),Ee=i.createPropertyAssignment(this.ids.headersProperty,i.createConditionalExpression(this.ids.hasBodyConst,void 0,i.createObjectLiteralExpression([i.createPropertyAssignment(i.createStringLiteral("Content-Type"),i.createStringLiteral(w.json))]),void 0,this.ids.undefinedValue)),V=i.createPropertyAssignment(this.ids.bodyProperty,i.createConditionalExpression(this.ids.hasBodyConst,void 0,i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("JSON"),"stringify"),void 0,[this.ids.paramsArgument]),void 0,this.ids.undefinedValue)),X=i.createVariableStatement(void 0,W(this.ids.responseConst,i.createAwaitExpression(i.createCallExpression(i.createIdentifier("fetch"),void 0,[i.createTemplateExpression(i.createTemplateHead("https://example.com"),[i.createTemplateSpan(this.ids.pathParameter,i.createTemplateMiddle("")),i.createTemplateSpan(this.ids.searchParamsConst,we)]),i.createObjectLiteralExpression([b,Ee,V])])))),le=i.createVariableStatement(void 0,W(this.ids.hasBodyConst,i.createLogicalNot(i.createCallExpression(i.createPropertyAccessExpression(i.createArrayLiteralExpression([i.createStringLiteral("get"),i.createStringLiteral("delete")]),"includes"),void 0,[this.ids.methodParameter])))),je=i.createVariableStatement(void 0,W(this.ids.searchParamsConst,i.createConditionalExpression(this.ids.hasBodyConst,void 0,i.createStringLiteral(""),void 0,i.createTemplateExpression(i.createTemplateHead("?"),[i.createTemplateSpan(i.createNewExpression(i.createIdentifier("URLSearchParams"),void 0,[this.ids.paramsArgument]),we)])))),[Ge,St]=["json","text"].map(R=>i.createReturnStatement(i.createCallExpression(i.createPropertyAccessExpression(this.ids.responseConst,R),void 0,void 0))),_e=i.createIfStatement(i.createBinaryExpression(i.createTemplateExpression(Bt,[i.createTemplateSpan(this.ids.methodParameter,qt),i.createTemplateSpan(this.ids.pathParameter,we)]),j.default.SyntaxKind.InKeyword,this.ids.jsonEndpointsConst),i.createBlock([Ge])),D=i.createVariableStatement(J,W(this.ids.exampleImplementationConst,Yt([this.ids.methodParameter,this.ids.pathParameter,this.ids.paramsArgument],i.createBlock([le,je,X,_e,St]),!0),i.createTypeReferenceNode(this.ids.implementationType))),ee=i.createExpressionStatement(i.createCallExpression(i.createPropertyAccessExpression(this.ids.clientConst,this.ids.provideMethod),void 0,[i.createStringLiteral("get"),i.createStringLiteral("/v1/user/retrieve"),i.createObjectLiteralExpression([i.createPropertyAssignment("id",i.createStringLiteral("10"))])])),Le=i.createVariableStatement(void 0,W(this.ids.clientConst,i.createNewExpression(this.ids.clientClass,void 0,[this.ids.exampleImplementationConst])));this.usage.push(D,Le,ee)}printUsage(t){return this.usage.length?this.usage.map(r=>typeof r=="string"?r:Wt(r,t)).join(`
|
|
20
|
+
`)};var Dr=e=>{e.startupLogo!==!1&&console.log(Mr());let t=e.errorHandler||xe,r=Cr(e.logger)?e.logger:new Oe(e.logger);r.debug("Running","v20.7.0 (CJS)");let o=kr({rootLogger:r,config:e}),n=Lr({rootLogger:r,errorHandler:t}),s=jr({rootLogger:r,errorHandler:t});return{rootLogger:r,errorHandler:t,notFoundHandler:n,parserFailureHandler:s,loggingMiddleware:o}},Fr=(e,t)=>{let{rootLogger:r,notFoundHandler:o,loggingMiddleware:n}=Dr(e);return Mt({app:e.app.use(n),routing:t,rootLogger:r,config:e}),{notFoundHandler:o,logger:r}},Kr=async(e,t)=>{let{rootLogger:r,notFoundHandler:o,parserFailureHandler:n,loggingMiddleware:s}=Dr(e),a=(0,ct.default)().disable("x-powered-by").use(s);if(e.server.compression){let m=await Ie("compression");a.use(m(typeof e.server.compression=="object"?e.server.compression:void 0))}let p={json:[e.server.jsonParser||ct.default.json()],raw:[e.server.rawParser||ct.default.raw(),vr],upload:e.server.upload?await Nr({config:e,rootLogger:r}):[]};e.server.beforeRouting&&await e.server.beforeRouting({app:a,logger:r}),Mt({app:a,routing:t,rootLogger:r,config:e,parsers:p}),a.use(n,o);let d=(m,y)=>m.listen(y,()=>{r.info("Listening",y)}),l={httpServer:d(Ur.default.createServer(a),e.server.listen),httpsServer:e.https?d(Hr.default.createServer(e.https.options,a),e.https.listen):void 0};return{app:a,...l,logger:r}};var ao=O(require("node:assert/strict"),1),po=require("openapi3-ts/oas31"),co=require("ramda");var Q=O(require("node:assert/strict"),1),q=require("openapi3-ts/oas31"),c=require("ramda"),x=require("zod");var Ce=require("zod");var dt=e=>!isNaN(e.getTime());var qe=Symbol("DateIn"),Br=()=>Ce.z.union([Ce.z.string().date(),Ce.z.string().datetime(),Ce.z.string().datetime({local:!0})]).transform(t=>new Date(t)).pipe(Ce.z.date().refine(dt)).brand(qe);var qr=require("zod");var $e=Symbol("DateOut"),$r=()=>qr.z.date().refine(dt).transform(e=>e.toISOString()).brand($e);var pe=(e,{onEach:t,rules:r,onMissing:o,ctx:n={}})=>{let s=r[e._def[g]?.brand]||r[e._def.typeName],p=s?s(e,{...n,next:l=>pe(l,{ctx:n,onEach:t,rules:r,onMissing:o})}):o(e,n),d=t&&t(e,{prev:p,...n});return d?{...p,...d}:p};var Vr=50,_r="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString",Go={integer:0,number:0,string:"",boolean:!1,object:{},null:null,array:[]},Yr=/:([A-Za-z0-9_]+)/g,_o=e=>e.match(Yr)?.map(t=>t.slice(1))||[],Qr=e=>e.replace(Yr,t=>`{${t.slice(1)}}`),Yo=({_def:e},{next:t})=>({...t(e.innerType),default:e[g]?.defaultLabel||e.defaultValue()}),Qo=({_def:{innerType:e}},{next:t})=>t(e),Jo=()=>({format:"any"}),Wo=({},e)=>((0,Q.default)(!e.isResponse,new z({message:"Please use ez.upload() only for input.",...e})),{type:"string",format:"binary"}),Xo=e=>{let t=e.unwrap();return{type:"string",format:t instanceof x.z.ZodString?t._def.checks.find(r=>r.kind==="base64")?"byte":"file":"binary"}},en=({options:e},{next:t})=>({oneOf:e.map(t)}),tn=({options:e,discriminator:t},{next:r})=>({discriminator:{propertyName:t},oneOf:e.map(r)}),rn=e=>{let[t,r]=e.filter(q.isSchemaObject).filter(n=>n.type==="object"&&Object.keys(n).every(s=>["type","properties","required","examples"].includes(s)));(0,Q.default)(t&&r,"Can not flatten objects");let o={type:"object"};return(t.properties||r.properties)&&(o.properties=(0,c.mergeDeepWith)((n,s)=>Array.isArray(n)&&Array.isArray(s)?(0,c.concat)(n,s):n===s?s:Q.default.fail("Can not flatten properties"),t.properties||{},r.properties||{})),(t.required||r.required)&&(o.required=(0,c.union)(t.required||[],r.required||[])),(t.examples||r.examples)&&(o.examples=re(t.examples||[],r.examples||[],([n,s])=>(0,c.mergeDeepRight)(n,s))),o},on=({_def:{left:e,right:t}},{next:r})=>{let o=[e,t].map(r);try{return rn(o)}catch{}return{allOf:o}},nn=(e,{next:t})=>t(e.unwrap()),sn=(e,{next:t})=>t(e.unwrap()),an=(e,{next:t})=>{let r=t(e.unwrap());return(0,q.isSchemaObject)(r)&&(r.type=Wr(r)),r},Jr=e=>{let t=(0,c.toLower)((0,c.type)(e));return typeof e=="bigint"?"integer":t==="number"||t==="string"||t==="boolean"||t==="object"||t==="null"||t==="array"?t:void 0},Gr=e=>({type:Jr(Object.values(e.enum)[0]),enum:Object.values(e.enum)}),pn=({value:e})=>({type:Jr(e),const:e}),cn=(e,{isResponse:t,next:r})=>{let o=Object.keys(e.shape),n=p=>t&&Ue(p)?p instanceof x.z.ZodOptional:p.isOptional(),s=o.filter(p=>!n(e.shape[p])),a={type:"object"};return o.length&&(a.properties=lt(e,r)),s.length&&(a.required=s),a},dn=()=>({type:"null"}),ln=({},e)=>((0,Q.default)(!e.isResponse,new z({message:"Please use ez.dateOut() for output.",...e})),{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:_r}}),mn=({},e)=>((0,Q.default)(e.isResponse,new z({message:"Please use ez.dateIn() for input.",...e})),{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",externalDocs:{url:_r}}),un=({},e)=>Q.default.fail(new z({message:`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})),fn=()=>({type:"boolean"}),yn=()=>({type:"integer",format:"bigint"}),gn=e=>e.every(t=>t instanceof x.z.ZodLiteral),hn=({keySchema:e,valueSchema:t},{next:r})=>{if(e instanceof x.z.ZodEnum||e instanceof x.z.ZodNativeEnum){let o=Object.values(e.enum),n={type:"object"};return o.length&&(n.properties=lt(x.z.object((0,c.fromPairs)((0,c.xprod)(o,[t]))),r),n.required=o),n}if(e instanceof x.z.ZodLiteral)return{type:"object",properties:lt(x.z.object({[e.value]:t}),r),required:[e.value]};if(e instanceof x.z.ZodUnion&&gn(e.options)){let o=(0,c.map)(s=>`${s.value}`,e.options),n=(0,c.fromPairs)((0,c.xprod)(o,[t]));return{type:"object",properties:lt(x.z.object(n),r),required:o}}return{type:"object",additionalProperties:r(t)}},bn=({_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},xn=({items:e,_def:{rest:t}},{next:r})=>({type:"array",prefixItems:e.map(r),items:t===null?{not:{}}:r(t)}),Tn=({isEmail:e,isURL:t,minLength:r,maxLength:o,isUUID:n,isCUID:s,isCUID2:a,isULID:p,isIP:d,isEmoji:l,isDatetime:m,_def:{checks:y}})=>{let f=y.find(I=>I.kind==="regex"),S=y.find(I=>I.kind==="datetime"),L=f?f.regex:S?S.offset?new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(([+-]\\d{2}:\\d{2})|Z)$"):new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?Z$"):void 0,T={type:"string"},M={"date-time":m,email:e,url:t,uuid:n,cuid:s,cuid2:a,ulid:p,ip:d,emoji:l};for(let I in M)if(M[I]){T.format=I;break}return r!==null&&(T.minLength=r),o!==null&&(T.maxLength=o),L&&(T.pattern=L.source),T},Sn=({isInt:e,maxValue:t,minValue:r,_def:{checks:o}})=>{let n=o.find(y=>y.kind==="min"),s=r===null?e?Number.MIN_SAFE_INTEGER:-Number.MAX_VALUE:r,a=n?n.inclusive:!0,p=o.find(y=>y.kind==="max"),d=t===null?e?Number.MAX_SAFE_INTEGER:Number.MAX_VALUE:t,l=p?p.inclusive:!0,m={type:e?"integer":"number",format:e?"int64":"double"};return a?m.minimum=s:m.exclusiveMinimum=s,l?m.maximum=d:m.exclusiveMaximum=d,m},lt=({shape:e},t)=>(0,c.map)(t,e),On=e=>{let t=Array.isArray(e.type)?e.type[0]:e.type;return Go?.[t]},Wr=e=>{let t=typeof e.type=="string"?[e.type]:e.type||[];return t.includes("null")?t:t.concat("null")},Rn=(e,{isResponse:t,next:r})=>{let o=r(e.innerType()),{effect:n}=e._def;if(t&&n.type==="transform"&&(0,q.isSchemaObject)(o)){let s=Xe(e,On(o));return s&&["number","string","boolean"].includes(s)?{type:s}:r(x.z.any())}if(!t&&n.type==="preprocess"&&(0,q.isSchemaObject)(o)){let{type:s,...a}=o;return{...a,format:`${a.format||s} (preprocessed)`}}return o},An=({_def:e},{isResponse:t,next:r})=>r(e[t?"out":"in"]),Pn=(e,{next:t})=>t(e.unwrap()),In=({schema:e},{next:t,serializer:r,getRef:o,makeRef:n})=>{let s=r(e);return o(s)||(n(s,{}),n(s,t(e)))},Cn=(e,{next:t})=>t(e.unwrap().shape.raw),Xr=e=>e.length?(0,c.fromPairs)((0,c.zip)((0,c.range)(1,e.length+1).map(t=>`example${t}`),(0,c.map)((0,c.objOf)("value"),e))):void 0,eo=(e,t,r=[])=>(0,c.pipe)(K,(0,c.map)((0,c.when)(o=>(0,c.type)(o)==="Object",(0,c.omit)(r))),Xr)({schema:e,variant:t?"parsed":"original",validate:!0}),zn=(e,t)=>(0,c.pipe)(K,(0,c.filter)((0,c.has)(t)),(0,c.pluck)(t),Xr)({schema:e,variant:"original",validate:!0}),ce=e=>e instanceof x.z.ZodObject?e:e instanceof x.z.ZodBranded?ce(e.unwrap()):e instanceof x.z.ZodUnion||e instanceof x.z.ZodDiscriminatedUnion?e.options.map(t=>ce(t)).reduce((t,r)=>t.merge(r.partial()),x.z.object({})):e instanceof x.z.ZodEffects?ce(e._def.schema):e instanceof x.z.ZodPipeline?ce(e._def.in):ce(e._def.left).merge(ce(e._def.right)),to=({path:e,method:t,schema:r,inputSources:o,serializer:n,getRef:s,makeRef:a,composition:p,brandHandling:d,description:l=`${t.toUpperCase()} ${e} Parameter`})=>{let{shape:m}=ce(r),y=_o(e),f=o.includes("query"),S=o.includes("params"),L=o.includes("headers"),T=b=>S&&y.includes(b),M=b=>L&&At(b);return Object.keys(m).map(b=>({name:b,location:T(b)?"path":M(b)?"header":f?"query":void 0})).filter(b=>b.location!==void 0).map(({name:b,location:Ee})=>{let V=pe(m[b],{rules:{...d,...Ht},onEach:Dt,onMissing:Ft,ctx:{isResponse:!1,serializer:n,getRef:s,makeRef:a,path:e,method:t}}),X=p==="components"?a(v(l,b),V):V;return{name:b,in:Ee,required:!m[b].isOptional(),description:V.description||l,schema:X,examples:zn(r,b)}})},Ht={ZodString:Tn,ZodNumber:Sn,ZodBigInt:yn,ZodBoolean:fn,ZodNull:dn,ZodArray:bn,ZodTuple:xn,ZodRecord:hn,ZodObject:cn,ZodLiteral:pn,ZodIntersection:on,ZodUnion:en,ZodAny:Jo,ZodDefault:Yo,ZodEnum:Gr,ZodNativeEnum:Gr,ZodEffects:Rn,ZodOptional:nn,ZodNullable:an,ZodDiscriminatedUnion:tn,ZodBranded:Pn,ZodDate:un,ZodCatch:Qo,ZodPipeline:An,ZodLazy:In,ZodReadonly:sn,[Y]:Xo,[De]:Wo,[$e]:mn,[qe]:ln,[ie]:Cn},Dt=(e,{isResponse:t,prev:r})=>{if((0,q.isReferenceObject)(r))return{};let{description:o}=e,n=e instanceof x.z.ZodLazy,s=r.type!==void 0,a=t&&Ue(e),p=!n&&s&&!a&&e.isNullable(),d=n?[]:K({schema:e,variant:t?"parsed":"original",validate:!0}),l={};return o&&(l.description=o),p&&(l.type=Wr(r)),d.length&&(l.examples=d.slice()),l},Ft=(e,t)=>Q.default.fail(new z({message:`Zod type ${e.constructor.name} is unsupported.`,...t})),Ut=(e,t)=>{if((0,q.isReferenceObject)(e))return e;let r={...e};return r.properties&&(r.properties=(0,c.omit)(t,r.properties)),r.examples&&(r.examples=r.examples.map(o=>(0,c.omit)(t,o))),r.required&&(r.required=r.required.filter(o=>!t.includes(o))),r.allOf&&(r.allOf=r.allOf.map(o=>Ut(o,t))),r.oneOf&&(r.oneOf=r.oneOf.map(o=>Ut(o,t))),r},ro=e=>(0,q.isReferenceObject)(e)?e:(0,c.omit)(["examples"],e),oo=({method:e,path:t,schema:r,mimeTypes:o,variant:n,serializer:s,getRef:a,makeRef:p,composition:d,hasMultipleStatusCodes:l,statusCode:m,brandHandling:y,description:f=`${e.toUpperCase()} ${t} ${Ct(n)} response ${l?m:""}`.trim()})=>{let S=ro(pe(r,{rules:{...y,...Ht},onEach:Dt,onMissing:Ft,ctx:{isResponse:!0,serializer:s,getRef:a,makeRef:p,path:t,method:e}})),L={schema:d==="components"?p(v(f),S):S,examples:eo(r,!0)};return{description:f,content:(0,c.fromPairs)((0,c.xprod)(o,[L]))}},wn=()=>({type:"http",scheme:"basic"}),Zn=({format:e})=>{let t={type:"http",scheme:"bearer"};return e&&(t.bearerFormat=e),t},En=({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},jn=({name:e})=>({type:"apiKey",in:"header",name:e}),Ln=({name:e})=>({type:"apiKey",in:"cookie",name:e}),Nn=({url:e})=>({type:"openIdConnect",openIdConnectUrl:e}),vn=({flows:e={}})=>({type:"oauth2",flows:(0,c.map)(t=>({...t,scopes:t.scopes||{}}),(0,c.reject)(c.isNil,e))}),no=(e,t)=>{let r={basic:wn,bearer:Zn,input:En,header:jn,cookie:Ln,openid:Nn,oauth2:vn};return nt(e,o=>r[o.type](o,t))},mt=e=>"or"in e?e.or.map(t=>"and"in t?(0,c.mergeAll)((0,c.map)(({name:r,scopes:o})=>(0,c.objOf)(r,o),t.and)):{[t.name]:t.scopes}):"and"in e?mt(Zt(e)):mt({or:[e]}),io=({method:e,path:t,schema:r,mimeTypes:o,serializer:n,getRef:s,makeRef:a,composition:p,brandHandling:d,paramNames:l,description:m=`${e.toUpperCase()} ${t} Request body`})=>{let y=ro(Ut(pe(r,{rules:{...d,...Ht},onEach:Dt,onMissing:Ft,ctx:{isResponse:!1,serializer:n,getRef:s,makeRef:a,path:t,method:e}}),l)),f={schema:p==="components"?a(v(m),y):y,examples:eo(r,!1,l)};return{description:m,content:(0,c.fromPairs)((0,c.xprod)(o,[f]))}},so=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}),Kt=e=>e.length<=Vr?e:e.slice(0,Vr-1)+"\u2026";var ut=class extends po.OpenApiBuilder{lastSecuritySchemaIds=new Map;lastOperationIdSuffixes=new Map;makeRef(t,r){return this.addSchema(t,r),this.getRef(t)}getRef(t){return t in(this.rootDoc.components?.schemas||{})?{$ref:`#/components/schemas/${t}`}:void 0}ensureUniqOperationId(t,r,o){let n=o||v(r,t),s=this.lastOperationIdSuffixes.get(n);return s===void 0?(this.lastOperationIdSuffixes.set(n,1),n):(o&&ao.default.fail(new z({message:`Duplicated operationId: "${o}"`,method:r,isResponse:!1,path:t})),s++,this.lastOperationIdSuffixes.set(n,s),`${n}${s}`)}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:s,descriptions:a,brandHandling:p,hasSummaryFromDescription:d=!0,composition:l="inline",serializer:m=We}){super(),this.addInfo({title:o,version:n});for(let f of typeof s=="string"?[s]:s)this.addServer({url:f});ae({routing:t,onEndpoint:(f,S,L)=>{let T=L,M={path:S,method:T,endpoint:f,composition:l,serializer:m,brandHandling:p,getRef:this.getRef.bind(this),makeRef:this.makeRef.bind(this)},[I,b]=["short","long"].map(f.getDescription.bind(f)),Ee=I?Kt(I):d&&b?Kt(b):void 0,V=f.getTags(),X=r.inputSources?.[T]||Ot[T],le=this.ensureUniqOperationId(S,T,f.getOperationId(T)),je=to({...M,inputSources:X,schema:f.getSchema("input"),description:a?.requestParameter?.call(null,{method:T,path:S,operationId:le})}),Ge={};for(let D of["positive","negative"]){let ee=f.getResponses(D);for(let{mimeTypes:Le,schema:R,statusCodes:A}of ee)for(let C of A)Ge[C]=oo({...M,variant:D,schema:R,mimeTypes:Le,statusCode:C,hasMultipleStatusCodes:ee.length>1||A.length>1,description:a?.[`${D}Response`]?.call(null,{method:T,path:S,operationId:le,statusCode:C})})}let St=X.includes("body")?io({...M,paramNames:(0,co.pluck)("name",je),schema:f.getSchema("input"),mimeTypes:f.getMimeTypes("input"),description:a?.requestBody?.call(null,{method:T,path:S,operationId:le})}):void 0,_e=mt(nt(no(f.getSecurity(),X),D=>{let ee=this.ensureUniqSecuritySchemaName(D),Le=["oauth2","openIdConnect"].includes(D.type)?f.getScopes().slice():[];return this.addSecurityScheme(ee,D),{name:ee,scopes:Le}}));this.addPath(Qr(S),{[T]:{operationId:le,summary:Ee,description:b,tags:V.length>0?V:void 0,parameters:je.length>0?je:void 0,requestBody:St,security:_e.length>0?_e:void 0,responses:Ge}})}}),this.rootDoc.tags=r.tags?so(r.tags):[]}};var ft=require("node-mocks-http"),kn=e=>(0,ft.createRequest)({...e,headers:{"content-type":w.json,...e?.headers}}),Mn=e=>(0,ft.createResponse)(e),Un=e=>{let t={warn:[],error:[],info:[],debug:[]};return new Proxy(e||{},{get(r,o,n){return o==="_getLogs"?()=>t:o in Se?(...s)=>t[o].push(s):Reflect.get(r,o,n)}})},Hn=({requestProps:e,responseOptions:t,configProps:r,loggerProps:o})=>{let n=kn(e),s=Mn({req:n,...t}),a=Un(o),p={cors:!1,logger:a,...r};return{requestMock:n,responseMock:s,loggerMock:a,configMock:p}},lo=async({endpoint:e,...t})=>{let{requestMock:r,responseMock:o,loggerMock:n,configMock:s}=Hn(t);return await e.execute({request:r,response:o,config:s,logger:n}),{requestMock:r,responseMock:o,loggerMock:n}};var j=O(require("typescript"),1);var H=O(require("typescript"),1),ze=require("ramda"),i=H.default.factory,J=[i.createModifier(H.default.SyntaxKind.ExportKeyword)],Dn=[i.createModifier(H.default.SyntaxKind.AsyncKeyword)],Fn=[i.createModifier(H.default.SyntaxKind.PublicKeyword),i.createModifier(H.default.SyntaxKind.ReadonlyKeyword)],mo=[i.createModifier(H.default.SyntaxKind.ProtectedKeyword),i.createModifier(H.default.SyntaxKind.ReadonlyKeyword)],Bt=i.createTemplateHead(""),we=i.createTemplateTail(""),qt=i.createTemplateMiddle(" "),$t=e=>i.createTemplateLiteralType(Bt,e.map((t,r)=>i.createTemplateLiteralTypeSpan(i.createTypeReferenceNode(t),r===e.length-1?we:qt))),Vt=$t(["M","P"]),yt=(e,t,r)=>i.createParameterDeclaration(r,void 0,e,void 0,t,void 0),gt=(e,t)=>(0,ze.chain)(([r,o])=>[yt(i.createIdentifier(r),o,t)],(0,ze.toPairs)(e)),Gt=(e,t)=>i.createExpressionWithTypeArguments(i.createIdentifier("Record"),[typeof e=="number"?i.createKeywordTypeNode(e):i.createTypeReferenceNode(e),i.createKeywordTypeNode(t)]),uo=e=>i.createConstructorDeclaration(void 0,e,i.createBlock([])),fo=(e,t)=>i.createPropertySignature(void 0,e,void 0,i.createTypeReferenceNode(t)),W=(e,t,r)=>i.createVariableDeclarationList([i.createVariableDeclaration(e,void 0,r,t)],H.default.NodeFlags.Const),_t=(e,t)=>i.createTypeAliasDeclaration(J,e,void 0,i.createUnionTypeNode(t.map(r=>i.createLiteralTypeNode(i.createStringLiteral(r))))),ht=(e,t)=>i.createTypeAliasDeclaration(J,e,void 0,t),yo=(e,t,r)=>i.createPropertyDeclaration(Fn,e,void 0,t,r),go=(e,t,r)=>i.createClassDeclaration(J,e,void 0,void 0,[t,...r]),ho=(e,t)=>i.createTypeReferenceNode("Promise",[i.createIndexedAccessTypeNode(i.createTypeReferenceNode(e),t)]),bo=()=>i.createTypeReferenceNode("Promise",[i.createKeywordTypeNode(H.default.SyntaxKind.AnyKeyword)]),xo=(e,t,r)=>i.createInterfaceDeclaration(J,e,void 0,t,r),Kn=(0,ze.chain)(([e,t])=>[i.createTypeParameterDeclaration([],e,i.createTypeReferenceNode(t))]),To=e=>Kn((0,ze.toPairs)(e)),Yt=(e,t,r)=>i.createArrowFunction(r?Dn:void 0,void 0,e.map(o=>yt(o)),void 0,void 0,t),Qt=(e,t,r)=>i.createCallExpression(i.createPropertyAccessExpression(i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("Object"),"keys"),void 0,[e]),"reduce"),void 0,[i.createArrowFunction(void 0,void 0,gt({acc:void 0,key:void 0}),void 0,void 0,t),r]),So=(...e)=>`"${e.join(" ")}"`;var Oo=["get","post","put","delete","patch"];var h=O(require("typescript"),1),xt=require("zod");var $=O(require("typescript"),1),{factory:bt}=$.default,Jt=(e,t)=>{$.default.addSyntheticLeadingComment(e,$.default.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0)},Ze=(e,t,r)=>{let o=bt.createTypeAliasDeclaration(void 0,bt.createIdentifier(t),void 0,e);return r&&Jt(o,r),o},Wt=(e,t)=>{let r=$.default.createSourceFile("print.ts","",$.default.ScriptTarget.Latest,!1,$.default.ScriptKind.TS);return $.default.createPrinter(t).printNode($.default.EmitHint.Unspecified,e,r)},Bn=/^[A-Za-z_$][A-Za-z0-9_$]*$/,Ro=e=>Bn.test(e)?bt.createIdentifier(e):bt.createStringLiteral(e);var{factory:u}=h.default,qn={[h.default.SyntaxKind.AnyKeyword]:"",[h.default.SyntaxKind.BigIntKeyword]:BigInt(0),[h.default.SyntaxKind.BooleanKeyword]:!1,[h.default.SyntaxKind.NumberKeyword]:0,[h.default.SyntaxKind.ObjectKeyword]:{},[h.default.SyntaxKind.StringKeyword]:"",[h.default.SyntaxKind.UndefinedKeyword]:void 0},$n=({value:e})=>u.createLiteralTypeNode(typeof e=="number"?u.createNumericLiteral(e):typeof e=="boolean"?e?u.createTrue():u.createFalse():u.createStringLiteral(e)),Vn=({shape:e},{isResponse:t,next:r,optionalPropStyle:{withQuestionMark:o}})=>{let n=Object.entries(e).map(([s,a])=>{let p=t&&Ue(a)?a instanceof xt.z.ZodOptional:a.isOptional(),d=u.createPropertySignature(void 0,Ro(s),p&&o?u.createToken(h.default.SyntaxKind.QuestionToken):void 0,r(a));return a.description&&Jt(d,a.description),d});return u.createTypeLiteralNode(n)},Gn=({element:e},{next:t})=>u.createArrayTypeNode(t(e)),_n=({options:e})=>u.createUnionTypeNode(e.map(t=>u.createLiteralTypeNode(u.createStringLiteral(t)))),Ao=({options:e},{next:t})=>u.createUnionTypeNode(e.map(t)),Yn=e=>qn?.[e.kind],Qn=(e,{next:t,isResponse:r})=>{let o=t(e.innerType());if(r&&e._def.effect.type==="transform"){let n=Xe(e,Yn(o)),s={number:h.default.SyntaxKind.NumberKeyword,bigint:h.default.SyntaxKind.BigIntKeyword,boolean:h.default.SyntaxKind.BooleanKeyword,string:h.default.SyntaxKind.StringKeyword,undefined:h.default.SyntaxKind.UndefinedKeyword,object:h.default.SyntaxKind.ObjectKeyword};return u.createKeywordTypeNode(n&&s[n]||h.default.SyntaxKind.AnyKeyword)}return o},Jn=e=>u.createUnionTypeNode(Object.values(e.enum).map(t=>u.createLiteralTypeNode(typeof t=="number"?u.createNumericLiteral(t):u.createStringLiteral(t)))),Wn=(e,{next:t,optionalPropStyle:{withUndefined:r}})=>{let o=t(e.unwrap());return r?u.createUnionTypeNode([o,u.createKeywordTypeNode(h.default.SyntaxKind.UndefinedKeyword)]):o},Xn=(e,{next:t})=>u.createUnionTypeNode([t(e.unwrap()),u.createLiteralTypeNode(u.createNull())]),ei=({items:e,_def:{rest:t}},{next:r})=>u.createTupleTypeNode(e.map(r).concat(t===null?[]:u.createRestTypeNode(r(t)))),ti=({keySchema:e,valueSchema:t},{next:r})=>u.createExpressionWithTypeArguments(u.createIdentifier("Record"),[e,t].map(r)),ri=({_def:e},{next:t})=>u.createIntersectionTypeNode([e.left,e.right].map(t)),oi=({_def:e},{next:t})=>t(e.innerType),de=e=>()=>u.createKeywordTypeNode(e),ni=(e,{next:t})=>t(e.unwrap()),ii=(e,{next:t})=>t(e.unwrap()),si=({_def:e},{next:t})=>t(e.innerType),ai=({_def:e},{next:t,isResponse:r})=>t(e[r?"out":"in"]),pi=()=>u.createLiteralTypeNode(u.createNull()),ci=({schema:e},{getAlias:t,makeAlias:r,next:o,serializer:n})=>{let s=`Type${n(e)}`;return t(s)||(r(s,u.createLiteralTypeNode(u.createNull())),r(s,o(e)))},di=e=>{let t=e.unwrap(),r=u.createKeywordTypeNode(h.default.SyntaxKind.StringKeyword),o=u.createTypeReferenceNode("Buffer"),n=u.createUnionTypeNode([r,o]);return t instanceof xt.z.ZodString?r:t instanceof xt.z.ZodUnion?n:o},li=(e,{next:t})=>t(e.unwrap().shape.raw),mi={ZodString:de(h.default.SyntaxKind.StringKeyword),ZodNumber:de(h.default.SyntaxKind.NumberKeyword),ZodBigInt:de(h.default.SyntaxKind.BigIntKeyword),ZodBoolean:de(h.default.SyntaxKind.BooleanKeyword),ZodAny:de(h.default.SyntaxKind.AnyKeyword),[qe]:de(h.default.SyntaxKind.StringKeyword),[$e]:de(h.default.SyntaxKind.StringKeyword),ZodNull:pi,ZodArray:Gn,ZodTuple:ei,ZodRecord:ti,ZodObject:Vn,ZodLiteral:$n,ZodIntersection:ri,ZodUnion:Ao,ZodDefault:oi,ZodEnum:_n,ZodNativeEnum:Jn,ZodEffects:Qn,ZodOptional:Wn,ZodNullable:Xn,ZodDiscriminatedUnion:Ao,ZodBranded:ni,ZodCatch:si,ZodPipeline:ai,ZodLazy:ci,ZodReadonly:ii,[Y]:di,[ie]:li},Ve=(e,{brandHandling:t,ctx:r})=>pe(e,{rules:{...t,...mi},onMissing:()=>u.createKeywordTypeNode(h.default.SyntaxKind.AnyKeyword),ctx:r});var Tt=class{program=[];usage=[];registry=new Map;paths=[];aliases=new Map;ids={pathType:i.createIdentifier("Path"),methodType:i.createIdentifier("Method"),methodPathType:i.createIdentifier("MethodPath"),inputInterface:i.createIdentifier("Input"),posResponseInterface:i.createIdentifier("PositiveResponse"),negResponseInterface:i.createIdentifier("NegativeResponse"),responseInterface:i.createIdentifier("Response"),jsonEndpointsConst:i.createIdentifier("jsonEndpoints"),endpointTagsConst:i.createIdentifier("endpointTags"),providerType:i.createIdentifier("Provider"),implementationType:i.createIdentifier("Implementation"),clientClass:i.createIdentifier("ExpressZodAPIClient"),keyParameter:i.createIdentifier("key"),pathParameter:i.createIdentifier("path"),paramsArgument:i.createIdentifier("params"),methodParameter:i.createIdentifier("method"),accumulator:i.createIdentifier("acc"),provideMethod:i.createIdentifier("provide"),implementationArgument:i.createIdentifier("implementation"),headersProperty:i.createIdentifier("headers"),hasBodyConst:i.createIdentifier("hasBody"),undefinedValue:i.createIdentifier("undefined"),bodyProperty:i.createIdentifier("body"),responseConst:i.createIdentifier("response"),searchParamsConst:i.createIdentifier("searchParams"),exampleImplementationConst:i.createIdentifier("exampleImplementation"),clientConst:i.createIdentifier("client")};interfaces=[];getAlias(t){return this.aliases.has(t)?i.createTypeReferenceNode(t):void 0}makeAlias(t,r){return this.aliases.set(t,Ze(r,t)),this.getAlias(t)}constructor({routing:t,brandHandling:r,variant:o="client",serializer:n=We,splitResponse:s=!1,optionalPropStyle:a={withQuestionMark:!0,withUndefined:!0}}){ae({routing:t,onEndpoint:(R,A,C)=>{let me={serializer:n,getAlias:this.getAlias.bind(this),makeAlias:this.makeAlias.bind(this),optionalPropStyle:a},Ne=v(C,A,"input"),ve=Ve(R.getSchema("input"),{brandHandling:r,ctx:{...me,isResponse:!1}}),N=s?v(C,A,"positive.response"):void 0,Xt=R.getSchema("positive"),er=s?Ve(Xt,{brandHandling:r,ctx:{...me,isResponse:!0}}):void 0,ke=s?v(C,A,"negative.response"):void 0,tr=R.getSchema("negative"),rr=s?Ve(tr,{brandHandling:r,ctx:{...me,isResponse:!0}}):void 0,or=v(C,A,"response"),Io=N&&ke?i.createUnionTypeNode([i.createTypeReferenceNode(N),i.createTypeReferenceNode(ke)]):Ve(Xt.or(tr),{brandHandling:r,ctx:{...me,isResponse:!0}});this.program.push(Ze(ve,Ne)),er&&N&&this.program.push(Ze(er,N)),rr&&ke&&this.program.push(Ze(rr,ke)),this.program.push(Ze(Io,or)),C!=="options"&&(this.paths.push(A),this.registry.set({method:C,path:A},{input:Ne,positive:N,negative:ke,response:or,isJson:R.getMimeTypes("positive").includes(w.json),tags:R.getTags()}))}}),this.program.unshift(...this.aliases.values()),this.program.push(_t(this.ids.pathType,this.paths)),this.program.push(_t(this.ids.methodType,Oo)),this.program.push(ht(this.ids.methodPathType,$t([this.ids.methodType,this.ids.pathType])));let p=[i.createHeritageClause(j.default.SyntaxKind.ExtendsKeyword,[Gt(this.ids.methodPathType,j.default.SyntaxKind.AnyKeyword)])];this.interfaces.push({id:this.ids.inputInterface,kind:"input",props:[]}),s&&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=[],l=[];for(let[{method:R,path:A},{isJson:C,tags:me,...Ne}]of this.registry){let ve=So(R,A);for(let N of this.interfaces)N.kind in Ne&&N.props.push(fo(ve,Ne[N.kind]));o!=="types"&&(C&&d.push(i.createPropertyAssignment(ve,i.createTrue())),l.push(i.createPropertyAssignment(ve,i.createArrayLiteralExpression(me.map(N=>i.createStringLiteral(N))))))}for(let{id:R,props:A}of this.interfaces)this.program.push(xo(R,p,A));if(o==="types")return;let m=i.createVariableStatement(J,W(this.ids.jsonEndpointsConst,i.createObjectLiteralExpression(d))),y=i.createVariableStatement(J,W(this.ids.endpointTagsConst,i.createObjectLiteralExpression(l))),f=ht(this.ids.providerType,i.createFunctionTypeNode(To({M:this.ids.methodType,P:this.ids.pathType}),gt({method:i.createTypeReferenceNode("M"),path:i.createTypeReferenceNode("P"),params:i.createIndexedAccessTypeNode(i.createTypeReferenceNode(this.ids.inputInterface),Vt)}),ho(this.ids.responseInterface,Vt))),S=ht(this.ids.implementationType,i.createFunctionTypeNode(void 0,gt({method:i.createTypeReferenceNode(this.ids.methodType),path:i.createKeywordTypeNode(j.default.SyntaxKind.StringKeyword),params:Gt(j.default.SyntaxKind.StringKeyword,j.default.SyntaxKind.AnyKeyword)}),bo())),L=i.createTemplateExpression(i.createTemplateHead(":"),[i.createTemplateSpan(this.ids.keyParameter,we)]),T=Qt(this.ids.paramsArgument,i.createCallExpression(i.createPropertyAccessExpression(this.ids.accumulator,"replace"),void 0,[L,i.createElementAccessExpression(this.ids.paramsArgument,this.ids.keyParameter)]),this.ids.pathParameter),M=Qt(this.ids.paramsArgument,i.createConditionalExpression(i.createBinaryExpression(i.createCallExpression(i.createPropertyAccessExpression(this.ids.pathParameter,"indexOf"),void 0,[L]),j.default.SyntaxKind.GreaterThanEqualsToken,i.createNumericLiteral(0)),void 0,this.ids.accumulator,void 0,i.createObjectLiteralExpression([i.createSpreadAssignment(this.ids.accumulator),i.createPropertyAssignment(i.createComputedPropertyName(this.ids.keyParameter),i.createElementAccessExpression(this.ids.paramsArgument,this.ids.keyParameter))])),i.createObjectLiteralExpression()),I=go(this.ids.clientClass,uo([yt(this.ids.implementationArgument,i.createTypeReferenceNode(this.ids.implementationType),mo)]),[yo(this.ids.provideMethod,i.createTypeReferenceNode(this.ids.providerType),Yt([this.ids.methodParameter,this.ids.pathParameter,this.ids.paramsArgument],i.createCallExpression(i.createPropertyAccessExpression(i.createThis(),this.ids.implementationArgument),void 0,[this.ids.methodParameter,T,M]),!0))]);this.program.push(m,y,f,S,I);let b=i.createPropertyAssignment(this.ids.methodParameter,i.createCallExpression(i.createPropertyAccessExpression(this.ids.methodParameter,"toUpperCase"),void 0,void 0)),Ee=i.createPropertyAssignment(this.ids.headersProperty,i.createConditionalExpression(this.ids.hasBodyConst,void 0,i.createObjectLiteralExpression([i.createPropertyAssignment(i.createStringLiteral("Content-Type"),i.createStringLiteral(w.json))]),void 0,this.ids.undefinedValue)),V=i.createPropertyAssignment(this.ids.bodyProperty,i.createConditionalExpression(this.ids.hasBodyConst,void 0,i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("JSON"),"stringify"),void 0,[this.ids.paramsArgument]),void 0,this.ids.undefinedValue)),X=i.createVariableStatement(void 0,W(this.ids.responseConst,i.createAwaitExpression(i.createCallExpression(i.createIdentifier("fetch"),void 0,[i.createTemplateExpression(i.createTemplateHead("https://example.com"),[i.createTemplateSpan(this.ids.pathParameter,i.createTemplateMiddle("")),i.createTemplateSpan(this.ids.searchParamsConst,we)]),i.createObjectLiteralExpression([b,Ee,V])])))),le=i.createVariableStatement(void 0,W(this.ids.hasBodyConst,i.createLogicalNot(i.createCallExpression(i.createPropertyAccessExpression(i.createArrayLiteralExpression([i.createStringLiteral("get"),i.createStringLiteral("delete")]),"includes"),void 0,[this.ids.methodParameter])))),je=i.createVariableStatement(void 0,W(this.ids.searchParamsConst,i.createConditionalExpression(this.ids.hasBodyConst,void 0,i.createStringLiteral(""),void 0,i.createTemplateExpression(i.createTemplateHead("?"),[i.createTemplateSpan(i.createNewExpression(i.createIdentifier("URLSearchParams"),void 0,[this.ids.paramsArgument]),we)])))),[Ge,St]=["json","text"].map(R=>i.createReturnStatement(i.createCallExpression(i.createPropertyAccessExpression(this.ids.responseConst,R),void 0,void 0))),_e=i.createIfStatement(i.createBinaryExpression(i.createTemplateExpression(Bt,[i.createTemplateSpan(this.ids.methodParameter,qt),i.createTemplateSpan(this.ids.pathParameter,we)]),j.default.SyntaxKind.InKeyword,this.ids.jsonEndpointsConst),i.createBlock([Ge])),D=i.createVariableStatement(J,W(this.ids.exampleImplementationConst,Yt([this.ids.methodParameter,this.ids.pathParameter,this.ids.paramsArgument],i.createBlock([le,je,X,_e,St]),!0),i.createTypeReferenceNode(this.ids.implementationType))),ee=i.createExpressionStatement(i.createCallExpression(i.createPropertyAccessExpression(this.ids.clientConst,this.ids.provideMethod),void 0,[i.createStringLiteral("get"),i.createStringLiteral("/v1/user/retrieve"),i.createObjectLiteralExpression([i.createPropertyAssignment("id",i.createStringLiteral("10"))])])),Le=i.createVariableStatement(void 0,W(this.ids.clientConst,i.createNewExpression(this.ids.clientClass,void 0,[this.ids.exampleImplementationConst])));this.usage.push(D,Le,ee)}printUsage(t){return this.usage.length?this.usage.map(r=>typeof r=="string"?r:Wt(r,t)).join(`
|
|
21
21
|
`):void 0}print(t){let r=this.printUsage(t),o=r&&j.default.addSyntheticLeadingComment(j.default.addSyntheticLeadingComment(i.createEmptyStatement(),j.default.SyntaxKind.SingleLineCommentTrivia," Usage example:"),j.default.SyntaxKind.MultiLineCommentTrivia,`
|
|
22
22
|
${r}`);return this.program.concat(o||[]).map((n,s)=>Wt(n,s<this.program.length?t:{...t,omitTrailingSemicolon:!0})).join(`
|
|
23
23
|
|
package/dist/index.js
CHANGED
|
@@ -17,7 +17,7 @@ ${o}888${t}
|
|
|
17
17
|
${r}
|
|
18
18
|
`.split(`
|
|
19
19
|
`).map((c,d)=>a[d]?a[d](c):c).join(`
|
|
20
|
-
`)};var Tr=e=>{e.startupLogo!==!1&&console.log(xr());let t=e.errorHandler||ze,r=ar(e.logger)?e.logger:new Ze(e.logger);r.debug("Running","v20.6.2 (ESM)");let o=hr({rootLogger:r,config:e}),i=fr({rootLogger:r,errorHandler:t}),s=ur({rootLogger:r,errorHandler:t});return{rootLogger:r,errorHandler:t,notFoundHandler:i,parserFailureHandler:s,loggingMiddleware:o}},en=(e,t)=>{let{rootLogger:r,notFoundHandler:o,loggingMiddleware:i}=Tr(e);return Ot({app:e.app.use(i),routing:t,rootLogger:r,config:e}),{notFoundHandler:o,logger:r}},tn=async(e,t)=>{let{rootLogger:r,notFoundHandler:o,parserFailureHandler:i,loggingMiddleware:s}=Tr(e),a=Rt().disable("x-powered-by").use(s);if(e.server.compression){let l=await me("compression");a.use(l(typeof e.server.compression=="object"?e.server.compression:void 0))}let p={json:[e.server.jsonParser||Rt.json()],raw:[e.server.rawParser||Rt.raw(),gr],upload:e.server.upload?await yr({config:e,rootLogger:r}):[]};e.server.beforeRouting&&await e.server.beforeRouting({app:a,logger:r}),Ot({app:a,routing:t,rootLogger:r,config:e,parsers:p}),a.use(i,o);let c=(l,f)=>l.listen(f,()=>{r.info("Listening",f)}),d={httpServer:c(Wo.createServer(a),e.server.listen),httpsServer:e.https?c(Xo.createServer(e.https.options,a),e.https.listen):void 0};return{app:a,...d,logger:r}};import si from"node:assert/strict";import{OpenApiBuilder as ai}from"openapi3-ts/oas31";import{pluck as pi}from"ramda";import te from"node:assert/strict";import{isReferenceObject as Pt,isSchemaObject as tt}from"openapi3-ts/oas31";import{concat as on,type as Pr,filter as nn,fromPairs as ke,has as sn,isNil as an,map as ue,mergeAll as pn,mergeDeepRight as cn,mergeDeepWith as dn,objOf as Ir,omit as rt,pipe as Cr,pluck as ln,range as mn,reject as un,toLower as fn,union as yn,when as gn,xprod as ot,zip as hn}from"ramda";import{z as x}from"zod";import{z as Le}from"zod";var Xe=e=>!isNaN(e.getTime());var Ne=Symbol("DateIn"),Sr=()=>Le.union([Le.string().date(),Le.string().datetime(),Le.string().datetime({local:!0})]).transform(t=>new Date(t)).pipe(Le.date().refine(Xe)).brand(Ne);import{z as rn}from"zod";var ve=Symbol("DateOut"),Or=()=>rn.date().refine(Xe).transform(e=>e.toISOString()).brand(ve);var X=(e,{onEach:t,rules:r,onMissing:o,ctx:i={}})=>{let s=r[e._def[y]?.brand]||r[e._def.typeName],p=s?s(e,{...i,next:d=>X(d,{ctx:i,onEach:t,rules:r,onMissing:o})}):o(e,i),c=t&&t(e,{prev:p,...i});return c?{...p,...c}:p};var Rr=50,zr="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString",bn={integer:0,number:0,string:"",boolean:!1,object:{},null:null,array:[]},wr=/:([A-Za-z0-9_]+)/g,xn=e=>e.match(wr)?.map(t=>t.slice(1))||[],Zr=e=>e.replace(wr,t=>`{${t.slice(1)}}`),Tn=({_def:e},{next:t})=>({...t(e.innerType),default:e[y]?.defaultLabel||e.defaultValue()}),Sn=({_def:{innerType:e}},{next:t})=>t(e),On=()=>({format:"any"}),Rn=({},e)=>(te(!e.isResponse,new z({message:"Please use ez.upload() only for input.",...e})),{type:"string",format:"binary"}),An=e=>{let t=e.unwrap();return{type:"string",format:t instanceof x.ZodString?t._def.checks.find(r=>r.kind==="base64")?"byte":"file":"binary"}},Pn=({options:e},{next:t})=>({oneOf:e.map(t)}),In=({options:e,discriminator:t},{next:r})=>({discriminator:{propertyName:t},oneOf:e.map(r)}),Cn=e=>{let[t,r]=e.filter(tt).filter(i=>i.type==="object"&&Object.keys(i).every(s=>["type","properties","required","examples"].includes(s)));te(t&&r,"Can not flatten objects");let o={type:"object"};return(t.properties||r.properties)&&(o.properties=dn((i,s)=>Array.isArray(i)&&Array.isArray(s)?on(i,s):i===s?s:te.fail("Can not flatten properties"),t.properties||{},r.properties||{})),(t.required||r.required)&&(o.required=yn(t.required||[],r.required||[])),(t.examples||r.examples)&&(o.examples=_(t.examples||[],r.examples||[],([i,s])=>cn(i,s))),o},zn=({_def:{left:e,right:t}},{next:r})=>{let o=[e,t].map(r);try{return Cn(o)}catch{}return{allOf:o}},wn=(e,{next:t})=>t(e.unwrap()),Zn=(e,{next:t})=>t(e.unwrap()),En=(e,{next:t})=>{let r=t(e.unwrap());return tt(r)&&(r.type=jr(r)),r},Er=e=>{let t=fn(Pr(e));return typeof e=="bigint"?"integer":t==="number"||t==="string"||t==="boolean"||t==="object"||t==="null"||t==="array"?t:void 0},Ar=e=>({type:Er(Object.values(e.enum)[0]),enum:Object.values(e.enum)}),jn=({value:e})=>({type:Er(e),const:e}),Ln=(e,{isResponse:t,next:r})=>{let o=Object.keys(e.shape),i=p=>t&&Re(p)?p instanceof x.ZodOptional:p.isOptional(),s=o.filter(p=>!i(e.shape[p])),a={type:"object"};return o.length&&(a.properties=et(e,r)),s.length&&(a.required=s),a},Nn=()=>({type:"null"}),vn=({},e)=>(te(!e.isResponse,new z({message:"Please use ez.dateOut() for output.",...e})),{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:zr}}),kn=({},e)=>(te(e.isResponse,new z({message:"Please use ez.dateIn() for input.",...e})),{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",externalDocs:{url:zr}}),Mn=({},e)=>te.fail(new z({message:`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})),Un=()=>({type:"boolean"}),Hn=()=>({type:"integer",format:"bigint"}),Dn=e=>e.every(t=>t instanceof x.ZodLiteral),Fn=({keySchema:e,valueSchema:t},{next:r})=>{if(e instanceof x.ZodEnum||e instanceof x.ZodNativeEnum){let o=Object.values(e.enum),i={type:"object"};return o.length&&(i.properties=et(x.object(ke(ot(o,[t]))),r),i.required=o),i}if(e instanceof x.ZodLiteral)return{type:"object",properties:et(x.object({[e.value]:t}),r),required:[e.value]};if(e instanceof x.ZodUnion&&Dn(e.options)){let o=ue(s=>`${s.value}`,e.options),i=ke(ot(o,[t]));return{type:"object",properties:et(x.object(i),r),required:o}}return{type:"object",additionalProperties:r(t)}},Kn=({_def:{minLength:e,maxLength:t},element:r},{next:o})=>{let i={type:"array",items:o(r)};return e&&(i.minItems=e.value),t&&(i.maxItems=t.value),i},Bn=({items:e,_def:{rest:t}},{next:r})=>({type:"array",prefixItems:e.map(r),items:t===null?{not:{}}:r(t)}),qn=({isEmail:e,isURL:t,minLength:r,maxLength:o,isUUID:i,isCUID:s,isCUID2:a,isULID:p,isIP:c,isEmoji:d,isDatetime:l,_def:{checks:f}})=>{let u=f.find(R=>R.kind==="regex"),T=f.find(R=>R.kind==="datetime"),I=u?u.regex:T?T.offset?new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(([+-]\\d{2}:\\d{2})|Z)$"):new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?Z$"):void 0,b={type:"string"},E={"date-time":l,email:e,url:t,uuid:i,cuid:s,cuid2:a,ulid:p,ip:c,emoji:d};for(let R in E)if(E[R]){b.format=R;break}return r!==null&&(b.minLength=r),o!==null&&(b.maxLength=o),I&&(b.pattern=I.source),b},$n=({isInt:e,maxValue:t,minValue:r,_def:{checks:o}})=>{let i=o.find(f=>f.kind==="min"),s=r===null?e?Number.MIN_SAFE_INTEGER:-Number.MAX_VALUE:r,a=i?i.inclusive:!0,p=o.find(f=>f.kind==="max"),c=t===null?e?Number.MAX_SAFE_INTEGER:Number.MAX_VALUE:t,d=p?p.inclusive:!0,l={type:e?"integer":"number",format:e?"int64":"double"};return a?l.minimum=s:l.exclusiveMinimum=s,d?l.maximum=c:l.exclusiveMaximum=c,l},et=({shape:e},t)=>ue(t,e),Vn=e=>{let t=Array.isArray(e.type)?e.type[0]:e.type;return bn?.[t]},jr=e=>{let t=typeof e.type=="string"?[e.type]:e.type||[];return t.includes("null")?t:t.concat("null")},Gn=(e,{isResponse:t,next:r})=>{let o=r(e.innerType()),{effect:i}=e._def;if(t&&i.type==="transform"&&tt(o)){let s=Be(e,Vn(o));return s&&["number","string","boolean"].includes(s)?{type:s}:r(x.any())}if(!t&&i.type==="preprocess"&&tt(o)){let{type:s,...a}=o;return{...a,format:`${a.format||s} (preprocessed)`}}return o},_n=({_def:e},{isResponse:t,next:r})=>r(e[t?"out":"in"]),Yn=(e,{next:t})=>t(e.unwrap()),Qn=({schema:e},{next:t,serializer:r,getRef:o,makeRef:i})=>{let s=r(e);return o(s)||(i(s,{}),i(s,t(e)))},Jn=(e,{next:t})=>t(e.unwrap().shape.raw),Lr=e=>e.length?ke(hn(mn(1,e.length+1).map(t=>`example${t}`),ue(Ir("value"),e))):void 0,Nr=(e,t,r=[])=>Cr(H,ue(gn(o=>Pr(o)==="Object",rt(r))),Lr)({schema:e,variant:t?"parsed":"original",validate:!0}),Wn=(e,t)=>Cr(H,nn(sn(t)),ln(t),Lr)({schema:e,variant:"original",validate:!0}),ee=e=>e instanceof x.ZodObject?e:e instanceof x.ZodBranded?ee(e.unwrap()):e instanceof x.ZodUnion||e instanceof x.ZodDiscriminatedUnion?e.options.map(t=>ee(t)).reduce((t,r)=>t.merge(r.partial()),x.object({})):e instanceof x.ZodEffects?ee(e._def.schema):e instanceof x.ZodPipeline?ee(e._def.in):ee(e._def.left).merge(ee(e._def.right)),vr=({path:e,method:t,schema:r,inputSources:o,serializer:i,getRef:s,makeRef:a,composition:p,brandHandling:c,description:d=`${t.toUpperCase()} ${e} Parameter`})=>{let{shape:l}=ee(r),f=xn(e),u=o.includes("query"),T=o.includes("params"),I=o.includes("headers"),b=h=>T&&f.includes(h),E=h=>I&&mt(h);return Object.keys(l).map(h=>({name:h,location:b(h)?"path":E(h)?"header":u?"query":void 0})).filter(h=>h.location!==void 0).map(({name:h,location:ge})=>{let k=X(l[h],{rules:{...c,...It},onEach:Ct,onMissing:zt,ctx:{isResponse:!1,serializer:i,getRef:s,makeRef:a,path:e,method:t}}),$=p==="components"?a(w(d,h),k):k;return{name:h,in:ge,required:!l[h].isOptional(),description:k.description||d,schema:$,examples:Wn(r,h)}})},It={ZodString:qn,ZodNumber:$n,ZodBigInt:Hn,ZodBoolean:Un,ZodNull:Nn,ZodArray:Kn,ZodTuple:Bn,ZodRecord:Fn,ZodObject:Ln,ZodLiteral:jn,ZodIntersection:zn,ZodUnion:Pn,ZodAny:On,ZodDefault:Tn,ZodEnum:Ar,ZodNativeEnum:Ar,ZodEffects:Gn,ZodOptional:wn,ZodNullable:En,ZodDiscriminatedUnion:In,ZodBranded:Yn,ZodDate:Mn,ZodCatch:Sn,ZodPipeline:_n,ZodLazy:Qn,ZodReadonly:Zn,[D]:An,[Ae]:Rn,[ve]:kn,[Ne]:vn,[Q]:Jn},Ct=(e,{isResponse:t,prev:r})=>{if(Pt(r))return{};let{description:o}=e,i=e instanceof x.ZodLazy,s=r.type!==void 0,a=t&&Re(e),p=!i&&s&&!a&&e.isNullable(),c=i?[]:H({schema:e,variant:t?"parsed":"original",validate:!0}),d={};return o&&(d.description=o),p&&(d.type=jr(r)),c.length&&(d.examples=c.slice()),d},zt=(e,t)=>te.fail(new z({message:`Zod type ${e.constructor.name} is unsupported.`,...t})),At=(e,t)=>{if(Pt(e))return e;let r={...e};return r.properties&&(r.properties=rt(t,r.properties)),r.examples&&(r.examples=r.examples.map(o=>rt(t,o))),r.required&&(r.required=r.required.filter(o=>!t.includes(o))),r.allOf&&(r.allOf=r.allOf.map(o=>At(o,t))),r.oneOf&&(r.oneOf=r.oneOf.map(o=>At(o,t))),r},kr=e=>Pt(e)?e:rt(["examples"],e),Mr=({method:e,path:t,schema:r,mimeTypes:o,variant:i,serializer:s,getRef:a,makeRef:p,composition:c,hasMultipleStatusCodes:d,statusCode:l,brandHandling:f,description:u=`${e.toUpperCase()} ${t} ${yt(i)} response ${d?l:""}`.trim()})=>{let T=kr(X(r,{rules:{...f,...It},onEach:Ct,onMissing:zt,ctx:{isResponse:!0,serializer:s,getRef:a,makeRef:p,path:t,method:e}})),I={schema:c==="components"?p(w(u),T):T,examples:Nr(r,!0)};return{description:u,content:ke(ot(o,[I]))}},Xn=()=>({type:"http",scheme:"basic"}),ei=({format:e})=>{let t={type:"http",scheme:"bearer"};return e&&(t.bearerFormat=e),t},ti=({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},ri=({name:e})=>({type:"apiKey",in:"header",name:e}),oi=({name:e})=>({type:"apiKey",in:"cookie",name:e}),ni=({url:e})=>({type:"openIdConnect",openIdConnectUrl:e}),ii=({flows:e={}})=>({type:"oauth2",flows:ue(t=>({...t,scopes:t.scopes||{}}),un(an,e))}),Ur=(e,t)=>{let r={basic:Xn,bearer:ei,input:ti,header:ri,cookie:oi,openid:ni,oauth2:ii};return _e(e,o=>r[o.type](o,t))},nt=e=>"or"in e?e.or.map(t=>"and"in t?pn(ue(({name:r,scopes:o})=>Ir(r,o),t.and)):{[t.name]:t.scopes}):"and"in e?nt(bt(e)):nt({or:[e]}),Hr=({method:e,path:t,schema:r,mimeTypes:o,serializer:i,getRef:s,makeRef:a,composition:p,brandHandling:c,paramNames:d,description:l=`${e.toUpperCase()} ${t} Request body`})=>{let f=kr(At(X(r,{rules:{...c,...It},onEach:Ct,onMissing:zt,ctx:{isResponse:!1,serializer:i,getRef:s,makeRef:a,path:t,method:e}}),d)),u={schema:p==="components"?a(w(l),f):f,examples:Nr(r,!1,d)};return{description:l,content:ke(ot(o,[u]))}},Dr=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<=Rr?e:e.slice(0,Rr-1)+"\u2026";var Zt=class extends ai{lastSecuritySchemaIds=new Map;lastOperationIdSuffixes=new Map;makeRef(t,r){return this.addSchema(t,r),this.getRef(t)}getRef(t){return t in(this.rootDoc.components?.schemas||{})?{$ref:`#/components/schemas/${t}`}:void 0}ensureUniqOperationId(t,r,o){let i=o||w(r,t),s=this.lastOperationIdSuffixes.get(i);return s===void 0?(this.lastOperationIdSuffixes.set(i,1),i):(o&&si.fail(new z({message:`Duplicated operationId: "${o}"`,method:r,isResponse:!1,path:t})),s++,this.lastOperationIdSuffixes.set(i,s),`${i}${s}`)}ensureUniqSecuritySchemaName(t){let r=JSON.stringify(t);for(let i in this.rootDoc.components?.securitySchemes||{})if(r===JSON.stringify(this.rootDoc.components?.securitySchemes?.[i]))return i;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:i,serverUrl:s,descriptions:a,brandHandling:p,hasSummaryFromDescription:c=!0,composition:d="inline",serializer:l=Ke}){super(),this.addInfo({title:o,version:i});for(let u of typeof s=="string"?[s]:s)this.addServer({url:u});W({routing:t,onEndpoint:(u,T,I)=>{let b=I,E={path:T,method:b,endpoint:u,composition:d,serializer:l,brandHandling:p,getRef:this.getRef.bind(this),makeRef:this.makeRef.bind(this)},[R,h]=["short","long"].map(u.getDescription.bind(u)),ge=R?wt(R):c&&h?wt(h):void 0,k=u.getTags(),$=r.inputSources?.[b]||dt[b],oe=this.ensureUniqOperationId(T,b,u.getOperationId(b)),he=vr({...E,inputSources:$,schema:u.getSchema("input"),description:a?.requestParameter?.call(null,{method:b,path:T,operationId:oe})}),Ue={};for(let L of["positive","negative"]){let V=u.getResponses(L);for(let{mimeTypes:be,schema:S,statusCodes:O}of V)for(let A of O)Ue[A]=Mr({...E,variant:L,schema:S,mimeTypes:be,statusCode:A,hasMultipleStatusCodes:V.length>1||O.length>1,description:a?.[`${L}Response`]?.call(null,{method:b,path:T,operationId:oe,statusCode:A})})}let ct=$.includes("body")?Hr({...E,paramNames:pi("name",he),schema:u.getSchema("input"),mimeTypes:u.getMimeTypes("input"),description:a?.requestBody?.call(null,{method:b,path:T,operationId:oe})}):void 0,He=nt(_e(Ur(u.getSecurity(),$),L=>{let V=this.ensureUniqSecuritySchemaName(L),be=["oauth2","openIdConnect"].includes(L.type)?u.getScopes().slice():[];return this.addSecurityScheme(V,L),{name:V,scopes:be}}));this.addPath(Zr(T),{[b]:{operationId:oe,summary:ge,description:h,tags:k.length>0?k:void 0,parameters:he.length>0?he:void 0,requestBody:ct,security:He.length>0?He:void 0,responses:Ue}})}}),this.rootDoc.tags=r.tags?Dr(r.tags):[]}};import{createRequest as ci,createResponse as di}from"node-mocks-http";var li=e=>ci({...e,headers:{"content-type":P.json,...e?.headers}}),mi=e=>di(e),ui=e=>{let t={warn:[],error:[],info:[],debug:[]};return new Proxy(e||{},{get(r,o,i){return o==="_getLogs"?()=>t:o in le?(...s)=>t[o].push(s):Reflect.get(r,o,i)}})},fi=({requestProps:e,responseOptions:t,configProps:r,loggerProps:o})=>{let i=li(e),s=mi({req:i,...t}),a=ui(o),p={cors:!1,logger:a,...r};return{requestMock:i,responseMock:s,loggerMock:a,configMock:p}},yi=async({endpoint:e,...t})=>{let{requestMock:r,responseMock:o,loggerMock:i,configMock:s}=fi(t);return await e.execute({request:r,response:o,config:s,logger:i}),{requestMock:r,responseMock:o,loggerMock:i}};import Z from"typescript";import v from"typescript";import{chain as Fr,toPairs as Kr}from"ramda";var n=v.factory,K=[n.createModifier(v.SyntaxKind.ExportKeyword)],gi=[n.createModifier(v.SyntaxKind.AsyncKeyword)],hi=[n.createModifier(v.SyntaxKind.PublicKeyword),n.createModifier(v.SyntaxKind.ReadonlyKeyword)],Br=[n.createModifier(v.SyntaxKind.ProtectedKeyword),n.createModifier(v.SyntaxKind.ReadonlyKeyword)],Et=n.createTemplateHead(""),fe=n.createTemplateTail(""),jt=n.createTemplateMiddle(" "),Lt=e=>n.createTemplateLiteralType(Et,e.map((t,r)=>n.createTemplateLiteralTypeSpan(n.createTypeReferenceNode(t),r===e.length-1?fe:jt))),Nt=Lt(["M","P"]),it=(e,t,r)=>n.createParameterDeclaration(r,void 0,e,void 0,t,void 0),st=(e,t)=>Fr(([r,o])=>[it(n.createIdentifier(r),o,t)],Kr(e)),vt=(e,t)=>n.createExpressionWithTypeArguments(n.createIdentifier("Record"),[typeof e=="number"?n.createKeywordTypeNode(e):n.createTypeReferenceNode(e),n.createKeywordTypeNode(t)]),qr=e=>n.createConstructorDeclaration(void 0,e,n.createBlock([])),$r=(e,t)=>n.createPropertySignature(void 0,e,void 0,n.createTypeReferenceNode(t)),B=(e,t,r)=>n.createVariableDeclarationList([n.createVariableDeclaration(e,void 0,r,t)],v.NodeFlags.Const),kt=(e,t)=>n.createTypeAliasDeclaration(K,e,void 0,n.createUnionTypeNode(t.map(r=>n.createLiteralTypeNode(n.createStringLiteral(r))))),at=(e,t)=>n.createTypeAliasDeclaration(K,e,void 0,t),Vr=(e,t,r)=>n.createPropertyDeclaration(hi,e,void 0,t,r),Gr=(e,t,r)=>n.createClassDeclaration(K,e,void 0,void 0,[t,...r]),_r=(e,t)=>n.createTypeReferenceNode("Promise",[n.createIndexedAccessTypeNode(n.createTypeReferenceNode(e),t)]),Yr=()=>n.createTypeReferenceNode("Promise",[n.createKeywordTypeNode(v.SyntaxKind.AnyKeyword)]),Qr=(e,t,r)=>n.createInterfaceDeclaration(K,e,void 0,t,r),bi=Fr(([e,t])=>[n.createTypeParameterDeclaration([],e,n.createTypeReferenceNode(t))]),Jr=e=>bi(Kr(e)),Mt=(e,t,r)=>n.createArrowFunction(r?gi:void 0,void 0,e.map(o=>it(o)),void 0,void 0,t),Ut=(e,t,r)=>n.createCallExpression(n.createPropertyAccessExpression(n.createCallExpression(n.createPropertyAccessExpression(n.createIdentifier("Object"),"keys"),void 0,[e]),"reduce"),void 0,[n.createArrowFunction(void 0,void 0,st({acc:void 0,key:void 0}),void 0,void 0,t),r]),Wr=(...e)=>`"${e.join(" ")}"`;var Xr=["get","post","put","delete","patch"];import g from"typescript";import{z as Ft}from"zod";import q from"typescript";var{factory:pt}=q,Ht=(e,t)=>{q.addSyntheticLeadingComment(e,q.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0)},ye=(e,t,r)=>{let o=pt.createTypeAliasDeclaration(void 0,pt.createIdentifier(t),void 0,e);return r&&Ht(o,r),o},Dt=(e,t)=>{let r=q.createSourceFile("print.ts","",q.ScriptTarget.Latest,!1,q.ScriptKind.TS);return q.createPrinter(t).printNode(q.EmitHint.Unspecified,e,r)},xi=/^[A-Za-z_$][A-Za-z0-9_$]*$/,eo=e=>xi.test(e)?pt.createIdentifier(e):pt.createStringLiteral(e);var{factory:m}=g,Ti={[g.SyntaxKind.AnyKeyword]:"",[g.SyntaxKind.BigIntKeyword]:BigInt(0),[g.SyntaxKind.BooleanKeyword]:!1,[g.SyntaxKind.NumberKeyword]:0,[g.SyntaxKind.ObjectKeyword]:{},[g.SyntaxKind.StringKeyword]:"",[g.SyntaxKind.UndefinedKeyword]:void 0},Si=({value:e})=>m.createLiteralTypeNode(typeof e=="number"?m.createNumericLiteral(e):typeof e=="boolean"?e?m.createTrue():m.createFalse():m.createStringLiteral(e)),Oi=({shape:e},{isResponse:t,next:r,optionalPropStyle:{withQuestionMark:o}})=>{let i=Object.entries(e).map(([s,a])=>{let p=t&&Re(a)?a instanceof Ft.ZodOptional:a.isOptional(),c=m.createPropertySignature(void 0,eo(s),p&&o?m.createToken(g.SyntaxKind.QuestionToken):void 0,r(a));return a.description&&Ht(c,a.description),c});return m.createTypeLiteralNode(i)},Ri=({element:e},{next:t})=>m.createArrayTypeNode(t(e)),Ai=({options:e})=>m.createUnionTypeNode(e.map(t=>m.createLiteralTypeNode(m.createStringLiteral(t)))),to=({options:e},{next:t})=>m.createUnionTypeNode(e.map(t)),Pi=e=>Ti?.[e.kind],Ii=(e,{next:t,isResponse:r})=>{let o=t(e.innerType());if(r&&e._def.effect.type==="transform"){let i=Be(e,Pi(o)),s={number:g.SyntaxKind.NumberKeyword,bigint:g.SyntaxKind.BigIntKeyword,boolean:g.SyntaxKind.BooleanKeyword,string:g.SyntaxKind.StringKeyword,undefined:g.SyntaxKind.UndefinedKeyword,object:g.SyntaxKind.ObjectKeyword};return m.createKeywordTypeNode(i&&s[i]||g.SyntaxKind.AnyKeyword)}return o},Ci=e=>m.createUnionTypeNode(Object.values(e.enum).map(t=>m.createLiteralTypeNode(typeof t=="number"?m.createNumericLiteral(t):m.createStringLiteral(t)))),zi=(e,{next:t,optionalPropStyle:{withUndefined:r}})=>{let o=t(e.unwrap());return r?m.createUnionTypeNode([o,m.createKeywordTypeNode(g.SyntaxKind.UndefinedKeyword)]):o},wi=(e,{next:t})=>m.createUnionTypeNode([t(e.unwrap()),m.createLiteralTypeNode(m.createNull())]),Zi=({items:e,_def:{rest:t}},{next:r})=>m.createTupleTypeNode(e.map(r).concat(t===null?[]:m.createRestTypeNode(r(t)))),Ei=({keySchema:e,valueSchema:t},{next:r})=>m.createExpressionWithTypeArguments(m.createIdentifier("Record"),[e,t].map(r)),ji=({_def:e},{next:t})=>m.createIntersectionTypeNode([e.left,e.right].map(t)),Li=({_def:e},{next:t})=>t(e.innerType),re=e=>()=>m.createKeywordTypeNode(e),Ni=(e,{next:t})=>t(e.unwrap()),vi=(e,{next:t})=>t(e.unwrap()),ki=({_def:e},{next:t})=>t(e.innerType),Mi=({_def:e},{next:t,isResponse:r})=>t(e[r?"out":"in"]),Ui=()=>m.createLiteralTypeNode(m.createNull()),Hi=({schema:e},{getAlias:t,makeAlias:r,next:o,serializer:i})=>{let s=`Type${i(e)}`;return t(s)||(r(s,m.createLiteralTypeNode(m.createNull())),r(s,o(e)))},Di=e=>{let t=e.unwrap(),r=m.createKeywordTypeNode(g.SyntaxKind.StringKeyword),o=m.createTypeReferenceNode("Buffer"),i=m.createUnionTypeNode([r,o]);return t instanceof Ft.ZodString?r:t instanceof Ft.ZodUnion?i:o},Fi=(e,{next:t})=>t(e.unwrap().shape.raw),Ki={ZodString:re(g.SyntaxKind.StringKeyword),ZodNumber:re(g.SyntaxKind.NumberKeyword),ZodBigInt:re(g.SyntaxKind.BigIntKeyword),ZodBoolean:re(g.SyntaxKind.BooleanKeyword),ZodAny:re(g.SyntaxKind.AnyKeyword),[Ne]:re(g.SyntaxKind.StringKeyword),[ve]:re(g.SyntaxKind.StringKeyword),ZodNull:Ui,ZodArray:Ri,ZodTuple:Zi,ZodRecord:Ei,ZodObject:Oi,ZodLiteral:Si,ZodIntersection:ji,ZodUnion:to,ZodDefault:Li,ZodEnum:Ai,ZodNativeEnum:Ci,ZodEffects:Ii,ZodOptional:zi,ZodNullable:wi,ZodDiscriminatedUnion:to,ZodBranded:Ni,ZodCatch:ki,ZodPipeline:Mi,ZodLazy:Hi,ZodReadonly:vi,[D]:Di,[Q]:Fi},Me=(e,{brandHandling:t,ctx:r})=>X(e,{rules:{...t,...Ki},onMissing:()=>m.createKeywordTypeNode(g.SyntaxKind.AnyKeyword),ctx:r});var Kt=class{program=[];usage=[];registry=new Map;paths=[];aliases=new Map;ids={pathType:n.createIdentifier("Path"),methodType:n.createIdentifier("Method"),methodPathType:n.createIdentifier("MethodPath"),inputInterface:n.createIdentifier("Input"),posResponseInterface:n.createIdentifier("PositiveResponse"),negResponseInterface:n.createIdentifier("NegativeResponse"),responseInterface:n.createIdentifier("Response"),jsonEndpointsConst:n.createIdentifier("jsonEndpoints"),endpointTagsConst:n.createIdentifier("endpointTags"),providerType:n.createIdentifier("Provider"),implementationType:n.createIdentifier("Implementation"),clientClass:n.createIdentifier("ExpressZodAPIClient"),keyParameter:n.createIdentifier("key"),pathParameter:n.createIdentifier("path"),paramsArgument:n.createIdentifier("params"),methodParameter:n.createIdentifier("method"),accumulator:n.createIdentifier("acc"),provideMethod:n.createIdentifier("provide"),implementationArgument:n.createIdentifier("implementation"),headersProperty:n.createIdentifier("headers"),hasBodyConst:n.createIdentifier("hasBody"),undefinedValue:n.createIdentifier("undefined"),bodyProperty:n.createIdentifier("body"),responseConst:n.createIdentifier("response"),searchParamsConst:n.createIdentifier("searchParams"),exampleImplementationConst:n.createIdentifier("exampleImplementation"),clientConst:n.createIdentifier("client")};interfaces=[];getAlias(t){return this.aliases.has(t)?n.createTypeReferenceNode(t):void 0}makeAlias(t,r){return this.aliases.set(t,ye(r,t)),this.getAlias(t)}constructor({routing:t,brandHandling:r,variant:o="client",serializer:i=Ke,splitResponse:s=!1,optionalPropStyle:a={withQuestionMark:!0,withUndefined:!0}}){W({routing:t,onEndpoint:(S,O,A)=>{let ne={serializer:i,getAlias:this.getAlias.bind(this),makeAlias:this.makeAlias.bind(this),optionalPropStyle:a},xe=w(A,O,"input"),Te=Me(S.getSchema("input"),{brandHandling:r,ctx:{...ne,isResponse:!1}}),C=s?w(A,O,"positive.response"):void 0,Bt=S.getSchema("positive"),qt=s?Me(Bt,{brandHandling:r,ctx:{...ne,isResponse:!0}}):void 0,Se=s?w(A,O,"negative.response"):void 0,$t=S.getSchema("negative"),Vt=s?Me($t,{brandHandling:r,ctx:{...ne,isResponse:!0}}):void 0,Gt=w(A,O,"response"),ro=C&&Se?n.createUnionTypeNode([n.createTypeReferenceNode(C),n.createTypeReferenceNode(Se)]):Me(Bt.or($t),{brandHandling:r,ctx:{...ne,isResponse:!0}});this.program.push(ye(Te,xe)),qt&&C&&this.program.push(ye(qt,C)),Vt&&Se&&this.program.push(ye(Vt,Se)),this.program.push(ye(ro,Gt)),A!=="options"&&(this.paths.push(O),this.registry.set({method:A,path:O},{input:xe,positive:C,negative:Se,response:Gt,isJson:S.getMimeTypes("positive").includes(P.json),tags:S.getTags()}))}}),this.program.unshift(...this.aliases.values()),this.program.push(kt(this.ids.pathType,this.paths)),this.program.push(kt(this.ids.methodType,Xr)),this.program.push(at(this.ids.methodPathType,Lt([this.ids.methodType,this.ids.pathType])));let p=[n.createHeritageClause(Z.SyntaxKind.ExtendsKeyword,[vt(this.ids.methodPathType,Z.SyntaxKind.AnyKeyword)])];this.interfaces.push({id:this.ids.inputInterface,kind:"input",props:[]}),s&&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 c=[],d=[];for(let[{method:S,path:O},{isJson:A,tags:ne,...xe}]of this.registry){let Te=Wr(S,O);for(let C of this.interfaces)C.kind in xe&&C.props.push($r(Te,xe[C.kind]));o!=="types"&&(A&&c.push(n.createPropertyAssignment(Te,n.createTrue())),d.push(n.createPropertyAssignment(Te,n.createArrayLiteralExpression(ne.map(C=>n.createStringLiteral(C))))))}for(let{id:S,props:O}of this.interfaces)this.program.push(Qr(S,p,O));if(o==="types")return;let l=n.createVariableStatement(K,B(this.ids.jsonEndpointsConst,n.createObjectLiteralExpression(c))),f=n.createVariableStatement(K,B(this.ids.endpointTagsConst,n.createObjectLiteralExpression(d))),u=at(this.ids.providerType,n.createFunctionTypeNode(Jr({M:this.ids.methodType,P:this.ids.pathType}),st({method:n.createTypeReferenceNode("M"),path:n.createTypeReferenceNode("P"),params:n.createIndexedAccessTypeNode(n.createTypeReferenceNode(this.ids.inputInterface),Nt)}),_r(this.ids.responseInterface,Nt))),T=at(this.ids.implementationType,n.createFunctionTypeNode(void 0,st({method:n.createTypeReferenceNode(this.ids.methodType),path:n.createKeywordTypeNode(Z.SyntaxKind.StringKeyword),params:vt(Z.SyntaxKind.StringKeyword,Z.SyntaxKind.AnyKeyword)}),Yr())),I=n.createTemplateExpression(n.createTemplateHead(":"),[n.createTemplateSpan(this.ids.keyParameter,fe)]),b=Ut(this.ids.paramsArgument,n.createCallExpression(n.createPropertyAccessExpression(this.ids.accumulator,"replace"),void 0,[I,n.createElementAccessExpression(this.ids.paramsArgument,this.ids.keyParameter)]),this.ids.pathParameter),E=Ut(this.ids.paramsArgument,n.createConditionalExpression(n.createBinaryExpression(n.createCallExpression(n.createPropertyAccessExpression(this.ids.pathParameter,"indexOf"),void 0,[I]),Z.SyntaxKind.GreaterThanEqualsToken,n.createNumericLiteral(0)),void 0,this.ids.accumulator,void 0,n.createObjectLiteralExpression([n.createSpreadAssignment(this.ids.accumulator),n.createPropertyAssignment(n.createComputedPropertyName(this.ids.keyParameter),n.createElementAccessExpression(this.ids.paramsArgument,this.ids.keyParameter))])),n.createObjectLiteralExpression()),R=Gr(this.ids.clientClass,qr([it(this.ids.implementationArgument,n.createTypeReferenceNode(this.ids.implementationType),Br)]),[Vr(this.ids.provideMethod,n.createTypeReferenceNode(this.ids.providerType),Mt([this.ids.methodParameter,this.ids.pathParameter,this.ids.paramsArgument],n.createCallExpression(n.createPropertyAccessExpression(n.createThis(),this.ids.implementationArgument),void 0,[this.ids.methodParameter,b,E]),!0))]);this.program.push(l,f,u,T,R);let h=n.createPropertyAssignment(this.ids.methodParameter,n.createCallExpression(n.createPropertyAccessExpression(this.ids.methodParameter,"toUpperCase"),void 0,void 0)),ge=n.createPropertyAssignment(this.ids.headersProperty,n.createConditionalExpression(this.ids.hasBodyConst,void 0,n.createObjectLiteralExpression([n.createPropertyAssignment(n.createStringLiteral("Content-Type"),n.createStringLiteral(P.json))]),void 0,this.ids.undefinedValue)),k=n.createPropertyAssignment(this.ids.bodyProperty,n.createConditionalExpression(this.ids.hasBodyConst,void 0,n.createCallExpression(n.createPropertyAccessExpression(n.createIdentifier("JSON"),"stringify"),void 0,[this.ids.paramsArgument]),void 0,this.ids.undefinedValue)),$=n.createVariableStatement(void 0,B(this.ids.responseConst,n.createAwaitExpression(n.createCallExpression(n.createIdentifier("fetch"),void 0,[n.createTemplateExpression(n.createTemplateHead("https://example.com"),[n.createTemplateSpan(this.ids.pathParameter,n.createTemplateMiddle("")),n.createTemplateSpan(this.ids.searchParamsConst,fe)]),n.createObjectLiteralExpression([h,ge,k])])))),oe=n.createVariableStatement(void 0,B(this.ids.hasBodyConst,n.createLogicalNot(n.createCallExpression(n.createPropertyAccessExpression(n.createArrayLiteralExpression([n.createStringLiteral("get"),n.createStringLiteral("delete")]),"includes"),void 0,[this.ids.methodParameter])))),he=n.createVariableStatement(void 0,B(this.ids.searchParamsConst,n.createConditionalExpression(this.ids.hasBodyConst,void 0,n.createStringLiteral(""),void 0,n.createTemplateExpression(n.createTemplateHead("?"),[n.createTemplateSpan(n.createNewExpression(n.createIdentifier("URLSearchParams"),void 0,[this.ids.paramsArgument]),fe)])))),[Ue,ct]=["json","text"].map(S=>n.createReturnStatement(n.createCallExpression(n.createPropertyAccessExpression(this.ids.responseConst,S),void 0,void 0))),He=n.createIfStatement(n.createBinaryExpression(n.createTemplateExpression(Et,[n.createTemplateSpan(this.ids.methodParameter,jt),n.createTemplateSpan(this.ids.pathParameter,fe)]),Z.SyntaxKind.InKeyword,this.ids.jsonEndpointsConst),n.createBlock([Ue])),L=n.createVariableStatement(K,B(this.ids.exampleImplementationConst,Mt([this.ids.methodParameter,this.ids.pathParameter,this.ids.paramsArgument],n.createBlock([oe,he,$,He,ct]),!0),n.createTypeReferenceNode(this.ids.implementationType))),V=n.createExpressionStatement(n.createCallExpression(n.createPropertyAccessExpression(this.ids.clientConst,this.ids.provideMethod),void 0,[n.createStringLiteral("get"),n.createStringLiteral("/v1/user/retrieve"),n.createObjectLiteralExpression([n.createPropertyAssignment("id",n.createStringLiteral("10"))])])),be=n.createVariableStatement(void 0,B(this.ids.clientConst,n.createNewExpression(this.ids.clientClass,void 0,[this.ids.exampleImplementationConst])));this.usage.push(L,be,V)}printUsage(t){return this.usage.length?this.usage.map(r=>typeof r=="string"?r:Dt(r,t)).join(`
|
|
20
|
+
`)};var Tr=e=>{e.startupLogo!==!1&&console.log(xr());let t=e.errorHandler||ze,r=ar(e.logger)?e.logger:new Ze(e.logger);r.debug("Running","v20.7.0 (ESM)");let o=hr({rootLogger:r,config:e}),i=fr({rootLogger:r,errorHandler:t}),s=ur({rootLogger:r,errorHandler:t});return{rootLogger:r,errorHandler:t,notFoundHandler:i,parserFailureHandler:s,loggingMiddleware:o}},en=(e,t)=>{let{rootLogger:r,notFoundHandler:o,loggingMiddleware:i}=Tr(e);return Ot({app:e.app.use(i),routing:t,rootLogger:r,config:e}),{notFoundHandler:o,logger:r}},tn=async(e,t)=>{let{rootLogger:r,notFoundHandler:o,parserFailureHandler:i,loggingMiddleware:s}=Tr(e),a=Rt().disable("x-powered-by").use(s);if(e.server.compression){let l=await me("compression");a.use(l(typeof e.server.compression=="object"?e.server.compression:void 0))}let p={json:[e.server.jsonParser||Rt.json()],raw:[e.server.rawParser||Rt.raw(),gr],upload:e.server.upload?await yr({config:e,rootLogger:r}):[]};e.server.beforeRouting&&await e.server.beforeRouting({app:a,logger:r}),Ot({app:a,routing:t,rootLogger:r,config:e,parsers:p}),a.use(i,o);let c=(l,f)=>l.listen(f,()=>{r.info("Listening",f)}),d={httpServer:c(Wo.createServer(a),e.server.listen),httpsServer:e.https?c(Xo.createServer(e.https.options,a),e.https.listen):void 0};return{app:a,...d,logger:r}};import si from"node:assert/strict";import{OpenApiBuilder as ai}from"openapi3-ts/oas31";import{pluck as pi}from"ramda";import te from"node:assert/strict";import{isReferenceObject as Pt,isSchemaObject as tt}from"openapi3-ts/oas31";import{concat as on,type as Pr,filter as nn,fromPairs as ke,has as sn,isNil as an,map as ue,mergeAll as pn,mergeDeepRight as cn,mergeDeepWith as dn,objOf as Ir,omit as rt,pipe as Cr,pluck as ln,range as mn,reject as un,toLower as fn,union as yn,when as gn,xprod as ot,zip as hn}from"ramda";import{z as x}from"zod";import{z as Le}from"zod";var Xe=e=>!isNaN(e.getTime());var Ne=Symbol("DateIn"),Sr=()=>Le.union([Le.string().date(),Le.string().datetime(),Le.string().datetime({local:!0})]).transform(t=>new Date(t)).pipe(Le.date().refine(Xe)).brand(Ne);import{z as rn}from"zod";var ve=Symbol("DateOut"),Or=()=>rn.date().refine(Xe).transform(e=>e.toISOString()).brand(ve);var X=(e,{onEach:t,rules:r,onMissing:o,ctx:i={}})=>{let s=r[e._def[y]?.brand]||r[e._def.typeName],p=s?s(e,{...i,next:d=>X(d,{ctx:i,onEach:t,rules:r,onMissing:o})}):o(e,i),c=t&&t(e,{prev:p,...i});return c?{...p,...c}:p};var Rr=50,zr="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString",bn={integer:0,number:0,string:"",boolean:!1,object:{},null:null,array:[]},wr=/:([A-Za-z0-9_]+)/g,xn=e=>e.match(wr)?.map(t=>t.slice(1))||[],Zr=e=>e.replace(wr,t=>`{${t.slice(1)}}`),Tn=({_def:e},{next:t})=>({...t(e.innerType),default:e[y]?.defaultLabel||e.defaultValue()}),Sn=({_def:{innerType:e}},{next:t})=>t(e),On=()=>({format:"any"}),Rn=({},e)=>(te(!e.isResponse,new z({message:"Please use ez.upload() only for input.",...e})),{type:"string",format:"binary"}),An=e=>{let t=e.unwrap();return{type:"string",format:t instanceof x.ZodString?t._def.checks.find(r=>r.kind==="base64")?"byte":"file":"binary"}},Pn=({options:e},{next:t})=>({oneOf:e.map(t)}),In=({options:e,discriminator:t},{next:r})=>({discriminator:{propertyName:t},oneOf:e.map(r)}),Cn=e=>{let[t,r]=e.filter(tt).filter(i=>i.type==="object"&&Object.keys(i).every(s=>["type","properties","required","examples"].includes(s)));te(t&&r,"Can not flatten objects");let o={type:"object"};return(t.properties||r.properties)&&(o.properties=dn((i,s)=>Array.isArray(i)&&Array.isArray(s)?on(i,s):i===s?s:te.fail("Can not flatten properties"),t.properties||{},r.properties||{})),(t.required||r.required)&&(o.required=yn(t.required||[],r.required||[])),(t.examples||r.examples)&&(o.examples=_(t.examples||[],r.examples||[],([i,s])=>cn(i,s))),o},zn=({_def:{left:e,right:t}},{next:r})=>{let o=[e,t].map(r);try{return Cn(o)}catch{}return{allOf:o}},wn=(e,{next:t})=>t(e.unwrap()),Zn=(e,{next:t})=>t(e.unwrap()),En=(e,{next:t})=>{let r=t(e.unwrap());return tt(r)&&(r.type=jr(r)),r},Er=e=>{let t=fn(Pr(e));return typeof e=="bigint"?"integer":t==="number"||t==="string"||t==="boolean"||t==="object"||t==="null"||t==="array"?t:void 0},Ar=e=>({type:Er(Object.values(e.enum)[0]),enum:Object.values(e.enum)}),jn=({value:e})=>({type:Er(e),const:e}),Ln=(e,{isResponse:t,next:r})=>{let o=Object.keys(e.shape),i=p=>t&&Re(p)?p instanceof x.ZodOptional:p.isOptional(),s=o.filter(p=>!i(e.shape[p])),a={type:"object"};return o.length&&(a.properties=et(e,r)),s.length&&(a.required=s),a},Nn=()=>({type:"null"}),vn=({},e)=>(te(!e.isResponse,new z({message:"Please use ez.dateOut() for output.",...e})),{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:zr}}),kn=({},e)=>(te(e.isResponse,new z({message:"Please use ez.dateIn() for input.",...e})),{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",externalDocs:{url:zr}}),Mn=({},e)=>te.fail(new z({message:`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})),Un=()=>({type:"boolean"}),Hn=()=>({type:"integer",format:"bigint"}),Dn=e=>e.every(t=>t instanceof x.ZodLiteral),Fn=({keySchema:e,valueSchema:t},{next:r})=>{if(e instanceof x.ZodEnum||e instanceof x.ZodNativeEnum){let o=Object.values(e.enum),i={type:"object"};return o.length&&(i.properties=et(x.object(ke(ot(o,[t]))),r),i.required=o),i}if(e instanceof x.ZodLiteral)return{type:"object",properties:et(x.object({[e.value]:t}),r),required:[e.value]};if(e instanceof x.ZodUnion&&Dn(e.options)){let o=ue(s=>`${s.value}`,e.options),i=ke(ot(o,[t]));return{type:"object",properties:et(x.object(i),r),required:o}}return{type:"object",additionalProperties:r(t)}},Kn=({_def:{minLength:e,maxLength:t},element:r},{next:o})=>{let i={type:"array",items:o(r)};return e&&(i.minItems=e.value),t&&(i.maxItems=t.value),i},Bn=({items:e,_def:{rest:t}},{next:r})=>({type:"array",prefixItems:e.map(r),items:t===null?{not:{}}:r(t)}),qn=({isEmail:e,isURL:t,minLength:r,maxLength:o,isUUID:i,isCUID:s,isCUID2:a,isULID:p,isIP:c,isEmoji:d,isDatetime:l,_def:{checks:f}})=>{let u=f.find(R=>R.kind==="regex"),T=f.find(R=>R.kind==="datetime"),I=u?u.regex:T?T.offset?new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(([+-]\\d{2}:\\d{2})|Z)$"):new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?Z$"):void 0,b={type:"string"},E={"date-time":l,email:e,url:t,uuid:i,cuid:s,cuid2:a,ulid:p,ip:c,emoji:d};for(let R in E)if(E[R]){b.format=R;break}return r!==null&&(b.minLength=r),o!==null&&(b.maxLength=o),I&&(b.pattern=I.source),b},$n=({isInt:e,maxValue:t,minValue:r,_def:{checks:o}})=>{let i=o.find(f=>f.kind==="min"),s=r===null?e?Number.MIN_SAFE_INTEGER:-Number.MAX_VALUE:r,a=i?i.inclusive:!0,p=o.find(f=>f.kind==="max"),c=t===null?e?Number.MAX_SAFE_INTEGER:Number.MAX_VALUE:t,d=p?p.inclusive:!0,l={type:e?"integer":"number",format:e?"int64":"double"};return a?l.minimum=s:l.exclusiveMinimum=s,d?l.maximum=c:l.exclusiveMaximum=c,l},et=({shape:e},t)=>ue(t,e),Vn=e=>{let t=Array.isArray(e.type)?e.type[0]:e.type;return bn?.[t]},jr=e=>{let t=typeof e.type=="string"?[e.type]:e.type||[];return t.includes("null")?t:t.concat("null")},Gn=(e,{isResponse:t,next:r})=>{let o=r(e.innerType()),{effect:i}=e._def;if(t&&i.type==="transform"&&tt(o)){let s=Be(e,Vn(o));return s&&["number","string","boolean"].includes(s)?{type:s}:r(x.any())}if(!t&&i.type==="preprocess"&&tt(o)){let{type:s,...a}=o;return{...a,format:`${a.format||s} (preprocessed)`}}return o},_n=({_def:e},{isResponse:t,next:r})=>r(e[t?"out":"in"]),Yn=(e,{next:t})=>t(e.unwrap()),Qn=({schema:e},{next:t,serializer:r,getRef:o,makeRef:i})=>{let s=r(e);return o(s)||(i(s,{}),i(s,t(e)))},Jn=(e,{next:t})=>t(e.unwrap().shape.raw),Lr=e=>e.length?ke(hn(mn(1,e.length+1).map(t=>`example${t}`),ue(Ir("value"),e))):void 0,Nr=(e,t,r=[])=>Cr(H,ue(gn(o=>Pr(o)==="Object",rt(r))),Lr)({schema:e,variant:t?"parsed":"original",validate:!0}),Wn=(e,t)=>Cr(H,nn(sn(t)),ln(t),Lr)({schema:e,variant:"original",validate:!0}),ee=e=>e instanceof x.ZodObject?e:e instanceof x.ZodBranded?ee(e.unwrap()):e instanceof x.ZodUnion||e instanceof x.ZodDiscriminatedUnion?e.options.map(t=>ee(t)).reduce((t,r)=>t.merge(r.partial()),x.object({})):e instanceof x.ZodEffects?ee(e._def.schema):e instanceof x.ZodPipeline?ee(e._def.in):ee(e._def.left).merge(ee(e._def.right)),vr=({path:e,method:t,schema:r,inputSources:o,serializer:i,getRef:s,makeRef:a,composition:p,brandHandling:c,description:d=`${t.toUpperCase()} ${e} Parameter`})=>{let{shape:l}=ee(r),f=xn(e),u=o.includes("query"),T=o.includes("params"),I=o.includes("headers"),b=h=>T&&f.includes(h),E=h=>I&&mt(h);return Object.keys(l).map(h=>({name:h,location:b(h)?"path":E(h)?"header":u?"query":void 0})).filter(h=>h.location!==void 0).map(({name:h,location:ge})=>{let k=X(l[h],{rules:{...c,...It},onEach:Ct,onMissing:zt,ctx:{isResponse:!1,serializer:i,getRef:s,makeRef:a,path:e,method:t}}),$=p==="components"?a(w(d,h),k):k;return{name:h,in:ge,required:!l[h].isOptional(),description:k.description||d,schema:$,examples:Wn(r,h)}})},It={ZodString:qn,ZodNumber:$n,ZodBigInt:Hn,ZodBoolean:Un,ZodNull:Nn,ZodArray:Kn,ZodTuple:Bn,ZodRecord:Fn,ZodObject:Ln,ZodLiteral:jn,ZodIntersection:zn,ZodUnion:Pn,ZodAny:On,ZodDefault:Tn,ZodEnum:Ar,ZodNativeEnum:Ar,ZodEffects:Gn,ZodOptional:wn,ZodNullable:En,ZodDiscriminatedUnion:In,ZodBranded:Yn,ZodDate:Mn,ZodCatch:Sn,ZodPipeline:_n,ZodLazy:Qn,ZodReadonly:Zn,[D]:An,[Ae]:Rn,[ve]:kn,[Ne]:vn,[Q]:Jn},Ct=(e,{isResponse:t,prev:r})=>{if(Pt(r))return{};let{description:o}=e,i=e instanceof x.ZodLazy,s=r.type!==void 0,a=t&&Re(e),p=!i&&s&&!a&&e.isNullable(),c=i?[]:H({schema:e,variant:t?"parsed":"original",validate:!0}),d={};return o&&(d.description=o),p&&(d.type=jr(r)),c.length&&(d.examples=c.slice()),d},zt=(e,t)=>te.fail(new z({message:`Zod type ${e.constructor.name} is unsupported.`,...t})),At=(e,t)=>{if(Pt(e))return e;let r={...e};return r.properties&&(r.properties=rt(t,r.properties)),r.examples&&(r.examples=r.examples.map(o=>rt(t,o))),r.required&&(r.required=r.required.filter(o=>!t.includes(o))),r.allOf&&(r.allOf=r.allOf.map(o=>At(o,t))),r.oneOf&&(r.oneOf=r.oneOf.map(o=>At(o,t))),r},kr=e=>Pt(e)?e:rt(["examples"],e),Mr=({method:e,path:t,schema:r,mimeTypes:o,variant:i,serializer:s,getRef:a,makeRef:p,composition:c,hasMultipleStatusCodes:d,statusCode:l,brandHandling:f,description:u=`${e.toUpperCase()} ${t} ${yt(i)} response ${d?l:""}`.trim()})=>{let T=kr(X(r,{rules:{...f,...It},onEach:Ct,onMissing:zt,ctx:{isResponse:!0,serializer:s,getRef:a,makeRef:p,path:t,method:e}})),I={schema:c==="components"?p(w(u),T):T,examples:Nr(r,!0)};return{description:u,content:ke(ot(o,[I]))}},Xn=()=>({type:"http",scheme:"basic"}),ei=({format:e})=>{let t={type:"http",scheme:"bearer"};return e&&(t.bearerFormat=e),t},ti=({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},ri=({name:e})=>({type:"apiKey",in:"header",name:e}),oi=({name:e})=>({type:"apiKey",in:"cookie",name:e}),ni=({url:e})=>({type:"openIdConnect",openIdConnectUrl:e}),ii=({flows:e={}})=>({type:"oauth2",flows:ue(t=>({...t,scopes:t.scopes||{}}),un(an,e))}),Ur=(e,t)=>{let r={basic:Xn,bearer:ei,input:ti,header:ri,cookie:oi,openid:ni,oauth2:ii};return _e(e,o=>r[o.type](o,t))},nt=e=>"or"in e?e.or.map(t=>"and"in t?pn(ue(({name:r,scopes:o})=>Ir(r,o),t.and)):{[t.name]:t.scopes}):"and"in e?nt(bt(e)):nt({or:[e]}),Hr=({method:e,path:t,schema:r,mimeTypes:o,serializer:i,getRef:s,makeRef:a,composition:p,brandHandling:c,paramNames:d,description:l=`${e.toUpperCase()} ${t} Request body`})=>{let f=kr(At(X(r,{rules:{...c,...It},onEach:Ct,onMissing:zt,ctx:{isResponse:!1,serializer:i,getRef:s,makeRef:a,path:t,method:e}}),d)),u={schema:p==="components"?a(w(l),f):f,examples:Nr(r,!1,d)};return{description:l,content:ke(ot(o,[u]))}},Dr=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<=Rr?e:e.slice(0,Rr-1)+"\u2026";var Zt=class extends ai{lastSecuritySchemaIds=new Map;lastOperationIdSuffixes=new Map;makeRef(t,r){return this.addSchema(t,r),this.getRef(t)}getRef(t){return t in(this.rootDoc.components?.schemas||{})?{$ref:`#/components/schemas/${t}`}:void 0}ensureUniqOperationId(t,r,o){let i=o||w(r,t),s=this.lastOperationIdSuffixes.get(i);return s===void 0?(this.lastOperationIdSuffixes.set(i,1),i):(o&&si.fail(new z({message:`Duplicated operationId: "${o}"`,method:r,isResponse:!1,path:t})),s++,this.lastOperationIdSuffixes.set(i,s),`${i}${s}`)}ensureUniqSecuritySchemaName(t){let r=JSON.stringify(t);for(let i in this.rootDoc.components?.securitySchemes||{})if(r===JSON.stringify(this.rootDoc.components?.securitySchemes?.[i]))return i;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:i,serverUrl:s,descriptions:a,brandHandling:p,hasSummaryFromDescription:c=!0,composition:d="inline",serializer:l=Ke}){super(),this.addInfo({title:o,version:i});for(let u of typeof s=="string"?[s]:s)this.addServer({url:u});W({routing:t,onEndpoint:(u,T,I)=>{let b=I,E={path:T,method:b,endpoint:u,composition:d,serializer:l,brandHandling:p,getRef:this.getRef.bind(this),makeRef:this.makeRef.bind(this)},[R,h]=["short","long"].map(u.getDescription.bind(u)),ge=R?wt(R):c&&h?wt(h):void 0,k=u.getTags(),$=r.inputSources?.[b]||dt[b],oe=this.ensureUniqOperationId(T,b,u.getOperationId(b)),he=vr({...E,inputSources:$,schema:u.getSchema("input"),description:a?.requestParameter?.call(null,{method:b,path:T,operationId:oe})}),Ue={};for(let L of["positive","negative"]){let V=u.getResponses(L);for(let{mimeTypes:be,schema:S,statusCodes:O}of V)for(let A of O)Ue[A]=Mr({...E,variant:L,schema:S,mimeTypes:be,statusCode:A,hasMultipleStatusCodes:V.length>1||O.length>1,description:a?.[`${L}Response`]?.call(null,{method:b,path:T,operationId:oe,statusCode:A})})}let ct=$.includes("body")?Hr({...E,paramNames:pi("name",he),schema:u.getSchema("input"),mimeTypes:u.getMimeTypes("input"),description:a?.requestBody?.call(null,{method:b,path:T,operationId:oe})}):void 0,He=nt(_e(Ur(u.getSecurity(),$),L=>{let V=this.ensureUniqSecuritySchemaName(L),be=["oauth2","openIdConnect"].includes(L.type)?u.getScopes().slice():[];return this.addSecurityScheme(V,L),{name:V,scopes:be}}));this.addPath(Zr(T),{[b]:{operationId:oe,summary:ge,description:h,tags:k.length>0?k:void 0,parameters:he.length>0?he:void 0,requestBody:ct,security:He.length>0?He:void 0,responses:Ue}})}}),this.rootDoc.tags=r.tags?Dr(r.tags):[]}};import{createRequest as ci,createResponse as di}from"node-mocks-http";var li=e=>ci({...e,headers:{"content-type":P.json,...e?.headers}}),mi=e=>di(e),ui=e=>{let t={warn:[],error:[],info:[],debug:[]};return new Proxy(e||{},{get(r,o,i){return o==="_getLogs"?()=>t:o in le?(...s)=>t[o].push(s):Reflect.get(r,o,i)}})},fi=({requestProps:e,responseOptions:t,configProps:r,loggerProps:o})=>{let i=li(e),s=mi({req:i,...t}),a=ui(o),p={cors:!1,logger:a,...r};return{requestMock:i,responseMock:s,loggerMock:a,configMock:p}},yi=async({endpoint:e,...t})=>{let{requestMock:r,responseMock:o,loggerMock:i,configMock:s}=fi(t);return await e.execute({request:r,response:o,config:s,logger:i}),{requestMock:r,responseMock:o,loggerMock:i}};import Z from"typescript";import v from"typescript";import{chain as Fr,toPairs as Kr}from"ramda";var n=v.factory,K=[n.createModifier(v.SyntaxKind.ExportKeyword)],gi=[n.createModifier(v.SyntaxKind.AsyncKeyword)],hi=[n.createModifier(v.SyntaxKind.PublicKeyword),n.createModifier(v.SyntaxKind.ReadonlyKeyword)],Br=[n.createModifier(v.SyntaxKind.ProtectedKeyword),n.createModifier(v.SyntaxKind.ReadonlyKeyword)],Et=n.createTemplateHead(""),fe=n.createTemplateTail(""),jt=n.createTemplateMiddle(" "),Lt=e=>n.createTemplateLiteralType(Et,e.map((t,r)=>n.createTemplateLiteralTypeSpan(n.createTypeReferenceNode(t),r===e.length-1?fe:jt))),Nt=Lt(["M","P"]),it=(e,t,r)=>n.createParameterDeclaration(r,void 0,e,void 0,t,void 0),st=(e,t)=>Fr(([r,o])=>[it(n.createIdentifier(r),o,t)],Kr(e)),vt=(e,t)=>n.createExpressionWithTypeArguments(n.createIdentifier("Record"),[typeof e=="number"?n.createKeywordTypeNode(e):n.createTypeReferenceNode(e),n.createKeywordTypeNode(t)]),qr=e=>n.createConstructorDeclaration(void 0,e,n.createBlock([])),$r=(e,t)=>n.createPropertySignature(void 0,e,void 0,n.createTypeReferenceNode(t)),B=(e,t,r)=>n.createVariableDeclarationList([n.createVariableDeclaration(e,void 0,r,t)],v.NodeFlags.Const),kt=(e,t)=>n.createTypeAliasDeclaration(K,e,void 0,n.createUnionTypeNode(t.map(r=>n.createLiteralTypeNode(n.createStringLiteral(r))))),at=(e,t)=>n.createTypeAliasDeclaration(K,e,void 0,t),Vr=(e,t,r)=>n.createPropertyDeclaration(hi,e,void 0,t,r),Gr=(e,t,r)=>n.createClassDeclaration(K,e,void 0,void 0,[t,...r]),_r=(e,t)=>n.createTypeReferenceNode("Promise",[n.createIndexedAccessTypeNode(n.createTypeReferenceNode(e),t)]),Yr=()=>n.createTypeReferenceNode("Promise",[n.createKeywordTypeNode(v.SyntaxKind.AnyKeyword)]),Qr=(e,t,r)=>n.createInterfaceDeclaration(K,e,void 0,t,r),bi=Fr(([e,t])=>[n.createTypeParameterDeclaration([],e,n.createTypeReferenceNode(t))]),Jr=e=>bi(Kr(e)),Mt=(e,t,r)=>n.createArrowFunction(r?gi:void 0,void 0,e.map(o=>it(o)),void 0,void 0,t),Ut=(e,t,r)=>n.createCallExpression(n.createPropertyAccessExpression(n.createCallExpression(n.createPropertyAccessExpression(n.createIdentifier("Object"),"keys"),void 0,[e]),"reduce"),void 0,[n.createArrowFunction(void 0,void 0,st({acc:void 0,key:void 0}),void 0,void 0,t),r]),Wr=(...e)=>`"${e.join(" ")}"`;var Xr=["get","post","put","delete","patch"];import g from"typescript";import{z as Ft}from"zod";import q from"typescript";var{factory:pt}=q,Ht=(e,t)=>{q.addSyntheticLeadingComment(e,q.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0)},ye=(e,t,r)=>{let o=pt.createTypeAliasDeclaration(void 0,pt.createIdentifier(t),void 0,e);return r&&Ht(o,r),o},Dt=(e,t)=>{let r=q.createSourceFile("print.ts","",q.ScriptTarget.Latest,!1,q.ScriptKind.TS);return q.createPrinter(t).printNode(q.EmitHint.Unspecified,e,r)},xi=/^[A-Za-z_$][A-Za-z0-9_$]*$/,eo=e=>xi.test(e)?pt.createIdentifier(e):pt.createStringLiteral(e);var{factory:m}=g,Ti={[g.SyntaxKind.AnyKeyword]:"",[g.SyntaxKind.BigIntKeyword]:BigInt(0),[g.SyntaxKind.BooleanKeyword]:!1,[g.SyntaxKind.NumberKeyword]:0,[g.SyntaxKind.ObjectKeyword]:{},[g.SyntaxKind.StringKeyword]:"",[g.SyntaxKind.UndefinedKeyword]:void 0},Si=({value:e})=>m.createLiteralTypeNode(typeof e=="number"?m.createNumericLiteral(e):typeof e=="boolean"?e?m.createTrue():m.createFalse():m.createStringLiteral(e)),Oi=({shape:e},{isResponse:t,next:r,optionalPropStyle:{withQuestionMark:o}})=>{let i=Object.entries(e).map(([s,a])=>{let p=t&&Re(a)?a instanceof Ft.ZodOptional:a.isOptional(),c=m.createPropertySignature(void 0,eo(s),p&&o?m.createToken(g.SyntaxKind.QuestionToken):void 0,r(a));return a.description&&Ht(c,a.description),c});return m.createTypeLiteralNode(i)},Ri=({element:e},{next:t})=>m.createArrayTypeNode(t(e)),Ai=({options:e})=>m.createUnionTypeNode(e.map(t=>m.createLiteralTypeNode(m.createStringLiteral(t)))),to=({options:e},{next:t})=>m.createUnionTypeNode(e.map(t)),Pi=e=>Ti?.[e.kind],Ii=(e,{next:t,isResponse:r})=>{let o=t(e.innerType());if(r&&e._def.effect.type==="transform"){let i=Be(e,Pi(o)),s={number:g.SyntaxKind.NumberKeyword,bigint:g.SyntaxKind.BigIntKeyword,boolean:g.SyntaxKind.BooleanKeyword,string:g.SyntaxKind.StringKeyword,undefined:g.SyntaxKind.UndefinedKeyword,object:g.SyntaxKind.ObjectKeyword};return m.createKeywordTypeNode(i&&s[i]||g.SyntaxKind.AnyKeyword)}return o},Ci=e=>m.createUnionTypeNode(Object.values(e.enum).map(t=>m.createLiteralTypeNode(typeof t=="number"?m.createNumericLiteral(t):m.createStringLiteral(t)))),zi=(e,{next:t,optionalPropStyle:{withUndefined:r}})=>{let o=t(e.unwrap());return r?m.createUnionTypeNode([o,m.createKeywordTypeNode(g.SyntaxKind.UndefinedKeyword)]):o},wi=(e,{next:t})=>m.createUnionTypeNode([t(e.unwrap()),m.createLiteralTypeNode(m.createNull())]),Zi=({items:e,_def:{rest:t}},{next:r})=>m.createTupleTypeNode(e.map(r).concat(t===null?[]:m.createRestTypeNode(r(t)))),Ei=({keySchema:e,valueSchema:t},{next:r})=>m.createExpressionWithTypeArguments(m.createIdentifier("Record"),[e,t].map(r)),ji=({_def:e},{next:t})=>m.createIntersectionTypeNode([e.left,e.right].map(t)),Li=({_def:e},{next:t})=>t(e.innerType),re=e=>()=>m.createKeywordTypeNode(e),Ni=(e,{next:t})=>t(e.unwrap()),vi=(e,{next:t})=>t(e.unwrap()),ki=({_def:e},{next:t})=>t(e.innerType),Mi=({_def:e},{next:t,isResponse:r})=>t(e[r?"out":"in"]),Ui=()=>m.createLiteralTypeNode(m.createNull()),Hi=({schema:e},{getAlias:t,makeAlias:r,next:o,serializer:i})=>{let s=`Type${i(e)}`;return t(s)||(r(s,m.createLiteralTypeNode(m.createNull())),r(s,o(e)))},Di=e=>{let t=e.unwrap(),r=m.createKeywordTypeNode(g.SyntaxKind.StringKeyword),o=m.createTypeReferenceNode("Buffer"),i=m.createUnionTypeNode([r,o]);return t instanceof Ft.ZodString?r:t instanceof Ft.ZodUnion?i:o},Fi=(e,{next:t})=>t(e.unwrap().shape.raw),Ki={ZodString:re(g.SyntaxKind.StringKeyword),ZodNumber:re(g.SyntaxKind.NumberKeyword),ZodBigInt:re(g.SyntaxKind.BigIntKeyword),ZodBoolean:re(g.SyntaxKind.BooleanKeyword),ZodAny:re(g.SyntaxKind.AnyKeyword),[Ne]:re(g.SyntaxKind.StringKeyword),[ve]:re(g.SyntaxKind.StringKeyword),ZodNull:Ui,ZodArray:Ri,ZodTuple:Zi,ZodRecord:Ei,ZodObject:Oi,ZodLiteral:Si,ZodIntersection:ji,ZodUnion:to,ZodDefault:Li,ZodEnum:Ai,ZodNativeEnum:Ci,ZodEffects:Ii,ZodOptional:zi,ZodNullable:wi,ZodDiscriminatedUnion:to,ZodBranded:Ni,ZodCatch:ki,ZodPipeline:Mi,ZodLazy:Hi,ZodReadonly:vi,[D]:Di,[Q]:Fi},Me=(e,{brandHandling:t,ctx:r})=>X(e,{rules:{...t,...Ki},onMissing:()=>m.createKeywordTypeNode(g.SyntaxKind.AnyKeyword),ctx:r});var Kt=class{program=[];usage=[];registry=new Map;paths=[];aliases=new Map;ids={pathType:n.createIdentifier("Path"),methodType:n.createIdentifier("Method"),methodPathType:n.createIdentifier("MethodPath"),inputInterface:n.createIdentifier("Input"),posResponseInterface:n.createIdentifier("PositiveResponse"),negResponseInterface:n.createIdentifier("NegativeResponse"),responseInterface:n.createIdentifier("Response"),jsonEndpointsConst:n.createIdentifier("jsonEndpoints"),endpointTagsConst:n.createIdentifier("endpointTags"),providerType:n.createIdentifier("Provider"),implementationType:n.createIdentifier("Implementation"),clientClass:n.createIdentifier("ExpressZodAPIClient"),keyParameter:n.createIdentifier("key"),pathParameter:n.createIdentifier("path"),paramsArgument:n.createIdentifier("params"),methodParameter:n.createIdentifier("method"),accumulator:n.createIdentifier("acc"),provideMethod:n.createIdentifier("provide"),implementationArgument:n.createIdentifier("implementation"),headersProperty:n.createIdentifier("headers"),hasBodyConst:n.createIdentifier("hasBody"),undefinedValue:n.createIdentifier("undefined"),bodyProperty:n.createIdentifier("body"),responseConst:n.createIdentifier("response"),searchParamsConst:n.createIdentifier("searchParams"),exampleImplementationConst:n.createIdentifier("exampleImplementation"),clientConst:n.createIdentifier("client")};interfaces=[];getAlias(t){return this.aliases.has(t)?n.createTypeReferenceNode(t):void 0}makeAlias(t,r){return this.aliases.set(t,ye(r,t)),this.getAlias(t)}constructor({routing:t,brandHandling:r,variant:o="client",serializer:i=Ke,splitResponse:s=!1,optionalPropStyle:a={withQuestionMark:!0,withUndefined:!0}}){W({routing:t,onEndpoint:(S,O,A)=>{let ne={serializer:i,getAlias:this.getAlias.bind(this),makeAlias:this.makeAlias.bind(this),optionalPropStyle:a},xe=w(A,O,"input"),Te=Me(S.getSchema("input"),{brandHandling:r,ctx:{...ne,isResponse:!1}}),C=s?w(A,O,"positive.response"):void 0,Bt=S.getSchema("positive"),qt=s?Me(Bt,{brandHandling:r,ctx:{...ne,isResponse:!0}}):void 0,Se=s?w(A,O,"negative.response"):void 0,$t=S.getSchema("negative"),Vt=s?Me($t,{brandHandling:r,ctx:{...ne,isResponse:!0}}):void 0,Gt=w(A,O,"response"),ro=C&&Se?n.createUnionTypeNode([n.createTypeReferenceNode(C),n.createTypeReferenceNode(Se)]):Me(Bt.or($t),{brandHandling:r,ctx:{...ne,isResponse:!0}});this.program.push(ye(Te,xe)),qt&&C&&this.program.push(ye(qt,C)),Vt&&Se&&this.program.push(ye(Vt,Se)),this.program.push(ye(ro,Gt)),A!=="options"&&(this.paths.push(O),this.registry.set({method:A,path:O},{input:xe,positive:C,negative:Se,response:Gt,isJson:S.getMimeTypes("positive").includes(P.json),tags:S.getTags()}))}}),this.program.unshift(...this.aliases.values()),this.program.push(kt(this.ids.pathType,this.paths)),this.program.push(kt(this.ids.methodType,Xr)),this.program.push(at(this.ids.methodPathType,Lt([this.ids.methodType,this.ids.pathType])));let p=[n.createHeritageClause(Z.SyntaxKind.ExtendsKeyword,[vt(this.ids.methodPathType,Z.SyntaxKind.AnyKeyword)])];this.interfaces.push({id:this.ids.inputInterface,kind:"input",props:[]}),s&&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 c=[],d=[];for(let[{method:S,path:O},{isJson:A,tags:ne,...xe}]of this.registry){let Te=Wr(S,O);for(let C of this.interfaces)C.kind in xe&&C.props.push($r(Te,xe[C.kind]));o!=="types"&&(A&&c.push(n.createPropertyAssignment(Te,n.createTrue())),d.push(n.createPropertyAssignment(Te,n.createArrayLiteralExpression(ne.map(C=>n.createStringLiteral(C))))))}for(let{id:S,props:O}of this.interfaces)this.program.push(Qr(S,p,O));if(o==="types")return;let l=n.createVariableStatement(K,B(this.ids.jsonEndpointsConst,n.createObjectLiteralExpression(c))),f=n.createVariableStatement(K,B(this.ids.endpointTagsConst,n.createObjectLiteralExpression(d))),u=at(this.ids.providerType,n.createFunctionTypeNode(Jr({M:this.ids.methodType,P:this.ids.pathType}),st({method:n.createTypeReferenceNode("M"),path:n.createTypeReferenceNode("P"),params:n.createIndexedAccessTypeNode(n.createTypeReferenceNode(this.ids.inputInterface),Nt)}),_r(this.ids.responseInterface,Nt))),T=at(this.ids.implementationType,n.createFunctionTypeNode(void 0,st({method:n.createTypeReferenceNode(this.ids.methodType),path:n.createKeywordTypeNode(Z.SyntaxKind.StringKeyword),params:vt(Z.SyntaxKind.StringKeyword,Z.SyntaxKind.AnyKeyword)}),Yr())),I=n.createTemplateExpression(n.createTemplateHead(":"),[n.createTemplateSpan(this.ids.keyParameter,fe)]),b=Ut(this.ids.paramsArgument,n.createCallExpression(n.createPropertyAccessExpression(this.ids.accumulator,"replace"),void 0,[I,n.createElementAccessExpression(this.ids.paramsArgument,this.ids.keyParameter)]),this.ids.pathParameter),E=Ut(this.ids.paramsArgument,n.createConditionalExpression(n.createBinaryExpression(n.createCallExpression(n.createPropertyAccessExpression(this.ids.pathParameter,"indexOf"),void 0,[I]),Z.SyntaxKind.GreaterThanEqualsToken,n.createNumericLiteral(0)),void 0,this.ids.accumulator,void 0,n.createObjectLiteralExpression([n.createSpreadAssignment(this.ids.accumulator),n.createPropertyAssignment(n.createComputedPropertyName(this.ids.keyParameter),n.createElementAccessExpression(this.ids.paramsArgument,this.ids.keyParameter))])),n.createObjectLiteralExpression()),R=Gr(this.ids.clientClass,qr([it(this.ids.implementationArgument,n.createTypeReferenceNode(this.ids.implementationType),Br)]),[Vr(this.ids.provideMethod,n.createTypeReferenceNode(this.ids.providerType),Mt([this.ids.methodParameter,this.ids.pathParameter,this.ids.paramsArgument],n.createCallExpression(n.createPropertyAccessExpression(n.createThis(),this.ids.implementationArgument),void 0,[this.ids.methodParameter,b,E]),!0))]);this.program.push(l,f,u,T,R);let h=n.createPropertyAssignment(this.ids.methodParameter,n.createCallExpression(n.createPropertyAccessExpression(this.ids.methodParameter,"toUpperCase"),void 0,void 0)),ge=n.createPropertyAssignment(this.ids.headersProperty,n.createConditionalExpression(this.ids.hasBodyConst,void 0,n.createObjectLiteralExpression([n.createPropertyAssignment(n.createStringLiteral("Content-Type"),n.createStringLiteral(P.json))]),void 0,this.ids.undefinedValue)),k=n.createPropertyAssignment(this.ids.bodyProperty,n.createConditionalExpression(this.ids.hasBodyConst,void 0,n.createCallExpression(n.createPropertyAccessExpression(n.createIdentifier("JSON"),"stringify"),void 0,[this.ids.paramsArgument]),void 0,this.ids.undefinedValue)),$=n.createVariableStatement(void 0,B(this.ids.responseConst,n.createAwaitExpression(n.createCallExpression(n.createIdentifier("fetch"),void 0,[n.createTemplateExpression(n.createTemplateHead("https://example.com"),[n.createTemplateSpan(this.ids.pathParameter,n.createTemplateMiddle("")),n.createTemplateSpan(this.ids.searchParamsConst,fe)]),n.createObjectLiteralExpression([h,ge,k])])))),oe=n.createVariableStatement(void 0,B(this.ids.hasBodyConst,n.createLogicalNot(n.createCallExpression(n.createPropertyAccessExpression(n.createArrayLiteralExpression([n.createStringLiteral("get"),n.createStringLiteral("delete")]),"includes"),void 0,[this.ids.methodParameter])))),he=n.createVariableStatement(void 0,B(this.ids.searchParamsConst,n.createConditionalExpression(this.ids.hasBodyConst,void 0,n.createStringLiteral(""),void 0,n.createTemplateExpression(n.createTemplateHead("?"),[n.createTemplateSpan(n.createNewExpression(n.createIdentifier("URLSearchParams"),void 0,[this.ids.paramsArgument]),fe)])))),[Ue,ct]=["json","text"].map(S=>n.createReturnStatement(n.createCallExpression(n.createPropertyAccessExpression(this.ids.responseConst,S),void 0,void 0))),He=n.createIfStatement(n.createBinaryExpression(n.createTemplateExpression(Et,[n.createTemplateSpan(this.ids.methodParameter,jt),n.createTemplateSpan(this.ids.pathParameter,fe)]),Z.SyntaxKind.InKeyword,this.ids.jsonEndpointsConst),n.createBlock([Ue])),L=n.createVariableStatement(K,B(this.ids.exampleImplementationConst,Mt([this.ids.methodParameter,this.ids.pathParameter,this.ids.paramsArgument],n.createBlock([oe,he,$,He,ct]),!0),n.createTypeReferenceNode(this.ids.implementationType))),V=n.createExpressionStatement(n.createCallExpression(n.createPropertyAccessExpression(this.ids.clientConst,this.ids.provideMethod),void 0,[n.createStringLiteral("get"),n.createStringLiteral("/v1/user/retrieve"),n.createObjectLiteralExpression([n.createPropertyAssignment("id",n.createStringLiteral("10"))])])),be=n.createVariableStatement(void 0,B(this.ids.clientConst,n.createNewExpression(this.ids.clientClass,void 0,[this.ids.exampleImplementationConst])));this.usage.push(L,be,V)}printUsage(t){return this.usage.length?this.usage.map(r=>typeof r=="string"?r:Dt(r,t)).join(`
|
|
21
21
|
`):void 0}print(t){let r=this.printUsage(t),o=r&&Z.addSyntheticLeadingComment(Z.addSyntheticLeadingComment(n.createEmptyStatement(),Z.SyntaxKind.SingleLineCommentTrivia," Usage example:"),Z.SyntaxKind.MultiLineCommentTrivia,`
|
|
22
22
|
${r}`);return this.program.concat(o||[]).map((i,s)=>Dt(i,s<this.program.length?t:{...t,omitTrailingSemicolon:!0})).join(`
|
|
23
23
|
|
package/migration/index.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var p=Object.defineProperty;var
|
|
1
|
+
"use strict";var p=Object.defineProperty;var d=Object.getOwnPropertyDescriptor;var m=Object.getOwnPropertyNames;var u=Object.prototype.hasOwnProperty;var y=(s,t)=>{for(var e in t)p(s,e,{get:t[e],enumerable:!0})},g=(s,t,e,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of m(t))!u.call(s,i)&&i!==e&&p(s,i,{get:()=>t[i],enumerable:!(r=d(t,i))||r.enumerable});return s};var f=s=>g(p({},"__esModule",{value:!0}),s);var w={};y(w,{default:()=>k});module.exports=f(w);var c=require("@typescript-eslint/utils");var l="express-zod-api";var h="testEndpoint",a={createLogger:"BuiltinLogger",createResultHandler:"ResultHandler",createMiddleware:"Middleware"},o={getPositiveResponse:"positive",getNegativeResponse:"negative",responseProps:"responseOptions",middleware:"handler"},b={fnMethod:null},n=(s,t)=>typeof s=="string"&&s in t,v=c.ESLintUtils.RuleCreator.withoutDocs({meta:{type:"problem",fixable:"code",schema:[],messages:{change:"Change {{subject}} {{from}} to {{to}}.",remove:"Remove {{subject}} {{name}}."}},defaultOptions:[],create:s=>({ImportDeclaration:t=>{if(t.source.value===l){for(let e of t.specifiers)if(e.type==="ImportSpecifier"&&n(e.imported.name,a)){let r=a[e.imported.name];s.report({node:e.imported,messageId:"change",data:{subject:"import",from:e.imported.name,to:r},fix:i=>i.replaceText(e,r)})}}},CallExpression:t=>{if(t.callee.type==="Identifier"&&n(t.callee.name,a)){let e=`new ${a[t.callee.name]}`;s.report({node:t.callee,messageId:"change",data:{subject:"call",from:t.callee.name,to:e},fix:r=>r.replaceText(t.callee,e)})}if(t.callee.type==="Identifier"&&t.callee.name===h&&t.arguments.length===1&&t.arguments[0].type==="ObjectExpression"){for(let e of t.arguments[0].properties)if(e.type==="Property"&&e.key.type==="Identifier"){if(n(e.key.name,o)){let r=o[e.key.name];s.report({node:e,messageId:"change",data:{subject:"property",from:e.key.name,to:r},fix:i=>i.replaceText(e.key,r)})}n(e.key.name,b)&&s.report({node:e,messageId:"remove",data:{subject:"property",name:e.key.name},fix:r=>s.sourceCode.getTokenAfter(e)?.value===","&&e.range?r.removeRange([e.range[0],e.range[1]+1]):r.remove(e)})}}},NewExpression:t=>{if(t.callee.type==="Identifier"&&[a.createResultHandler,a.createMiddleware].includes(t.callee.name)&&t.arguments.length===1&&t.arguments[0].type==="ObjectExpression"){for(let e of t.arguments[0].properties)if(e.type==="Property"&&e.key.type==="Identifier"&&n(e.key.name,o)){let r=o[e.key.name];s.report({node:e,messageId:"change",data:{subject:"property",from:e.key.name,to:r},fix:i=>i.replaceText(e.key,r)})}}},Identifier:t=>{t.name==="MockOverrides"&&`${t.parent.type}`=="TSInterfaceDeclaration"&&s.report({node:t,messageId:"remove",data:{subject:"augmentation",name:t.name},fix:e=>e.remove(t.parent)})}})}),k={rules:{v20:v}};
|
package/migration/index.d.cts
CHANGED
|
@@ -1,24 +1,20 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ESLintUtils } from '@typescript-eslint/utils';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
* @desc ESLint
|
|
4
|
+
* @desc ESLint plugin for migrating to this version (from previous), requires eslint v9 and typescript-eslint v8
|
|
5
5
|
* @deprecated Single-use tool that can be removed and changed regardless SemVer. Remember to delete it after use.
|
|
6
6
|
* @example
|
|
7
7
|
* // eslint.config.mjs:
|
|
8
8
|
* import parser from "@typescript-eslint/parser";
|
|
9
9
|
* import migration from "express-zod-api/migration";
|
|
10
|
-
* export default [
|
|
10
|
+
* export default [
|
|
11
|
+
* { languageOptions: {parser}, plugins: {migration} },
|
|
12
|
+
* { files: ["**\/*.ts"], rules: { "migration/v20": "error" } }
|
|
13
|
+
* ];
|
|
11
14
|
* */
|
|
12
15
|
declare const _default: {
|
|
13
16
|
rules: {
|
|
14
|
-
|
|
15
|
-
};
|
|
16
|
-
plugins: {
|
|
17
|
-
"ez-migration": {
|
|
18
|
-
rules: {
|
|
19
|
-
v20: Rule.RuleModule;
|
|
20
|
-
};
|
|
21
|
-
};
|
|
17
|
+
v20: ESLintUtils.RuleModule<"change" | "remove", [], unknown, ESLintUtils.RuleListener>;
|
|
22
18
|
};
|
|
23
19
|
};
|
|
24
20
|
|
package/migration/index.d.ts
CHANGED
|
@@ -1,24 +1,20 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ESLintUtils } from '@typescript-eslint/utils';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
* @desc ESLint
|
|
4
|
+
* @desc ESLint plugin for migrating to this version (from previous), requires eslint v9 and typescript-eslint v8
|
|
5
5
|
* @deprecated Single-use tool that can be removed and changed regardless SemVer. Remember to delete it after use.
|
|
6
6
|
* @example
|
|
7
7
|
* // eslint.config.mjs:
|
|
8
8
|
* import parser from "@typescript-eslint/parser";
|
|
9
9
|
* import migration from "express-zod-api/migration";
|
|
10
|
-
* export default [
|
|
10
|
+
* export default [
|
|
11
|
+
* { languageOptions: {parser}, plugins: {migration} },
|
|
12
|
+
* { files: ["**\/*.ts"], rules: { "migration/v20": "error" } }
|
|
13
|
+
* ];
|
|
11
14
|
* */
|
|
12
15
|
declare const _default: {
|
|
13
16
|
rules: {
|
|
14
|
-
|
|
15
|
-
};
|
|
16
|
-
plugins: {
|
|
17
|
-
"ez-migration": {
|
|
18
|
-
rules: {
|
|
19
|
-
v20: Rule.RuleModule;
|
|
20
|
-
};
|
|
21
|
-
};
|
|
17
|
+
v20: ESLintUtils.RuleModule<"change" | "remove", [], unknown, ESLintUtils.RuleListener>;
|
|
22
18
|
};
|
|
23
19
|
};
|
|
24
20
|
|
package/migration/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
import{ESLintUtils as c}from"@typescript-eslint/utils";var p="express-zod-api";var d="testEndpoint",i={createLogger:"BuiltinLogger",createResultHandler:"ResultHandler",createMiddleware:"Middleware"},o={getPositiveResponse:"positive",getNegativeResponse:"negative",responseProps:"responseOptions",middleware:"handler"},m={fnMethod:null},n=(r,t)=>typeof r=="string"&&r in t,u=c.RuleCreator.withoutDocs({meta:{type:"problem",fixable:"code",schema:[],messages:{change:"Change {{subject}} {{from}} to {{to}}.",remove:"Remove {{subject}} {{name}}."}},defaultOptions:[],create:r=>({ImportDeclaration:t=>{if(t.source.value===p){for(let e of t.specifiers)if(e.type==="ImportSpecifier"&&n(e.imported.name,i)){let s=i[e.imported.name];r.report({node:e.imported,messageId:"change",data:{subject:"import",from:e.imported.name,to:s},fix:a=>a.replaceText(e,s)})}}},CallExpression:t=>{if(t.callee.type==="Identifier"&&n(t.callee.name,i)){let e=`new ${i[t.callee.name]}`;r.report({node:t.callee,messageId:"change",data:{subject:"call",from:t.callee.name,to:e},fix:s=>s.replaceText(t.callee,e)})}if(t.callee.type==="Identifier"&&t.callee.name===d&&t.arguments.length===1&&t.arguments[0].type==="ObjectExpression"){for(let e of t.arguments[0].properties)if(e.type==="Property"&&e.key.type==="Identifier"){if(n(e.key.name,o)){let s=o[e.key.name];r.report({node:e,messageId:"change",data:{subject:"property",from:e.key.name,to:s},fix:a=>a.replaceText(e.key,s)})}n(e.key.name,m)&&r.report({node:e,messageId:"remove",data:{subject:"property",name:e.key.name},fix:s=>r.sourceCode.getTokenAfter(e)?.value===","&&e.range?s.removeRange([e.range[0],e.range[1]+1]):s.remove(e)})}}},NewExpression:t=>{if(t.callee.type==="Identifier"&&[i.createResultHandler,i.createMiddleware].includes(t.callee.name)&&t.arguments.length===1&&t.arguments[0].type==="ObjectExpression"){for(let e of t.arguments[0].properties)if(e.type==="Property"&&e.key.type==="Identifier"&&n(e.key.name,o)){let s=o[e.key.name];r.report({node:e,messageId:"change",data:{subject:"property",from:e.key.name,to:s},fix:a=>a.replaceText(e.key,s)})}}},Identifier:t=>{t.name==="MockOverrides"&&`${t.parent.type}`=="TSInterfaceDeclaration"&&r.report({node:t,messageId:"remove",data:{subject:"augmentation",name:t.name},fix:e=>e.remove(t.parent)})}})}),x={rules:{v20:u}};export{x as default};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "express-zod-api",
|
|
3
|
-
"version": "20.
|
|
3
|
+
"version": "20.7.0",
|
|
4
4
|
"description": "A Typescript library to help you get an API server up and running with I/O schema validation and custom middlewares in minutes.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -116,6 +116,7 @@
|
|
|
116
116
|
},
|
|
117
117
|
"devDependencies": {
|
|
118
118
|
"@arethetypeswrong/cli": "^0.15.0",
|
|
119
|
+
"@eslint/eslintrc": "^3",
|
|
119
120
|
"@tsconfig/node18": "^18.2.1",
|
|
120
121
|
"@types/compression": "^1.7.5",
|
|
121
122
|
"@types/cors": "^2.8.14",
|
|
@@ -128,14 +129,14 @@
|
|
|
128
129
|
"@types/semver": "^7.5.8",
|
|
129
130
|
"@types/swagger-ui-express": "^4.1.6",
|
|
130
131
|
"@types/triple-beam": "^1.3.2",
|
|
132
|
+
"@typescript-eslint/rule-tester": "^8.0.1",
|
|
131
133
|
"@vitest/coverage-istanbul": "^2.0.3",
|
|
132
134
|
"camelize-ts": "^3.0.0",
|
|
133
135
|
"compression": "^1.7.4",
|
|
134
136
|
"cors": "^2.8.5",
|
|
135
137
|
"eslint": "^9.3.0",
|
|
136
138
|
"eslint-config-prettier": "^9.1.0",
|
|
137
|
-
"eslint-
|
|
138
|
-
"eslint-plugin-import": "npm:eslint-plugin-import-x@^3.1.0",
|
|
139
|
+
"eslint-plugin-allowed-dependencies": "^0.5.0",
|
|
139
140
|
"eslint-plugin-prettier": "^5.1.3",
|
|
140
141
|
"eslint-plugin-unicorn": "^55.0.0",
|
|
141
142
|
"express": "^4.19.2",
|
|
@@ -156,9 +157,6 @@
|
|
|
156
157
|
"vitest": "^2.0.3",
|
|
157
158
|
"zod": "^3.23.0"
|
|
158
159
|
},
|
|
159
|
-
"resolutions": {
|
|
160
|
-
"**/@typescript-eslint/utils": "^8.0.0"
|
|
161
|
-
},
|
|
162
160
|
"keywords": [
|
|
163
161
|
"nodejs",
|
|
164
162
|
"api",
|