better-call 0.0.5-beta.7 → 0.0.5-beta.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";var l=Object.defineProperty;var D=Object.getOwnPropertyDescriptor;var g=Object.getOwnPropertyNames;var P=Object.prototype.hasOwnProperty;var S=(t,e,n)=>e in t?l(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n;var b=(t,e)=>{for(var n in e)l(t,n,{get:e[n],enumerable:!0})},M=(t,e,n,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let d of g(e))!P.call(t,d)&&d!==n&&l(t,d,{get:()=>e[d],enumerable:!(s=D(e,d))||s.enumerable});return t};var U=t=>M(l({},"__esModule",{value:!0}),t);var m=(t,e,n)=>S(t,typeof e!="symbol"?e+"":e,n);var G={};b(G,{APIError:()=>R,createEndpoint:()=>f,createEndpointCreator:()=>B,createMiddleware:()=>H,createMiddlewareCreator:()=>L,createRouter:()=>F,getBody:()=>y,shouldSerialize:()=>T,statusCode:()=>h});module.exports=U(G);var N=require("zod");var Y=require("zod");function H(t,e){if(typeof t=="function")return f("*",{method:"*"},t);if(!e)throw new Error("Middleware handler is required");return f("*",{...t,method:"*"},e)}var L=()=>{function t(e,n){if(typeof e=="function")return f("*",{method:"*"},e);if(!n)throw new Error("Middleware handler is required");return f("*",{...e,method:"*"},n)}return{createMiddleware:t}};var R=class extends Error{constructor(n,s){super(`API Error: ${n} ${s?.message??""}`,{cause:s});m(this,"status");m(this,"body");this.status=n,this.body=s??{},this.stack="",this.name="BetterCallAPIError"}};function B(){return(t,e,n)=>f(t,e,n)}function f(t,e,n){let s=new Headers,d=async(...o)=>{let r={setHeader(a,i){s.set(a,i)},setCookie(a,i){s.append("Set-Cookie",`${a}=${i}`)},getCookie(a){return o[0]?.headers?.get("cookie")?.split(";").find(c=>c.startsWith(`${a}=`))?.split("=")[1]},...o[0]||{},context:{}};if(e.use?.length)for(let a of e.use){let i=await a(r),c=i.options?.body?i.options.body.parse(r.body):void 0;i&&(r={...r,body:c?{...c,...r.body}:r.body,context:{...r.context||{},...i}})}try{let a=e.body?e.body.parse(r.body):r.body;r={...r,body:a?{...a,...r.body}:r.body},r.query=e.query?e.query.parse(r.query):r.query,r.params=e.params?e.params.parse(r.params):r.params}catch(a){throw a instanceof N.ZodError?new R("BAD_REQUEST",{message:a.message,details:a.errors}):a}if(e.requireHeaders&&!r.headers)throw new R("BAD_REQUEST",{message:"Headers are required"});if(e.requireRequest&&!r.request)throw new R("BAD_REQUEST",{message:"Request is required"});return await n(r)};return d.path=t,d.options=e,d.method=e.method,d.headers=s,d}var E=require("rou3");async function y(t){let e=t.headers.get("content-type")||"";if(t.body){if(e.includes("application/json"))return await t.json();if(e.includes("application/x-www-form-urlencoded")){let n=await t.formData(),s={};return n.forEach((d,o)=>{s[o]=d.toString()}),s}if(e.includes("multipart/form-data")){let n=await t.formData(),s={};return n.forEach((d,o)=>{s[o]=d}),s}return e.includes("text/plain")?await t.text():e.includes("application/octet-stream")?await t.arrayBuffer():e.includes("application/pdf")||e.includes("image/")||e.includes("video/")?await t.blob():e.includes("application/stream")||t.body instanceof ReadableStream?t.body:await t.text()}}function T(t){return typeof t=="object"&&t!==null&&!(t instanceof Blob)&&!(t instanceof FormData)}var h={OK:200,CREATED:201,ACCEPTED:202,NO_CONTENT:204,MULTIPLE_CHOICES:300,MOVED_PERMANENTLY:301,FOUND:302,SEE_OTHER:303,NOT_MODIFIED:304,TEMPORARY_REDIRECT:307,BAD_REQUEST:400,UNAUTHORIZED:401,PAYMENT_REQUIRED:402,FORBIDDEN:403,NOT_FOUND:404,METHOD_NOT_ALLOWED:405,NOT_ACCEPTABLE:406,PROXY_AUTHENTICATION_REQUIRED:407,REQUEST_TIMEOUT:408,CONFLICT:409,GONE:410,LENGTH_REQUIRED:411,PRECONDITION_FAILED:412,PAYLOAD_TOO_LARGE:413,URI_TOO_LONG:414,UNSUPPORTED_MEDIA_TYPE:415,RANGE_NOT_SATISFIABLE:416,EXPECTATION_FAILED:417,"I'M_A_TEAPOT":418,MISDIRECTED_REQUEST:421,UNPROCESSABLE_ENTITY:422,LOCKED:423,FAILED_DEPENDENCY:424,TOO_EARLY:425,UPGRADE_REQUIRED:426,PRECONDITION_REQUIRED:428,TOO_MANY_REQUESTS:429,REQUEST_HEADER_FIELDS_TOO_LARGE:431,UNAVAILABLE_FOR_LEGAL_REASONS:451,INTERNAL_SERVER_ERROR:500,NOT_IMPLEMENTED:501,BAD_GATEWAY:502,SERVICE_UNAVAILABLE:503,GATEWAY_TIMEOUT:504,HTTP_VERSION_NOT_SUPPORTED:505,VARIANT_ALSO_NEGOTIATES:506,INSUFFICIENT_STORAGE:507,LOOP_DETECTED:508,NOT_EXTENDED:510,NETWORK_AUTHENTICATION_REQUIRED:511};var F=(t,e)=>{let n=(0,E.createRouter)();for(let o of t)if(Array.isArray(o.options?.method))for(let r of o.options.method)(0,E.addRoute)(n,r,o.path,o);else(0,E.addRoute)(n,o.options.method,o.path,o);let s=(0,E.createRouter)();for(let o of e?.routerMiddleware||[])(0,E.addRoute)(s,"*",o.path,o.middleware);return{handler:async o=>{let r=new URL(o.url),O=r.pathname;e?.basePath&&(O=O.split(e.basePath)[1]);let a=o.method,i=(0,E.findRoute)(n,a,O),c=i?.data,x=await y(o),w=o.headers,_=Object.fromEntries(r.searchParams),A=(0,E.findRoute)(s,"*",O)?.data;if(!c)return new Response(null,{status:404,statusText:"Not Found"});try{let p={};if(A){let I=await A({path:O,method:a,headers:w,params:i?.params,request:o,body:x,query:_});I&&(p={...I,...p})}let u=await c({path:O,method:a,headers:w,params:i?.params,request:o,body:x,query:_,...p});if(u instanceof Response)return u;let C=T(u)?JSON.stringify(u):u;return new Response(C,{headers:c.headers})}catch(p){if(e?.onError){let u=await e.onError(p);if(u instanceof Response)return u}if(p instanceof R)return new Response(p.body?JSON.stringify(p.body):null,{status:h[p.status],statusText:p.status,headers:{"Content-Type":"application/json"}});if(e?.throwError)throw p;return new Response(null,{status:500,statusText:"Internal Server Error"})}}}};0&&(module.exports={APIError,createEndpoint,createEndpointCreator,createMiddleware,createMiddlewareCreator,createRouter,getBody,shouldSerialize,statusCode});
1
+ "use strict";var m=Object.defineProperty;var A=Object.getOwnPropertyDescriptor;var b=Object.getOwnPropertyNames;var S=Object.prototype.hasOwnProperty;var N=(t,e,n)=>e in t?m(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n;var D=(t,e)=>{for(var n in e)m(t,n,{get:e[n],enumerable:!0})},H=(t,e,n,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let d of b(e))!S.call(t,d)&&d!==n&&m(t,d,{get:()=>e[d],enumerable:!(s=A(e,d))||s.enumerable});return t};var U=t=>H(m({},"__esModule",{value:!0}),t);var x=(t,e,n)=>N(t,typeof e!="symbol"?e+"":e,n);var Q={};D(Q,{APIError:()=>f,createEndpoint:()=>O,createEndpointCreator:()=>L,createMiddleware:()=>M,createMiddlewareCreator:()=>q,createRouter:()=>B,getBody:()=>h,shouldSerialize:()=>c,statusCode:()=>l});module.exports=U(Q);var w=require("zod");var k=require("zod");function M(t,e){if(typeof t=="function")return O("*",{method:"*"},t);if(!e)throw new Error("Middleware handler is required");return O("*",{...t,method:"*"},e)}var q=()=>{function t(e,n){if(typeof e=="function")return O("*",{method:"*"},e);if(!n)throw new Error("Middleware handler is required");return O("*",{...e,method:"*"},n)}return t};var f=class extends Error{constructor(n,s){super(`API Error: ${n} ${s?.message??""}`,{cause:s});x(this,"status");x(this,"body");this.status=n,this.body=s??{},this.stack="",this.name="BetterCallAPIError"}};function L(){return(t,e,n)=>O(t,e,n)}function O(t,e,n){let s=new Headers,d=async(...o)=>{let r={setHeader(a,i){s.set(a,i)},setCookie(a,i){s.append("Set-Cookie",`${a}=${i}`)},getCookie(a){return o[0]?.headers?.get("cookie")?.split(";").find(u=>u.startsWith(`${a}=`))?.split("=")[1]},...o[0]||{},context:{}};if(e.use?.length)for(let a of e.use){let i=await a(r),u=i.options?.body?i.options.body.parse(r.body):void 0;i&&(r={...r,body:u?{...u,...r.body}:r.body,context:{...r.context||{},...i}})}try{let a=e.body?e.body.parse(r.body):r.body;r={...r,body:a?{...a,...r.body}:r.body},r.query=e.query?e.query.parse(r.query):r.query,r.params=e.params?e.params.parse(r.params):r.params}catch(a){throw a instanceof w.ZodError?new f("BAD_REQUEST",{message:a.message,details:a.errors}):a}if(e.requireHeaders&&!r.headers)throw new f("BAD_REQUEST",{message:"Headers are required"});if(e.requireRequest&&!r.request)throw new f("BAD_REQUEST",{message:"Request is required"});return await n(r)};return d.path=t,d.options=e,d.method=e.method,d.headers=s,d}var E=require("rou3");async function h(t){let e=t.headers.get("content-type")||"";if(t.body){if(e.includes("application/json"))return await t.json();if(e.includes("application/x-www-form-urlencoded")){let n=await t.formData(),s={};return n.forEach((d,o)=>{s[o]=d.toString()}),s}if(e.includes("multipart/form-data")){let n=await t.formData(),s={};return n.forEach((d,o)=>{s[o]=d}),s}return e.includes("text/plain")?await t.text():e.includes("application/octet-stream")?await t.arrayBuffer():e.includes("application/pdf")||e.includes("image/")||e.includes("video/")?await t.blob():e.includes("application/stream")||t.body instanceof ReadableStream?t.body:await t.text()}}function c(t){return typeof t=="object"&&t!==null&&!(t instanceof Blob)&&!(t instanceof FormData)}var l={OK:200,CREATED:201,ACCEPTED:202,NO_CONTENT:204,MULTIPLE_CHOICES:300,MOVED_PERMANENTLY:301,FOUND:302,SEE_OTHER:303,NOT_MODIFIED:304,TEMPORARY_REDIRECT:307,BAD_REQUEST:400,UNAUTHORIZED:401,PAYMENT_REQUIRED:402,FORBIDDEN:403,NOT_FOUND:404,METHOD_NOT_ALLOWED:405,NOT_ACCEPTABLE:406,PROXY_AUTHENTICATION_REQUIRED:407,REQUEST_TIMEOUT:408,CONFLICT:409,GONE:410,LENGTH_REQUIRED:411,PRECONDITION_FAILED:412,PAYLOAD_TOO_LARGE:413,URI_TOO_LONG:414,UNSUPPORTED_MEDIA_TYPE:415,RANGE_NOT_SATISFIABLE:416,EXPECTATION_FAILED:417,"I'M_A_TEAPOT":418,MISDIRECTED_REQUEST:421,UNPROCESSABLE_ENTITY:422,LOCKED:423,FAILED_DEPENDENCY:424,TOO_EARLY:425,UPGRADE_REQUIRED:426,PRECONDITION_REQUIRED:428,TOO_MANY_REQUESTS:429,REQUEST_HEADER_FIELDS_TOO_LARGE:431,UNAVAILABLE_FOR_LEGAL_REASONS:451,INTERNAL_SERVER_ERROR:500,NOT_IMPLEMENTED:501,BAD_GATEWAY:502,SERVICE_UNAVAILABLE:503,GATEWAY_TIMEOUT:504,HTTP_VERSION_NOT_SUPPORTED:505,VARIANT_ALSO_NEGOTIATES:506,INSUFFICIENT_STORAGE:507,LOOP_DETECTED:508,NOT_EXTENDED:510,NETWORK_AUTHENTICATION_REQUIRED:511};var B=(t,e)=>{let n=(0,E.createRouter)();for(let o of t)if(Array.isArray(o.options?.method))for(let r of o.options.method)(0,E.addRoute)(n,r,o.path,o);else(0,E.addRoute)(n,o.options.method,o.path,o);let s=(0,E.createRouter)();for(let o of e?.routerMiddleware||[])(0,E.addRoute)(s,"*",o.path,o.middleware);return{handler:async o=>{let r=new URL(o.url),R=r.pathname;e?.basePath&&(R=R.split(e.basePath)[1]);let a=o.method,i=(0,E.findRoute)(n,a,R),u=i?.data,P=await h(o),T=o.headers,I=Object.fromEntries(r.searchParams),_=(0,E.findRoute)(s,"*",R)?.data;if(!u)return new Response(null,{status:404,statusText:"Not Found"});try{let p={};if(_){let C=await _({path:R,method:a,headers:T,params:i?.params,request:o,body:P,query:I});C&&(p={...C,...p})}let y=await u({path:R,method:a,headers:T,params:i?.params,request:o,body:P,query:I,...p});if(y instanceof Response)return y;let g=c(y)?JSON.stringify(y):y;return new Response(g,{headers:u.headers})}catch(p){if(e?.onError){let y=await e.onError(p);if(y instanceof Response)return y}if(p instanceof f)return new Response(p.body?JSON.stringify(p.body):null,{status:l[p.status],statusText:p.status,headers:{"Content-Type":"application/json"}});if(e?.throwError)throw p;return new Response(null,{status:500,statusText:"Internal Server Error"})}}}};var ne=require("zod");0&&(module.exports={APIError,createEndpoint,createEndpointCreator,createMiddleware,createMiddlewareCreator,createRouter,getBody,shouldSerialize,statusCode});
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/endpoint.ts","../src/middleware.ts","../src/better-call-error.ts","../src/router.ts","../src/utils.ts"],"sourcesContent":["export * from \"./endpoint\"\nexport * from \"./router\"\nexport * from \"./middleware\"\nexport * from \"./better-call-error\"\nexport * from \"./utils\"","import { z, ZodError, type ZodOptional, type ZodSchema } from \"zod\"\nimport { createMiddleware, type Middleware } from \"./middleware\"\nimport { APIError } from \"./better-call-error\";\nimport type { HasRequiredKeys, UnionToIntersection } from \"./helper\";\nimport type { Context, ContextTools, Endpoint, EndpointOptions, EndpointResponse, Handler } from \"./types\";\n\n\nexport interface EndpointConfig {\n /**\n * Throw when the response isn't in 200 range\n */\n throwOnError?: boolean\n}\n\nexport function createEndpointCreator<T extends Record<string, any>>() {\n return <Path extends string, Opts extends EndpointOptions, R extends EndpointResponse>(path: Path, options: Opts, handler: Handler<Path, Opts, R, T>) => {\n //@ts-expect-error\n return createEndpoint(path, options, handler)\n }\n\n}\n\nexport function createEndpoint<Path extends string, Opts extends EndpointOptions, R extends EndpointResponse>(path: Path, options: Opts, handler: Handler<Path, Opts, R>) {\n const responseHeader = new Headers()\n type Ctx = Context<Path, Opts>\n const handle = async (...ctx: HasRequiredKeys<Ctx> extends true ? [Ctx] : [Ctx?]) => {\n let internalCtx = ({\n setHeader(key: string, value: string) {\n responseHeader.set(key, value)\n },\n setCookie(key: string, value: string) {\n responseHeader.append(\"Set-Cookie\", `${key}=${value}`)\n },\n getCookie(key: string) {\n const header = ctx[0]?.headers\n return header?.get(\"cookie\")?.split(\";\").find(cookie => cookie.startsWith(`${key}=`))?.split(\"=\")[1]\n },\n ...(ctx[0] || {}),\n context: {}\n })\n if (options.use?.length) {\n for (const middleware of options.use) {\n const res = await middleware(internalCtx) as Endpoint\n const body = res.options?.body ? res.options.body.parse(internalCtx.body) : undefined\n if (res) {\n internalCtx = {\n ...internalCtx,\n body: body ? {\n ...body,\n ...internalCtx.body\n } : internalCtx.body,\n context: {\n ...internalCtx.context || {},\n ...res\n }\n }\n }\n }\n }\n try {\n const body = options.body ? options.body.parse(internalCtx.body) : internalCtx.body\n internalCtx = {\n ...internalCtx,\n body: body ? {\n ...body,\n ...internalCtx.body\n } : internalCtx.body,\n }\n internalCtx.query = options.query ? options.query.parse(internalCtx.query) : internalCtx.query\n internalCtx.params = options.params ? options.params.parse(internalCtx.params) : internalCtx.params\n } catch (e) {\n if (e instanceof ZodError) {\n throw new APIError(\"BAD_REQUEST\", {\n message: e.message,\n details: e.errors\n })\n }\n throw e\n }\n if (options.requireHeaders && !internalCtx.headers) {\n throw new APIError(\"BAD_REQUEST\", {\n message: \"Headers are required\"\n })\n }\n if (options.requireRequest && !internalCtx.request) {\n throw new APIError(\"BAD_REQUEST\", {\n message: \"Request is required\"\n })\n }\n //@ts-expect-error\n const res = await handler(internalCtx)\n return res as ReturnType<Handler<Path, Opts, R>>\n }\n handle.path = path\n handle.options = options\n handle.method = options.method\n handle.headers = responseHeader\n return handle\n}","import { z } from \"zod\"\nimport type { ContextTools, Endpoint, EndpointOptions, EndpointResponse, Handler, InferBody, InferHeaders, InferRequest, Prettify } from \"./types\"\nimport { createEndpoint } from \"./endpoint\"\n\nexport type MiddlewareHandler<Opts extends EndpointOptions, R extends EndpointResponse, Extra extends Record<string, any> = {}> = (ctx: Prettify<InferBody<Opts> & InferRequest<Opts> & InferHeaders<Opts> & {\n params?: Record<string, string>,\n query?: Record<string, string>,\n} & ContextTools> & Extra) => Promise<R>\n\nexport function createMiddleware<Opts extends EndpointOptions, R extends EndpointResponse>(optionsOrHandler: MiddlewareHandler<Opts, R>): Endpoint<Handler<string, Opts, R>, Opts>\nexport function createMiddleware<Opts extends Omit<EndpointOptions, \"method\">, R extends EndpointResponse>(optionsOrHandler: Opts, handler: MiddlewareHandler<Opts & {\n method: \"*\"\n}, R>): Endpoint<Handler<string, Opts & {\n method: \"*\"\n}, R>, Opts & {\n method: \"*\"\n}>\nexport function createMiddleware(optionsOrHandler: any, handler?: any) {\n if (typeof optionsOrHandler === \"function\") {\n return createEndpoint(\"*\", {\n method: \"*\"\n }, optionsOrHandler)\n }\n if (!handler) {\n throw new Error(\"Middleware handler is required\")\n }\n const endpoint = createEndpoint(\"*\", {\n ...optionsOrHandler,\n method: \"*\"\n }, handler)\n return endpoint as any\n}\n\nexport const createMiddlewareCreator = <ExtraContext extends Record<string, any> = {}>() => {\n function fn<Opts extends EndpointOptions, R extends EndpointResponse>(optionsOrHandler: MiddlewareHandler<Opts, R, ExtraContext>): Endpoint<Handler<string, Opts, R>, Opts>\n function fn<Opts extends Omit<EndpointOptions, \"method\">, R extends EndpointResponse>(optionsOrHandler: Opts, handler: MiddlewareHandler<Opts & {\n method: \"*\"\n }, R, ExtraContext>): Endpoint<Handler<string, Opts & {\n method: \"*\"\n }, R>, Opts & {\n method: \"*\"\n }>\n function fn(optionsOrHandler: any, handler?: any) {\n if (typeof optionsOrHandler === \"function\") {\n return createEndpoint(\"*\", {\n method: \"*\"\n }, optionsOrHandler)\n }\n if (!handler) {\n throw new Error(\"Middleware handler is required\")\n }\n const endpoint = createEndpoint(\"*\", {\n ...optionsOrHandler,\n method: \"*\"\n }, handler)\n return endpoint as any\n }\n return { createMiddleware: fn }\n}\n\nexport type Middleware<Opts extends EndpointOptions = EndpointOptions, R extends EndpointResponse = EndpointResponse> = (opts: Opts, handler: (ctx: {\n body?: InferBody<Opts>,\n params?: Record<string, string>,\n query?: Record<string, string>\n}) => Promise<R>) => Endpoint","import type { statusCode } from \"./utils\"\n\ntype Status = keyof typeof statusCode\n\nexport class APIError extends Error {\n status: Status\n body: Record<string, any>\n constructor(\n status: Status,\n body?: Record<string, any>,\n ) {\n super(\n `API Error: ${status} ${body?.message ?? \"\"}`,\n {\n cause: body,\n }\n )\n this.status = status\n this.body = body ?? {}\n this.stack = \"\";\n this.name = \"BetterCallAPIError\"\n }\n}","import {\n createRouter as createRou3Router,\n addRoute,\n findRoute,\n} from \"rou3\";\nimport { getBody, shouldSerialize, statusCode } from \"./utils\";\nimport { APIError } from \"./better-call-error\";\nimport type { Middleware, MiddlewareHandler } from \"./middleware\";\nimport type { Endpoint, Method } from \"./types\";\n\ninterface RouterConfig {\n /**\n * Throw error if error occurred other than APIError\n */\n throwError?: boolean\n /**\n * Handle error\n */\n onError?: (e: unknown) => void | Promise<void> | Response | Promise<Response>\n /**\n * Base path for the router\n */\n basePath?: string\n /**\n * Middlewares for the router\n */\n routerMiddleware?: {\n path: string,\n middleware: Endpoint\n }[]\n}\n\nexport const createRouter = <E extends Endpoint, Config extends RouterConfig>(endpoints: E[], config?: Config) => {\n const router = createRou3Router()\n for (const endpoint of endpoints) {\n if (Array.isArray(endpoint.options?.method)) {\n for (const method of endpoint.options.method) {\n addRoute(router, method, endpoint.path, endpoint)\n }\n } else {\n addRoute(router, endpoint.options.method, endpoint.path, endpoint)\n }\n }\n\n const middlewareRouter = createRou3Router()\n for (const route of (config?.routerMiddleware || [])) {\n addRoute(middlewareRouter, \"*\", route.path, route.middleware)\n }\n\n const handler = async (request: Request) => {\n const url = new URL(request.url);\n let path = url.pathname\n if (config?.basePath) {\n path = path.split(config.basePath)[1]\n }\n const method = request.method;\n const route = findRoute(router, method, path)\n const handler = route?.data as Endpoint\n const body = await getBody(request)\n const headers = request.headers\n const query = Object.fromEntries(url.searchParams)\n const middleware = findRoute(middlewareRouter, \"*\", path)?.data as Endpoint | undefined\n //handler 404\n if (!handler) {\n return new Response(null, {\n status: 404,\n statusText: \"Not Found\"\n })\n }\n try {\n let middlewareContext: Record<string, any> = {}\n if (middleware) {\n const res = await middleware({\n path: path,\n method: method as \"GET\",\n headers,\n params: route?.params as any,\n request: request,\n body: body,\n query\n })\n if (res) {\n middlewareContext = {\n ...res,\n ...middlewareContext\n }\n }\n }\n const handlerRes = await handler({\n path: path,\n method: method as \"GET\",\n headers,\n params: route?.params as any,\n request: request,\n body: body,\n query,\n ...middlewareContext,\n })\n if (handlerRes instanceof Response) {\n return handlerRes\n }\n const resBody = shouldSerialize(handlerRes) ? JSON.stringify(handlerRes) : handlerRes\n return new Response(resBody as any, {\n headers: handler.headers\n })\n } catch (e) {\n if (config?.onError) {\n const onErrorRes = await config.onError(e)\n if (onErrorRes instanceof Response) {\n return onErrorRes\n }\n }\n if (e instanceof APIError) {\n return new Response(e.body ? JSON.stringify(e.body) : null, {\n status: statusCode[e.status],\n statusText: e.status,\n headers: {\n \"Content-Type\": \"application/json\",\n }\n })\n }\n if (config?.throwError) {\n throw e\n }\n return new Response(null, {\n status: 500,\n statusText: \"Internal Server Error\"\n })\n }\n }\n return {\n handler\n }\n}","export async function getBody(request: Request) {\n const contentType = request.headers.get('content-type') || '';\n\n if (!request.body) {\n return undefined\n }\n\n if (contentType.includes('application/json')) {\n return await request.json();\n }\n\n if (contentType.includes('application/x-www-form-urlencoded')) {\n const formData = await request.formData();\n const result: Record<string, string> = {};\n formData.forEach((value, key) => {\n result[key] = value.toString();\n });\n return result;\n }\n\n if (contentType.includes('multipart/form-data')) {\n const formData = await request.formData();\n const result: Record<string, any> = {};\n formData.forEach((value, key) => {\n result[key] = value;\n });\n return result;\n }\n\n if (contentType.includes('text/plain')) {\n return await request.text();\n }\n\n if (contentType.includes('application/octet-stream')) {\n return await request.arrayBuffer();\n }\n\n if (contentType.includes('application/pdf') || contentType.includes('image/') || contentType.includes('video/')) {\n const blob = await request.blob();\n return blob;\n }\n\n if (contentType.includes('application/stream') || request.body instanceof ReadableStream) {\n return request.body;\n }\n\n return await request.text();\n}\n\n\nexport function shouldSerialize(body: any) {\n return typeof body === \"object\" && body !== null && !(body instanceof Blob) && !(body instanceof FormData)\n}\n\nexport const statusCode = {\n \"OK\": 200,\n \"CREATED\": 201,\n \"ACCEPTED\": 202,\n \"NO_CONTENT\": 204,\n \"MULTIPLE_CHOICES\": 300,\n \"MOVED_PERMANENTLY\": 301,\n \"FOUND\": 302,\n \"SEE_OTHER\": 303,\n \"NOT_MODIFIED\": 304,\n \"TEMPORARY_REDIRECT\": 307,\n \"BAD_REQUEST\": 400,\n \"UNAUTHORIZED\": 401,\n \"PAYMENT_REQUIRED\": 402,\n \"FORBIDDEN\": 403,\n \"NOT_FOUND\": 404,\n \"METHOD_NOT_ALLOWED\": 405,\n \"NOT_ACCEPTABLE\": 406,\n \"PROXY_AUTHENTICATION_REQUIRED\": 407,\n \"REQUEST_TIMEOUT\": 408,\n \"CONFLICT\": 409,\n \"GONE\": 410,\n \"LENGTH_REQUIRED\": 411,\n \"PRECONDITION_FAILED\": 412,\n \"PAYLOAD_TOO_LARGE\": 413,\n \"URI_TOO_LONG\": 414,\n \"UNSUPPORTED_MEDIA_TYPE\": 415,\n \"RANGE_NOT_SATISFIABLE\": 416,\n \"EXPECTATION_FAILED\": 417,\n \"I'M_A_TEAPOT\": 418,\n \"MISDIRECTED_REQUEST\": 421,\n \"UNPROCESSABLE_ENTITY\": 422,\n \"LOCKED\": 423,\n \"FAILED_DEPENDENCY\": 424,\n \"TOO_EARLY\": 425,\n \"UPGRADE_REQUIRED\": 426,\n \"PRECONDITION_REQUIRED\": 428,\n \"TOO_MANY_REQUESTS\": 429,\n \"REQUEST_HEADER_FIELDS_TOO_LARGE\": 431,\n \"UNAVAILABLE_FOR_LEGAL_REASONS\": 451,\n \"INTERNAL_SERVER_ERROR\": 500,\n \"NOT_IMPLEMENTED\": 501,\n \"BAD_GATEWAY\": 502,\n \"SERVICE_UNAVAILABLE\": 503,\n \"GATEWAY_TIMEOUT\": 504,\n \"HTTP_VERSION_NOT_SUPPORTED\": 505,\n \"VARIANT_ALSO_NEGOTIATES\": 506,\n \"INSUFFICIENT_STORAGE\": 507,\n \"LOOP_DETECTED\": 508,\n \"NOT_EXTENDED\": 510,\n \"NETWORK_AUTHENTICATION_REQUIRED\": 511,\n}\n"],"mappings":"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","names":["src_exports","__export","APIError","createEndpoint","createEndpointCreator","createMiddleware","createMiddlewareCreator","createRouter","getBody","shouldSerialize","statusCode","__toCommonJS","import_zod","import_zod","createMiddleware","optionsOrHandler","handler","createEndpoint","createMiddlewareCreator","fn","APIError","status","body","__publicField","createEndpointCreator","path","options","handler","createEndpoint","responseHeader","handle","ctx","internalCtx","key","value","cookie","middleware","res","body","e","APIError","import_rou3","getBody","request","contentType","formData","result","value","key","shouldSerialize","body","statusCode","createRouter","endpoints","config","router","createRou3Router","endpoint","method","middlewareRouter","route","request","url","path","handler","body","getBody","headers","query","middleware","middlewareContext","res","handlerRes","resBody","shouldSerialize","e","onErrorRes","APIError","statusCode"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/endpoint.ts","../src/middleware.ts","../src/better-call-error.ts","../src/router.ts","../src/utils.ts","../src/types.ts"],"sourcesContent":["export * from \"./endpoint\"\nexport * from \"./router\"\nexport * from \"./middleware\"\nexport * from \"./better-call-error\"\nexport * from \"./utils\"\nexport * from \"./types\"","import { z, ZodError, type ZodOptional, type ZodSchema } from \"zod\"\nimport { createMiddleware, type Middleware } from \"./middleware\"\nimport { APIError } from \"./better-call-error\";\nimport type { HasRequiredKeys, UnionToIntersection } from \"./helper\";\nimport type { Context, ContextTools, Endpoint, EndpointOptions, EndpointResponse, Handler } from \"./types\";\n\n\nexport interface EndpointConfig {\n /**\n * Throw when the response isn't in 200 range\n */\n throwOnError?: boolean\n}\n\nexport function createEndpointCreator<T extends Record<string, any>>() {\n return <Path extends string, Opts extends EndpointOptions, R extends EndpointResponse>(path: Path, options: Opts, handler: Handler<Path, Opts, R, T>) => {\n //@ts-expect-error\n return createEndpoint(path, options, handler)\n }\n\n}\n\nexport function createEndpoint<Path extends string, Opts extends EndpointOptions, R extends EndpointResponse>(path: Path, options: Opts, handler: Handler<Path, Opts, R>) {\n const responseHeader = new Headers()\n type Ctx = Context<Path, Opts>\n const handle = async (...ctx: HasRequiredKeys<Ctx> extends true ? [Ctx] : [Ctx?]) => {\n let internalCtx = ({\n setHeader(key: string, value: string) {\n responseHeader.set(key, value)\n },\n setCookie(key: string, value: string) {\n responseHeader.append(\"Set-Cookie\", `${key}=${value}`)\n },\n getCookie(key: string) {\n const header = ctx[0]?.headers\n return header?.get(\"cookie\")?.split(\";\").find(cookie => cookie.startsWith(`${key}=`))?.split(\"=\")[1]\n },\n ...(ctx[0] || {}),\n context: {}\n })\n if (options.use?.length) {\n for (const middleware of options.use) {\n const res = await middleware(internalCtx) as Endpoint\n const body = res.options?.body ? res.options.body.parse(internalCtx.body) : undefined\n if (res) {\n internalCtx = {\n ...internalCtx,\n body: body ? {\n ...body,\n ...internalCtx.body\n } : internalCtx.body,\n context: {\n ...internalCtx.context || {},\n ...res\n }\n }\n }\n }\n }\n try {\n const body = options.body ? options.body.parse(internalCtx.body) : internalCtx.body\n internalCtx = {\n ...internalCtx,\n body: body ? {\n ...body,\n ...internalCtx.body\n } : internalCtx.body,\n }\n internalCtx.query = options.query ? options.query.parse(internalCtx.query) : internalCtx.query\n internalCtx.params = options.params ? options.params.parse(internalCtx.params) : internalCtx.params\n } catch (e) {\n if (e instanceof ZodError) {\n throw new APIError(\"BAD_REQUEST\", {\n message: e.message,\n details: e.errors\n })\n }\n throw e\n }\n if (options.requireHeaders && !internalCtx.headers) {\n throw new APIError(\"BAD_REQUEST\", {\n message: \"Headers are required\"\n })\n }\n if (options.requireRequest && !internalCtx.request) {\n throw new APIError(\"BAD_REQUEST\", {\n message: \"Request is required\"\n })\n }\n //@ts-expect-error\n const res = await handler(internalCtx)\n return res as ReturnType<Handler<Path, Opts, R>>\n }\n handle.path = path\n handle.options = options\n handle.method = options.method\n handle.headers = responseHeader\n return handle\n}","import { z } from \"zod\"\nimport type { ContextTools, Endpoint, EndpointOptions, EndpointResponse, Handler, InferBody, InferHeaders, InferRequest, Prettify } from \"./types\"\nimport { createEndpoint } from \"./endpoint\"\n\nexport type MiddlewareHandler<Opts extends EndpointOptions, R extends EndpointResponse, Extra extends Record<string, any> = {}> = (ctx: Prettify<InferBody<Opts> & InferRequest<Opts> & InferHeaders<Opts> & {\n params?: Record<string, string>,\n query?: Record<string, string>,\n} & ContextTools> & Extra) => Promise<R>\n\nexport function createMiddleware<Opts extends EndpointOptions, R extends EndpointResponse>(optionsOrHandler: MiddlewareHandler<Opts, R>): Endpoint<Handler<string, Opts, R>, Opts>\nexport function createMiddleware<Opts extends Omit<EndpointOptions, \"method\">, R extends EndpointResponse>(optionsOrHandler: Opts, handler: MiddlewareHandler<Opts & {\n method: \"*\"\n}, R>): Endpoint<Handler<string, Opts & {\n method: \"*\"\n}, R>, Opts & {\n method: \"*\"\n}>\nexport function createMiddleware(optionsOrHandler: any, handler?: any) {\n if (typeof optionsOrHandler === \"function\") {\n return createEndpoint(\"*\", {\n method: \"*\"\n }, optionsOrHandler)\n }\n if (!handler) {\n throw new Error(\"Middleware handler is required\")\n }\n const endpoint = createEndpoint(\"*\", {\n ...optionsOrHandler,\n method: \"*\"\n }, handler)\n return endpoint as any\n}\n\nexport const createMiddlewareCreator = <ExtraContext extends Record<string, any> = {}>() => {\n function fn<Opts extends EndpointOptions, R extends EndpointResponse>(optionsOrHandler: MiddlewareHandler<Opts, R, ExtraContext>): Endpoint<Handler<string, Opts, R>, Opts>\n function fn<Opts extends Omit<EndpointOptions, \"method\">, R extends EndpointResponse>(optionsOrHandler: Opts, handler: MiddlewareHandler<Opts & {\n method: \"*\"\n }, R, ExtraContext>): Endpoint<Handler<string, Opts & {\n method: \"*\"\n }, R>, Opts & {\n method: \"*\"\n }>\n function fn(optionsOrHandler: any, handler?: any) {\n if (typeof optionsOrHandler === \"function\") {\n return createEndpoint(\"*\", {\n method: \"*\"\n }, optionsOrHandler)\n }\n if (!handler) {\n throw new Error(\"Middleware handler is required\")\n }\n const endpoint = createEndpoint(\"*\", {\n ...optionsOrHandler,\n method: \"*\"\n }, handler)\n return endpoint as any\n }\n return fn\n}\n\nexport type Middleware<Opts extends EndpointOptions = EndpointOptions, R extends EndpointResponse = EndpointResponse> = (opts: Opts, handler: (ctx: {\n body?: InferBody<Opts>,\n params?: Record<string, string>,\n query?: Record<string, string>\n}) => Promise<R>) => Endpoint","import type { statusCode } from \"./utils\"\n\ntype Status = keyof typeof statusCode\n\nexport class APIError extends Error {\n status: Status\n body: Record<string, any>\n constructor(\n status: Status,\n body?: Record<string, any>,\n ) {\n super(\n `API Error: ${status} ${body?.message ?? \"\"}`,\n {\n cause: body,\n }\n )\n this.status = status\n this.body = body ?? {}\n this.stack = \"\";\n this.name = \"BetterCallAPIError\"\n }\n}","import {\n createRouter as createRou3Router,\n addRoute,\n findRoute,\n} from \"rou3\";\nimport { getBody, shouldSerialize, statusCode } from \"./utils\";\nimport { APIError } from \"./better-call-error\";\nimport type { Middleware, MiddlewareHandler } from \"./middleware\";\nimport type { Endpoint, Method } from \"./types\";\n\ninterface RouterConfig {\n /**\n * Throw error if error occurred other than APIError\n */\n throwError?: boolean\n /**\n * Handle error\n */\n onError?: (e: unknown) => void | Promise<void> | Response | Promise<Response>\n /**\n * Base path for the router\n */\n basePath?: string\n /**\n * Middlewares for the router\n */\n routerMiddleware?: {\n path: string,\n middleware: Endpoint\n }[]\n}\n\nexport const createRouter = <E extends Endpoint, Config extends RouterConfig>(endpoints: E[], config?: Config) => {\n const router = createRou3Router()\n for (const endpoint of endpoints) {\n if (Array.isArray(endpoint.options?.method)) {\n for (const method of endpoint.options.method) {\n addRoute(router, method, endpoint.path, endpoint)\n }\n } else {\n addRoute(router, endpoint.options.method, endpoint.path, endpoint)\n }\n }\n\n const middlewareRouter = createRou3Router()\n for (const route of (config?.routerMiddleware || [])) {\n addRoute(middlewareRouter, \"*\", route.path, route.middleware)\n }\n\n const handler = async (request: Request) => {\n const url = new URL(request.url);\n let path = url.pathname\n if (config?.basePath) {\n path = path.split(config.basePath)[1]\n }\n const method = request.method;\n const route = findRoute(router, method, path)\n const handler = route?.data as Endpoint\n const body = await getBody(request)\n const headers = request.headers\n const query = Object.fromEntries(url.searchParams)\n const middleware = findRoute(middlewareRouter, \"*\", path)?.data as Endpoint | undefined\n //handler 404\n if (!handler) {\n return new Response(null, {\n status: 404,\n statusText: \"Not Found\"\n })\n }\n try {\n let middlewareContext: Record<string, any> = {}\n if (middleware) {\n const res = await middleware({\n path: path,\n method: method as \"GET\",\n headers,\n params: route?.params as any,\n request: request,\n body: body,\n query\n })\n if (res) {\n middlewareContext = {\n ...res,\n ...middlewareContext\n }\n }\n }\n const handlerRes = await handler({\n path: path,\n method: method as \"GET\",\n headers,\n params: route?.params as any,\n request: request,\n body: body,\n query,\n ...middlewareContext,\n })\n if (handlerRes instanceof Response) {\n return handlerRes\n }\n const resBody = shouldSerialize(handlerRes) ? JSON.stringify(handlerRes) : handlerRes\n return new Response(resBody as any, {\n headers: handler.headers\n })\n } catch (e) {\n if (config?.onError) {\n const onErrorRes = await config.onError(e)\n if (onErrorRes instanceof Response) {\n return onErrorRes\n }\n }\n if (e instanceof APIError) {\n return new Response(e.body ? JSON.stringify(e.body) : null, {\n status: statusCode[e.status],\n statusText: e.status,\n headers: {\n \"Content-Type\": \"application/json\",\n }\n })\n }\n if (config?.throwError) {\n throw e\n }\n return new Response(null, {\n status: 500,\n statusText: \"Internal Server Error\"\n })\n }\n }\n return {\n handler\n }\n}","export async function getBody(request: Request) {\n const contentType = request.headers.get('content-type') || '';\n\n if (!request.body) {\n return undefined\n }\n\n if (contentType.includes('application/json')) {\n return await request.json();\n }\n\n if (contentType.includes('application/x-www-form-urlencoded')) {\n const formData = await request.formData();\n const result: Record<string, string> = {};\n formData.forEach((value, key) => {\n result[key] = value.toString();\n });\n return result;\n }\n\n if (contentType.includes('multipart/form-data')) {\n const formData = await request.formData();\n const result: Record<string, any> = {};\n formData.forEach((value, key) => {\n result[key] = value;\n });\n return result;\n }\n\n if (contentType.includes('text/plain')) {\n return await request.text();\n }\n\n if (contentType.includes('application/octet-stream')) {\n return await request.arrayBuffer();\n }\n\n if (contentType.includes('application/pdf') || contentType.includes('image/') || contentType.includes('video/')) {\n const blob = await request.blob();\n return blob;\n }\n\n if (contentType.includes('application/stream') || request.body instanceof ReadableStream) {\n return request.body;\n }\n\n return await request.text();\n}\n\n\nexport function shouldSerialize(body: any) {\n return typeof body === \"object\" && body !== null && !(body instanceof Blob) && !(body instanceof FormData)\n}\n\nexport const statusCode = {\n \"OK\": 200,\n \"CREATED\": 201,\n \"ACCEPTED\": 202,\n \"NO_CONTENT\": 204,\n \"MULTIPLE_CHOICES\": 300,\n \"MOVED_PERMANENTLY\": 301,\n \"FOUND\": 302,\n \"SEE_OTHER\": 303,\n \"NOT_MODIFIED\": 304,\n \"TEMPORARY_REDIRECT\": 307,\n \"BAD_REQUEST\": 400,\n \"UNAUTHORIZED\": 401,\n \"PAYMENT_REQUIRED\": 402,\n \"FORBIDDEN\": 403,\n \"NOT_FOUND\": 404,\n \"METHOD_NOT_ALLOWED\": 405,\n \"NOT_ACCEPTABLE\": 406,\n \"PROXY_AUTHENTICATION_REQUIRED\": 407,\n \"REQUEST_TIMEOUT\": 408,\n \"CONFLICT\": 409,\n \"GONE\": 410,\n \"LENGTH_REQUIRED\": 411,\n \"PRECONDITION_FAILED\": 412,\n \"PAYLOAD_TOO_LARGE\": 413,\n \"URI_TOO_LONG\": 414,\n \"UNSUPPORTED_MEDIA_TYPE\": 415,\n \"RANGE_NOT_SATISFIABLE\": 416,\n \"EXPECTATION_FAILED\": 417,\n \"I'M_A_TEAPOT\": 418,\n \"MISDIRECTED_REQUEST\": 421,\n \"UNPROCESSABLE_ENTITY\": 422,\n \"LOCKED\": 423,\n \"FAILED_DEPENDENCY\": 424,\n \"TOO_EARLY\": 425,\n \"UPGRADE_REQUIRED\": 426,\n \"PRECONDITION_REQUIRED\": 428,\n \"TOO_MANY_REQUESTS\": 429,\n \"REQUEST_HEADER_FIELDS_TOO_LARGE\": 431,\n \"UNAVAILABLE_FOR_LEGAL_REASONS\": 451,\n \"INTERNAL_SERVER_ERROR\": 500,\n \"NOT_IMPLEMENTED\": 501,\n \"BAD_GATEWAY\": 502,\n \"SERVICE_UNAVAILABLE\": 503,\n \"GATEWAY_TIMEOUT\": 504,\n \"HTTP_VERSION_NOT_SUPPORTED\": 505,\n \"VARIANT_ALSO_NEGOTIATES\": 506,\n \"INSUFFICIENT_STORAGE\": 507,\n \"LOOP_DETECTED\": 508,\n \"NOT_EXTENDED\": 510,\n \"NETWORK_AUTHENTICATION_REQUIRED\": 511,\n}\n","import { z, type ZodOptional, type ZodSchema } from \"zod\"\nimport type { Middleware } from \"./middleware\"\nimport type { UnionToIntersection } from \"./helper\";\n\n\nexport interface EndpointOptions {\n method: Method | Method[]\n body?: ZodSchema\n query?: ZodSchema\n params?: ZodSchema<any>\n /**\n * If true headers will be required to be passed in the context\n */\n requireHeaders?: boolean\n /**\n * If true request object will be required\n */\n requireRequest?: boolean\n /**\n * List of endpoints that will be called before this endpoint\n */\n use?: Endpoint[]\n}\n\nexport type Endpoint<Handler extends (ctx: any) => Promise<any> = (ctx: any) => Promise<any>, Option extends EndpointOptions = EndpointOptions> = {\n path: string\n options: Option\n headers?: Headers\n} & (Handler)\n\nexport type InferParamPath<Path> =\n Path extends `${infer _Start}:${infer Param}/${infer Rest}`\n ? { [K in Param | keyof InferParamPath<Rest>]: string }\n : Path extends `${infer _Start}:${infer Param}`\n ? { [K in Param]: string }\n : Path extends `${infer _Start}/${infer Rest}`\n ? InferParamPath<Rest>\n : undefined;\n\nexport type InferParamWildCard<Path> = Path extends `${infer _Start}/*:${infer Param}/${infer Rest}` | `${infer _Start}/**:${infer Param}/${infer Rest}`\n ? { [K in Param | keyof InferParamPath<Rest>]: string }\n : Path extends `${infer _Start}/*`\n ? { [K in \"_\"]: string }\n : Path extends `${infer _Start}/${infer Rest}`\n ? InferParamPath<Rest>\n : undefined;\n\n\nexport type Prettify<T> = {\n [key in keyof T]: T[key];\n} & {};\n\nexport type ContextTools = {\n /**\n * Set header\n * \n * If it's called outside of a request it will just be ignored.\n */\n setHeader: (key: string, value: string) => void\n /**\n * cookie setter.\n * \n * If it's called outside of a request it will just be ignored.\n */\n setCookie: (key: string, value: string) => void\n /**\n * Get cookie value\n * \n * If it's called outside of a request it will just be ignored.\n */\n getCookie: (key: string) => string | undefined\n}\n\nexport type Context<Path extends string, Opts extends EndpointOptions> = InferBody<Opts> & InferParam<Path> & InferMethod<Opts['method']> & InferHeaders<Opts> & InferRequest<Opts> & InferQuery<Opts[\"query\"]>\n\nexport type InferUse<Opts extends EndpointOptions> = Opts[\"use\"] extends Endpoint[] ? {\n context: UnionToIntersection<Awaited<ReturnType<Opts[\"use\"][number]>>>\n} : {}\n\nexport type InferUseOptions<Opts extends EndpointOptions> = Opts[\"use\"] extends Array<infer U> ? UnionToIntersection<U extends Endpoint ? U['options'] : {\n body?: {},\n requireRequest?: boolean\n requireHeaders?: boolean\n}> : {\n body?: {},\n requireRequest?: boolean\n requireHeaders?: boolean\n}\n\nexport type InferMethod<M extends Method | Method[]> = M extends Array<Method> ? {\n method: M[number]\n} : {\n method?: M\n}\n\nexport type InferHeaders<Opt extends EndpointOptions, HeaderReq = Opt[\"requireHeaders\"]> = HeaderReq extends true ? {\n headers: Headers\n} : InferUseOptions<Opt>['requireHeaders'] extends true ? {\n headers: Headers\n} : {\n headers?: Headers\n}\n\n\nexport type InferRequest<Opt extends EndpointOptions, RequestReq = Opt[\"requireRequest\"]> = RequestReq extends true ? {\n request: Request\n} : InferUseOptions<Opt>['requireRequest'] extends true ? {\n request: Request\n} : {\n request?: Request\n}\n\n\nexport type InferQuery<Query> = Query extends ZodSchema ? Query extends ZodOptional<any> ? {\n query?: z.infer<Query>\n} : {\n query: z.infer<Query>\n} : {\n query?: undefined\n}\n\nexport type InferParam<Path extends string, ParamPath extends InferParamPath<Path> = InferParamPath<Path>, WildCard extends InferParamWildCard<Path> = InferParamWildCard<Path>> = ParamPath extends undefined ? WildCard extends undefined ? {\n params?: Record<string, string>\n} : {\n params: WildCard\n} : {\n params: Prettify<ParamPath & (WildCard extends undefined ? {} : WildCard)>\n}\n\n\nexport type EndpointResponse = Record<string, any> | string | boolean | number | void | undefined\n\nexport type Handler<Path extends string, Opts extends EndpointOptions, R extends EndpointResponse, Extra extends Record<string, any> = {}> = (ctx: Prettify<Context<Path, Opts> & InferUse<Opts> & ContextTools> & Extra) => Promise<R>\n\nexport type Method = \"GET\" | \"POST\" | \"PUT\" | \"DELETE\" | \"PATCH\" | \"*\"\n\n\nexport type InferBody<Opts extends EndpointOptions, Body extends ZodSchema | undefined = (Opts[\"body\"] &\n (undefined extends InferUseOptions<Opts>['body'] ? {} : InferUseOptions<Opts>['body']))> = Body extends ZodSchema ? Body extends ZodOptional<any> ? {\n body?: Prettify<z.infer<Body>>\n } : {\n body: Prettify<z.infer<Body>>\n } : {\n body?: undefined\n }"],"mappings":"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","names":["src_exports","__export","APIError","createEndpoint","createEndpointCreator","createMiddleware","createMiddlewareCreator","createRouter","getBody","shouldSerialize","statusCode","__toCommonJS","import_zod","import_zod","createMiddleware","optionsOrHandler","handler","createEndpoint","createMiddlewareCreator","fn","APIError","status","body","__publicField","createEndpointCreator","path","options","handler","createEndpoint","responseHeader","handle","ctx","internalCtx","key","value","cookie","middleware","res","body","e","APIError","import_rou3","getBody","request","contentType","formData","result","value","key","shouldSerialize","body","statusCode","createRouter","endpoints","config","router","createRou3Router","endpoint","method","middlewareRouter","route","request","url","path","handler","body","getBody","headers","query","middleware","middlewareContext","res","handlerRes","resBody","shouldSerialize","e","onErrorRes","APIError","statusCode","import_zod"]}
package/dist/index.d.cts CHANGED
@@ -178,16 +178,14 @@ declare function createMiddleware<Opts extends Omit<EndpointOptions, "method">,
178
178
  method: "*";
