express-zod-api 29.8.2 → 30.0.0-beta.1
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 +58 -0
- package/README.md +21 -53
- package/SECURITY.md +1 -0
- package/dist/documentation-helpers-Df2sKJq9.js +1 -0
- package/dist/documentation.d.ts +12 -16
- package/dist/documentation.js +1 -1
- package/dist/{errors-Dbnie2Mk.d.ts → errors-masq5u05.d.ts} +6 -20
- package/dist/index.d.ts +179 -397
- package/dist/index.js +3 -3
- package/dist/integration.d.ts +8 -21
- package/dist/integration.js +8 -9
- package/dist/{peer-helpers-BguVeFhx.js → peer-helpers-CURhdLch.js} +1 -1
- package/dist/{routing-oAHiW3zy.d.ts → routing-BE8APxgy.d.ts} +74 -168
- package/dist/routing-walker-BpLERmiE.js +1 -0
- package/package.json +5 -5
- package/dist/documentation-helpers-C5Tkir01.js +0 -1
- package/dist/routing-walker-CelPngqp.js +0 -1
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import{A as e,B as t,C as n,D as r,E as i,H as a,K as o,L as s,M as c,O as l,P as u,T as d,U as f,V as p,Z as m,_ as ee,a as te,c as h,d as ne,f as g,g as _,h as v,k as re,l as y,m as b,nt as x,o as ie,p as ae,s as S,t as oe,tt as C,u as w,v as T,w as se,x as ce,z as le}from"./routing-walker-CelPngqp.js";import{t as E}from"./peer-helpers-BguVeFhx.js";import{h as ue,l as de,m as fe,p as pe}from"./documentation-helpers-C5Tkir01.js";import{globalRegistry as D,z as O}from"zod";import*as me from"ramda";import k,{isHttpError as he}from"http-errors";import ge,{blue as _e,cyanBright as ve,green as ye,hex as A,italic as be,red as xe,whiteBright as j}from"ansis";import{inspect as Se}from"node:util";import{performance as M}from"node:perf_hooks";import N from"express";import Ce from"node:http";import we from"node:https";import{setInterval as Te}from"node:timers/promises";import{createRequest as Ee,createResponse as De}from"node-mocks-http";function Oe(e){return e}const ke=(e,t)=>e&&t?e.and(t):e||t,Ae=(e,t)=>e?e.and(t):t;var je=class e{#e;constructor(e){this.#e=e}async execute(...n){try{return await this.#e(...n)}catch(r){let{response:i,logger:a,error:o}=n[0],s=new l(t(r),o||void 0);e.lastResort({response:i,logger:a,error:s})}}static lastResort({error:e,logger:t,response:n}){t.error(`Result handler failure`,e);let r=h(k(500,`An error occurred while serving the result: ${e.message}.`+(e.handled?`\nOriginal error: ${e.handled.message}.`:``),{expose:he(e.cause)?e.cause.expose:!1}));n.status(500).type(`text/plain`).end(r)}},P=class extends je{#e;#t;constructor(e){super(e.handler),this.#e=e.positive,this.#t=e.negative}getPositiveResponse(e){return w(this.#e,{variant:`positive`,args:[e]})}getNegativeResponse(){return w(this.#t,{variant:`negative`,args:[]})}};const F=O.object({status:O.literal(`error`),error:O.object({message:O.string()})});D.add(F,{examples:[{status:`error`,error:{message:`Sample error message`}}]});const I=new P({positive:e=>{let t=O.object({status:O.literal(`success`),data:e}),n=s(e);return n.length&&D.add(t,{examples:n.map(e=>({status:`success`,data:e}))}),t},negative:F,handler:({error:e,input:t,output:n,request:r,response:i,logger:a})=>{if(e){let n=S(e);y(n,a,r,t),i.status(n.statusCode).set(n.headers).json({status:`error`,error:{message:h(n)}});return}i.status(g.positive).json({status:`success`,data:n})}}),L=O.string();D.add(L,{examples:[`Sample error message`]});const R=new P({positive:e=>{let t=e instanceof O.ZodObject&&`items`in e.shape&&e.shape.items instanceof O.ZodArray?e.shape.items:O.array(O.any());if(s(t).length)return t;let n=s(e).filter(e=>o(e)&&`items`in e&&Array.isArray(e.items)).map(e=>e.items);if(n?.length){let e=t.meta();D.remove(t).add(t,{...e,examples:n})}return t},negative:{schema:L,mimeType:`text/plain`},handler:({response:e,output:t,error:n,logger:r,request:i,input:a})=>{if(n){let t=S(n);y(t,r,i,a),e.status(t.statusCode).type(`text/plain`).send(h(t));return}if(`items`in t&&Array.isArray(t.items)){e.status(g.positive).json(t.items);return}throw Error(`Property 'items' is missing in the endpoint output`)}}),z=e=>{let t=[];return e.scope&&t.push(e.scope),e.noStore&&t.push(`no-store`),e.noCache&&t.push(`no-cache`),e.maxAge!==void 0&&t.push(`max-age=${e.maxAge}`),e.sMaxAge!==void 0&&t.push(`s-maxage=${e.sMaxAge}`),e.mustRevalidate&&t.push(`must-revalidate`),e.proxyRevalidate&&t.push(`proxy-revalidate`),e.mustUnderstand&&t.push(`must-understand`),e.immutable&&t.push(`immutable`),e.noTransform&&t.push(`no-transform`),e.staleWhileRevalidate!==void 0&&t.push(`stale-while-revalidate=${e.staleWhileRevalidate}`),e.staleIfError!==void 0&&t.push(`stale-if-error=${e.staleIfError}`),t.join(`, `)},Me={"max-age":`maxAge`,"max-stale":`maxStale`,"min-fresh":`minFresh`,"stale-if-error":`staleIfError`},Ne={"no-cache":`noCache`,"no-store":`noStore`,"no-transform":`noTransform`,"only-if-cached":`onlyIfCached`},Pe=e=>{if(!e)return;let t={};for(let n of e.toLowerCase().split(`,`)){let[e,r]=n.split(`=`),i=Me[e.trim()];if(i){let e=parseInt(r?.trim()??``,10);isNaN(e)||(t[i]=e);continue}let a=Ne[e.trim()];a&&(t[a]=!0)}return t},B=e=>new v({handler:async({request:t,response:n})=>(e&&n.setHeader(`Cache-Control`,z(e)),{get ifNoneMatch(){let e=t.headers[`if-none-match`];if(!e)return;let n=e.trim();return n===`*`?n:n.split(`,`).map(e=>e.trim().replace(/^(?:W\/)?"/,``).replace(/"$/,``))},get ifModifiedSince(){let e=t.headers[`if-modified-since`];if(!e)return;let n=new Date(e);return isNaN(n.getTime())?void 0:n},get cacheControl(){return Pe(t.headers[`cache-control`])},addCachePolicy:t=>{n.setHeader(`Cache-Control`,z({...e,...t}))},setETag:e=>{n.setHeader(`ETag`,e.startsWith(`"`)?e:`"${e}"`)},setLastModified:e=>{n.setHeader(`Last-Modified`,e.toUTCString())},setVary:(...e)=>{n.setHeader(`Vary`,e.join(`, `))},setExpires:e=>{n.setHeader(`Expires`,e.toUTCString())},clearSiteData:()=>{n.setHeader(`Clear-Site-Data`,`"cache"`)},notModified:()=>{n.status(304).end()}})}),V=e=>new v({handler:async({request:t,response:n})=>({getCookie:e=>t.signedCookies?.[e]??t.cookies?.[e],setCookie:(t,r,i)=>{n.cookie(t,r,{...e,...i})},clearCookie:(t,r)=>{n.clearCookie(t,{...e,...r})}})}),H=e=>{let t=E(`express-rate-limit`)({statusCode:429,...e,handler:(e,t,n,r)=>{n(k(r.statusCode,r.message))}}),{getKey:n,resetKey:r}=t,i={getKey:n,resetKey:r};return new b(t,{statusCode:e?.statusCode,provider:t=>({rateLimit:{...i,...t[e?.requestPropertyName??`rateLimit`]}})})};var U=class e{resultHandler;schema=void 0;statusCodes=new Set;middlewares=[];constructor(e){this.resultHandler=e}#e(t){let n=new e(this.resultHandler);return n.middlewares=this.middlewares.concat(t),n.schema=ke(this.schema,t.schema),n.statusCodes=this.statusCodes.union(t.statusCodes),n}addMiddleware(e){return this.#e(e instanceof v?e:new v(e))}useCookies(...e){return this.#e(V(...e))}useCache(...e){return this.#e(B(...e))}useRateLimit(...e){return this.#e(H(...e))}use=this.addExpressMiddleware;addExpressMiddleware(...e){return this.#e(new b(...e))}addContext(e){return this.#e(new v({handler:({ctx:t})=>e(t)}))}build({input:e=le,output:t,operationId:n,scope:r,tag:i,method:a,statusCode:o,...s}){let{middlewares:c,resultHandler:l}=this,u=new _(typeof a==`string`?[a]:a),d=typeof n==`function`?n:e=>n&&`${n}${e===`head`?`__HEAD`:``}`,f=new _(typeof r==`string`?[r]:r),p=new _(typeof i==`string`?[i]:i);return new ie({...s,middlewares:c,outputSchema:t,resultHandler:l,scopes:f,tags:p,methods:u,getOperationId:d,inputSchema:Ae(this.schema,e),statusCodes:this.statusCodes.union(new Set(typeof o==`number`?[o]:o||[]))})}buildVoid({handler:e,...t}){return this.build({...t,output:le,handler:async t=>(await e(t),{})})}};const Fe=new U(I),Ie=new U(R),W={debug:_e,info:ye,warn:A(`#FFA500`),error:xe,ctx:ve},G={debug:10,info:20,warn:30,error:40},Le=e=>o(e)&&Object.keys(G).some(t=>t in e),K=e=>e in G,Re=(e,t)=>G[e]<G[t],q=me.memoizeWith((e,t)=>`${e}${t}`,(e,t=0)=>Intl.NumberFormat(void 0,{useGrouping:!1,minimumFractionDigits:0,maximumFractionDigits:t,style:`unit`,unitDisplay:`long`,unit:e})),ze=e=>e<1e-6?q(`nanosecond`,3).format(e/1e-6):e<.001?q(`nanosecond`).format(e/1e-6):e<1?q(`microsecond`).format(e/.001):e<1e3?q(`millisecond`).format(e):e<6e4?q(`second`,2).format(e/1e3):q(`minute`,2).format(e/6e4);var J=class e{config;constructor({color:e=ge.isSupported(),level:t=m.isProduction?`warn`:`debug`,depth:n=2,ctx:r={}}={}){this.config={color:e,level:t,depth:n,ctx:r}}format(e){let{depth:t,color:n,level:r}=this.config;return Se(e,{depth:t,colors:n,breakLength:r===`debug`?80:1/0,compact:r!==`debug`||3})}print(e,t,n){let{level:r,ctx:{requestId:i,...a},color:o}=this.config;if(r===`silent`||Re(e,r))return;let s=[new Date().toISOString()];i&&s.push(o?W.ctx(i):i),s.push(o?`${W[e](e)}:`:`${e}:`,t),n!==void 0&&s.push(this.format(n)),Object.keys(a).length>0&&s.push(this.format(a)),console.log(s.join(` `))}debug(e,t){this.print(`debug`,e,t)}info(e,t){this.print(`info`,e,t)}warn(e,t){this.print(`warn`,e,t)}error(e,t){this.print(`error`,e,t)}child(t){return new e({...this.config,ctx:t})}get ctx(){return this.config.ctx}profile(e){let t=M.now();return()=>{let n=M.now()-t,{message:r,severity:i=`debug`,formatter:a=ze}=typeof e==`object`?e:{message:e};this.print(typeof i==`function`?i(n):i,r,a(n))}}},Be=class{logger;config;#e=new WeakMap;constructor(e,t){this.logger=e,this.config=t}#t(e,t,n){if(!e.isSchemaChecked){for(let e of[`input`,`output`]){let r=[O.toJSONSchema(t[`${e}Schema`],{unrepresentable:`any`})];for(let t of r){t.type&&t.type!==`object`&&this.logger.warn(`Endpoint ${e} schema is not object-based`,n);for(let e of[`allOf`,`oneOf`,`anyOf`])t[e]&&r.push(...t[e])}}if(t.getProbableRequestType()===`json`){let e=T(t.inputSchema,`input`);e&&this.logger.warn(`The final input schema of the endpoint contains an unsupported JSON payload type.`,{...n,reason:e})}for(let e of ae)for(let{mimeTypes:r,schema:i}of t.getResponses(e)){if(!r?.includes(x.json))continue;let t=T(i,`output`);t&&this.logger.warn(`The final ${e} response schema of the endpoint contains an unsupported JSON payload type.`,{...n,reason:t})}e.isSchemaChecked=!0}}#n(e,t,n,r,i){if(e.paths.has(r))return;let{pathParams:s,getLocation:c,isQueryEnabled:l}=de({method:n,path:r,security:t.security,inputSources:a(n,this.config.inputSources)});if(s.size!==0||l){e.flat??=fe(O.toJSONSchema(t.inputSchema,{unrepresentable:`any`,io:`input`,override:({zodSchema:e,jsonSchema:t})=>{(e._zod.traits.has(`$ZodPreprocess`)||`coerce`in e._zod.def&&e._zod.def.coerce)&&(t[pe]=!0)}}));for(let[t,n]of Object.entries(e.flat.properties)){if(!o(n))continue;let r=c(t);(r===`path`||r===`query`)&&(r===`path`&&!e.flat.required?.includes(t)&&this.logger.warn(`The path parameter "${t}" is declared optional in the input schema, but path parameters are always required since Express matches the route only when the segment is present.`,{...i,name:t}),!ue(n,r)&&this.logger.warn(`The ${r} parameter "${t}" has a schema that most likely would not accept the parsed data, ${r===`path`?`since path parameters always arrive as strings`:`depending on the "queryParser" config option`}. Convert the parsed value from "z.string()" using ".transform()" method, or use "z.coerce" at least.`,{...i,name:t,jsonSchema:n}))}for(let e of s)this.logger.warn(`The input schema of the endpoint is most likely missing the parameter of the path it's assigned to.`,{...i,param:e});e.paths.add(r)}}check=(e,t,n)=>{let r=this.#e.get(n);r||(r={isSchemaChecked:!1,paths:new Set},this.#e.set(n,r)),this.#t(r,n,{method:e,path:t}),this.#n(r,n,e,t,{method:e,path:t})}};const Y=e=>e.sort((e,t)=>+C(t)-C(e)||e.localeCompare(t)).join(`, `).toUpperCase(),Ve=e=>({method:t},n,r)=>{let i=Y(e);n.set({Allow:i}),r(k(405,`${t} is not allowed`,{headers:{Allow:i}}))},He=({app:e,getLogger:t,config:n,routing:r})=>{let i=m.isProduction?void 0:new Be(t(),n),a=new Map;return oe({routing:r,config:n,onEndpoint:(e,t,r)=>{i?.check(e,t,r),a.has(t)||a.set(t,new Map(n.cors?[[`options`,r]]:[])),a.get(t)?.set(e,r)},onStatic:e.use.bind(e)}),a},Ue=({app:e,config:t,getLogger:n,...r})=>{let i=He({app:e,getLogger:n,config:t,...r}),a=new Map;for(let[r,o]of i){let i=Array.from(o.keys());i.includes(`get`)&&i.push(`head`);for(let[a,s]of o){let o=[];t.cors&&o.push((e,t,n)=>{t.set(`Access-Control-Allow-Methods`,Y(i)),n()}),o.push(async(e,r)=>{let i=n(e);return s.execute({request:e,response:r,logger:i,config:t})}),e[a]?.(r,...o)}t.hintAllowedMethods!==!1&&a.set(r,Ve(i))}for(let[t,n]of a)e.all(t,n)},We=e=>`_httpMessage`in e&&typeof e._httpMessage==`object`&&e._httpMessage!==null&&`headersSent`in e._httpMessage&&typeof e._httpMessage.headersSent==`boolean`&&`setHeader`in e._httpMessage&&typeof e._httpMessage.setHeader==`function`,Ge=e=>`server`in e&&typeof e.server==`object`&&e.server!==null&&`close`in e.server&&typeof e.server.close==`function`,Ke=e=>`encrypted`in e&&typeof e.encrypted==`boolean`&&e.encrypted,qe=({},e)=>void(!e.headersSent&&e.setHeader(`connection`,`close`)),Je=e=>{let{promise:t,resolve:n,reject:r}=Promise.withResolvers();return e.close(e=>e?r(e):n()),t},Ye=({timeout:e=1e3,logger:t}={})=>{let n,r=new Set,i=new Set,a=e=>void i.delete(e),o=e=>a(e.destroy()),s=e=>void(We(e)?!e._httpMessage.headersSent&&e._httpMessage.setHeader(`connection`,`close`):o(e)),c=e=>void(n?e.destroy():i.add(e.once(`close`,()=>a(e)).once(`error`,()=>o(e)))),l=async()=>{for(let e of r)e.on(`request`,qe);t?.info(`Graceful shutdown`,{sockets:i.size,timeout:e});for(let e of i)(Ke(e)||Ge(e))&&s(e);for await(let t of Te(10,Date.now()))if(i.size===0||Date.now()-t>=e)break;for(let e of i)o(e);return Promise.allSettled(r.values().map(Je))},u={sockets:i,add:(...e)=>{for(let t of e)if(!r.has(t)){r.add(t);for(let e of[`connection`,`secureConnection`])t.on(e,c)}return u},shutdown:()=>n??=l(),get isShuttingDown(){return!!n}};return u},Xe=Symbol.for(`express-zod-api`),Ze=({errorHandler:e,getLogger:n})=>async(r,i,a,o)=>r?e.execute({error:t(r),request:i,response:a,input:null,output:null,ctx:{},logger:n(i)}):o(),Qe=({errorHandler:e,getLogger:t})=>async(n,r)=>{let i=k(404,`Can not ${n.method} ${n.path}`),a=t(n);await e.execute({request:n,response:r,logger:a,error:i,input:null,output:null,ctx:{}})},$e=e=>(t,{},n)=>{if(Object.values(t?.files||[]).flat().find(({truncated:e})=>e))return n(e);n()},et=({config:e})=>{let t=E(`cookie-parser`),{secret:n,...r}={...typeof e.cookies==`object`&&e.cookies};return t(n,Object.keys(r).length?r:void 0)},tt=e=>typeof e==`function`?e:({},e,t)=>{e.set({"Access-Control-Allow-Origin":`*`,"Access-Control-Allow-Headers":`content-type`}),t()},nt=e=>({log:t=>{/not eligible/i.test(t)||e.debug(t)}}),rt=({getLogger:e,config:t})=>{let n=E(`express-fileupload`),{limitError:r,beforeUpload:i,...a}={...typeof t.upload==`object`&&t.upload},o=[];return o.push(async(t,r,o)=>{let s=e(t);return await i?.({request:t,logger:s}),n({debug:!0,...a,abortOnLimit:!1,parseNested:!0,logger:nt(s)})(t,r,o)}),r&&o.push($e(r)),o},it=(e,{},t)=>{Buffer.isBuffer(e.body)&&(e.body={raw:e.body}),t()},at=({logger:e,config:{childLoggerProvider:t,accessLogger:n=({method:e,path:t},n)=>n.debug(`${e}: ${t}`)}})=>async(r,i,a)=>{let o=await t?.({request:r,parent:e})||e;n?.(r,o),r.res&&(r.res.locals[Xe]={logger:o}),a()},ot=e=>t=>t?.res?.locals[Xe]?.logger||e;let st=!1;const ct=e=>{st||(st=!0,process.on(`deprecation`,({message:t,namespace:n,name:r,stack:i})=>e.warn(`${r} (${n}): ${t}`,i.split(`
|
|
2
|
-
`).slice(1))))};let X,Z,Q;const
|
|
1
|
+
import{A as e,B as t,C as n,D as r,E as i,H as a,L as o,M as s,O as c,P as l,Q as u,T as d,U as f,V as p,W as ee,_ as te,a as ne,c as m,d as re,f as h,g,h as _,k as ie,l as v,m as ae,nt as oe,o as se,p as ce,q as y,rt as b,s as x,t as le,u as S,v as C,x as ue,z as w}from"./routing-walker-BpLERmiE.js";import{t as T}from"./peer-helpers-CURhdLch.js";import{h as de,l as fe,m as pe,p as me}from"./documentation-helpers-Df2sKJq9.js";import{globalRegistry as E,z as D}from"zod";import*as he from"ramda";import O,{isHttpError as ge}from"http-errors";import _e,{blue as ve,cyanBright as ye,green as be,hex as k,italic as xe,red as Se,whiteBright as A}from"ansis";import{inspect as Ce}from"node:util";import{performance as we}from"node:perf_hooks";import j from"express";import Te from"node:http";import Ee from"node:https";import{setInterval as De}from"node:timers/promises";import{createRequest as Oe,createResponse as ke}from"node-mocks-http";function Ae(e){return e}const je=(e,t)=>e&&t?e.and(t):e||t,Me=(e,t)=>w(e?e.and(t):t);var Ne=class e{#e;constructor(e){this.#e=e}async execute(...t){try{return await this.#e(...t)}catch(n){let{response:r,logger:i,error:a}=t[0],o=new c(p(n),a||void 0);e.lastResort({response:r,logger:i,error:o})}}static lastResort({error:e,logger:t,response:n}){t.error(`Result handler failure`,e);let r=m(O(500,`An error occurred while serving the result: ${e.message}.`+(e.handled?`\nOriginal error: ${e.handled.message}.`:``),{expose:ge(e.cause)?e.cause.expose:!1}));n.status(500).type(`text/plain`).end(r)}},M=class extends Ne{#e;#t;constructor(e){super(e.handler),this.#e=e.positive,this.#t=e.negative}getPositiveResponse(e){return S(this.#e,{variant:`positive`,args:[e]})}getNegativeResponse(){return S(this.#t,{variant:`negative`,args:[]})}};const Pe=D.object({message:D.string()});E.add(Pe,{examples:[{message:`Sample error message`}]});const N=new M({positive:e=>e,negative:Pe,handler:({error:e,input:t,output:n,request:r,response:i,logger:a})=>{if(e){let n=x(e);v(n,a,r,t),i.status(n.statusCode).set(n.headers).json({message:m(n)});return}i.status(h.positive).json(n)}}),P=D.object({status:D.literal(`error`),error:D.object({message:D.string()})});E.add(P,{examples:[{status:`error`,error:{message:`Sample error message`}}]});const F=new M({positive:e=>{let t=D.object({status:D.literal(`success`),data:e}),n=o(e);return n.length&&E.add(t,{examples:n.map(e=>({status:`success`,data:e}))}),t},negative:P,handler:({error:e,input:t,output:n,request:r,response:i,logger:a})=>{if(e){let n=x(e);v(n,a,r,t),i.status(n.statusCode).set(n.headers).json({status:`error`,error:{message:m(n)}});return}i.status(h.positive).json({status:`success`,data:n})}}),I=D.string();E.add(I,{examples:[`Sample error message`]});const L=new M({positive:e=>{let t=e instanceof D.ZodObject&&`items`in e.shape&&e.shape.items instanceof D.ZodArray?e.shape.items:D.array(D.any());if(o(t).length)return t;let n=o(e).filter(e=>y(e)&&`items`in e&&Array.isArray(e.items)).map(e=>e.items);if(n?.length){let e=t.meta();E.remove(t).add(t,{...e,examples:n})}return t},negative:{schema:I,mimeType:`text/plain`},handler:({response:e,output:t,error:n,logger:r,request:i,input:a})=>{if(n){let t=x(n);v(t,r,i,a),e.status(t.statusCode).type(`text/plain`).send(m(t));return}if(`items`in t&&Array.isArray(t.items)){e.status(h.positive).json(t.items);return}throw Error(`Property 'items' is missing in the endpoint output`)}}),R=e=>{let t=[];return e.scope&&t.push(e.scope),e.noStore&&t.push(`no-store`),e.noCache&&t.push(`no-cache`),e.maxAge!==void 0&&t.push(`max-age=${e.maxAge}`),e.sMaxAge!==void 0&&t.push(`s-maxage=${e.sMaxAge}`),e.mustRevalidate&&t.push(`must-revalidate`),e.proxyRevalidate&&t.push(`proxy-revalidate`),e.mustUnderstand&&t.push(`must-understand`),e.immutable&&t.push(`immutable`),e.noTransform&&t.push(`no-transform`),e.staleWhileRevalidate!==void 0&&t.push(`stale-while-revalidate=${e.staleWhileRevalidate}`),e.staleIfError!==void 0&&t.push(`stale-if-error=${e.staleIfError}`),t.join(`, `)},Fe={"max-age":`maxAge`,"max-stale":`maxStale`,"min-fresh":`minFresh`,"stale-if-error":`staleIfError`},Ie={"no-cache":`noCache`,"no-store":`noStore`,"no-transform":`noTransform`,"only-if-cached":`onlyIfCached`},Le=e=>{if(!e)return;let t={};for(let n of e.toLowerCase().split(`,`)){let[e,r]=n.split(`=`),i=Fe[e.trim()];if(i){let e=parseInt(r?.trim()??``,10);isNaN(e)||(t[i]=e);continue}let a=Ie[e.trim()];a&&(t[a]=!0)}return t},z=e=>new _({handler:async({request:t,response:n})=>(e&&n.setHeader(`Cache-Control`,R(e)),{get ifNoneMatch(){let e=t.headers[`if-none-match`];if(!e)return;let n=e.trim();return n===`*`?n:n.split(`,`).map(e=>e.trim().replace(/^(?:W\/)?"/,``).replace(/"$/,``))},get ifModifiedSince(){let e=t.headers[`if-modified-since`];if(!e)return;let n=new Date(e);return isNaN(n.getTime())?void 0:n},get cacheControl(){return Le(t.headers[`cache-control`])},addCachePolicy:t=>{n.setHeader(`Cache-Control`,R({...e,...t}))},setETag:e=>{n.setHeader(`ETag`,e.startsWith(`"`)?e:`"${e}"`)},setLastModified:e=>{n.setHeader(`Last-Modified`,e.toUTCString())},setVary:(...e)=>{n.setHeader(`Vary`,e.join(`, `))},setExpires:e=>{n.setHeader(`Expires`,e.toUTCString())},clearSiteData:()=>{n.setHeader(`Clear-Site-Data`,`"cache"`)},notModified:()=>{n.status(304).end()}})}),B=e=>new _({handler:async({request:t,response:n})=>({getCookie:e=>t.signedCookies?.[e]??t.cookies?.[e],setCookie:(t,r,i)=>{n.cookie(t,r,{...e,...i})},clearCookie:(t,r)=>{n.clearCookie(t,{...e,...r})}})}),V=e=>{let t=T(`express-rate-limit`)({statusCode:429,...e,handler:(e,t,n,r)=>{n(O(r.statusCode,r.message))}}),{getKey:n,resetKey:r}=t,i={getKey:n,resetKey:r};return new ae(t,{statusCode:e?.statusCode??429,provider:t=>({rateLimit:{...i,...t[e?.requestPropertyName??`rateLimit`]}})})};var H=class e{resultHandler;schema=void 0;statusCodes=/* @__PURE__ */ new Set;middlewares=[];constructor(e){this.resultHandler=e}#e(t){let n=new e(this.resultHandler);return n.middlewares=this.middlewares.concat(t),n.schema=je(this.schema,t.schema),n.statusCodes=this.statusCodes.union(t.statusCodes),n}addMiddleware(e){return this.#e(e instanceof _?e:new _(e))}useCookies(...e){return this.#e(B(...e))}useCache(...e){return this.#e(z(...e))}useRateLimit(...e){return this.#e(V(...e))}use=this.addExpressMiddleware;addExpressMiddleware(...e){return this.#e(new ae(...e))}addContext(e){return this.#e(new _({handler:({ctx:t})=>e(t)}))}build({input:e=t,output:n,operationId:r,scope:i,tag:a,method:o,statusCode:s,...c}){let{middlewares:l,resultHandler:u}=this,d=new g(typeof o==`string`?[o]:o),f=typeof r==`function`?r:e=>r&&`${r}${e===`head`?`__HEAD`:``}`,p=new g(typeof i==`string`?[i]:i),ee=new g(typeof a==`string`?[a]:a);return new se({...c,middlewares:l,resultHandler:u,scopes:p,tags:ee,methods:d,getOperationId:f,inputSchema:Me(this.schema,e),outputSchema:w(n),statusCodes:this.statusCodes.union(new Set(typeof s==`number`?[s]:s||[]))})}buildVoid({handler:e,...n}){return this.build({...n,output:t,handler:async t=>(await e(t),{})})}};const Re=new H(N),ze=new H(F),Be=new H(L),U={debug:ve,info:be,warn:k(`#FFA500`),error:Se,ctx:ye},W={debug:10,info:20,warn:30,error:40},Ve=e=>y(e)&&Object.keys(W).some(t=>t in e),G=e=>e in W,He=(e,t)=>W[e]<W[t],K=he.memoizeWith((e,t)=>`${e}${t}`,(e,t=0)=>Intl.NumberFormat(void 0,{useGrouping:!1,minimumFractionDigits:0,maximumFractionDigits:t,style:`unit`,unitDisplay:`long`,unit:e})),Ue=e=>e<1e-6?K(`nanosecond`,3).format(e/1e-6):e<.001?K(`nanosecond`).format(e/1e-6):e<1?K(`microsecond`).format(e/.001):e<1e3?K(`millisecond`).format(e):e<6e4?K(`second`,2).format(e/1e3):K(`minute`,2).format(e/6e4);var q=class e{config;constructor({color:e=_e.isSupported(),level:t=u.isProduction?`warn`:`debug`,depth:n=2,ctx:r={}}={}){this.config={color:e,level:t,depth:n,ctx:r}}format(e){let{depth:t,color:n,level:r}=this.config;return Ce(e,{depth:t,colors:n,breakLength:r===`debug`?80:1/0,compact:r!==`debug`||3})}print(e,t,n){let{level:r,ctx:{requestId:i,...a},color:o}=this.config;if(r===`silent`||He(e,r))return;let s=[(/* @__PURE__ */ new Date()).toISOString()];i&&s.push(o?U.ctx(i):i),s.push(o?`${U[e](e)}:`:`${e}:`,t),n!==void 0&&s.push(this.format(n)),Object.keys(a).length>0&&s.push(this.format(a)),console.log(s.join(` `))}debug(e,t){this.print(`debug`,e,t)}info(e,t){this.print(`info`,e,t)}warn(e,t){this.print(`warn`,e,t)}error(e,t){this.print(`error`,e,t)}child(t){return new e({...this.config,ctx:t})}get ctx(){return this.config.ctx}profile(e){let t=we.now();return()=>{let n=we.now()-t,{message:r,severity:i=`debug`,formatter:a=Ue}=typeof e==`object`?e:{message:e};this.print(typeof i==`function`?i(n):i,r,a(n))}}},We=class{logger;config;#e=/* @__PURE__ */ new WeakMap;constructor(e,t){this.logger=e,this.config=t}#t(e,t,n){if(!e.isSchemaChecked){for(let e of[`input`,`output`]){let r=[D.toJSONSchema(t[`${e}Schema`],{unrepresentable:`any`})];for(let t of r){t.type&&t.type!==`object`&&this.logger.warn(`Endpoint ${e} schema is not object-based`,n);for(let e of[`allOf`,`oneOf`,`anyOf`])t[e]&&r.push(...t[e])}}if(t.getProbableRequestType()===`json`){let e=C(t.inputSchema,`input`);e&&this.logger.warn(`The final input schema of the endpoint contains an unsupported JSON payload type.`,{...n,reason:e})}for(let e of ce)for(let{mimeTypes:r,schema:i}of t.getResponses(e)){if(!r?.includes(b.json))continue;let t=C(i,`output`);t&&this.logger.warn(`The final ${e} response schema of the endpoint contains an unsupported JSON payload type.`,{...n,reason:t})}e.isSchemaChecked=!0}}#n(e,t,n,r,i){if(e.paths.has(r))return;let{pathParams:a,getLocation:o,isQueryEnabled:s}=fe({method:n,path:r,security:t.security,inputSources:f(n,this.config.inputSources)});if(a.size!==0||s){e.flat??=pe(D.toJSONSchema(t.inputSchema,{unrepresentable:`any`,io:`input`,override:({zodSchema:e,jsonSchema:t})=>{(e._zod.traits.has(`$ZodPreprocess`)||`coerce`in e._zod.def&&e._zod.def.coerce)&&(t[me]=!0)}}));for(let[t,n]of Object.entries(e.flat.properties)){if(!y(n))continue;let r=o(t);(r===`path`||r===`query`)&&(r===`path`&&!e.flat.required?.includes(t)&&this.logger.warn(`The path parameter "${t}" is declared optional in the input schema, but path parameters are always required since Express matches the route only when the segment is present.`,{...i,name:t}),!de(n,r)&&this.logger.warn(`The ${r} parameter "${t}" has a schema that most likely would not accept the parsed data, ${r===`path`?`since path parameters always arrive as strings`:`depending on the "queryParser" config option`}. Convert the parsed value from "z.string()" using ".transform()" method, or use "z.coerce" at least.`,{...i,name:t,jsonSchema:n}))}for(let e of a)this.logger.warn(`The input schema of the endpoint is most likely missing the parameter of the path it's assigned to.`,{...i,param:e});e.paths.add(r)}}check=(e,t,n)=>{let r=this.#e.get(n);r||(r={isSchemaChecked:!1,paths:/* @__PURE__ */ new Set},this.#e.set(n,r)),this.#t(r,n,{method:e,path:t}),this.#n(r,n,e,t,{method:e,path:t})}};const J=e=>e.sort((e,t)=>+oe(t)-oe(e)||e.localeCompare(t)).join(`, `).toUpperCase(),Ge=e=>({method:t},n,r)=>{let i=J(e);n.set({Allow:i}),r(O(405,`${t} is not allowed`,{headers:{Allow:i}}))},Ke=({app:e,getLogger:t,config:n,routing:r})=>{let i=u.isProduction?void 0:new We(t(),n),a=/* @__PURE__ */ new Map;return le({routing:r,config:n,onEndpoint:(e,t,r)=>{i?.check(e,t,r),a.has(t)||a.set(t,new Map(n.cors?[[`options`,r]]:[])),a.get(t)?.set(e,r)},onStatic:e.use.bind(e)}),a},Y=({app:e,config:t,getLogger:n,...r})=>{let i=Ke({app:e,getLogger:n,config:t,...r}),a=/* @__PURE__ */ new Map;for(let[r,o]of i){let i=Array.from(o.keys());i.includes(`get`)&&i.push(`head`);for(let[a,s]of o){let o=[];t.cors&&o.push((e,t,n)=>{t.set(`Access-Control-Allow-Methods`,J(i)),n()}),o.push(async(e,r)=>{let i=n(e);return s.execute({request:e,response:r,logger:i,config:t})}),e[a]?.(r,...o)}t.hintAllowedMethods!==!1&&a.set(r,Ge(i))}for(let[t,n]of a)e.all(t,n)},qe=e=>`_httpMessage`in e&&typeof e._httpMessage==`object`&&e._httpMessage!==null&&`headersSent`in e._httpMessage&&typeof e._httpMessage.headersSent==`boolean`&&`setHeader`in e._httpMessage&&typeof e._httpMessage.setHeader==`function`,Je=e=>`server`in e&&typeof e.server==`object`&&e.server!==null&&`close`in e.server&&typeof e.server.close==`function`,Ye=e=>`encrypted`in e&&typeof e.encrypted==`boolean`&&e.encrypted,Xe=({},e)=>void(!e.headersSent&&e.setHeader(`connection`,`close`)),Ze=e=>{let{promise:t,resolve:n,reject:r}=Promise.withResolvers();return e.close(e=>e?r(e):n()),t},Qe=({timeout:e=1e3,logger:t}={})=>{let n,r=/* @__PURE__ */ new Set,i=/* @__PURE__ */ new Set,a=e=>void i.delete(e),o=e=>a(e.destroy()),s=e=>void(qe(e)?!e._httpMessage.headersSent&&e._httpMessage.setHeader(`connection`,`close`):/* v8 ignore next -- unreachable */o(e)),c=e=>void(n?/* v8 ignore next -- unstable */e.destroy():i.add(e.once(`close`,()=>a(e)).once(`error`,()=>o(e)))),l=async()=>{for(let e of r)e.on(`request`,Xe);t?.info(`Graceful shutdown`,{sockets:i.size,timeout:e});for(let e of i)(Ye(e)||Je(e))&&s(e);for await(let t of De(10,Date.now()))if(i.size===0||Date.now()-t>=e)break;for(let e of i)o(e);return Promise.allSettled(r.values().map(Ze))},u={sockets:i,add:(...e)=>{for(let t of e)if(!r.has(t)){r.add(t);for(let e of[`connection`,`secureConnection`])t.on(e,c)}return u},shutdown:()=>n??=l(),get isShuttingDown(){return!!n}};return u},$e=Symbol.for(`express-zod-api`),et=({errorHandler:e,getLogger:t})=>async(n,r,i,a)=>n?e.execute({error:p(n),request:r,response:i,input:null,output:null,ctx:{},logger:t(r)}):a(),tt=({errorHandler:e,getLogger:t})=>async(n,r)=>{let i=O(404,`Can not ${n.method} ${n.path}`),a=t(n);await e.execute({request:n,response:r,logger:a,error:i,input:null,output:null,ctx:{}})},nt=e=>(t,{},n)=>{if(Object.values(t?.files||[]).flat().find(({truncated:e})=>e))return n(e);n()},rt=({config:e})=>{let t=T(`cookie-parser`),{secret:n,...r}={...typeof e.cookies==`object`&&e.cookies};return t(n,Object.keys(r).length?r:void 0)},it=e=>typeof e==`function`?e:({},e,t)=>{e.set({"Access-Control-Allow-Origin":`*`,"Access-Control-Allow-Headers":`content-type`}),t()},at=e=>({log:t=>{/not eligible/i.test(t)||e.debug(t)}}),ot=({getLogger:e,config:t})=>{let n=T(`express-fileupload`),{limitError:r,beforeUpload:i,...a}={...typeof t.upload==`object`&&t.upload},o=[];return o.push(async(t,r,o)=>{let s=e(t);return await i?.({request:t,logger:s}),n({debug:!0,...a,abortOnLimit:!1,parseNested:!0,logger:at(s)})(t,r,o)}),r&&o.push(nt(r)),o},st=(e,{},t)=>{Buffer.isBuffer(e.body)&&(e.body={raw:e.body}),t()},ct=({logger:e,config:{childLoggerProvider:t,accessLogger:n=({method:e,path:t},n)=>n.debug(`${e}: ${t}`)}})=>async(r,i,a)=>{let o=await t?.({request:r,parent:e})||e;n?.(r,o),r.res&&(r.res.locals[$e]={logger:o}),a()},lt=e=>t=>t?.res?.locals[$e]?.logger||e;let ut=!1;const dt=e=>{ut||(ut=!0,process.on(`deprecation`,({message:t,namespace:n,name:r,stack:i})=>e.warn(`${r} (${n}): ${t}`,i.split(`
|
|
2
|
+
`).slice(1))))};let X,Z,Q;const ft=({servers:e,logger:t,options:{timeout:n,beforeExit:r,events:i=[`SIGINT`,`SIGTERM`]}})=>{X??=Qe({logger:t,timeout:n}),X.add(...e),r&&(Q??=/* @__PURE__ */ new Set).add(r),Z??=async()=>{X?.isShuttingDown||(await X?.shutdown(),Q&&await Promise.allSettled(Q.values().map(async e=>e())),process.exit())};for(let e of i)process.listeners(e).includes(Z)||process.on(e,Z)},pt=e=>{if(e.columns<62)return;let t=xe(`for Rita`.padStart(52)),n=k(`#F5A9B8`),r=k(`#5BCEFA`),i=[r`8888888888${t}`,r`888`,r`888`,r`8888888 888 888 88888b. 888d888 .d88b. .d8888b .d8888b`,n`888 `Y8bd8P' 888 "88b 888P" d8P Y8b 88K 88K`,n`888 X88K 888 888 888 88888888 "Y8888b. "Y8888b.`,n`888 .d8""8b. 888 d88P 888 Y8b. X88 X88`,A`8888888888 888 888 88888P" 888 "Y8888 88888P' 88888P'`,A` 888`,A`8888888888P 888 888 d8888 8888888b. 8888888`,A` d88P 888 d88888 888 Y88b 888`,n` d88P 888 d88P888 888 888 888`,n` d88P .d88b. .d88888 d88P 888 888 d88P 888`,n` d88P d88""88b d88" 888 d88P 888 8888888P" 888`,r` d88P 888 888 888 888 d88P 888 888 888`,r` d88P Y88..88P Y88b 888 d8888888888 888 888`,r`d8888888888 "Y88P" "Y88888 d88P 888 888 8888888`];e.write(`
|
|
3
3
|
`+i.join(`
|
|
4
4
|
`)+`
|
|
5
5
|
|
|
6
|
-
`)}
|
|
6
|
+
`)},$=e=>{e.startupLogo!==!1&&pt(process.stdout);let t=e.errorHandler||N,n=Ve(e.logger)?e.logger:new q(e.logger);n.debug(`Running`,{build:`v30.0.0-beta.1`,env:u.env}),u.isProduction&&n instanceof q&&n.warn(`Using the built-in logger in production may degrade performance due to synchronous printing. Consider installing a professional logging solution, such as Pino or Winston.`),dt(n);let r=ct({logger:n,config:e}),i={getLogger:lt(n),errorHandler:t},a=tt(i),o=et(i);return{...i,logger:n,notFoundHandler:a,catcher:o,loggingMiddleware:r}},mt=(e,t)=>{let{logger:n,getLogger:r,notFoundHandler:i,loggingMiddleware:a}=$(e),o=e.app.use(a);return e.cors&&o.use(it(e.cors)),Y({app:o,routing:t,getLogger:r,config:e}),{notFoundHandler:i,logger:n}},ht=(e,t)=>{let{logger:n,getLogger:r,notFoundHandler:i,catcher:a,loggingMiddleware:o}=$(e),s=j().disable(`x-powered-by`).set(`query parser`,e.queryParser??`simple`).use(o);if(e.beforeParsers?.({app:s,getLogger:r}),e.compression){let t=T(`compression`);s.use(t(typeof e.compression==`object`?e.compression:void 0))}return e.cookies&&s.use(rt({config:e})),e.cors&&s.use(it(e.cors)),s.use(e.jsonParser||j.json()).use(e.formParser||j.urlencoded()).use(e.rawParser||j.raw(),st),e.upload&&s.use(...ot({config:e,getLogger:r})),e.beforeRouting?.({app:s,getLogger:r}),Y({app:s,routing:t,getLogger:r,config:e}),e.afterRouting?.({app:s,getLogger:r}),s.use(a,i),{app:s,logger:n}},gt=(e,t)=>{let{app:n,logger:r}=ht(e,t),i=[],a=(e,t)=>()=>e.listen(t,()=>r.info(`Listening`,t)),o=[];if(e.http){let t=Te.createServer(n);i.push(t),o.push(a(t,e.http.listen))}if(e.https){let t=Ee.createServer(e.https.options,n);i.push(t),o.push(a(t,e.https.listen))}return i.length||r.warn(`No servers configured.`),e.gracefulShutdown&&ft({logger:r,servers:i,options:e.gracefulShutdown===!0?{}:e.gracefulShutdown}),{app:n,logger:r,servers:o.map(e=>e())}},_t=e=>Oe({...e,headers:{"content-type":b.json,...e?.headers}}),vt=e=>ke(e),yt=e=>{let t={warn:[],error:[],info:[],debug:[]};return new Proxy(e||{},{get(e,n,r){return n===`_getLogs`?()=>t:G(n)?(...e)=>t[n].push(e):Reflect.get(e,n,r)},has(e,t){return G(t)||t===`_getLogs`?!0:Reflect.has(e,t)}})},bt=({requestProps:e,responseOptions:t,configProps:n,loggerProps:r})=>{let i=_t(e),a=vt({req:i,...t});a.req=t?.req||i,i.res=a;let o=yt(r);return{requestMock:i,responseMock:a,loggerMock:o,configMock:{cors:!1,logger:o,...n}}},xt=async({endpoint:e,...t})=>{let{requestMock:n,responseMock:r,loggerMock:i,configMock:a}=bt(t);return await e.execute({request:n,response:r,config:a,logger:i}),{requestMock:n,responseMock:r,loggerMock:i}},St=async({middleware:e,ctx:t={},...n})=>{let{configMock:r,...i}=bt(n),{inputSources:o,errorHandler:s=N}=r,c=a(i.requestMock,o),l={request:i.requestMock,response:i.responseMock,logger:i.loggerMock,input:c,ctx:t};try{let t=await e.execute({...l,config:r});return{...i,output:t}}catch(e){return await s.execute({...l,error:p(e),output:null}),{...i,output:{}}}},Ct=(e,t)=>D.object({data:t,event:D.literal(e),id:D.string().optional(),retry:D.int().positive().optional()}),wt=/[\r\n\0]/g,Tt=({events:e,event:t,data:n,id:r,retry:i})=>{if(!Object.prototype.hasOwnProperty.call(e,t))throw Error(`Unknown event: ${t}`);let a=e[t].parse(n),o=`event: ${t}\n`;return r!==void 0&&(o+=`id: ${r}\n`),i!==void 0&&(o+=`retry: ${i}\n`),o+`data: ${JSON.stringify(a)}\n\n`},Et=e=>e.headersSent||e.writeHead(200,{connection:`keep-alive`,"content-type":b.sse,"cache-control":`no-cache`}),Dt=(e,{eventId:t=!1,retry:n}={})=>{let r=0,i;if(n!==void 0&&!(Number.isInteger(n)&&n>0))throw Error(`Invalid SSE retry value "${n}": must be a positive integer.`);return t&&(i=typeof t==`function`?(e,n)=>t(e,n).replace(wt,``):(e,t)=>`${e}##${t}`),new _({handler:async({request:t,response:a})=>{let o=new AbortController,s=setTimeout(()=>Et(a),1e4);return t.once(`close`,()=>{clearTimeout(s),o.abort()}),{isClosed:()=>a.writableEnded||a.closed,signal:o.signal,lastEventId:i&&t.get(`last-event-id`),emit:(t,o)=>{Et(a);let s=Tt({events:e,data:o,retry:n,id:i&&i(String(t),++r),event:String(t)});a.write(s,`utf-8`),a.flush?.()}}}})},Ot=e=>new M({positive:()=>{let[t,...n]=Object.entries(e).map(([e,t])=>Ct(e,t));if(!t)throw new c(/* @__PURE__ */ Error(`At least one SSE event is required.`));return{mimeType:b.sse,schema:n.length?D.discriminatedUnion(`event`,[t,...n]):t}},negative:{mimeType:`text/plain`,schema:D.string()},handler:async({response:e,error:t,logger:n,request:r,input:i})=>{if(t){let a=x(t);v(a,n,r,i),e.headersSent||e.status(a.statusCode).type(`text/plain`).write(m(a),`utf-8`)}e.end()}});var kt=class extends H{constructor(e,t){let n=Object.fromEntries(Object.entries(e).map(([e,t])=>{if(e.match(wt))throw Error(`Invalid SSE event name "${e}": must not contain line breaks or null characters.`);return[e,w(t)]}));super(Ot(n)),this.middlewares=[Dt(n,t)]}};const At=[`total`,`limit`,`offset`],jt=[`nextCursor`,`limit`];function Mt({style:e,itemSchema:t,itemsName:n=`items`,maxLimit:r=100,defaultLimit:i=20}){if(!Number.isInteger(r)||r<1)throw Error(`ez.paginated: maxLimit must be a positive integer`);if(!Number.isInteger(i)||i<1)throw Error(`ez.paginated: defaultLimit must be a positive integer`);if(i>r)throw Error(`ez.paginated: defaultLimit must not be greater than maxLimit`);if(e===`offset`&&At.includes(n))throw Error(`ez.paginated: itemsName must not match reserved keys for offset output (${At.join(`, `)})`);if(e===`cursor`&&jt.includes(n))throw Error(`ez.paginated: itemsName must not match reserved keys for cursor output (${jt.join(`, `)})`);let a=D.coerce.number().int().min(1).max(r).default(i).describe(`Page size (number of ${n} per page)`);if(e===`offset`){let e=D.coerce.number().int().min(0).default(0).describe(`Number of ${n} to skip`);return{input:D.object({limit:a,offset:e}),output:D.object({[n]:D.array(t).describe(`Page of ${n}`),total:D.number().int().min(0).describe(`Total number of ${n}`),limit:D.number().int().min(1).describe(`Page size used`),offset:D.number().int().min(0).describe(`Offset used`)})}}let o=D.string().optional().describe(`Cursor for the next page; omit for first page`);return{input:D.object({cursor:o,limit:a}),output:D.object({[n]:D.array(t).describe(`Page of ${n}`),nextCursor:D.string().nullable().describe(`Cursor for the next page, or null if no more pages`),limit:D.number().int().min(1).describe(`Page size used`)})}}const Nt={dateIn:s,dateOut:e,form:te,upload:n,raw:ue,buffer:l,paginated:Mt};export{q as BuiltinLogger,H as EndpointsFactory,kt as EventStreamFactory,d as InputValidationError,_ as Middleware,i as MissingPeerError,r as OutputValidationError,M as ResultHandler,ie as RoutingError,ne as ServeStatic,Be as arrayEndpointsFactory,L as arrayResultHandler,mt as attachRouting,re as createApiResponse,z as createCacheMiddleware,Ae as createConfig,B as createCookieMiddleware,V as createRateLimitMiddleware,gt as createServer,Re as defaultEndpointsFactory,N as defaultResultHandler,x as ensureHttpError,Nt as ez,ee as getMessageFromError,ze as legacyEndpointsFactory,F as legacyResultHandler,xt as testEndpoint,St as testMiddleware};
|
package/dist/integration.d.ts
CHANGED
|
@@ -1,16 +1,12 @@
|
|
|
1
|
-
import { d as FlatObject, g as CommonConfig, l as EmptyObject, t as Routing } from "./routing-
|
|
1
|
+
import { N as ResponseVariant, d as FlatObject, g as CommonConfig, l as EmptyObject, t as Routing } from "./routing-BE8APxgy.js";
|
|
2
2
|
import { z } from "zod";
|
|
3
3
|
import ts, { default as ts$1 } from "typescript";
|
|
4
4
|
interface NextHandlerInc<U> {
|
|
5
5
|
next: (schema: z.core.$ZodType) => U;
|
|
6
6
|
}
|
|
7
|
-
type SchemaHandler<U, Context extends FlatObject = EmptyObject, Variant extends "regular" | "last" = "regular"> = (
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
) => U;
|
|
11
|
-
type HandlingRules<U, Context extends FlatObject = EmptyObject, K extends string | symbol = string | symbol> = Partial<
|
|
12
|
-
Record<K, SchemaHandler<U, Context>>
|
|
13
|
-
>;
|
|
7
|
+
type SchemaHandler<U, Context extends FlatObject = EmptyObject, Variant extends "regular" | "last" = "regular"> = (schema: any // oxlint-disable-line typescript/no-explicit-any -- for assignment compatibility
|
|
8
|
+
, ctx: Context & (Variant extends "regular" ? NextHandlerInc<U> : Context)) => U;
|
|
9
|
+
type HandlingRules<U, Context extends FlatObject = EmptyObject, K extends string | symbol = string | symbol> = Partial<Record<K, SchemaHandler<U, Context>>>;
|
|
14
10
|
interface ZTSContext extends FlatObject {
|
|
15
11
|
isResponse: boolean;
|
|
16
12
|
makeAlias: (key: object, produce: () => ts.TypeNode) => ts.TypeNode;
|
|
@@ -20,6 +16,7 @@ declare abstract class IntegrationBase {
|
|
|
20
16
|
protected readonly serverUrl: string;
|
|
21
17
|
protected constructor(serverUrl: string);
|
|
22
18
|
protected makeOmit: (base: string, props: Iterable<string>, reason?: string) => string;
|
|
19
|
+
protected makeDiscriminator: (statusCodes: number[], responseVariant: ResponseVariant, dataRef: string) => string;
|
|
23
20
|
}
|
|
24
21
|
interface IntegrationParams {
|
|
25
22
|
routing: Routing;
|
|
@@ -77,19 +74,9 @@ interface FormattedPrintingOptions {
|
|
|
77
74
|
format?: (program: string) => Promise<string>;
|
|
78
75
|
}
|
|
79
76
|
export declare class Integration extends IntegrationBase {
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
config,
|
|
83
|
-
brandHandling,
|
|
84
|
-
variant,
|
|
85
|
-
clientClassName,
|
|
86
|
-
subscriptionClassName,
|
|
87
|
-
serverUrl,
|
|
88
|
-
noBodySchema,
|
|
89
|
-
hasHeadMethod,
|
|
90
|
-
hasCredentials,
|
|
91
|
-
}: IntegrationParams);
|
|
77
|
+
#private;
|
|
78
|
+
constructor({ routing, config, brandHandling, variant, clientClassName, subscriptionClassName, serverUrl, noBodySchema, hasHeadMethod, hasCredentials }: IntegrationParams);
|
|
92
79
|
print(printerOptions?: ts$1.PrinterOptions): string;
|
|
93
80
|
printFormatted({ printerOptions, format: userDefined }?: FormattedPrintingOptions): Promise<string>;
|
|
94
81
|
}
|
|
95
|
-
export type { Producer };
|
|
82
|
+
export type { Producer };
|
package/dist/integration.js
CHANGED
|
@@ -1,13 +1,12 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{$ as e,F as t,I as n,J as r,K as i,N as a,Y as o,b as s,j as c,n as l,p as u,r as d,rt as f,t as p,tt as m,y as h}from"./routing-walker-BpLERmiE.js";import{t as g}from"./peer-helpers-CURhdLch.js";import{globalRegistry as _,z as v}from"zod";import*as y from"ramda";import b from"typescript";const x={Path:`Path`,Implementation:`Implementation`,DefaultContext:`DefaultContext`,key:`key`,path:`path`,params:`params`,ctx:`ctx`,method:`method`,request:`request`,event:`event`,data:`data`,handler:`handler`,msg:`msg`,parseRequest:`parseRequest`,substitute:`substitute`,provide:`provide`,on:`on`,implementation:`implementation`,hasBody:`hasBody`,undefined:`undefined`,response:`response`,rest:`rest`,searchParams:`searchParams`,defaultImplementation:`defaultImplementation`,hasFiles:`hasFiles`,value:`value`,File:`File`,FormData:`FormData`,headers:`headers`,body:`body`,client:`client`,contentType:`contentType`,isBlob:`isBlob`,source:`source`,Method:`Method`,Request:`Request`,Pagination:`Pagination`,override:`override`,discriminate:`discriminate`,discriminator:`discriminator`},S={input:`Input`,positive:`PositiveResponse`,negative:`NegativeResponse`,encoded:`EncodedResponse`,response:`Response`},C=e=>Array.from(e).map(e=>`"${e}"`),w=e=>e,T={success:`success`,error:`error`};var ee=class{serverUrl;paths=/* @__PURE__ */ new Set;tags=/* @__PURE__ */ new Map;registry=/* @__PURE__ */ new Map;constructor(e){this.serverUrl=e}makeMethodType=()=>{let e=C(m).join(` | `);return`export type ${x.Method} = ${e};`};makeOmit=(e,t,n=``)=>`Omit<${e}, ${n&&`\n/** ${n} */\n`}${C(t).join(` | `)}>`;makeDiscriminator=(e,t,n)=>`{ ${[`${w(`status`)}: ${e.join(` | `)}`,`${x.discriminator}: "${t===`positive`?T.success:T.error}"`,`${x.data}: ${n}`].join(`, `)} }`;makeRequestType=()=>`export type ${x.Request} = keyof ${S.input};`;makePathType=()=>{let e=C(this.paths).join(` | `);return`export type ${x.Path} = ${e};`};makePublicInterfaces=()=>Object.keys(S).map(e=>{let t=Array.from(this.registry).map(([t,{store:n,isDeprecated:r}])=>` ${r?`/** @deprecated */
|
|
2
2
|
`:``}"${t}": ${n[e]};`).join(`
|
|
3
3
|
`);return`export interface ${S[e]} {\n${t}\n}`});makeEndpointTags=()=>`export const endpointTags = {\n${Array.from(this.tags).map(([e,t])=>` "${e}": [${C(t).join(`, `)}]`).join(`,
|
|
4
|
-
`)}\n}`;makeImplementationType=()=>{let e=[`${x.method}: ${x.Method}`,`${x.path}: string`,`${x.params}: Record<string, any>`,`${x.ctx}?: T`].join(`,`);return`export type ${x.Implementation}<T extends Record<string, unknown>> = (${e}) => Promise<any>;`};makeDefaultContextType=()=>`export type ${x.DefaultContext} = { ${x.override}?: (init: RequestInit) => RequestInit };`;makeParseRequestFn=()=>{let e=`${x.request}: string`,t=`[${x.Method}, ${x.Path}]`,n=`${x.request}.${w(`split`)}(/ (.+)/, 2) as ${t}`;return`const ${x.parseRequest} = (${e}) => ${n};`};makeSubstituteFn=()=>{let e=`${x.path}: string, ${x.params}: Record<string, any>`,t=`\`:\${${x.key}}\``,n=`: [typeof ${x.path}, typeof ${x.params}]`;return[`const ${x.substitute} = (${e})${n} => {`,` if (${x.params} instanceof Blob) return [${x.path}, ${x.params}] as const;`,` const ${x.rest} = { ...${x.params} };`,` for (const ${x.key} in ${x.params}) {`,` ${x.path} = ${x.path}.${w(`replace`)}(${t}, () => {`,` delete ${x.rest}[${x.key}];`,` return ${x.params}[${x.key}];`,` });`,` }`,` return [${x.path}, ${x.rest}] as const;`,`}`].join(`
|
|
5
|
-
`)};makePaginationType=()=>{let e=w(`nextCursor`),t=w(`total`),n=w(`limit`),r=w(`offset`),i=`{ ${e}: string | null }`,a=`{ ${t}: number; ${n}: number; ${r}: number }`;return`type ${x.Pagination} = ${i} | ${a}`};makeClientClass=e=>{let t=w(`nextCursor`),n=w(`offset`),r=w(`limit`),i=w(`total`),a=`${x.method}, ...${x.substitute}(${x.path}, ${x.params}), ${x.ctx}`;return[`export class ${e}<T extends Record<string, unknown> = ${x.DefaultContext}> {`,` public constructor(`,` protected readonly ${x.implementation}: ${x.Implementation}<T> = ${x.defaultImplementation},`,` ) {}`,` public ${x.provide}<K extends ${x.Request}>(`,` ${x.request}: K,`,` ${x.params}: ${S.input}[K],`,` ${x.ctx}?: T,`,` ): Promise<${S.
|
|
6
|
-
`)};makeDefaultImplementation=e=>{let t=`${x.method}, ${x.path}, ${x.params}, ${x.ctx}`,n=C([`get`,`head`,`delete`]).join(`, `),r=`!${x.hasBody} || ${x.hasFiles} ? ${x.undefined} : { "Content-Type": ${x.isBlob} ? "${
|
|
4
|
+
`)}\n}`;makeImplementationType=()=>{let e=[`${x.method}: ${x.Method}`,`${x.path}: string`,`${x.params}: Record<string, any>`,`${x.ctx}?: T`].join(`,`);return`export type ${x.Implementation}<T extends Record<string, unknown>> = (${e}) => Promise<{ ${w(`status`)}: number, ${x.data}: any }>;`};makeDefaultContextType=()=>`export type ${x.DefaultContext} = { ${x.override}?: (init: RequestInit) => RequestInit };`;makeParseRequestFn=()=>{let e=`${x.request}: string`,t=`[${x.Method}, ${x.Path}]`,n=`${x.request}.${w(`split`)}(/ (.+)/, 2) as ${t}`;return`const ${x.parseRequest} = (${e}) => ${n};`};makeSubstituteFn=()=>{let e=`${x.path}: string, ${x.params}: Record<string, any>`,t=`\`:\${${x.key}}\``,n=`: [typeof ${x.path}, typeof ${x.params}]`;return[`const ${x.substitute} = (${e})${n} => {`,` if (${x.params} instanceof Blob) return [${x.path}, ${x.params}] as const;`,` const ${x.rest} = { ...${x.params} };`,` for (const ${x.key} in ${x.params}) {`,` ${x.path} = ${x.path}.${w(`replace`)}(${t}, () => {`,` delete ${x.rest}[${x.key}];`,` return ${x.params}[${x.key}];`,` });`,` }`,` return [${x.path}, ${x.rest}] as const;`,`}`].join(`
|
|
5
|
+
`)};makePaginationType=()=>{let e=w(`nextCursor`),t=w(`total`),n=w(`limit`),r=w(`offset`),i=`{ ${e}: string | null }`,a=`{ ${t}: number; ${n}: number; ${r}: number }`;return`type ${x.Pagination} = ${i} | ${a}`};makeClientClass=e=>{let t=w(`nextCursor`),n=w(`offset`),r=w(`limit`),i=w(`total`),a=`${x.method}, ...${x.substitute}(${x.path}, ${x.params}), ${x.ctx}`;return[`export class ${e}<T extends Record<string, unknown> = ${x.DefaultContext}> {`,` public constructor(`,` protected readonly ${x.implementation}: ${x.Implementation}<T> = ${x.defaultImplementation},`,` ) {}`,` public async ${x.provide}<K extends ${x.Request}>(`,` ${x.request}: K,`,` ${x.params}: ${S.input}[K],`,` ${x.ctx}?: T,`,` ): Promise<${S.encoded}[K]> {`,` const [${x.method}, ${x.path}] = ${x.parseRequest}(${x.request});`,` const { ${w(`status`)}, ${x.data} } = await this.${x.implementation}(${a});`,` const ${x.discriminator} = ${e}.${x.discriminate}(${w(`status`)});`,` return { ${w(`status`)}, ${x.data}, ${x.discriminator} } as ${S.encoded}[K];`,` }`,` public static hasMore(${x.response}: ${x.Pagination}): boolean {`,` if ("${t}" in ${x.response}) return ${x.response}.${t} !== null;`,` return ${x.response}.${n} + ${x.response}.${r} < ${x.response}.${i};`,` }`,` public static ${x.discriminate}(${w(`status`)}: number): ${C(Object.values(T)).join(` | `)} {`,` return ${w(`status`)} < 400 ? "${T.success}" : "${T.error}";`,` }`,`}`].join(`
|
|
6
|
+
`)};makeDefaultImplementation=e=>{let t=`${x.method}, ${x.path}, ${x.params}, ${x.ctx}`,n=C([`get`,`head`,`delete`]).join(`, `),r=`!${x.hasBody} || ${x.hasFiles} ? ${x.undefined} : { "Content-Type": ${x.isBlob} ? "${f.raw}" : "${f.json}" };`,i=`${x.response}.${w(`headers`)}.${w(`get`)}("content-type")`,a=`\`?\${new ${URLSearchParams.name}(${x.params})}\``;return[`const ${x.defaultImplementation}: ${x.Implementation}<${x.DefaultContext}> = async (${t}) => {`,` const ${x.isBlob} = ${x.params} instanceof Blob;`,` const ${x.hasFiles} = !${x.isBlob} && Object.${w(`values`)}(${x.params}).${w(`some`)}((one) => one instanceof Blob || one instanceof ${x.File});`,` const ${x.hasBody} = ![${n}].includes(${x.method});`,` const ${x.searchParams} = ${x.isBlob} || ${x.hasBody} ? "" : ${a};`,` const ${x.headers} = ${r}`,` let ${x.body}: RequestInit["${x.body}"] = ${x.undefined};`,` if (${x.hasBody}) {`,` if (${x.isBlob}) {`,` ${x.body} = ${x.params};`,` } else if (${x.hasFiles}) {`,` ${x.body} = new ${FormData.name}();`,` for (const [${x.key}, ${x.value}] of Object.${w(`entries`)}(${x.params}))`,` if (${x.value} !== undefined) ${x.body}.${w(`append`)}(${x.key}, ${x.value});`,` } else {`,` ${x.body} = JSON.${w(`stringify`)}(${x.params});`,` }`,` }`,` let init: RequestInit = {`,` ${w(`method`)}: ${x.method}.${w(`toUpperCase`)}(),`,` ${w(`credentials`)}: ${e?`"include"`:x.undefined},`,` ${x.headers},`,` ${x.body},`,` };`,` if (${x.ctx}?.${x.override}) init = ${x.ctx}.${x.override}(init);`,` const ${x.response} = await ${fetch.name}(`,` new ${URL.name}(\`\${${x.path}}\${${x.searchParams}}\`, "${this.serverUrl}"),`,` init,`,` );`,` const { ${w(`status`)} } = ${x.response};`,` const ${x.contentType} = ${i};`,` if (${x.method} === "head" || !${x.contentType}) return { ${w(`status`)}, data: undefined };`,` const ${x.data} = await (${x.contentType}.${w(`startsWith`)}("${f.json}") ?`,` ${x.response}.${w(`json`)}() : `,` ${x.contentType}.${w(`startsWith`)}("text/") ? `,` ${x.response}.${w(`text`)}() : `,` ${x.response}.${w(`blob`)}());`,` return { ${w(`status`)}, ${x.data} };`,`};`].join(`
|
|
7
7
|
`)};makeSubscriptionClass=(e,t)=>{let n=`${x.substitute}(${x.parseRequest}(${x.request})[1], ${x.params})`,r=`Extract<R, { ${w(`event`)}: E }>["${w(`data`)}"]`,i=`(${x.msg} as ${MessageEvent.name}).${w(`data`)}`;return[`export class ${e}<`,` K extends Extract<${x.Request}, \`get \${string}\`>,`,` R extends Extract<${S.positive}[K], { ${w(`event`)}: string }>,`,`> {`,` public ${x.source}: EventSource;`,` public constructor(${x.request}: K, ${x.params}: ${S.input}[K]) {`,` const [${x.path}, ${x.rest}] = ${n};`,` const ${x.searchParams} = \`?\${new ${URLSearchParams.name}(${x.rest})}\`;`,` this.${x.source} = new EventSource(`,` new URL(\`\${${x.path}}\${${x.searchParams}}\`, "${this.serverUrl}"),`,` { ${w(`withCredentials`)}: ${t?`true`:x.undefined} }`,` );`,` }`,` public ${x.on}<E extends R["${w(`event`)}"]>(`,` ${w(`event`)}: E,`,` ${x.handler}: (${x.data}: ${r}) => void | Promise<void>,`,` ) {`,` this.${x.source}.${w(`addEventListener`)}(${x.event}, (${x.msg}) =>`,` ${x.handler}(JSON.${w(`parse`)}(${i})),`,` );`,` return this;`,` }`,`}`].join(`
|
|
8
|
-
`)};makeUsageStatements=(e,t)=>[`const ${x.client} = new ${e}()
|
|
9
|
-
`)};const
|
|
10
|
-
`)});let v=
|
|
11
|
-
`)}\n}`),Object.assign(t,{[r]:c})},{});this.paths.add(t);let b={input:f,positive:this.someOf(v.positive),negative:this.someOf(v.negative),response:`${S.positive}["${l}"] | ${S.negative}["${l}"]`,encoded:`${v.positive} & ${v.negative}`};this.registry.set(l,{isDeprecated:o,store:b}),this.tags.set(l,c)};m({routing:e,config:t,onEndpoint:f?l(b):b}),this.#e.push(this.makeSomeOfType(),this.makePathType(),this.makeMethodType(),...this.makePublicInterfaces(),this.makeRequestType()),i!==`types`&&(this.#e.push(this.makeEndpointTags(),this.makeParseRequestFn(),this.makeSubstituteFn(),this.makeImplementationType(),this.makePaginationType(),this.makeDefaultContextType(),this.makeDefaultImplementation(h&&y),this.makeClientClass(o),this.makeSubscriptionClass(s,h&&y)),this.#n=this.makeUsageStatements(o,s))}print(e){let t=this.#e.map(t=>typeof t==`function`?t(e):t);return this.#n&&t.push(`// Usage example:\n/*\n${this.#n}*/`),t.join(`
|
|
8
|
+
`)};makeUsageStatements=(e,t)=>[`const ${x.client} = new ${e}();`,`const { ${w(`status`)}, ${x.discriminator}, ${x.data} } = await ${x.client}.${x.provide}("get /v1/user/retrieve", { id: "10" });`,`if (${w(`status`)} === 200) console.log(${x.data}.name); // success`,`else if (${w(`status`)} === 400 || ${x.discriminator} === "${T.error}") console.error(${x.data}.message); // error`,`new ${t}("get /v1/events/stream", {}).${x.on}("time", (time) => {});`].join(`
|
|
9
|
+
`)};const E=b.factory,D=/^[A-Za-z_$][A-Za-z0-9_$]*$/,O=/* @__PURE__ */ new Set([b.SyntaxKind.AnyKeyword,b.SyntaxKind.BigIntKeyword,b.SyntaxKind.BooleanKeyword,b.SyntaxKind.NeverKeyword,b.SyntaxKind.NumberKeyword,b.SyntaxKind.ObjectKeyword,b.SyntaxKind.StringKeyword,b.SyntaxKind.SymbolKeyword,b.SyntaxKind.UndefinedKeyword,b.SyntaxKind.UnknownKeyword,b.SyntaxKind.VoidKeyword]),k=e=>typeof e==`number`?E.createNumericLiteral(e):typeof e==`bigint`?E.createBigIntLiteral(e.toString()):typeof e==`boolean`?e?E.createTrue():E.createFalse():e===null?E.createNull():E.createStringLiteral(e),A=e=>E.createIdentifier(e),j=e=>typeof e==`string`&&D.test(e)?A(e):k(e),M=(e,t)=>typeof e==`number`?E.createKeywordTypeNode(e):typeof e==`string`||b.isIdentifier(e)?E.createTypeReferenceNode(e,t&&y.map(M,t)):e,N=e=>{let t=/* @__PURE__ */ new Map;for(let n of e)t.set(te(n)?n.kind:n,n);return E.createUnionTypeNode(Array.from(t.values()))},te=e=>O.has(e.kind),ne=(e,t)=>b.addSyntheticLeadingComment(e,b.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0),P=(e,t)=>{let n=b.createSourceFile(`print.ts`,``,b.ScriptTarget.Latest,!1,b.ScriptKind.TS);return b.createPrinter(t).printNode(b.EmitHint.Unspecified,e,n)},re=(e,t,{isOptional:n,hasUndefined:r=n,isDeprecated:i,comment:a}={})=>{let o=M(t),s=E.createPropertySignature(void 0,j(e),n?E.createToken(b.SyntaxKind.QuestionToken):void 0,r?N([o,M(b.SyntaxKind.UndefinedKeyword)]):o),c=y.reject(y.isNil,[i?`@deprecated`:void 0,a]);return c.length?ne(s,c.join(` `)):s},F=e=>E.createLiteralTypeNode(k(e)),I=(e,{rules:t,onMissing:r,ctx:i={}})=>{let a=n(e),o=a&&a in t?t[a]:t[e._zod.def.type],s=e=>I(e,{ctx:i,rules:t,onMissing:r});return o?o(e,{...i,next:s}):r(e,i)},L={name:y.path([`name`,`text`]),type:y.path([`type`]),optional:y.path([`questionToken`])},R=({_zod:{def:e}})=>{let t=e.values.map(e=>e===void 0?M(b.SyntaxKind.UndefinedKeyword):F(e));return t.length===1?t[0]:N(t)},z=({_zod:{def:e}},{next:t})=>{let{parts:n}=e,i=0,a=()=>{let e=``;for(;i<n.length;){let t=n[i];if(r(t))break;i++,e+=t??``}return e},o=E.createTemplateHead(a()),s=[];for(;i<n.length;){let e=t(n[i++]),r=a(),o=i<n.length?E.createTemplateMiddle:E.createTemplateTail;s.push(E.createTemplateLiteralTypeSpan(e,o(r)))}return s.length?E.createTemplateLiteralType(o,s):F(o.text)},B=(e,{isResponse:t,next:n})=>{let r=Object.entries(e._zod.def.shape).map(([e,r])=>{let{description:i,deprecated:a}=_.get(r)||{},o=(t?r._zod.optout:r._zod.optin)!==void 0,s=o&&!(r instanceof v.core.$ZodExactOptional);return re(e,n(r),{comment:i,isDeprecated:a,isOptional:o,hasUndefined:s})});return E.createTypeLiteralNode(r)},V=({_zod:{def:e}},{next:t})=>E.createArrayTypeNode(t(e.element)),H=({_zod:{def:e}})=>N(y.map(F,Object.values(e.entries))),U=({_zod:{def:e}},{next:t})=>N(e.options.map(t)),W=({_zod:{def:e}},{next:t})=>N([t(e.innerType),F(null)]),G=({_zod:{def:e}},{next:t})=>E.createTupleTypeNode(e.items.map(t).concat(e.rest===null?[]:E.createRestTypeNode(t(e.rest)))),K=({_zod:{def:e}},{next:t})=>{let[n,r]=[e.keyType,e.valueType].map(t),i=M(`Record`,[n,r]);return e.mode===`loose`?E.createIntersectionTypeNode([i,M(`Record`,[`PropertyKey`,r])]):i},q=y.tryCatch(e=>{if(!e.every(b.isTypeLiteralNode))throw Error(`Not objects`);let t=y.chain(y.prop(`members`),e),n=y.uniqWith((...e)=>{if(!y.eqBy(L.name,...e))return!1;if(y.both(y.eqBy(L.type),y.eqBy(L.optional))(...e))return!0;throw Error(`Has conflicting prop`)},t);return E.createTypeLiteralNode(n)},(e,t)=>E.createIntersectionTypeNode(t)),J=({_zod:{def:e}},{next:t})=>q([e.left,e.right].map(t)),Y=e=>()=>M(e),X=({_zod:{def:e}},{next:t})=>t(e.innerType),Z=e=>M(e?b.SyntaxKind.UnknownKeyword:b.SyntaxKind.AnyKeyword),ie=({_zod:{def:e}},{next:t,isResponse:n})=>{let a=e[n?`out`:`in`],o=e[n?`in`:`out`];if(!r(a,`transform`))return t(a);let s=t(o),c={[b.SyntaxKind.AnyKeyword]:``,[b.SyntaxKind.BigIntKeyword]:BigInt(0),[b.SyntaxKind.BooleanKeyword]:!1,[b.SyntaxKind.NumberKeyword]:0,[b.SyntaxKind.ObjectKeyword]:{},[b.SyntaxKind.StringKeyword]:``,[b.SyntaxKind.UndefinedKeyword]:void 0}[s.kind],l=i(a,c),u={number:b.SyntaxKind.NumberKeyword,bigint:b.SyntaxKind.BigIntKeyword,boolean:b.SyntaxKind.BooleanKeyword,string:b.SyntaxKind.StringKeyword,undefined:b.SyntaxKind.UndefinedKeyword,object:b.SyntaxKind.ObjectKeyword};return M(l&&u[l]||Z(n))},ae=()=>F(null),oe=({_zod:{def:e}},{next:t})=>t(e.getter()),se=()=>M(`Blob`),Q=(e,{next:t})=>t(e._zod.def.shape.raw),ce={string:Y(b.SyntaxKind.StringKeyword),number:Y(b.SyntaxKind.NumberKeyword),bigint:Y(b.SyntaxKind.BigIntKeyword),boolean:Y(b.SyntaxKind.BooleanKeyword),any:Y(b.SyntaxKind.AnyKeyword),undefined:Y(b.SyntaxKind.UndefinedKeyword),[a]:Y(b.SyntaxKind.StringKeyword),[c]:Y(b.SyntaxKind.StringKeyword),never:Y(b.SyntaxKind.NeverKeyword),void:Y(b.SyntaxKind.UndefinedKeyword),unknown:Y(b.SyntaxKind.UnknownKeyword),null:ae,array:V,tuple:G,record:K,object:B,literal:R,template_literal:z,intersection:J,union:U,default:X,enum:H,optional:X,nonoptional:X,nullable:W,catch:X,pipe:ie,lazy:oe,readonly:X,[t]:se,[s]:Q},le=e=>(t,n)=>{let i=()=>e(t,n);return r(t,`lazy`)?n.makeAlias(t._zod.def.getter,i):r(t,`object`)&&h(t,{io:n.isResponse?`output`:`input`})?n.makeAlias(t,i):i()},$=(e,{brandHandling:t,ctx:n})=>{let r={...t,...ce};for(let e of[`object`,`lazy`])r[e]=le(r[e]);return I(e,{rules:r,onMissing:({},{isResponse:e})=>Z(e),ctx:n})};var ue=class extends ee{#e=[];#t=/* @__PURE__ */ new Map([[!1,/* @__PURE__ */ new Map],[!0,/* @__PURE__ */ new Map]]);#n;#r(e,t,n){let r=this.#t.get(e),i=r.get(t);if(!i){i=`${e?`Response`:`Input`}Type${r.size+1}`,r.set(t,i);let a=n();this.#e.push(e=>`type ${i} = ${P(a,e)};`)}return M(i)}constructor({routing:t,config:n,brandHandling:r,variant:i=`client`,clientClassName:a=`Client`,subscriptionClassName:s=`Subscription`,serverUrl:c=`https://example.com`,noBodySchema:f=v.undefined(),hasHeadMethod:m=!0,hasCredentials:h=!1}){super(c);let g={brandHandling:r,ctx:{isResponse:!1,makeAlias:this.#r.bind(this,!1)}},_={brandHandling:r,ctx:{isResponse:!0,makeAlias:this.#r.bind(this,!0)}},y=!1,b=(t,n,r)=>{let i=o.bind(null,t,n),{isDeprecated:a,inputSchema:s,tags:c}=r,l=`${t} ${n}`,p=i(`input`),m=d(r.security,`cookie`);m.size&&(y=!0);let h=$(s,g);this.#e.push(e=>{let t=P(h,e);return[`/** ${l} */`,`type ${p} = ${m.size?this.makeOmit(t,m,`security cookies`):t};`].join(`
|
|
10
|
+
`)});let v={positive:/* @__PURE__ */ new Set,negative:/* @__PURE__ */ new Set,encoded:/* @__PURE__ */ new Set};for(let n of u){let a=r.getResponses(n);for(let[r,{schema:o,mimeTypes:s,statusCodes:c}]of a.entries()){let a=e(t,s),u=i(n,`variant`,`${r+1}`),d=$(a?o:f,_);this.#e.push(e=>`/** ${l} */\ntype ${u} = ${P(d,e)};`),v[n].add(u),v.encoded.add(this.makeDiscriminator(c,n,u))}}this.paths.add(n);let b={input:p,positive:Array.from(v.positive).join(` | `),negative:Array.from(v.negative).join(` | `),response:`${S.encoded}["${l}"]["data"]`,encoded:Array.from(v.encoded).join(` | `)};this.registry.set(l,{isDeprecated:a,store:b}),this.tags.set(l,c)};p({routing:t,config:n,onEndpoint:m?l(b):b}),this.#e.push(this.makePathType(),this.makeMethodType(),...this.makePublicInterfaces(),this.makeRequestType()),i!==`types`&&(this.#e.push(this.makeEndpointTags(),this.makeParseRequestFn(),this.makeSubstituteFn(),this.makeImplementationType(),this.makePaginationType(),this.makeDefaultContextType(),this.makeDefaultImplementation(h&&y),this.makeClientClass(a),this.makeSubscriptionClass(s,h&&y)),this.#n=this.makeUsageStatements(a,s))}print(e){let t=this.#e.map(t=>typeof t==`function`?t(e):t);return this.#n&&t.push(`// Usage example:\n/*\n${this.#n}*/`),t.join(`
|
|
12
11
|
|
|
13
|
-
`)}async printFormatted({printerOptions:e,format:t}={}){let n=t;if(!n){try{let e=g(`prettier`).format;n=t=>e(t,{filepath:`client.ts`})}catch{}try{let e=g(`oxfmt`).format;n=async t=>{let{code:n,errors:r}=await e(`client.ts`,t);if(r.length)throw Error(`OxFmt failed to format the code`,{cause:r});return n}}catch{}}this.#n&&n&&(this.#n=await n(this.#n));let r=this.print(e);return n?n(r):r}};export{
|
|
12
|
+
`)}async printFormatted({printerOptions:e,format:t}={}){let n=t;if(!n){try{let e=g(`prettier`).format;n=t=>e(t,{filepath:`client.ts`})}catch{}try{let e=g(`oxfmt`).format;n=async t=>{let{code:n,errors:r}=await e(`client.ts`,t);if(r.length)throw Error(`OxFmt failed to format the code`,{cause:r});return n}}catch{}}this.#n&&n&&(this.#n=await n(this.#n));let r=this.print(e);return n?n(r):r}};export{ue as Integration};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{E as e}from"./routing-walker-
|
|
1
|
+
import{E as e}from"./routing-walker-BpLERmiE.js";import{createRequire as t}from"node:module";let n;const r=(r,i=`default`)=>{try{let e=(n??=t(import.meta.url))(r);return i==="default"?e.default===void 0?e:e.default:e[i]}catch{throw new e(r)}};export{r as t};
|