179
179
  }>;
180
180
  declare const createMiddlewareCreator: <ExtraContext extends Record<string, any> = {}>() => {
181
- createMiddleware: {
182
- <Opts extends EndpointOptions, R extends EndpointResponse>(optionsOrHandler: MiddlewareHandler<Opts, R, ExtraContext>): Endpoint<Handler<string, Opts, R>, Opts>;
183
- <Opts extends Omit<EndpointOptions, "method">, R_1 extends EndpointResponse>(optionsOrHandler: Opts, handler: MiddlewareHandler<Opts & {
184
- method: "*";
185
- }, R_1, ExtraContext>): Endpoint<Handler<string, Opts & {
186
- method: "*";
187
- }, R_1>, Opts & {
188
- method: "*";
189
- }>;
190
- };
181
+ <Opts extends EndpointOptions, R extends EndpointResponse>(optionsOrHandler: MiddlewareHandler<Opts, R, ExtraContext>): Endpoint<Handler<string, Opts, R>, Opts>;
182
+ <Opts extends Omit<EndpointOptions, "method">, R_1 extends EndpointResponse>(optionsOrHandler: Opts, handler: MiddlewareHandler<Opts & {
183
+ method: "*";
184
+ }, R_1, ExtraContext>): Endpoint<Handler<string, Opts & {
185
+ method: "*";
186
+ }, R_1>, Opts & {
187
+ method: "*";
188
+ }>;
191
189
  };
192
190
  type Middleware<Opts extends EndpointOptions = EndpointOptions, R extends EndpointResponse = EndpointResponse> = (opts: Opts, handler: (ctx: {
193
191
  body?: InferBody<Opts>;
@@ -257,4 +255,4 @@ declare class APIError extends Error {
257
255
  constructor(status: Status, body?: Record<string, any>);
258
256
  }
259
257
 
260
- export { APIError, type EndpointConfig, type Middleware, type MiddlewareHandler, createEndpoint, createEndpointCreator, createMiddleware, createMiddlewareCreator, createRouter, getBody, shouldSerialize, statusCode };
258
+ export { APIError, type Context, type ContextTools, type Endpoint, type EndpointConfig, type EndpointOptions, type EndpointResponse, type Handler, type InferBody, type InferHeaders, type InferMethod, type InferParam, type InferParamPath, type InferParamWildCard, type InferQuery, type InferRequest, type InferUse, type InferUseOptions, type Method, type Middleware, type MiddlewareHandler, type Prettify, createEndpoint, createEndpointCreator, createMiddleware, createMiddlewareCreator, createRouter, getBody, shouldSerialize, statusCode };
package/dist/index.d.ts CHANGED
@@ -178,16 +178,14 @@ declare function createMiddleware<Opts extends Omit<EndpointOptions, "method">,
178
178
  method: "*";
179
179
  }>;
180
180
  declare const createMiddlewareCreator: <ExtraContext extends Record<string, any> = {}>() => {
181
- createMiddleware: {
182
- <Opts extends EndpointOptions, R extends EndpointResponse>(optionsOrHandler: MiddlewareHandler<Opts, R, ExtraContext>): Endpoint<Handler<string, Opts, R>, Opts>;
183
- <Opts extends Omit<EndpointOptions, "method">, R_1 extends EndpointResponse>(optionsOrHandler: Opts, handler: MiddlewareHandler<Opts & {
184
- method: "*";
185
- }, R_1, ExtraContext>): Endpoint<Handler<string, Opts & {
186
- method: "*";
187
- }, R_1>, Opts & {
188
- method: "*";
189
- }>;
190
- };
181
+ <Opts extends EndpointOptions, R extends EndpointResponse>(optionsOrHandler: MiddlewareHandler<Opts, R, ExtraContext>): Endpoint<Handler<string, Opts, R>, Opts>;
182
+ <Opts extends Omit<EndpointOptions, "method">, R_1 extends EndpointResponse>(optionsOrHandler: Opts, handler: MiddlewareHandler<Opts & {
183
+ method: "*";
184
+ }, R_1, ExtraContext>): Endpoint<Handler<string, Opts & {
185
+ method: "*";
186
+ }, R_1>, Opts & {
187
+ method: "*";
188
+ }>;
191
189
  };
192
190
  type Middleware<Opts extends EndpointOptions = EndpointOptions, R extends EndpointResponse = EndpointResponse> = (opts: Opts, handler: (ctx: {
193
191
  body?: InferBody<Opts>;
@@ -257,4 +255,4 @@ declare class APIError extends Error {
257
255
  constructor(status: Status, body?: Record<string, any>);
258
256
  }
259
257
 
260
- export { APIError, type EndpointConfig, type Middleware, type MiddlewareHandler, createEndpoint, createEndpointCreator, createMiddleware, createMiddlewareCreator, createRouter, getBody, shouldSerialize, statusCode };
258
+ export { APIError, type Context, type ContextTools, type Endpoint, type EndpointConfig, type EndpointOptions, type EndpointResponse, type Handler, type InferBody, type InferHeaders, type InferMethod, type InferParam, type InferParamPath, type InferParamWildCard, type InferQuery, type InferRequest, type InferUse, type InferUseOptions, type Method, type Middleware, type MiddlewareHandler, type Prettify, createEndpoint, createEndpointCreator, createMiddleware, createMiddlewareCreator, createRouter, getBody, shouldSerialize, statusCode };
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- var D=Object.defineProperty;var g=(t,e,r)=>e in t?D(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r;var f=(t,e,r)=>g(t,typeof e!="symbol"?e+"":e,r);import{ZodError as P}from"zod";import"zod";function H(t,e){if(typeof t=="function")return O("*",{method:"*"},t);if(!e)throw new Error("Middleware handler is required");return O("*",{...t,method:"*"},e)}var L=()=>{function t(e,r){if(typeof e=="function")return O("*",{method:"*"},e);if(!r)throw new Error("Middleware handler is required");return O("*",{...e,method:"*"},r)}return{createMiddleware:t}};var c=class extends Error{constructor(r,a){super(`API Error: ${r} ${a?.message??""}`,{cause:a});f(this,"status");f(this,"body");this.status=r,this.body=a??{},this.stack="",this.name="BetterCallAPIError"}};function j(){return(t,e,r)=>O(t,e,r)}function O(t,e,r){let a=new Headers,p=async(...o)=>{let n={setHeader(s,d){a.set(s,d)},setCookie(s,d){a.append("Set-Cookie",`${s}=${d}`)},getCookie(s){return o[0]?.headers?.get("cookie")?.split(";").find(E=>E.startsWith(`${s}=`))?.split("=")[1]},...o[0]||{},context:{}};if(e.use?.length)for(let s of e.use){let d=await s(n),E=d.options?.body?d.options.body.parse(n.body):void 0;d&&(n={...n,body:E?{...E,...n.body}:n.body,context:{...n.context||{},...d}})}try{let s=e.body?e.body.parse(n.body):n.body;n={...n,body:s?{...s,...n.body}:n.body},n.query=e.query?e.query.parse(n.query):n.query,n.params=e.params?e.params.parse(n.params):n.params}catch(s){throw s instanceof P?new c("BAD_REQUEST",{message:s.message,details:s.errors}):s}if(e.requireHeaders&&!n.headers)throw new c("BAD_REQUEST",{message:"Headers are required"});if(e.requireRequest&&!n.request)throw new c("BAD_REQUEST",{message:"Request is required"});return await r(n)};return p.path=t,p.options=e,p.method=e.method,p.headers=a,p}import{createRouter as I,addRoute as l,findRoute as N}from"rou3";async function w(t){let e=t.headers.get("content-type")||"";if(t.body){if(e.includes("application/json"))return await t.json();if(e.includes("application/x-www-form-urlencoded")){let r=await t.formData(),a={};return r.forEach((p,o)=>{a[o]=p.toString()}),a}if(e.includes("multipart/form-data")){let r=await t.formData(),a={};return r.forEach((p,o)=>{a[o]=p}),a}return e.includes("text/plain")?await t.text():e.includes("application/octet-stream")?await t.arrayBuffer():e.includes("application/pdf")||e.includes("image/")||e.includes("video/")?await t.blob():e.includes("application/stream")||t.body instanceof ReadableStream?t.body:await t.text()}}function _(t){return typeof t=="object"&&t!==null&&!(t instanceof Blob)&&!(t instanceof FormData)}var A={OK:200,CREATED:201,ACCEPTED:202,NO_CONTENT:204,MULTIPLE_CHOICES:300,MOVED_PERMANENTLY:301,FOUND:302,SEE_OTHER:303,NOT_MODIFIED:304,TEMPORARY_REDIRECT:307,BAD_REQUEST:400,UNAUTHORIZED:401,PAYMENT_REQUIRED:402,FORBIDDEN:403,NOT_FOUND:404,METHOD_NOT_ALLOWED:405,NOT_ACCEPTABLE:406,PROXY_AUTHENTICATION_REQUIRED:407,REQUEST_TIMEOUT:408,CONFLICT:409,GONE:410,LENGTH_REQUIRED:411,PRECONDITION_FAILED:412,PAYLOAD_TOO_LARGE:413,URI_TOO_LONG:414,UNSUPPORTED_MEDIA_TYPE:415,RANGE_NOT_SATISFIABLE:416,EXPECTATION_FAILED:417,"I'M_A_TEAPOT":418,MISDIRECTED_REQUEST:421,UNPROCESSABLE_ENTITY:422,LOCKED:423,FAILED_DEPENDENCY:424,TOO_EARLY:425,UPGRADE_REQUIRED:426,PRECONDITION_REQUIRED:428,TOO_MANY_REQUESTS:429,REQUEST_HEADER_FIELDS_TOO_LARGE:431,UNAVAILABLE_FOR_LEGAL_REASONS:451,INTERNAL_SERVER_ERROR:500,NOT_IMPLEMENTED:501,BAD_GATEWAY:502,SERVICE_UNAVAILABLE:503,GATEWAY_TIMEOUT:504,HTTP_VERSION_NOT_SUPPORTED:505,VARIANT_ALSO_NEGOTIATES:506,INSUFFICIENT_STORAGE:507,LOOP_DETECTED:508,NOT_EXTENDED:510,NETWORK_AUTHENTICATION_REQUIRED:511};var Z=(t,e)=>{let r=I();for(let o of t)if(Array.isArray(o.options?.method))for(let n of o.options.method)l(r,n,o.path,o);else l(r,o.options.method,o.path,o);let a=I();for(let o of e?.routerMiddleware||[])l(a,"*",o.path,o.middleware);return{handler:async o=>{let n=new URL(o.url),u=n.pathname;e?.basePath&&(u=u.split(e.basePath)[1]);let s=o.method,d=N(r,s,u),E=d?.data,m=await w(o),y=o.headers,T=Object.fromEntries(n.searchParams),h=N(a,"*",u)?.data;if(!E)return new Response(null,{status:404,statusText:"Not Found"});try{let i={};if(h){let x=await h({path:u,method:s,headers:y,params:d?.params,request:o,body:m,query:T});x&&(i={...x,...i})}let R=await E({path:u,method:s,headers:y,params:d?.params,request:o,body:m,query:T,...i});if(R instanceof Response)return R;let C=_(R)?JSON.stringify(R):R;return new Response(C,{headers:E.headers})}catch(i){if(e?.onError){let R=await e.onError(i);if(R instanceof Response)return R}if(i instanceof c)return new Response(i.body?JSON.stringify(i.body):null,{status:A[i.status],statusText:i.status,headers:{"Content-Type":"application/json"}});if(e?.throwError)throw i;return new Response(null,{status:500,statusText:"Internal Server Error"})}}}};export{c as APIError,O as createEndpoint,j as createEndpointCreator,H as createMiddleware,L as createMiddlewareCreator,Z as createRouter,w as getBody,_ as shouldSerialize,A as statusCode};
1
+ var A=Object.defineProperty;var b=(t,e,r)=>e in t?A(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r;var O=(t,e,r)=>b(t,typeof e!="symbol"?e+"":e,r);import{ZodError as S}from"zod";import"zod";function M(t,e){if(typeof t=="function")return R("*",{method:"*"},t);if(!e)throw new Error("Middleware handler is required");return R("*",{...t,method:"*"},e)}var q=()=>{function t(e,r){if(typeof e=="function")return R("*",{method:"*"},e);if(!r)throw new Error("Middleware handler is required");return R("*",{...e,method:"*"},r)}return t};var u=class extends Error{constructor(r,a){super(`API Error: ${r} ${a?.message??""}`,{cause:a});O(this,"status");O(this,"body");this.status=r,this.body=a??{},this.stack="",this.name="BetterCallAPIError"}};function W(){return(t,e,r)=>R(t,e,r)}function R(t,e,r){let a=new Headers,p=async(...o)=>{let n={setHeader(s,d){a.set(s,d)},setCookie(s,d){a.append("Set-Cookie",`${s}=${d}`)},getCookie(s){return o[0]?.headers?.get("cookie")?.split(";").find(E=>E.startsWith(`${s}=`))?.split("=")[1]},...o[0]||{},context:{}};if(e.use?.length)for(let s of e.use){let d=await s(n),E=d.options?.body?d.options.body.parse(n.body):void 0;d&&(n={...n,body:E?{...E,...n.body}:n.body,context:{...n.context||{},...d}})}try{let s=e.body?e.body.parse(n.body):n.body;n={...n,body:s?{...s,...n.body}:n.body},n.query=e.query?e.query.parse(n.query):n.query,n.params=e.params?e.params.parse(n.params):n.params}catch(s){throw s instanceof S?new u("BAD_REQUEST",{message:s.message,details:s.errors}):s}if(e.requireHeaders&&!n.headers)throw new u("BAD_REQUEST",{message:"Headers are required"});if(e.requireRequest&&!n.request)throw new u("BAD_REQUEST",{message:"Request is required"});return await r(n)};return p.path=t,p.options=e,p.method=e.method,p.headers=a,p}import{createRouter as C,addRoute as m,findRoute as w}from"rou3";async function T(t){let e=t.headers.get("content-type")||"";if(t.body){if(e.includes("application/json"))return await t.json();if(e.includes("application/x-www-form-urlencoded")){let r=await t.formData(),a={};return r.forEach((p,o)=>{a[o]=p.toString()}),a}if(e.includes("multipart/form-data")){let r=await t.formData(),a={};return r.forEach((p,o)=>{a[o]=p}),a}return e.includes("text/plain")?await t.text():e.includes("application/octet-stream")?await t.arrayBuffer():e.includes("application/pdf")||e.includes("image/")||e.includes("video/")?await t.blob():e.includes("application/stream")||t.body instanceof ReadableStream?t.body:await t.text()}}function I(t){return typeof t=="object"&&t!==null&&!(t instanceof Blob)&&!(t instanceof FormData)}var _={OK:200,CREATED:201,ACCEPTED:202,NO_CONTENT:204,MULTIPLE_CHOICES:300,MOVED_PERMANENTLY:301,FOUND:302,SEE_OTHER:303,NOT_MODIFIED:304,TEMPORARY_REDIRECT:307,BAD_REQUEST:400,UNAUTHORIZED:401,PAYMENT_REQUIRED:402,FORBIDDEN:403,NOT_FOUND:404,METHOD_NOT_ALLOWED:405,NOT_ACCEPTABLE:406,PROXY_AUTHENTICATION_REQUIRED:407,REQUEST_TIMEOUT:408,CONFLICT:409,GONE:410,LENGTH_REQUIRED:411,PRECONDITION_FAILED:412,PAYLOAD_TOO_LARGE:413,URI_TOO_LONG:414,UNSUPPORTED_MEDIA_TYPE:415,RANGE_NOT_SATISFIABLE:416,EXPECTATION_FAILED:417,"I'M_A_TEAPOT":418,MISDIRECTED_REQUEST:421,UNPROCESSABLE_ENTITY:422,LOCKED:423,FAILED_DEPENDENCY:424,TOO_EARLY:425,UPGRADE_REQUIRED:426,PRECONDITION_REQUIRED:428,TOO_MANY_REQUESTS:429,REQUEST_HEADER_FIELDS_TOO_LARGE:431,UNAVAILABLE_FOR_LEGAL_REASONS:451,INTERNAL_SERVER_ERROR:500,NOT_IMPLEMENTED:501,BAD_GATEWAY:502,SERVICE_UNAVAILABLE:503,GATEWAY_TIMEOUT:504,HTTP_VERSION_NOT_SUPPORTED:505,VARIANT_ALSO_NEGOTIATES:506,INSUFFICIENT_STORAGE:507,LOOP_DETECTED:508,NOT_EXTENDED:510,NETWORK_AUTHENTICATION_REQUIRED:511};var j=(t,e)=>{let r=C();for(let o of t)if(Array.isArray(o.options?.method))for(let n of o.options.method)m(r,n,o.path,o);else m(r,o.options.method,o.path,o);let a=C();for(let o of e?.routerMiddleware||[])m(a,"*",o.path,o.middleware);return{handler:async o=>{let n=new URL(o.url),y=n.pathname;e?.basePath&&(y=y.split(e.basePath)[1]);let s=o.method,d=w(r,s,y),E=d?.data,x=await T(o),h=o.headers,c=Object.fromEntries(n.searchParams),l=w(a,"*",y)?.data;if(!E)return new Response(null,{status:404,statusText:"Not Found"});try{let i={};if(l){let P=await l({path:y,method:s,headers:h,params:d?.params,request:o,body:x,query:c});P&&(i={...P,...i})}let f=await E({path:y,method:s,headers:h,params:d?.params,request:o,body:x,query:c,...i});if(f instanceof Response)return f;let g=I(f)?JSON.stringify(f):f;return new Response(g,{headers:E.headers})}catch(i){if(e?.onError){let f=await e.onError(i);if(f instanceof Response)return f}if(i instanceof u)return new Response(i.body?JSON.stringify(i.body):null,{status:_[i.status],statusText:i.status,headers:{"Content-Type":"application/json"}});if(e?.throwError)throw i;return new Response(null,{status:500,statusText:"Internal Server Error"})}}}};import"zod";export{u as APIError,R as createEndpoint,W as createEndpointCreator,M as createMiddleware,q as createMiddlewareCreator,j as createRouter,T as getBody,I as shouldSerialize,_ as statusCode};
2
2
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/endpoint.ts","../src/middleware.ts","../src/better-call-error.ts","../src/router.ts","../src/utils.ts"],"sourcesContent":["import { z, ZodError, type ZodOptional, type ZodSchema } from \"zod\"\nimport { createMiddleware, type Middleware } from \"./middleware\"\nimport { APIError } from \"./better-call-error\";\nimport type { HasRequiredKeys, UnionToIntersection } from \"./helper\";\nimport type { Context, ContextTools, Endpoint, EndpointOptions, EndpointResponse, Handler } from \"./types\";\n\n\nexport interface EndpointConfig {\n /**\n * Throw when the response isn't in 200 range\n */\n throwOnError?: boolean\n}\n\nexport function createEndpointCreator<T extends Record<string, any>>() {\n return <Path extends string, Opts extends EndpointOptions, R extends EndpointResponse>(path: Path, options: Opts, handler: Handler<Path, Opts, R, T>) => {\n //@ts-expect-error\n return createEndpoint(path, options, handler)\n }\n\n}\n\nexport function createEndpoint<Path extends string, Opts extends EndpointOptions, R extends EndpointResponse>(path: Path, options: Opts, handler: Handler<Path, Opts, R>) {\n const responseHeader = new Headers()\n type Ctx = Context<Path, Opts>\n const handle = async (...ctx: HasRequiredKeys<Ctx> extends true ? [Ctx] : [Ctx?]) => {\n let internalCtx = ({\n setHeader(key: string, value: string) {\n responseHeader.set(key, value)\n },\n setCookie(key: string, value: string) {\n responseHeader.append(\"Set-Cookie\", `${key}=${value}`)\n },\n getCookie(key: string) {\n const header = ctx[0]?.headers\n return header?.get(\"cookie\")?.split(\";\").find(cookie => cookie.startsWith(`${key}=`))?.split(\"=\")[1]\n },\n ...(ctx[0] || {}),\n context: {}\n })\n if (options.use?.length) {\n for (const middleware of options.use) {\n const res = await middleware(internalCtx) as Endpoint\n const body = res.options?.body ? res.options.body.parse(internalCtx.body) : undefined\n if (res) {\n internalCtx = {\n ...internalCtx,\n body: body ? {\n ...body,\n ...internalCtx.body\n } : internalCtx.body,\n context: {\n ...internalCtx.context || {},\n ...res\n }\n }\n }\n }\n }\n try {\n const body = options.body ? options.body.parse(internalCtx.body) : internalCtx.body\n internalCtx = {\n ...internalCtx,\n body: body ? {\n ...body,\n ...internalCtx.body\n } : internalCtx.body,\n }\n internalCtx.query = options.query ? options.query.parse(internalCtx.query) : internalCtx.query\n internalCtx.params = options.params ? options.params.parse(internalCtx.params) : internalCtx.params\n } catch (e) {\n if (e instanceof ZodError) {\n throw new APIError(\"BAD_REQUEST\", {\n message: e.message,\n details: e.errors\n })\n }\n throw e\n }\n if (options.requireHeaders && !internalCtx.headers) {\n throw new APIError(\"BAD_REQUEST\", {\n message: \"Headers are required\"\n })\n }\n if (options.requireRequest && !internalCtx.request) {\n throw new APIError(\"BAD_REQUEST\", {\n message: \"Request is required\"\n })\n }\n //@ts-expect-error\n const res = await handler(internalCtx)\n return res as ReturnType<Handler<Path, Opts, R>>\n }\n handle.path = path\n handle.options = options\n handle.method = options.method\n handle.headers = responseHeader\n return handle\n}","import { z } from \"zod\"\nimport type { ContextTools, Endpoint, EndpointOptions, EndpointResponse, Handler, InferBody, InferHeaders, InferRequest, Prettify } from \"./types\"\nimport { createEndpoint } from \"./endpoint\"\n\nexport type MiddlewareHandler<Opts extends EndpointOptions, R extends EndpointResponse, Extra extends Record<string, any> = {}> = (ctx: Prettify<InferBody<Opts> & InferRequest<Opts> & InferHeaders<Opts> & {\n params?: Record<string, string>,\n query?: Record<string, string>,\n} & ContextTools> & Extra) => Promise<R>\n\nexport function createMiddleware<Opts extends EndpointOptions, R extends EndpointResponse>(optionsOrHandler: MiddlewareHandler<Opts, R>): Endpoint<Handler<string, Opts, R>, Opts>\nexport function createMiddleware<Opts extends Omit<EndpointOptions, \"method\">, R extends EndpointResponse>(optionsOrHandler: Opts, handler: MiddlewareHandler<Opts & {\n method: \"*\"\n}, R>): Endpoint<Handler<string, Opts & {\n method: \"*\"\n}, R>, Opts & {\n method: \"*\"\n}>\nexport function createMiddleware(optionsOrHandler: any, handler?: any) {\n if (typeof optionsOrHandler === \"function\") {\n return createEndpoint(\"*\", {\n method: \"*\"\n }, optionsOrHandler)\n }\n if (!handler) {\n throw new Error(\"Middleware handler is required\")\n }\n const endpoint = createEndpoint(\"*\", {\n ...optionsOrHandler,\n method: \"*\"\n }, handler)\n return endpoint as any\n}\n\nexport const createMiddlewareCreator = <ExtraContext extends Record<string, any> = {}>() => {\n function fn<Opts extends EndpointOptions, R extends EndpointResponse>(optionsOrHandler: MiddlewareHandler<Opts, R, ExtraContext>): Endpoint<Handler<string, Opts, R>, Opts>\n function fn<Opts extends Omit<EndpointOptions, \"method\">, R extends EndpointResponse>(optionsOrHandler: Opts, handler: MiddlewareHandler<Opts & {\n method: \"*\"\n }, R, ExtraContext>): Endpoint<Handler<string, Opts & {\n method: \"*\"\n }, R>, Opts & {\n method: \"*\"\n }>\n function fn(optionsOrHandler: any, handler?: any) {\n if (typeof optionsOrHandler === \"function\") {\n return createEndpoint(\"*\", {\n method: \"*\"\n }, optionsOrHandler)\n }\n if (!handler) {\n throw new Error(\"Middleware handler is required\")\n }\n const endpoint = createEndpoint(\"*\", {\n ...optionsOrHandler,\n method: \"*\"\n }, handler)\n return endpoint as any\n }\n return { createMiddleware: fn }\n}\n\nexport type Middleware<Opts extends EndpointOptions = EndpointOptions, R extends EndpointResponse = EndpointResponse> = (opts: Opts, handler: (ctx: {\n body?: InferBody<Opts>,\n params?: Record<string, string>,\n query?: Record<string, string>\n}) => Promise<R>) => Endpoint","import type { statusCode } from \"./utils\"\n\ntype Status = keyof typeof statusCode\n\nexport class APIError extends Error {\n status: Status\n body: Record<string, any>\n constructor(\n status: Status,\n body?: Record<string, any>,\n ) {\n super(\n `API Error: ${status} ${body?.message ?? \"\"}`,\n {\n cause: body,\n }\n )\n this.status = status\n this.body = body ?? {}\n this.stack = \"\";\n this.name = \"BetterCallAPIError\"\n }\n}","import {\n createRouter as createRou3Router,\n addRoute,\n findRoute,\n} from \"rou3\";\nimport { getBody, shouldSerialize, statusCode } from \"./utils\";\nimport { APIError } from \"./better-call-error\";\nimport type { Middleware, MiddlewareHandler } from \"./middleware\";\nimport type { Endpoint, Method } from \"./types\";\n\ninterface RouterConfig {\n /**\n * Throw error if error occurred other than APIError\n */\n throwError?: boolean\n /**\n * Handle error\n */\n onError?: (e: unknown) => void | Promise<void> | Response | Promise<Response>\n /**\n * Base path for the router\n */\n basePath?: string\n /**\n * Middlewares for the router\n */\n routerMiddleware?: {\n path: string,\n middleware: Endpoint\n }[]\n}\n\nexport const createRouter = <E extends Endpoint, Config extends RouterConfig>(endpoints: E[], config?: Config) => {\n const router = createRou3Router()\n for (const endpoint of endpoints) {\n if (Array.isArray(endpoint.options?.method)) {\n for (const method of endpoint.options.method) {\n addRoute(router, method, endpoint.path, endpoint)\n }\n } else {\n addRoute(router, endpoint.options.method, endpoint.path, endpoint)\n }\n }\n\n const middlewareRouter = createRou3Router()\n for (const route of (config?.routerMiddleware || [])) {\n addRoute(middlewareRouter, \"*\", route.path, route.middleware)\n }\n\n const handler = async (request: Request) => {\n const url = new URL(request.url);\n let path = url.pathname\n if (config?.basePath) {\n path = path.split(config.basePath)[1]\n }\n const method = request.method;\n const route = findRoute(router, method, path)\n const handler = route?.data as Endpoint\n const body = await getBody(request)\n const headers = request.headers\n const query = Object.fromEntries(url.searchParams)\n const middleware = findRoute(middlewareRouter, \"*\", path)?.data as Endpoint | undefined\n //handler 404\n if (!handler) {\n return new Response(null, {\n status: 404,\n statusText: \"Not Found\"\n })\n }\n try {\n let middlewareContext: Record<string, any> = {}\n if (middleware) {\n const res = await middleware({\n path: path,\n method: method as \"GET\",\n headers,\n params: route?.params as any,\n request: request,\n body: body,\n query\n })\n if (res) {\n middlewareContext = {\n ...res,\n ...middlewareContext\n }\n }\n }\n const handlerRes = await handler({\n path: path,\n method: method as \"GET\",\n headers,\n params: route?.params as any,\n request: request,\n body: body,\n query,\n ...middlewareContext,\n })\n if (handlerRes instanceof Response) {\n return handlerRes\n }\n const resBody = shouldSerialize(handlerRes) ? JSON.stringify(handlerRes) : handlerRes\n return new Response(resBody as any, {\n headers: handler.headers\n })\n } catch (e) {\n if (config?.onError) {\n const onErrorRes = await config.onError(e)\n if (onErrorRes instanceof Response) {\n return onErrorRes\n }\n }\n if (e instanceof APIError) {\n return new Response(e.body ? JSON.stringify(e.body) : null, {\n status: statusCode[e.status],\n statusText: e.status,\n headers: {\n \"Content-Type\": \"application/json\",\n }\n })\n }\n if (config?.throwError) {\n throw e\n }\n return new Response(null, {\n status: 500,\n statusText: \"Internal Server Error\"\n })\n }\n }\n return {\n handler\n }\n}","export async function getBody(request: Request) {\n const contentType = request.headers.get('content-type') || '';\n\n if (!request.body) {\n return undefined\n }\n\n if (contentType.includes('application/json')) {\n return await request.json();\n }\n\n if (contentType.includes('application/x-www-form-urlencoded')) {\n const formData = await request.formData();\n const result: Record<string, string> = {};\n formData.forEach((value, key) => {\n result[key] = value.toString();\n });\n return result;\n }\n\n if (contentType.includes('multipart/form-data')) {\n const formData = await request.formData();\n const result: Record<string, any> = {};\n formData.forEach((value, key) => {\n result[key] = value;\n });\n return result;\n }\n\n if (contentType.includes('text/plain')) {\n return await request.text();\n }\n\n if (contentType.includes('application/octet-stream')) {\n return await request.arrayBuffer();\n }\n\n if (contentType.includes('application/pdf') || contentType.includes('image/') || contentType.includes('video/')) {\n const blob = await request.blob();\n return blob;\n }\n\n if (contentType.includes('application/stream') || request.body instanceof ReadableStream) {\n return request.body;\n }\n\n return await request.text();\n}\n\n\nexport function shouldSerialize(body: any) {\n return typeof body === \"object\" && body !== null && !(body instanceof Blob) && !(body instanceof FormData)\n}\n\nexport const statusCode = {\n \"OK\": 200,\n \"CREATED\": 201,\n \"ACCEPTED\": 202,\n \"NO_CONTENT\": 204,\n \"MULTIPLE_CHOICES\": 300,\n \"MOVED_PERMANENTLY\": 301,\n \"FOUND\": 302,\n \"SEE_OTHER\": 303,\n \"NOT_MODIFIED\": 304,\n \"TEMPORARY_REDIRECT\": 307,\n \"BAD_REQUEST\": 400,\n \"UNAUTHORIZED\": 401,\n \"PAYMENT_REQUIRED\": 402,\n \"FORBIDDEN\": 403,\n \"NOT_FOUND\": 404,\n \"METHOD_NOT_ALLOWED\": 405,\n \"NOT_ACCEPTABLE\": 406,\n \"PROXY_AUTHENTICATION_REQUIRED\": 407,\n \"REQUEST_TIMEOUT\": 408,\n \"CONFLICT\": 409,\n \"GONE\": 410,\n \"LENGTH_REQUIRED\": 411,\n \"PRECONDITION_FAILED\": 412,\n \"PAYLOAD_TOO_LARGE\": 413,\n \"URI_TOO_LONG\": 414,\n \"UNSUPPORTED_MEDIA_TYPE\": 415,\n \"RANGE_NOT_SATISFIABLE\": 416,\n \"EXPECTATION_FAILED\": 417,\n \"I'M_A_TEAPOT\": 418,\n \"MISDIRECTED_REQUEST\": 421,\n \"UNPROCESSABLE_ENTITY\": 422,\n \"LOCKED\": 423,\n \"FAILED_DEPENDENCY\": 424,\n \"TOO_EARLY\": 425,\n \"UPGRADE_REQUIRED\": 426,\n \"PRECONDITION_REQUIRED\": 428,\n \"TOO_MANY_REQUESTS\": 429,\n \"REQUEST_HEADER_FIELDS_TOO_LARGE\": 431,\n \"UNAVAILABLE_FOR_LEGAL_REASONS\": 451,\n \"INTERNAL_SERVER_ERROR\": 500,\n \"NOT_IMPLEMENTED\": 501,\n \"BAD_GATEWAY\": 502,\n \"SERVICE_UNAVAILABLE\": 503,\n \"GATEWAY_TIMEOUT\": 504,\n \"HTTP_VERSION_NOT_SUPPORTED\": 505,\n \"VARIANT_ALSO_NEGOTIATES\": 506,\n \"INSUFFICIENT_STORAGE\": 507,\n \"LOOP_DETECTED\": 508,\n \"NOT_EXTENDED\": 510,\n \"NETWORK_AUTHENTICATION_REQUIRED\": 511,\n}\n"],"mappings":"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","names":["ZodError","createMiddleware","optionsOrHandler","handler","createEndpoint","createMiddlewareCreator","fn","APIError","status","body","__publicField","createEndpointCreator","path","options","handler","createEndpoint","responseHeader","handle","ctx","internalCtx","key","value","cookie","middleware","res","body","e","ZodError","APIError","createRou3Router","addRoute","findRoute","getBody","request","contentType","formData","result","value","key","shouldSerialize","body","statusCode","createRouter","endpoints","config","router","createRou3Router","endpoint","method","addRoute","middlewareRouter","route","request","url","path","findRoute","handler","body","getBody","headers","query","middleware","middlewareContext","res","handlerRes","resBody","shouldSerialize","e","onErrorRes","APIError","statusCode"]}
1
+ {"version":3,"sources":["../src/endpoint.ts","../src/middleware.ts","../src/better-call-error.ts","../src/router.ts","../src/utils.ts","../src/types.ts"],"sourcesContent":["import { z, ZodError, type ZodOptional, type ZodSchema } from \"zod\"\nimport { createMiddleware, type Middleware } from \"./middleware\"\nimport { APIError } from \"./better-call-error\";\nimport type { HasRequiredKeys, UnionToIntersection } from \"./helper\";\nimport type { Context, ContextTools, Endpoint, EndpointOptions, EndpointResponse, Handler } from \"./types\";\n\n\nexport interface EndpointConfig {\n /**\n * Throw when the response isn't in 200 range\n */\n throwOnError?: boolean\n}\n\nexport function createEndpointCreator<T extends Record<string, any>>() {\n return <Path extends string, Opts extends EndpointOptions, R extends EndpointResponse>(path: Path, options: Opts, handler: Handler<Path, Opts, R, T>) => {\n //@ts-expect-error\n return createEndpoint(path, options, handler)\n }\n\n}\n\nexport function createEndpoint<Path extends string, Opts extends EndpointOptions, R extends EndpointResponse>(path: Path, options: Opts, handler: Handler<Path, Opts, R>) {\n const responseHeader = new Headers()\n type Ctx = Context<Path, Opts>\n const handle = async (...ctx: HasRequiredKeys<Ctx> extends true ? [Ctx] : [Ctx?]) => {\n let internalCtx = ({\n setHeader(key: string, value: string) {\n responseHeader.set(key, value)\n },\n setCookie(key: string, value: string) {\n responseHeader.append(\"Set-Cookie\", `${key}=${value}`)\n },\n getCookie(key: string) {\n const header = ctx[0]?.headers\n return header?.get(\"cookie\")?.split(\";\").find(cookie => cookie.startsWith(`${key}=`))?.split(\"=\")[1]\n },\n ...(ctx[0] || {}),\n context: {}\n })\n if (options.use?.length) {\n for (const middleware of options.use) {\n const res = await middleware(internalCtx) as Endpoint\n const body = res.options?.body ? res.options.body.parse(internalCtx.body) : undefined\n if (res) {\n internalCtx = {\n ...internalCtx,\n body: body ? {\n ...body,\n ...internalCtx.body\n } : internalCtx.body,\n context: {\n ...internalCtx.context || {},\n ...res\n }\n }\n }\n }\n }\n try {\n const body = options.body ? options.body.parse(internalCtx.body) : internalCtx.body\n internalCtx = {\n ...internalCtx,\n body: body ? {\n ...body,\n ...internalCtx.body\n } : internalCtx.body,\n }\n internalCtx.query = options.query ? options.query.parse(internalCtx.query) : internalCtx.query\n internalCtx.params = options.params ? options.params.parse(internalCtx.params) : internalCtx.params\n } catch (e) {\n if (e instanceof ZodError) {\n throw new APIError(\"BAD_REQUEST\", {\n message: e.message,\n details: e.errors\n })\n }\n throw e\n }\n if (options.requireHeaders && !internalCtx.headers) {\n throw new APIError(\"BAD_REQUEST\", {\n message: \"Headers are required\"\n })\n }\n if (options.requireRequest && !internalCtx.request) {\n throw new APIError(\"BAD_REQUEST\", {\n message: \"Request is required\"\n })\n }\n //@ts-expect-error\n const res = await handler(internalCtx)\n return res as ReturnType<Handler<Path, Opts, R>>\n }\n handle.path = path\n handle.options = options\n handle.method = options.method\n handle.headers = responseHeader\n return handle\n}","import { z } from \"zod\"\nimport type { ContextTools, Endpoint, EndpointOptions, EndpointResponse, Handler, InferBody, InferHeaders, InferRequest, Prettify } from \"./types\"\nimport { createEndpoint } from \"./endpoint\"\n\nexport type MiddlewareHandler<Opts extends EndpointOptions, R extends EndpointResponse, Extra extends Record<string, any> = {}> = (ctx: Prettify<InferBody<Opts> & InferRequest<Opts> & InferHeaders<Opts> & {\n params?: Record<string, string>,\n query?: Record<string, string>,\n} & ContextTools> & Extra) => Promise<R>\n\nexport function createMiddleware<Opts extends EndpointOptions, R extends EndpointResponse>(optionsOrHandler: MiddlewareHandler<Opts, R>): Endpoint<Handler<string, Opts, R>, Opts>\nexport function createMiddleware<Opts extends Omit<EndpointOptions, \"method\">, R extends EndpointResponse>(optionsOrHandler: Opts, handler: MiddlewareHandler<Opts & {\n method: \"*\"\n}, R>): Endpoint<Handler<string, Opts & {\n method: \"*\"\n}, R>, Opts & {\n method: \"*\"\n}>\nexport function createMiddleware(optionsOrHandler: any, handler?: any) {\n if (typeof optionsOrHandler === \"function\") {\n return createEndpoint(\"*\", {\n method: \"*\"\n }, optionsOrHandler)\n }\n if (!handler) {\n throw new Error(\"Middleware handler is required\")\n }\n const endpoint = createEndpoint(\"*\", {\n ...optionsOrHandler,\n method: \"*\"\n }, handler)\n return endpoint as any\n}\n\nexport const createMiddlewareCreator = <ExtraContext extends Record<string, any> = {}>() => {\n function fn<Opts extends EndpointOptions, R extends EndpointResponse>(optionsOrHandler: MiddlewareHandler<Opts, R, ExtraContext>): Endpoint<Handler<string, Opts, R>, Opts>\n function fn<Opts extends Omit<EndpointOptions, \"method\">, R extends EndpointResponse>(optionsOrHandler: Opts, handler: MiddlewareHandler<Opts & {\n method: \"*\"\n }, R, ExtraContext>): Endpoint<Handler<string, Opts & {\n method: \"*\"\n }, R>, Opts & {\n method: \"*\"\n }>\n function fn(optionsOrHandler: any, handler?: any) {\n if (typeof optionsOrHandler === \"function\") {\n return createEndpoint(\"*\", {\n method: \"*\"\n }, optionsOrHandler)\n }\n if (!handler) {\n throw new Error(\"Middleware handler is required\")\n }\n const endpoint = createEndpoint(\"*\", {\n ...optionsOrHandler,\n method: \"*\"\n }, handler)\n return endpoint as any\n }\n return fn\n}\n\nexport type Middleware<Opts extends EndpointOptions = EndpointOptions, R extends EndpointResponse = EndpointResponse> = (opts: Opts, handler: (ctx: {\n body?: InferBody<Opts>,\n params?: Record<string, string>,\n query?: Record<string, string>\n}) => Promise<R>) => Endpoint","import type { statusCode } from \"./utils\"\n\ntype Status = keyof typeof statusCode\n\nexport class APIError extends Error {\n status: Status\n body: Record<string, any>\n constructor(\n status: Status,\n body?: Record<string, any>,\n ) {\n super(\n `API Error: ${status} ${body?.message ?? \"\"}`,\n {\n cause: body,\n }\n )\n this.status = status\n this.body = body ?? {}\n this.stack = \"\";\n this.name = \"BetterCallAPIError\"\n }\n}","import {\n createRouter as createRou3Router,\n addRoute,\n findRoute,\n} from \"rou3\";\nimport { getBody, shouldSerialize, statusCode } from \"./utils\";\nimport { APIError } from \"./better-call-error\";\nimport type { Middleware, MiddlewareHandler } from \"./middleware\";\nimport type { Endpoint, Method } from \"./types\";\n\ninterface RouterConfig {\n /**\n * Throw error if error occurred other than APIError\n */\n throwError?: boolean\n /**\n * Handle error\n */\n onError?: (e: unknown) => void | Promise<void> | Response | Promise<Response>\n /**\n * Base path for the router\n */\n basePath?: string\n /**\n * Middlewares for the router\n */\n routerMiddleware?: {\n path: string,\n middleware: Endpoint\n }[]\n}\n\nexport const createRouter = <E extends Endpoint, Config extends RouterConfig>(endpoints: E[], config?: Config) => {\n const router = createRou3Router()\n for (const endpoint of endpoints) {\n if (Array.isArray(endpoint.options?.method)) {\n for (const method of endpoint.options.method) {\n addRoute(router, method, endpoint.path, endpoint)\n }\n } else {\n addRoute(router, endpoint.options.method, endpoint.path, endpoint)\n }\n }\n\n const middlewareRouter = createRou3Router()\n for (const route of (config?.routerMiddleware || [])) {\n addRoute(middlewareRouter, \"*\", route.path, route.middleware)\n }\n\n const handler = async (request: Request) => {\n const url = new URL(request.url);\n let path = url.pathname\n if (config?.basePath) {\n path = path.split(config.basePath)[1]\n }\n const method = request.method;\n const route = findRoute(router, method, path)\n const handler = route?.data as Endpoint\n const body = await getBody(request)\n const headers = request.headers\n const query = Object.fromEntries(url.searchParams)\n const middleware = findRoute(middlewareRouter, \"*\", path)?.data as Endpoint | undefined\n //handler 404\n if (!handler) {\n return new Response(null, {\n status: 404,\n statusText: \"Not Found\"\n })\n }\n try {\n let middlewareContext: Record<string, any> = {}\n if (middleware) {\n const res = await middleware({\n path: path,\n method: method as \"GET\",\n headers,\n params: route?.params as any,\n request: request,\n body: body,\n query\n })\n if (res) {\n middlewareContext = {\n ...res,\n ...middlewareContext\n }\n }\n }\n const handlerRes = await handler({\n path: path,\n method: method as \"GET\",\n headers,\n params: route?.params as any,\n request: request,\n body: body,\n query,\n ...middlewareContext,\n })\n if (handlerRes instanceof Response) {\n return handlerRes\n }\n const resBody = shouldSerialize(handlerRes) ? JSON.stringify(handlerRes) : handlerRes\n return new Response(resBody as any, {\n headers: handler.headers\n })\n } catch (e) {\n if (config?.onError) {\n const onErrorRes = await config.onError(e)\n if (onErrorRes instanceof Response) {\n return onErrorRes\n }\n }\n if (e instanceof APIError) {\n return new Response(e.body ? JSON.stringify(e.body) : null, {\n status: statusCode[e.status],\n statusText: e.status,\n headers: {\n \"Content-Type\": \"application/json\",\n }\n })\n }\n if (config?.throwError) {\n throw e\n }\n return new Response(null, {\n status: 500,\n statusText: \"Internal Server Error\"\n })\n }\n }\n return {\n handler\n }\n}","export async function getBody(request: Request) {\n const contentType = request.headers.get('content-type') || '';\n\n if (!request.body) {\n return undefined\n }\n\n if (contentType.includes('application/json')) {\n return await request.json();\n }\n\n if (contentType.includes('application/x-www-form-urlencoded')) {\n const formData = await request.formData();\n const result: Record<string, string> = {};\n formData.forEach((value, key) => {\n result[key] = value.toString();\n });\n return result;\n }\n\n if (contentType.includes('multipart/form-data')) {\n const formData = await request.formData();\n const result: Record<string, any> = {};\n formData.forEach((value, key) => {\n result[key] = value;\n });\n return result;\n }\n\n if (contentType.includes('text/plain')) {\n return await request.text();\n }\n\n if (contentType.includes('application/octet-stream')) {\n return await request.arrayBuffer();\n }\n\n if (contentType.includes('application/pdf') || contentType.includes('image/') || contentType.includes('video/')) {\n const blob = await request.blob();\n return blob;\n }\n\n if (contentType.includes('application/stream') || request.body instanceof ReadableStream) {\n return request.body;\n }\n\n return await request.text();\n}\n\n\nexport function shouldSerialize(body: any) {\n return typeof body === \"object\" && body !== null && !(body instanceof Blob) && !(body instanceof FormData)\n}\n\nexport const statusCode = {\n \"OK\": 200,\n \"CREATED\": 201,\n \"ACCEPTED\": 202,\n \"NO_CONTENT\": 204,\n \"MULTIPLE_CHOICES\": 300,\n \"MOVED_PERMANENTLY\": 301,\n \"FOUND\": 302,\n \"SEE_OTHER\": 303,\n \"NOT_MODIFIED\": 304,\n \"TEMPORARY_REDIRECT\": 307,\n \"BAD_REQUEST\": 400,\n \"UNAUTHORIZED\": 401,\n \"PAYMENT_REQUIRED\": 402,\n \"FORBIDDEN\": 403,\n \"NOT_FOUND\": 404,\n \"METHOD_NOT_ALLOWED\": 405,\n \"NOT_ACCEPTABLE\": 406,\n \"PROXY_AUTHENTICATION_REQUIRED\": 407,\n \"REQUEST_TIMEOUT\": 408,\n \"CONFLICT\": 409,\n \"GONE\": 410,\n \"LENGTH_REQUIRED\": 411,\n \"PRECONDITION_FAILED\": 412,\n \"PAYLOAD_TOO_LARGE\": 413,\n \"URI_TOO_LONG\": 414,\n \"UNSUPPORTED_MEDIA_TYPE\": 415,\n \"RANGE_NOT_SATISFIABLE\": 416,\n \"EXPECTATION_FAILED\": 417,\n \"I'M_A_TEAPOT\": 418,\n \"MISDIRECTED_REQUEST\": 421,\n \"UNPROCESSABLE_ENTITY\": 422,\n \"LOCKED\": 423,\n \"FAILED_DEPENDENCY\": 424,\n \"TOO_EARLY\": 425,\n \"UPGRADE_REQUIRED\": 426,\n \"PRECONDITION_REQUIRED\": 428,\n \"TOO_MANY_REQUESTS\": 429,\n \"REQUEST_HEADER_FIELDS_TOO_LARGE\": 431,\n \"UNAVAILABLE_FOR_LEGAL_REASONS\": 451,\n \"INTERNAL_SERVER_ERROR\": 500,\n \"NOT_IMPLEMENTED\": 501,\n \"BAD_GATEWAY\": 502,\n \"SERVICE_UNAVAILABLE\": 503,\n \"GATEWAY_TIMEOUT\": 504,\n \"HTTP_VERSION_NOT_SUPPORTED\": 505,\n \"VARIANT_ALSO_NEGOTIATES\": 506,\n \"INSUFFICIENT_STORAGE\": 507,\n \"LOOP_DETECTED\": 508,\n \"NOT_EXTENDED\": 510,\n \"NETWORK_AUTHENTICATION_REQUIRED\": 511,\n}\n","import { z, type ZodOptional, type ZodSchema } from \"zod\"\nimport type { Middleware } from \"./middleware\"\nimport type { UnionToIntersection } from \"./helper\";\n\n\nexport interface EndpointOptions {\n method: Method | Method[]\n body?: ZodSchema\n query?: ZodSchema\n params?: ZodSchema<any>\n /**\n * If true headers will be required to be passed in the context\n */\n requireHeaders?: boolean\n /**\n * If true request object will be required\n */\n requireRequest?: boolean\n /**\n * List of endpoints that will be called before this endpoint\n */\n use?: Endpoint[]\n}\n\nexport type Endpoint<Handler extends (ctx: any) => Promise<any> = (ctx: any) => Promise<any>, Option extends EndpointOptions = EndpointOptions> = {\n path: string\n options: Option\n headers?: Headers\n} & (Handler)\n\nexport type InferParamPath<Path> =\n Path extends `${infer _Start}:${infer Param}/${infer Rest}`\n ? { [K in Param | keyof InferParamPath<Rest>]: string }\n : Path extends `${infer _Start}:${infer Param}`\n ? { [K in Param]: string }\n : Path extends `${infer _Start}/${infer Rest}`\n ? InferParamPath<Rest>\n : undefined;\n\nexport type InferParamWildCard<Path> = Path extends `${infer _Start}/*:${infer Param}/${infer Rest}` | `${infer _Start}/**:${infer Param}/${infer Rest}`\n ? { [K in Param | keyof InferParamPath<Rest>]: string }\n : Path extends `${infer _Start}/*`\n ? { [K in \"_\"]: string }\n : Path extends `${infer _Start}/${infer Rest}`\n ? InferParamPath<Rest>\n : undefined;\n\n\nexport type Prettify<T> = {\n [key in keyof T]: T[key];\n} & {};\n\nexport type ContextTools = {\n /**\n * Set header\n * \n * If it's called outside of a request it will just be ignored.\n */\n setHeader: (key: string, value: string) => void\n /**\n * cookie setter.\n * \n * If it's called outside of a request it will just be ignored.\n */\n setCookie: (key: string, value: string) => void\n /**\n * Get cookie value\n * \n * If it's called outside of a request it will just be ignored.\n */\n getCookie: (key: string) => string | undefined\n}\n\nexport type Context<Path extends string, Opts extends EndpointOptions> = InferBody<Opts> & InferParam<Path> & InferMethod<Opts['method']> & InferHeaders<Opts> & InferRequest<Opts> & InferQuery<Opts[\"query\"]>\n\nexport type InferUse<Opts extends EndpointOptions> = Opts[\"use\"] extends Endpoint[] ? {\n context: UnionToIntersection<Awaited<ReturnType<Opts[\"use\"][number]>>>\n} : {}\n\nexport type InferUseOptions<Opts extends EndpointOptions> = Opts[\"use\"] extends Array<infer U> ? UnionToIntersection<U extends Endpoint ? U['options'] : {\n body?: {},\n requireRequest?: boolean\n requireHeaders?: boolean\n}> : {\n body?: {},\n requireRequest?: boolean\n requireHeaders?: boolean\n}\n\nexport type InferMethod<M extends Method | Method[]> = M extends Array<Method> ? {\n method: M[number]\n} : {\n method?: M\n}\n\nexport type InferHeaders<Opt extends EndpointOptions, HeaderReq = Opt[\"requireHeaders\"]> = HeaderReq extends true ? {\n headers: Headers\n} : InferUseOptions<Opt>['requireHeaders'] extends true ? {\n headers: Headers\n} : {\n headers?: Headers\n}\n\n\nexport type InferRequest<Opt extends EndpointOptions, RequestReq = Opt[\"requireRequest\"]> = RequestReq extends true ? {\n request: Request\n} : InferUseOptions<Opt>['requireRequest'] extends true ? {\n request: Request\n} : {\n request?: Request\n}\n\n\nexport type InferQuery<Query> = Query extends ZodSchema ? Query extends ZodOptional<any> ? {\n query?: z.infer<Query>\n} : {\n query: z.infer<Query>\n} : {\n query?: undefined\n}\n\nexport type InferParam<Path extends string, ParamPath extends InferParamPath<Path> = InferParamPath<Path>, WildCard extends InferParamWildCard<Path> = InferParamWildCard<Path>> = ParamPath extends undefined ? WildCard extends undefined ? {\n params?: Record<string, string>\n} : {\n params: WildCard\n} : {\n params: Prettify<ParamPath & (WildCard extends undefined ? {} : WildCard)>\n}\n\n\nexport type EndpointResponse = Record<string, any> | string | boolean | number | void | undefined\n\nexport type Handler<Path extends string, Opts extends EndpointOptions, R extends EndpointResponse, Extra extends Record<string, any> = {}> = (ctx: Prettify<Context<Path, Opts> & InferUse<Opts> & ContextTools> & Extra) => Promise<R>\n\nexport type Method = \"GET\" | \"POST\" | \"PUT\" | \"DELETE\" | \"PATCH\" | \"*\"\n\n\nexport type InferBody<Opts extends EndpointOptions, Body extends ZodSchema | undefined = (Opts[\"body\"] &\n (undefined extends InferUseOptions<Opts>['body'] ? {} : InferUseOptions<Opts>['body']))> = Body extends ZodSchema ? Body extends ZodOptional<any> ? {\n body?: Prettify<z.infer<Body>>\n } : {\n body: Prettify<z.infer<Body>>\n } : {\n body?: undefined\n }"],"mappings":"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","names":["ZodError","createMiddleware","optionsOrHandler","handler","createEndpoint","createMiddlewareCreator","fn","APIError","status","body","__publicField","createEndpointCreator","path","options","handler","createEndpoint","responseHeader","handle","ctx","internalCtx","key","value","cookie","middleware","res","body","e","ZodError","APIError","createRou3Router","addRoute","findRoute","getBody","request","contentType","formData","result","value","key","shouldSerialize","body","statusCode","createRouter","endpoints","config","router","createRou3Router","endpoint","method","addRoute","middlewareRouter","route","request","url","path","findRoute","handler","body","getBody","headers","query","middleware","middlewareContext","res","handlerRes","resBody","shouldSerialize","e","onErrorRes","APIError","statusCode"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "better-call",
3
- "version": "0.0.5-beta.7",
3
+ "version": "0.0.5-beta.9",
4
4
  "type": "module",
5
5
  "main": "./dist/index.cjs",
6
6
  "module": "./dist/index.js",