better-call 0.0.5-beta.20 → 0.0.5-beta.21
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/README.md +1 -1
- package/dist/client.cjs +1 -1
- package/dist/client.cjs.map +1 -1
- package/dist/client.d.cts +7 -2
- package/dist/client.d.ts +7 -2
- package/dist/client.js +1 -1
- package/dist/client.js.map +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js.map +1 -1
- package/dist/{router-CAklHiJN.d.cts → router-BoATPhwk.d.cts} +1 -1
- package/dist/{router-CAklHiJN.d.ts → router-BoATPhwk.d.ts} +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
package/dist/client.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var o=Object.defineProperty;var d=Object.getOwnPropertyDescriptor;var y=Object.getOwnPropertyNames;var p=Object.prototype.hasOwnProperty;var a=(t,e)=>{for(var n in e)o(t,n,{get:e[n],enumerable:!0})},u=(t,e,n,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of y(e))!p.call(t,r)&&r!==n&&o(t,r,{get:()=>e[r],enumerable:!(s=d(e,r))||s.enumerable});return t};var x=t=>u(o({},"__esModule",{value:!0}),t);var f={};a(f,{createClient:()=>T});module.exports=x(f);var i=require("@better-fetch/fetch"),T=t=>{let e=(0,i.createFetch)(t);return async(n,...s)=>await e(n,{...s[0]})};0&&(module.exports={createClient});
|
|
2
2
|
//# sourceMappingURL=client.cjs.map
|
package/dist/client.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/client.ts"],"sourcesContent":["import type { Endpoint, Prettify } from \"./types\";\nimport type { HasRequiredKeys, UnionToIntersection } from \"type-fest\";\nimport { type BetterFetchOption, type BetterFetchResponse, createFetch } from \"@better-fetch/fetch\";\nimport type { Router } from \"./router\";\n\ntype InferContext<T> = T extends (ctx: infer Ctx) => any\n\t? Ctx extends object\n\t
|
|
1
|
+
{"version":3,"sources":["../src/client.ts"],"sourcesContent":["import type { Endpoint, Prettify } from \"./types\";\nimport type { HasRequiredKeys, UnionToIntersection } from \"type-fest\";\nimport { type BetterFetchOption, type BetterFetchResponse, createFetch } from \"@better-fetch/fetch\";\nimport type { Router } from \"./router\";\n\n\ntype HasRequired<T extends {\n\tbody?: any;\n\tquery?: any;\n\tparams?: any;\n}> = HasRequiredKeys<T> extends true ? HasRequiredKeys<T[\"body\"]> extends false ? HasRequiredKeys<T[\"query\"]> extends false ? HasRequiredKeys<T[\"params\"]> extends false ? false : true : true : true : true\n\ntype InferContext<T> = T extends (ctx: infer Ctx) => any\n\t? Ctx extends object\n\t? Ctx\n\t: never\n\t: never;\n\nexport interface ClientOptions extends BetterFetchOption {\n\tbaseURL: string;\n}\n\ntype WithRequired<T, K> = T & {\n\t[P in K extends string ? K : never]-?: T[P extends keyof T ? P : never];\n};\n\nexport type RequiredOptionKeys<\n\tC extends {\n\t\tbody?: any;\n\t\tquery?: any;\n\t\tparams?: any;\n\t},\n> = (undefined extends C[\"body\"]\n\t? {}\n\t: {\n\t\tbody: true;\n\t}) &\n\t(undefined extends C[\"query\"]\n\t\t? {}\n\t\t: {\n\t\t\tquery: true;\n\t\t}) &\n\t(undefined extends C[\"params\"]\n\t\t? {}\n\t\t: {\n\t\t\tparams: true;\n\t\t});\n\nexport const createClient = <R extends Router | Router[\"endpoints\"]>(options: ClientOptions) => {\n\tconst fetch = createFetch(options);\n\ttype API = R extends Router ? R[\"endpoints\"] : R;\n\ttype Options = API extends {\n\t\t[key: string]: infer T;\n\t}\n\t\t? T extends Endpoint\n\t\t? {\n\t\t\t[key in T[\"options\"][\"method\"] extends \"GET\"\n\t\t\t? T[\"path\"]\n\t\t\t: `@${T[\"options\"][\"method\"] extends string ? Lowercase<T[\"options\"][\"method\"]> : never}${T[\"path\"]}`]: T;\n\t\t}\n\t\t: {}\n\t\t: {};\n\n\ttype O = Prettify<UnionToIntersection<Options>>;\n\treturn async <OPT extends O, K extends keyof OPT, C extends InferContext<OPT[K]>>(\n\t\tpath: K,\n\t\t...options: HasRequired<C> extends true\n\t\t\t? [\n\t\t\t\tWithRequired<\n\t\t\t\t\tBetterFetchOption<C[\"body\"], C[\"query\"], C[\"params\"]>,\n\t\t\t\t\tkeyof RequiredOptionKeys<C>\n\t\t\t\t>,\n\t\t\t]\n\t\t\t: [BetterFetchOption<C[\"body\"], C[\"query\"], C[\"params\"]>?]\n\t): Promise<\n\t\tBetterFetchResponse<Awaited<ReturnType<OPT[K] extends Endpoint ? OPT[K] : never>>>\n\t> => {\n\t\treturn (await fetch(path as string, {\n\t\t\t...options[0],\n\t\t})) as any;\n\t};\n};\n"],"mappings":"yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,kBAAAE,IAAA,eAAAC,EAAAH,GAEA,IAAAI,EAA8E,+BA8CjEF,EAAwDG,GAA2B,CAC/F,IAAMC,KAAQ,eAAYD,CAAO,EAejC,MAAO,OACNE,KACGF,IAWK,MAAMC,EAAMC,EAAgB,CACnC,GAAGF,EAAQ,CAAC,CACb,CAAC,CAEH","names":["client_exports","__export","createClient","__toCommonJS","import_fetch","options","fetch","path"]}
|
package/dist/client.d.cts
CHANGED
|
@@ -1,8 +1,13 @@
|
|
|
1
|
-
import { R as Router, f as Endpoint } from './router-
|
|
1
|
+
import { R as Router, f as Endpoint } from './router-BoATPhwk.cjs';
|
|
2
2
|
import { UnionToIntersection, HasRequiredKeys } from 'type-fest';
|
|
3
3
|
import { BetterFetchOption, BetterFetchResponse } from '@better-fetch/fetch';
|
|
4
4
|
import 'zod';
|
|
5
5
|
|
|
6
|
+
type HasRequired<T extends {
|
|
7
|
+
body?: any;
|
|
8
|
+
query?: any;
|
|
9
|
+
params?: any;
|
|
10
|
+
}> = HasRequiredKeys<T> extends true ? HasRequiredKeys<T["body"]> extends false ? HasRequiredKeys<T["query"]> extends false ? HasRequiredKeys<T["params"]> extends false ? false : true : true : true : true;
|
|
6
11
|
type InferContext<T> = T extends (ctx: infer Ctx) => any ? Ctx extends object ? Ctx : never : never;
|
|
7
12
|
interface ClientOptions extends BetterFetchOption {
|
|
8
13
|
baseURL: string;
|
|
@@ -31,6 +36,6 @@ declare const createClient: <R extends Router | Router["endpoints"]>(options: Cl
|
|
|
31
36
|
endpoints: Record<string, Endpoint>;
|
|
32
37
|
} ? R["endpoints"] : R) extends {
|
|
33
38
|
[key: string]: infer T_1;
|
|
34
|
-
} ? T_1 extends Endpoint ? { [key_1 in T_1["options"]["method"] extends "GET" ? T_1["path"] : `@${T_1["options"]["method"] extends string ? Lowercase<T_1["options"]["method"]> : never}${T_1["path"]}`]: T_1; } : {} : {}>[key]; } : never, K extends keyof OPT, C extends InferContext<OPT[K]>>(path: K, ...options:
|
|
39
|
+
} ? T_1 extends Endpoint ? { [key_1 in T_1["options"]["method"] extends "GET" ? T_1["path"] : `@${T_1["options"]["method"] extends string ? Lowercase<T_1["options"]["method"]> : never}${T_1["path"]}`]: T_1; } : {} : {}>[key]; } : never, K extends keyof OPT, C extends InferContext<OPT[K]>>(path: K, ...options: HasRequired<C> extends true ? [WithRequired<BetterFetchOption<C["body"], C["query"], C["params"]>, keyof RequiredOptionKeys<C>>] : [BetterFetchOption<C["body"], C["query"], C["params"]>?]) => Promise<BetterFetchResponse<Awaited<ReturnType<OPT[K] extends Endpoint ? OPT[K] : never>>>>;
|
|
35
40
|
|
|
36
41
|
export { type ClientOptions, type RequiredOptionKeys, createClient };
|
package/dist/client.d.ts
CHANGED
|
@@ -1,8 +1,13 @@
|
|
|
1
|
-
import { R as Router, f as Endpoint } from './router-
|
|
1
|
+
import { R as Router, f as Endpoint } from './router-BoATPhwk.js';
|
|
2
2
|
import { UnionToIntersection, HasRequiredKeys } from 'type-fest';
|
|
3
3
|
import { BetterFetchOption, BetterFetchResponse } from '@better-fetch/fetch';
|
|
4
4
|
import 'zod';
|
|
5
5
|
|
|
6
|
+
type HasRequired<T extends {
|
|
7
|
+
body?: any;
|
|
8
|
+
query?: any;
|
|
9
|
+
params?: any;
|
|
10
|
+
}> = HasRequiredKeys<T> extends true ? HasRequiredKeys<T["body"]> extends false ? HasRequiredKeys<T["query"]> extends false ? HasRequiredKeys<T["params"]> extends false ? false : true : true : true : true;
|
|
6
11
|
type InferContext<T> = T extends (ctx: infer Ctx) => any ? Ctx extends object ? Ctx : never : never;
|
|
7
12
|
interface ClientOptions extends BetterFetchOption {
|
|
8
13
|
baseURL: string;
|
|
@@ -31,6 +36,6 @@ declare const createClient: <R extends Router | Router["endpoints"]>(options: Cl
|
|
|
31
36
|
endpoints: Record<string, Endpoint>;
|
|
32
37
|
} ? R["endpoints"] : R) extends {
|
|
33
38
|
[key: string]: infer T_1;
|
|
34
|
-
} ? T_1 extends Endpoint ? { [key_1 in T_1["options"]["method"] extends "GET" ? T_1["path"] : `@${T_1["options"]["method"] extends string ? Lowercase<T_1["options"]["method"]> : never}${T_1["path"]}`]: T_1; } : {} : {}>[key]; } : never, K extends keyof OPT, C extends InferContext<OPT[K]>>(path: K, ...options:
|
|
39
|
+
} ? T_1 extends Endpoint ? { [key_1 in T_1["options"]["method"] extends "GET" ? T_1["path"] : `@${T_1["options"]["method"] extends string ? Lowercase<T_1["options"]["method"]> : never}${T_1["path"]}`]: T_1; } : {} : {}>[key]; } : never, K extends keyof OPT, C extends InferContext<OPT[K]>>(path: K, ...options: HasRequired<C> extends true ? [WithRequired<BetterFetchOption<C["body"], C["query"], C["params"]>, keyof RequiredOptionKeys<C>>] : [BetterFetchOption<C["body"], C["query"], C["params"]>?]) => Promise<BetterFetchResponse<Awaited<ReturnType<OPT[K] extends Endpoint ? OPT[K] : never>>>>;
|
|
35
40
|
|
|
36
41
|
export { type ClientOptions, type RequiredOptionKeys, createClient };
|
package/dist/client.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{createFetch as s}from"@better-fetch/fetch";var
|
|
1
|
+
import{createFetch as s}from"@better-fetch/fetch";var i=e=>{let t=s(e);return async(n,...r)=>await t(n,{...r[0]})};export{i as createClient};
|
|
2
2
|
//# sourceMappingURL=client.js.map
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/client.ts"],"sourcesContent":["import type { Endpoint, Prettify } from \"./types\";\nimport type { HasRequiredKeys, UnionToIntersection } from \"type-fest\";\nimport { type BetterFetchOption, type BetterFetchResponse, createFetch } from \"@better-fetch/fetch\";\nimport type { Router } from \"./router\";\n\ntype InferContext<T> = T extends (ctx: infer Ctx) => any\n\t? Ctx extends object\n\t
|
|
1
|
+
{"version":3,"sources":["../src/client.ts"],"sourcesContent":["import type { Endpoint, Prettify } from \"./types\";\nimport type { HasRequiredKeys, UnionToIntersection } from \"type-fest\";\nimport { type BetterFetchOption, type BetterFetchResponse, createFetch } from \"@better-fetch/fetch\";\nimport type { Router } from \"./router\";\n\n\ntype HasRequired<T extends {\n\tbody?: any;\n\tquery?: any;\n\tparams?: any;\n}> = HasRequiredKeys<T> extends true ? HasRequiredKeys<T[\"body\"]> extends false ? HasRequiredKeys<T[\"query\"]> extends false ? HasRequiredKeys<T[\"params\"]> extends false ? false : true : true : true : true\n\ntype InferContext<T> = T extends (ctx: infer Ctx) => any\n\t? Ctx extends object\n\t? Ctx\n\t: never\n\t: never;\n\nexport interface ClientOptions extends BetterFetchOption {\n\tbaseURL: string;\n}\n\ntype WithRequired<T, K> = T & {\n\t[P in K extends string ? K : never]-?: T[P extends keyof T ? P : never];\n};\n\nexport type RequiredOptionKeys<\n\tC extends {\n\t\tbody?: any;\n\t\tquery?: any;\n\t\tparams?: any;\n\t},\n> = (undefined extends C[\"body\"]\n\t? {}\n\t: {\n\t\tbody: true;\n\t}) &\n\t(undefined extends C[\"query\"]\n\t\t? {}\n\t\t: {\n\t\t\tquery: true;\n\t\t}) &\n\t(undefined extends C[\"params\"]\n\t\t? {}\n\t\t: {\n\t\t\tparams: true;\n\t\t});\n\nexport const createClient = <R extends Router | Router[\"endpoints\"]>(options: ClientOptions) => {\n\tconst fetch = createFetch(options);\n\ttype API = R extends Router ? R[\"endpoints\"] : R;\n\ttype Options = API extends {\n\t\t[key: string]: infer T;\n\t}\n\t\t? T extends Endpoint\n\t\t? {\n\t\t\t[key in T[\"options\"][\"method\"] extends \"GET\"\n\t\t\t? T[\"path\"]\n\t\t\t: `@${T[\"options\"][\"method\"] extends string ? Lowercase<T[\"options\"][\"method\"]> : never}${T[\"path\"]}`]: T;\n\t\t}\n\t\t: {}\n\t\t: {};\n\n\ttype O = Prettify<UnionToIntersection<Options>>;\n\treturn async <OPT extends O, K extends keyof OPT, C extends InferContext<OPT[K]>>(\n\t\tpath: K,\n\t\t...options: HasRequired<C> extends true\n\t\t\t? [\n\t\t\t\tWithRequired<\n\t\t\t\t\tBetterFetchOption<C[\"body\"], C[\"query\"], C[\"params\"]>,\n\t\t\t\t\tkeyof RequiredOptionKeys<C>\n\t\t\t\t>,\n\t\t\t]\n\t\t\t: [BetterFetchOption<C[\"body\"], C[\"query\"], C[\"params\"]>?]\n\t): Promise<\n\t\tBetterFetchResponse<Awaited<ReturnType<OPT[K] extends Endpoint ? OPT[K] : never>>>\n\t> => {\n\t\treturn (await fetch(path as string, {\n\t\t\t...options[0],\n\t\t})) as any;\n\t};\n};\n"],"mappings":"AAEA,OAA2D,eAAAA,MAAmB,sBA8CvE,IAAMC,EAAwDC,GAA2B,CAC/F,IAAMC,EAAQH,EAAYE,CAAO,EAejC,MAAO,OACNE,KACGF,IAWK,MAAMC,EAAMC,EAAgB,CACnC,GAAGF,EAAQ,CAAC,CACb,CAAC,CAEH","names":["createFetch","createClient","options","fetch","path"]}
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/endpoint.ts","../src/middleware.ts","../src/better-call-error.ts","../src/cookie.ts","../src/cookie-utils.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 {\n\tContext,\n\tContextTools,\n\tCookieOptions,\n\tEndpoint,\n\tEndpointOptions,\n\tEndpointResponse,\n\tHandler,\n} from \"./types\";\nimport { getCookie, getSignedCookie, setCookie, setSignedCookie } from \"./cookie-utils\";\nimport type { CookiePrefixOptions } from \"./cookie\";\n\nexport interface EndpointConfig {\n\t/**\n\t * Throw when the response isn't in 200 range\n\t */\n\tthrowOnError?: boolean;\n}\n\nexport function createEndpointCreator<T extends Record<string, any>>() {\n\treturn <Path extends string, Opts extends EndpointOptions, R extends EndpointResponse>(\n\t\tpath: Path,\n\t\toptions: Opts,\n\t\thandler: Handler<Path, Opts, R, T>,\n\t) => {\n\t\t//@ts-expect-error\n\t\treturn createEndpoint(path, options, handler);\n\t};\n}\n\nexport function createEndpoint<\n\tPath extends string,\n\tOpts extends EndpointOptions,\n\tR extends EndpointResponse,\n>(path: Path, options: Opts, handler: Handler<Path, Opts, R>) {\n\tconst responseHeader = new Headers();\n\ttype Ctx = Context<Path, Opts>;\n\tconst handle = async (...ctx: HasRequiredKeys<Ctx> extends true ? [Ctx] : [Ctx?]) => {\n\t\tlet internalCtx = {\n\t\t\tsetHeader(key: string, value: string) {\n\t\t\t\tresponseHeader.set(key, value);\n\t\t\t},\n\t\t\tsetCookie(key: string, value: string, options?: CookieOptions) {\n\t\t\t\tsetCookie(responseHeader, key, value, options);\n\t\t\t},\n\t\t\tgetCookie(key: string, prefix?: CookiePrefixOptions) {\n\t\t\t\tconst header = ctx[0]?.headers;\n\t\t\t\tconst cookie = getCookie(header?.get(\"Cookie\") || \"\", key, prefix);\n\t\t\t\treturn cookie;\n\t\t\t},\n\t\t\tgetSignedCookie(key: string, secret: string, prefix?: CookiePrefixOptions) {\n\t\t\t\tconst header = ctx[0]?.headers;\n\t\t\t\tif (!header) {\n\t\t\t\t\tthrow new TypeError(\"Headers are required\");\n\t\t\t\t}\n\t\t\t\tconst cookie = getSignedCookie(header, secret, key, prefix);\n\t\t\t\treturn cookie;\n\t\t\t},\n\t\t\tasync setSignedCookie(\n\t\t\t\tkey: string,\n\t\t\t\tvalue: string,\n\t\t\t\tsecret: string | BufferSource,\n\t\t\t\toptions?: CookieOptions,\n\t\t\t) {\n\t\t\t\tawait setSignedCookie(responseHeader, key, value, secret, options);\n\t\t\t},\n\t\t\t...(ctx[0] || {}),\n\t\t\tcontext: {},\n\t\t};\n\t\tif (options.use?.length) {\n\t\t\tfor (const middleware of options.use) {\n\t\t\t\tconst res = (await middleware(internalCtx)) as Endpoint;\n\t\t\t\tconst body = res.options?.body\n\t\t\t\t\t? res.options.body.parse(internalCtx.body)\n\t\t\t\t\t: undefined;\n\t\t\t\tif (res) {\n\t\t\t\t\tinternalCtx = {\n\t\t\t\t\t\t...internalCtx,\n\t\t\t\t\t\tbody: body\n\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t...body,\n\t\t\t\t\t\t\t\t\t...internalCtx.body,\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t: internalCtx.body,\n\t\t\t\t\t\tcontext: {\n\t\t\t\t\t\t\t...(internalCtx.context || {}),\n\t\t\t\t\t\t\t...res,\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\ttry {\n\t\t\tconst body = options.body ? options.body.parse(internalCtx.body) : internalCtx.body;\n\t\t\tinternalCtx = {\n\t\t\t\t...internalCtx,\n\t\t\t\tbody: body\n\t\t\t\t\t? {\n\t\t\t\t\t\t\t...body,\n\t\t\t\t\t\t\t...internalCtx.body,\n\t\t\t\t\t\t}\n\t\t\t\t\t: internalCtx.body,\n\t\t\t};\n\t\t\tinternalCtx.query = options.query\n\t\t\t\t? options.query.parse(internalCtx.query)\n\t\t\t\t: internalCtx.query;\n\t\t\tinternalCtx.params = options.params\n\t\t\t\t? options.params.parse(internalCtx.params)\n\t\t\t\t: internalCtx.params;\n\t\t} catch (e) {\n\t\t\tif (e instanceof ZodError) {\n\t\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\t\tmessage: e.message,\n\t\t\t\t\tdetails: e.errors,\n\t\t\t\t});\n\t\t\t}\n\t\t\tthrow e;\n\t\t}\n\t\tif (options.requireHeaders && !internalCtx.headers) {\n\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\tmessage: \"Headers are required\",\n\t\t\t});\n\t\t}\n\t\tif (options.requireRequest && !internalCtx.request) {\n\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\tmessage: \"Request is required\",\n\t\t\t});\n\t\t}\n\t\t//@ts-expect-error\n\t\tconst res = await handler(internalCtx);\n\t\treturn res as ReturnType<Handler<Path, Opts, R>>;\n\t};\n\thandle.path = path;\n\thandle.options = options;\n\thandle.method = options.method;\n\thandle.headers = responseHeader;\n\treturn handle;\n}\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}","//https://github.com/honojs/hono/blob/main/src/utils/cookie.ts\n\nexport type Cookie = Record<string, string>;\nexport type SignedCookie = Record<string, string | false>;\n\ntype PartitionCookieConstraint =\n\t| { partition: true; secure: true }\n\t| { partition?: boolean; secure?: boolean }; // reset to default\ntype SecureCookieConstraint = { secure: true };\ntype HostCookieConstraint = { secure: true; path: \"/\"; domain?: undefined };\n\nexport type CookieOptions = {\n\tdomain?: string;\n\texpires?: Date;\n\thttpOnly?: boolean;\n\tmaxAge?: number;\n\tpath?: string;\n\tsecure?: boolean;\n\tsigningSecret?: string;\n\tsameSite?: \"Strict\" | \"Lax\" | \"None\" | \"strict\" | \"lax\" | \"none\";\n\tpartitioned?: boolean;\n\tprefix?: CookiePrefixOptions;\n} & PartitionCookieConstraint;\nexport type CookiePrefixOptions = \"host\" | \"secure\";\n\nexport type CookieConstraint<Name> = Name extends `__Secure-${string}`\n\t? CookieOptions & SecureCookieConstraint\n\t: Name extends `__Host-${string}`\n\t\t? CookieOptions & HostCookieConstraint\n\t\t: CookieOptions;\n\nconst algorithm = { name: \"HMAC\", hash: \"SHA-256\" };\n\nconst getCryptoKey = async (secret: string | BufferSource): Promise<CryptoKey> => {\n\tconst secretBuf = typeof secret === \"string\" ? new TextEncoder().encode(secret) : secret;\n\treturn await crypto.subtle.importKey(\"raw\", secretBuf, algorithm, false, [\"sign\", \"verify\"]);\n};\n\nconst makeSignature = async (value: string, secret: string | BufferSource): Promise<string> => {\n\tconst key = await getCryptoKey(secret);\n\tconst signature = await crypto.subtle.sign(\n\t\talgorithm.name,\n\t\tkey,\n\t\tnew TextEncoder().encode(value),\n\t);\n\t// the returned base64 encoded signature will always be 44 characters long and end with one or two equal signs\n\treturn btoa(String.fromCharCode(...new Uint8Array(signature)));\n};\n\nconst verifySignature = async (\n\tbase64Signature: string,\n\tvalue: string,\n\tsecret: CryptoKey,\n): Promise<boolean> => {\n\ttry {\n\t\tconst signatureBinStr = atob(base64Signature);\n\t\tconst signature = new Uint8Array(signatureBinStr.length);\n\t\tfor (let i = 0, len = signatureBinStr.length; i < len; i++) {\n\t\t\tsignature[i] = signatureBinStr.charCodeAt(i);\n\t\t}\n\t\treturn await crypto.subtle.verify(\n\t\t\talgorithm,\n\t\t\tsecret,\n\t\t\tsignature,\n\t\t\tnew TextEncoder().encode(value),\n\t\t);\n\t} catch (e) {\n\t\treturn false;\n\t}\n};\n\n// all alphanumeric chars and all of _!#$%&'*.^`|~+-\n// (see: https://datatracker.ietf.org/doc/html/rfc6265#section-4.1.1)\nconst validCookieNameRegEx = /^[\\w!#$%&'*.^`|~+-]+$/;\n\n// all ASCII chars 32-126 except 34, 59, and 92 (i.e. space to tilde but not double quote, semicolon, or backslash)\n// (see: https://datatracker.ietf.org/doc/html/rfc6265#section-4.1.1)\n//\n// note: the spec also prohibits comma and space, but we allow both since they are very common in the real world\n// (see: https://github.com/golang/go/issues/7243)\nconst validCookieValueRegEx = /^[ !#-:<-[\\]-~]*$/;\n\nexport const parse = (cookie: string, name?: string): Cookie => {\n\tconst pairs = cookie.trim().split(\";\");\n\treturn pairs.reduce((parsedCookie, pairStr) => {\n\t\tpairStr = pairStr.trim();\n\t\tconst valueStartPos = pairStr.indexOf(\"=\");\n\t\tif (valueStartPos === -1) {\n\t\t\treturn parsedCookie;\n\t\t}\n\n\t\tconst cookieName = pairStr.substring(0, valueStartPos).trim();\n\t\tif ((name && name !== cookieName) || !validCookieNameRegEx.test(cookieName)) {\n\t\t\treturn parsedCookie;\n\t\t}\n\n\t\tlet cookieValue = pairStr.substring(valueStartPos + 1).trim();\n\t\tif (cookieValue.startsWith('\"') && cookieValue.endsWith('\"')) {\n\t\t\tcookieValue = cookieValue.slice(1, -1);\n\t\t}\n\t\tif (validCookieValueRegEx.test(cookieValue)) {\n\t\t\tparsedCookie[cookieName] = decodeURIComponent(cookieValue);\n\t\t}\n\n\t\treturn parsedCookie;\n\t}, {} as Cookie);\n};\n\nexport const parseSigned = async (\n\tcookie: string,\n\tsecret: string | BufferSource,\n\tname?: string,\n): Promise<SignedCookie> => {\n\tconst parsedCookie: SignedCookie = {};\n\tconst secretKey = await getCryptoKey(secret);\n\n\tfor (const [key, value] of Object.entries(parse(cookie, name))) {\n\t\tconst signatureStartPos = value.lastIndexOf(\".\");\n\t\tif (signatureStartPos < 1) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst signedValue = value.substring(0, signatureStartPos);\n\t\tconst signature = value.substring(signatureStartPos + 1);\n\t\tif (signature.length !== 44 || !signature.endsWith(\"=\")) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst isVerified = await verifySignature(signature, signedValue, secretKey);\n\t\tparsedCookie[key] = isVerified ? signedValue : false;\n\t}\n\n\treturn parsedCookie;\n};\n\nconst _serialize = (name: string, value: string, opt: CookieOptions = {}): string => {\n\tlet cookie = `${name}=${value}`;\n\n\tif (name.startsWith(\"__Secure-\") && !opt.secure) {\n\t\t// https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis-13#section-4.1.3.1\n\t\tthrow new Error(\"__Secure- Cookie must have Secure attributes\");\n\t}\n\n\tif (name.startsWith(\"__Host-\")) {\n\t\t// https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis-13#section-4.1.3.2\n\t\tif (!opt.secure) {\n\t\t\tthrow new Error(\"__Host- Cookie must have Secure attributes\");\n\t\t}\n\n\t\tif (opt.path !== \"/\") {\n\t\t\tthrow new Error('__Host- Cookie must have Path attributes with \"/\"');\n\t\t}\n\n\t\tif (opt.domain) {\n\t\t\tthrow new Error(\"__Host- Cookie must not have Domain attributes\");\n\t\t}\n\t}\n\n\tif (opt && typeof opt.maxAge === \"number\" && opt.maxAge >= 0) {\n\t\tif (opt.maxAge > 34560000) {\n\t\t\t// https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis-13#section-4.1.2.2\n\t\t\tthrow new Error(\n\t\t\t\t\"Cookies Max-Age SHOULD NOT be greater than 400 days (34560000 seconds) in duration.\",\n\t\t\t);\n\t\t}\n\t\tcookie += `; Max-Age=${Math.floor(opt.maxAge)}`;\n\t}\n\n\tif (opt.domain && opt.prefix !== \"host\") {\n\t\tcookie += `; Domain=${opt.domain}`;\n\t}\n\n\tif (opt.path) {\n\t\tcookie += `; Path=${opt.path}`;\n\t}\n\n\tif (opt.expires) {\n\t\tif (opt.expires.getTime() - Date.now() > 34560000_000) {\n\t\t\t// https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis-13#section-4.1.2.1\n\t\t\tthrow new Error(\n\t\t\t\t\"Cookies Expires SHOULD NOT be greater than 400 days (34560000 seconds) in the future.\",\n\t\t\t);\n\t\t}\n\t\tcookie += `; Expires=${opt.expires.toUTCString()}`;\n\t}\n\n\tif (opt.httpOnly) {\n\t\tcookie += \"; HttpOnly\";\n\t}\n\n\tif (opt.secure) {\n\t\tcookie += \"; Secure\";\n\t}\n\n\tif (opt.sameSite) {\n\t\tcookie += `; SameSite=${opt.sameSite.charAt(0).toUpperCase() + opt.sameSite.slice(1)}`;\n\t}\n\n\tif (opt.partitioned) {\n\t\t// FIXME: replace link to RFC\n\t\t// https://www.ietf.org/archive/id/draft-cutler-httpbis-partitioned-cookies-01.html#section-2.3\n\t\tif (!opt.secure) {\n\t\t\tthrow new Error(\"Partitioned Cookie must have Secure attributes\");\n\t\t}\n\t\tcookie += \"; Partitioned\";\n\t}\n\n\treturn cookie;\n};\n\nexport const serialize = <Name extends string>(\n\tname: Name,\n\tvalue: string,\n\topt?: CookieConstraint<Name>,\n): string => {\n\tvalue = encodeURIComponent(value);\n\treturn _serialize(name, value, opt);\n};\n\nexport const serializeSigned = async (\n\tname: string,\n\tvalue: string,\n\tsecret: string | BufferSource,\n\topt: CookieOptions = {},\n): Promise<string> => {\n\tconst signature = await makeSignature(value, secret);\n\tvalue = `${value}.${signature}`;\n\tvalue = encodeURIComponent(value);\n\treturn _serialize(name, value, opt);\n};\n","//https://github.com/honojs/hono/blob/main/src/helper/cookie/index.ts\n\nimport {\n\tparse,\n\tparseSigned,\n\tserialize,\n\tserializeSigned,\n\ttype CookieOptions,\n\ttype CookiePrefixOptions,\n} from \"./cookie\";\n\nexport const getCookie = (cookie?: string, key?: string, prefix?: CookiePrefixOptions) => {\n\tif (!cookie) {\n\t\treturn undefined;\n\t}\n\tlet finalKey = key;\n\tif (prefix === \"secure\") {\n\t\tfinalKey = \"__Secure-\" + key;\n\t} else if (prefix === \"host\") {\n\t\tfinalKey = \"__Host-\" + key;\n\t} else {\n\t\treturn undefined;\n\t}\n\tconst obj = parse(cookie, finalKey);\n\treturn obj[finalKey];\n};\n\nexport const setCookie = (\n\theader: Headers,\n\tname: string,\n\tvalue: string,\n\topt?: CookieOptions,\n): void => {\n\t// Cookie names prefixed with __Secure- can be used only if they are set with the secure attribute.\n\t// Cookie names prefixed with __Host- can be used only if they are set with the secure attribute, must have a path of / (meaning any path at the host)\n\t// and must not have a Domain attribute.\n\t// Read more at https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie#cookie_prefixes'\n\tlet cookie;\n\tif (opt?.prefix === \"secure\") {\n\t\tcookie = serialize(\"__Secure-\" + name, value, { path: \"/\", ...opt, secure: true });\n\t} else if (opt?.prefix === \"host\") {\n\t\tcookie = serialize(\"__Host-\" + name, value, {\n\t\t\t...opt,\n\t\t\tpath: \"/\",\n\t\t\tsecure: true,\n\t\t\tdomain: undefined,\n\t\t});\n\t} else {\n\t\tcookie = serialize(name, value, { path: \"/\", ...opt });\n\t}\n\theader.append(\"Set-Cookie\", cookie);\n};\n\nexport const setSignedCookie = async (\n\theader: Headers,\n\tname: string,\n\tvalue: string,\n\tsecret: string | BufferSource,\n\topt?: CookieOptions,\n): Promise<void> => {\n\tlet cookie;\n\tif (opt?.prefix === \"secure\") {\n\t\tcookie = await serializeSigned(\"__Secure-\" + name, value, secret, {\n\t\t\tpath: \"/\",\n\t\t\t...opt,\n\t\t\tsecure: true,\n\t\t});\n\t} else if (opt?.prefix === \"host\") {\n\t\tcookie = await serializeSigned(\"__Host-\" + name, value, secret, {\n\t\t\t...opt,\n\t\t\tpath: \"/\",\n\t\t\tsecure: true,\n\t\t\tdomain: undefined,\n\t\t});\n\t} else {\n\t\tcookie = await serializeSigned(name, value, secret, { path: \"/\", ...opt });\n\t}\n\theader.append(\"Set-Cookie\", cookie);\n};\n\nexport const getSignedCookie = async (\n\theader: Headers,\n\tsecret: string,\n\tkey: string,\n\tprefix?: CookiePrefixOptions,\n) => {\n\tconst cookie = header.get(\"Cookie\");\n\tif (!cookie) {\n\t\treturn undefined;\n\t}\n\tlet finalKey = key;\n\tif (prefix === \"secure\") {\n\t\tfinalKey = \"__Secure-\" + key;\n\t} else if (prefix === \"host\") {\n\t\tfinalKey = \"__Host-\" + key;\n\t}\n\tconst obj = await parseSigned(cookie, secret, finalKey);\n\treturn obj[finalKey];\n};\n","import { createRouter as createRou3Router, addRoute, findRoute } 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\t/**\n\t * Throw error if error occurred other than APIError\n\t */\n\tthrowError?: boolean;\n\t/**\n\t * Handle error\n\t */\n\tonError?: (e: unknown) => void | Promise<void> | Response | Promise<Response>;\n\t/**\n\t * Base path for the router\n\t */\n\tbasePath?: string;\n\t/**\n\t * Middlewares for the router\n\t */\n\trouterMiddleware?: {\n\t\tpath: string;\n\t\tmiddleware: Endpoint;\n\t}[];\n\textraContext?: Record<string, any>;\n}\n\nexport const createRouter = <E extends Record<string, Endpoint>, Config extends RouterConfig>(\n\tendpoints: E,\n\tconfig?: Config,\n) => {\n\tconst _endpoints = Object.values(endpoints);\n\tconst router = createRou3Router();\n\tfor (const endpoint of _endpoints) {\n\t\tif (Array.isArray(endpoint.options?.method)) {\n\t\t\tfor (const method of endpoint.options.method) {\n\t\t\t\taddRoute(router, method, endpoint.path, endpoint);\n\t\t\t}\n\t\t} else {\n\t\t\taddRoute(router, endpoint.options.method, endpoint.path, endpoint);\n\t\t}\n\t}\n\n\tconst middlewareRouter = createRou3Router();\n\tfor (const route of config?.routerMiddleware || []) {\n\t\taddRoute(middlewareRouter, \"*\", route.path, route.middleware);\n\t}\n\n\tconst handler = async (request: Request) => {\n\t\tconst url = new URL(request.url);\n\t\tlet path = url.pathname;\n\t\tif (config?.basePath) {\n\t\t\tpath = path.split(config.basePath)[1];\n\t\t}\n\t\tconst method = request.method;\n\t\tconst route = findRoute(router, method, path);\n\t\tconst handler = route?.data as Endpoint;\n\t\tconst body = await getBody(request);\n\t\tconst headers = request.headers;\n\t\tconst query = Object.fromEntries(url.searchParams);\n\t\tconst middleware = findRoute(middlewareRouter, \"*\", path)?.data as Endpoint | undefined;\n\t\t//handler 404\n\t\tif (!handler) {\n\t\t\treturn new Response(null, {\n\t\t\t\tstatus: 404,\n\t\t\t\tstatusText: \"Not Found\",\n\t\t\t});\n\t\t}\n\t\ttry {\n\t\t\tlet middlewareContext: Record<string, any> = {};\n\t\t\tif (middleware) {\n\t\t\t\tconst res = await middleware({\n\t\t\t\t\tpath: path,\n\t\t\t\t\tmethod: method as \"GET\",\n\t\t\t\t\theaders,\n\t\t\t\t\tparams: route?.params as any,\n\t\t\t\t\trequest: request,\n\t\t\t\t\tbody: body,\n\t\t\t\t\tquery,\n\t\t\t\t\t...config?.extraContext,\n\t\t\t\t});\n\t\t\t\tif (res) {\n\t\t\t\t\tmiddlewareContext = {\n\t\t\t\t\t\t...res,\n\t\t\t\t\t\t...middlewareContext,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst handlerRes = await handler({\n\t\t\t\tpath: path,\n\t\t\t\tmethod: method as \"GET\",\n\t\t\t\theaders,\n\t\t\t\tparams: route?.params as any,\n\t\t\t\trequest: request,\n\t\t\t\tbody: body,\n\t\t\t\tquery,\n\t\t\t\t...middlewareContext,\n\t\t\t\t...config?.extraContext,\n\t\t\t});\n\t\t\tif (handlerRes instanceof Response) {\n\t\t\t\treturn handlerRes;\n\t\t\t}\n\t\t\tconst resBody = shouldSerialize(handlerRes) ? JSON.stringify(handlerRes) : handlerRes;\n\t\t\treturn new Response(resBody as any, {\n\t\t\t\theaders: handler.headers,\n\t\t\t});\n\t\t} catch (e) {\n\t\t\tif (config?.onError) {\n\t\t\t\tconst onErrorRes = await config.onError(e);\n\t\t\t\tif (onErrorRes instanceof Response) {\n\t\t\t\t\treturn onErrorRes;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (e instanceof APIError) {\n\t\t\t\treturn new Response(e.body ? JSON.stringify(e.body) : null, {\n\t\t\t\t\tstatus: statusCode[e.status],\n\t\t\t\t\tstatusText: e.status,\n\t\t\t\t\theaders: handler.headers,\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (config?.throwError) {\n\t\t\t\tthrow e;\n\t\t\t}\n\t\t\treturn new Response(null, {\n\t\t\t\tstatus: 500,\n\t\t\t\tstatusText: \"Internal Server Error\",\n\t\t\t});\n\t\t}\n\t};\n\treturn {\n\t\thandler,\n\t\tendpoints,\n\t};\n};\n\nexport type Router = ReturnType<typeof createRouter>;\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\";\nimport type { CookiePrefixOptions } from \"./cookie\";\n\nexport interface EndpointOptions {\n\tmethod: Method | Method[];\n\tbody?: ZodSchema;\n\tquery?: ZodSchema;\n\tparams?: ZodSchema<any>;\n\t/**\n\t * If true headers will be required to be passed in the context\n\t */\n\trequireHeaders?: boolean;\n\t/**\n\t * If true request object will be required\n\t */\n\trequireRequest?: boolean;\n\t/**\n\t * List of endpoints that will be called before this endpoint\n\t */\n\tuse?: Endpoint[];\n}\n\nexport type Endpoint<\n\tHandler extends (ctx: any) => Promise<any> = (ctx: any) => Promise<any>,\n\tOption extends EndpointOptions = EndpointOptions,\n> = {\n\tpath: string;\n\toptions: Option;\n\theaders?: Headers;\n} & Handler;\n\nexport type InferParamPath<Path> = Path extends `${infer _Start}:${infer Param}/${infer Rest}`\n\t? { [K in Param | keyof InferParamPath<Rest>]: string }\n\t: Path extends `${infer _Start}:${infer Param}`\n\t\t? { [K in Param]: string }\n\t\t: Path extends `${infer _Start}/${infer Rest}`\n\t\t\t? InferParamPath<Rest>\n\t\t\t: undefined;\n\nexport type InferParamWildCard<Path> = Path extends\n\t| `${infer _Start}/*:${infer Param}/${infer Rest}`\n\t| `${infer _Start}/**:${infer Param}/${infer Rest}`\n\t? { [K in Param | keyof InferParamPath<Rest>]: string }\n\t: Path extends `${infer _Start}/*`\n\t\t? { [K in \"_\"]: string }\n\t\t: Path extends `${infer _Start}/${infer Rest}`\n\t\t\t? InferParamPath<Rest>\n\t\t\t: undefined;\n\nexport type Prettify<T> = {\n\t[key in keyof T]: T[key];\n} & {};\n\nexport interface CookieOptions {\n\t/**\n\t * Max age in seconds\n\t */\n\tmaxAge?: number;\n\t/**\n\t * Domain\n\t */\n\tdomain?: string;\n\t/**\n\t * Path\n\t */\n\tpath?: string;\n\t/**\n\t * Secure\n\t */\n\tsecure?: boolean;\n\t/**\n\t * HttpOnly\n\t */\n\thttpOnly?: boolean;\n\n\t/**\n\t * SameSite\n\t */\n\tsameSite?: \"strict\" | \"lax\" | \"none\";\n\t/**\n\t * Expires\n\t */\n\texpires?: Date;\n}\n\nexport type ContextTools = {\n\t/**\n\t * Set header\n\t *\n\t * If it's called outside of a request it will just be ignored.\n\t */\n\tsetHeader: (key: string, value: string) => void;\n\t/**\n\t * cookie setter.\n\t *\n\t * If it's called outside of a request it will just be ignored.\n\t */\n\tsetCookie: (key: string, value: string, options?: CookieOptions) => void;\n\t/**\n\t * Get cookie value\n\t *\n\t * If it's called outside of a request it will just be ignored.\n\t */\n\tgetCookie: (key: string, value: string, options?: CookieOptions) => string | undefined;\n\t/**\n\t * Set signed cookie\n\t */\n\tsetSignedCookie: (\n\t\tkey: string,\n\t\tvalue: string,\n\t\tsecret: string | BufferSource,\n\t\toptions?: CookieOptions,\n\t) => Promise<void>;\n\t/**\n\t * Get signed cookie value\n\t */\n\n\tgetSignedCookie: (\n\t\tkey: string,\n\t\tsecret: string,\n\t\tprefix?: CookiePrefixOptions,\n\t) => Promise<string | undefined>;\n};\n\nexport type Context<Path extends string, Opts extends EndpointOptions> = InferBody<Opts> &\n\tInferParam<Path> &\n\tInferMethod<Opts[\"method\"]> &\n\tInferHeaders<Opts> &\n\tInferRequest<Opts> &\n\tInferQuery<Opts[\"query\"]>;\n\nexport type InferUse<Opts extends EndpointOptions> = Opts[\"use\"] extends Endpoint[]\n\t? {\n\t\t\tcontext: UnionToIntersection<Awaited<ReturnType<Opts[\"use\"][number]>>>;\n\t\t}\n\t: {};\n\nexport type InferUseOptions<Opts extends EndpointOptions> = Opts[\"use\"] extends Array<infer U>\n\t? UnionToIntersection<\n\t\t\tU extends Endpoint\n\t\t\t\t? U[\"options\"]\n\t\t\t\t: {\n\t\t\t\t\t\tbody?: {};\n\t\t\t\t\t\trequireRequest?: boolean;\n\t\t\t\t\t\trequireHeaders?: boolean;\n\t\t\t\t\t}\n\t\t>\n\t: {\n\t\t\tbody?: {};\n\t\t\trequireRequest?: boolean;\n\t\t\trequireHeaders?: boolean;\n\t\t};\n\nexport type InferMethod<M extends Method | Method[]> = M extends Array<Method>\n\t? {\n\t\t\tmethod: M[number];\n\t\t}\n\t: {\n\t\t\tmethod?: M;\n\t\t};\n\nexport type InferHeaders<\n\tOpt extends EndpointOptions,\n\tHeaderReq = Opt[\"requireHeaders\"],\n> = HeaderReq extends true\n\t? {\n\t\t\theaders: Headers;\n\t\t}\n\t: InferUseOptions<Opt>[\"requireHeaders\"] extends true\n\t\t? {\n\t\t\t\theaders: Headers;\n\t\t\t}\n\t\t: {\n\t\t\t\theaders?: Headers;\n\t\t\t};\n\nexport type InferRequest<\n\tOpt extends EndpointOptions,\n\tRequestReq = Opt[\"requireRequest\"],\n> = RequestReq extends true\n\t? {\n\t\t\trequest: Request;\n\t\t}\n\t: InferUseOptions<Opt>[\"requireRequest\"] extends true\n\t\t? {\n\t\t\t\trequest: Request;\n\t\t\t}\n\t\t: {\n\t\t\t\trequest?: Request;\n\t\t\t};\n\nexport type InferQuery<Query> = Query extends ZodSchema\n\t? Query extends ZodOptional<any>\n\t\t? {\n\t\t\t\tquery?: z.infer<Query>;\n\t\t\t}\n\t\t: {\n\t\t\t\tquery: z.infer<Query>;\n\t\t\t}\n\t: {\n\t\t\tquery?: undefined;\n\t\t};\n\nexport type InferParam<\n\tPath extends string,\n\tParamPath extends InferParamPath<Path> = InferParamPath<Path>,\n\tWildCard extends InferParamWildCard<Path> = InferParamWildCard<Path>,\n> = ParamPath extends undefined\n\t? WildCard extends undefined\n\t\t? {\n\t\t\t\tparams?: Record<string, string>;\n\t\t\t}\n\t\t: {\n\t\t\t\tparams: WildCard;\n\t\t\t}\n\t: {\n\t\t\tparams: Prettify<ParamPath & (WildCard extends undefined ? {} : WildCard)>;\n\t\t};\n\nexport type EndpointResponse = Record<string, any> | string | boolean | number | void | undefined;\n\nexport type Handler<\n\tPath extends string,\n\tOpts extends EndpointOptions,\n\tR extends EndpointResponse,\n\tExtra extends Record<string, any> = {},\n> = (ctx: Prettify<Context<Path, Opts> & InferUse<Opts> & ContextTools> & Extra) => Promise<R>;\n\nexport type Method = \"GET\" | \"POST\" | \"PUT\" | \"DELETE\" | \"PATCH\" | \"*\";\n\nexport type InferBody<\n\tOpts extends EndpointOptions,\n\tBody extends ZodSchema | undefined = Opts[\"body\"] &\n\t\t(undefined extends InferUseOptions<Opts>[\"body\"] ? {} : InferUseOptions<Opts>[\"body\"]),\n> = Body extends ZodSchema\n\t? Body extends ZodOptional<any>\n\t\t? {\n\t\t\t\tbody?: Prettify<z.infer<Body>>;\n\t\t\t}\n\t\t: {\n\t\t\t\tbody: Prettify<z.infer<Body>>;\n\t\t\t}\n\t: {\n\t\t\tbody?: undefined;\n\t\t};\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","algorithm","getCryptoKey","secret","secretBuf","makeSignature","value","key","signature","verifySignature","base64Signature","signatureBinStr","len","validCookieNameRegEx","validCookieValueRegEx","parse","cookie","name","parsedCookie","pairStr","valueStartPos","cookieName","cookieValue","parseSigned","secretKey","signatureStartPos","signedValue","isVerified","_serialize","opt","serialize","serializeSigned","getCookie","cookie","key","prefix","finalKey","parse","setCookie","header","name","value","opt","serialize","setSignedCookie","secret","serializeSigned","getSignedCookie","parseSigned","createEndpointCreator","path","options","handler","createEndpoint","responseHeader","handle","ctx","internalCtx","key","value","setCookie","prefix","header","getCookie","secret","getSignedCookie","setSignedCookie","middleware","res","body","e","APIError","import_rou3","getBody","request","contentType","formData","result","value","key","shouldSerialize","body","statusCode","createRouter","endpoints","config","_endpoints","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"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/endpoint.ts","../src/middleware.ts","../src/error.ts","../src/cookie.ts","../src/cookie-utils.ts","../src/router.ts","../src/utils.ts","../src/types.ts"],"sourcesContent":["export * from \"./endpoint\";\nexport * from \"./router\";\nexport * from \"./middleware\";\nexport * from \"./error\";\nexport * from \"./utils\";\nexport * from \"./types\";\n","import { z, ZodError, type ZodOptional, type ZodSchema } from \"zod\";\nimport { createMiddleware, type Middleware } from \"./middleware\";\nimport { APIError } from \"./error\";\nimport type { HasRequiredKeys, UnionToIntersection } from \"./helper\";\nimport type {\n\tContext,\n\tContextTools,\n\tCookieOptions,\n\tEndpoint,\n\tEndpointOptions,\n\tEndpointResponse,\n\tHandler,\n} from \"./types\";\nimport { getCookie, getSignedCookie, setCookie, setSignedCookie } from \"./cookie-utils\";\nimport type { CookiePrefixOptions } from \"./cookie\";\n\nexport interface EndpointConfig {\n\t/**\n\t * Throw when the response isn't in 200 range\n\t */\n\tthrowOnError?: boolean;\n}\n\nexport function createEndpointCreator<T extends Record<string, any>>() {\n\treturn <Path extends string, Opts extends EndpointOptions, R extends EndpointResponse>(\n\t\tpath: Path,\n\t\toptions: Opts,\n\t\thandler: Handler<Path, Opts, R, T>,\n\t) => {\n\t\t//@ts-expect-error\n\t\treturn createEndpoint(path, options, handler);\n\t};\n}\n\nexport function createEndpoint<\n\tPath extends string,\n\tOpts extends EndpointOptions,\n\tR extends EndpointResponse,\n>(path: Path, options: Opts, handler: Handler<Path, Opts, R>) {\n\tconst responseHeader = new Headers();\n\ttype Ctx = Context<Path, Opts>;\n\tconst handle = async (...ctx: HasRequiredKeys<Ctx> extends true ? [Ctx] : [Ctx?]) => {\n\t\tlet internalCtx = {\n\t\t\tsetHeader(key: string, value: string) {\n\t\t\t\tresponseHeader.set(key, value);\n\t\t\t},\n\t\t\tsetCookie(key: string, value: string, options?: CookieOptions) {\n\t\t\t\tsetCookie(responseHeader, key, value, options);\n\t\t\t},\n\t\t\tgetCookie(key: string, prefix?: CookiePrefixOptions) {\n\t\t\t\tconst header = ctx[0]?.headers;\n\t\t\t\tconst cookie = getCookie(header?.get(\"Cookie\") || \"\", key, prefix);\n\t\t\t\treturn cookie;\n\t\t\t},\n\t\t\tgetSignedCookie(key: string, secret: string, prefix?: CookiePrefixOptions) {\n\t\t\t\tconst header = ctx[0]?.headers;\n\t\t\t\tif (!header) {\n\t\t\t\t\tthrow new TypeError(\"Headers are required\");\n\t\t\t\t}\n\t\t\t\tconst cookie = getSignedCookie(header, secret, key, prefix);\n\t\t\t\treturn cookie;\n\t\t\t},\n\t\t\tasync setSignedCookie(\n\t\t\t\tkey: string,\n\t\t\t\tvalue: string,\n\t\t\t\tsecret: string | BufferSource,\n\t\t\t\toptions?: CookieOptions,\n\t\t\t) {\n\t\t\t\tawait setSignedCookie(responseHeader, key, value, secret, options);\n\t\t\t},\n\t\t\t...(ctx[0] || {}),\n\t\t\tcontext: {},\n\t\t};\n\t\tif (options.use?.length) {\n\t\t\tfor (const middleware of options.use) {\n\t\t\t\tconst res = (await middleware(internalCtx)) as Endpoint;\n\t\t\t\tconst body = res.options?.body\n\t\t\t\t\t? res.options.body.parse(internalCtx.body)\n\t\t\t\t\t: undefined;\n\t\t\t\tif (res) {\n\t\t\t\t\tinternalCtx = {\n\t\t\t\t\t\t...internalCtx,\n\t\t\t\t\t\tbody: body\n\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t...body,\n\t\t\t\t\t\t\t\t\t...internalCtx.body,\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t: internalCtx.body,\n\t\t\t\t\t\tcontext: {\n\t\t\t\t\t\t\t...(internalCtx.context || {}),\n\t\t\t\t\t\t\t...res,\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\ttry {\n\t\t\tconst body = options.body ? options.body.parse(internalCtx.body) : internalCtx.body;\n\t\t\tinternalCtx = {\n\t\t\t\t...internalCtx,\n\t\t\t\tbody: body\n\t\t\t\t\t? {\n\t\t\t\t\t\t\t...body,\n\t\t\t\t\t\t\t...internalCtx.body,\n\t\t\t\t\t\t}\n\t\t\t\t\t: internalCtx.body,\n\t\t\t};\n\t\t\tinternalCtx.query = options.query\n\t\t\t\t? options.query.parse(internalCtx.query)\n\t\t\t\t: internalCtx.query;\n\t\t\tinternalCtx.params = options.params\n\t\t\t\t? options.params.parse(internalCtx.params)\n\t\t\t\t: internalCtx.params;\n\t\t} catch (e) {\n\t\t\tif (e instanceof ZodError) {\n\t\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\t\tmessage: e.message,\n\t\t\t\t\tdetails: e.errors,\n\t\t\t\t});\n\t\t\t}\n\t\t\tthrow e;\n\t\t}\n\t\tif (options.requireHeaders && !internalCtx.headers) {\n\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\tmessage: \"Headers are required\",\n\t\t\t});\n\t\t}\n\t\tif (options.requireRequest && !internalCtx.request) {\n\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\tmessage: \"Request is required\",\n\t\t\t});\n\t\t}\n\t\t//@ts-expect-error\n\t\tconst res = await handler(internalCtx);\n\t\treturn res as ReturnType<Handler<Path, Opts, R>>;\n\t};\n\thandle.path = path;\n\thandle.options = options;\n\thandle.method = options.method;\n\thandle.headers = responseHeader;\n\treturn handle;\n}\n","import { z } from \"zod\";\nimport type {\n\tContextTools,\n\tEndpoint,\n\tEndpointOptions,\n\tEndpointResponse,\n\tHandler,\n\tInferBody,\n\tInferHeaders,\n\tInferRequest,\n\tPrettify,\n} from \"./types\";\nimport { createEndpoint } from \"./endpoint\";\n\nexport type MiddlewareHandler<\n\tOpts extends EndpointOptions,\n\tR extends EndpointResponse,\n\tExtra extends Record<string, any> = {},\n> = (\n\tctx: Prettify<\n\t\tInferBody<Opts> &\n\t\t\tInferRequest<Opts> &\n\t\t\tInferHeaders<Opts> & {\n\t\t\t\tparams?: Record<string, string>;\n\t\t\t\tquery?: Record<string, string>;\n\t\t\t} & ContextTools\n\t> &\n\t\tExtra,\n) => Promise<R>;\n\nexport function createMiddleware<Opts extends EndpointOptions, R extends EndpointResponse>(\n\toptionsOrHandler: MiddlewareHandler<Opts, R>,\n): Endpoint<Handler<string, Opts, R>, Opts>;\nexport function createMiddleware<\n\tOpts extends Omit<EndpointOptions, \"method\">,\n\tR extends EndpointResponse,\n>(\n\toptionsOrHandler: Opts,\n\thandler: MiddlewareHandler<\n\t\tOpts & {\n\t\t\tmethod: \"*\";\n\t\t},\n\t\tR\n\t>,\n): Endpoint<\n\tHandler<\n\t\tstring,\n\t\tOpts & {\n\t\t\tmethod: \"*\";\n\t\t},\n\t\tR\n\t>,\n\tOpts & {\n\t\tmethod: \"*\";\n\t}\n>;\nexport function createMiddleware(optionsOrHandler: any, handler?: any) {\n\tif (typeof optionsOrHandler === \"function\") {\n\t\treturn createEndpoint(\n\t\t\t\"*\",\n\t\t\t{\n\t\t\t\tmethod: \"*\",\n\t\t\t},\n\t\t\toptionsOrHandler,\n\t\t);\n\t}\n\tif (!handler) {\n\t\tthrow new Error(\"Middleware handler is required\");\n\t}\n\tconst endpoint = createEndpoint(\n\t\t\"*\",\n\t\t{\n\t\t\t...optionsOrHandler,\n\t\t\tmethod: \"*\",\n\t\t},\n\t\thandler,\n\t);\n\treturn endpoint as any;\n}\n\nexport const createMiddlewareCreator = <ExtraContext extends Record<string, any> = {}>() => {\n\tfunction fn<Opts extends EndpointOptions, R extends EndpointResponse>(\n\t\toptionsOrHandler: MiddlewareHandler<Opts, R, ExtraContext>,\n\t): Endpoint<Handler<string, Opts, R>, Opts>;\n\tfunction fn<Opts extends Omit<EndpointOptions, \"method\">, R extends EndpointResponse>(\n\t\toptionsOrHandler: Opts,\n\t\thandler: MiddlewareHandler<\n\t\t\tOpts & {\n\t\t\t\tmethod: \"*\";\n\t\t\t},\n\t\t\tR,\n\t\t\tExtraContext\n\t\t>,\n\t): Endpoint<\n\t\tHandler<\n\t\t\tstring,\n\t\t\tOpts & {\n\t\t\t\tmethod: \"*\";\n\t\t\t},\n\t\t\tR\n\t\t>,\n\t\tOpts & {\n\t\t\tmethod: \"*\";\n\t\t}\n\t>;\n\tfunction fn(optionsOrHandler: any, handler?: any) {\n\t\tif (typeof optionsOrHandler === \"function\") {\n\t\t\treturn createEndpoint(\n\t\t\t\t\"*\",\n\t\t\t\t{\n\t\t\t\t\tmethod: \"*\",\n\t\t\t\t},\n\t\t\t\toptionsOrHandler,\n\t\t\t);\n\t\t}\n\t\tif (!handler) {\n\t\t\tthrow new Error(\"Middleware handler is required\");\n\t\t}\n\t\tconst endpoint = createEndpoint(\n\t\t\t\"*\",\n\t\t\t{\n\t\t\t\t...optionsOrHandler,\n\t\t\t\tmethod: \"*\",\n\t\t\t},\n\t\t\thandler,\n\t\t);\n\t\treturn endpoint as any;\n\t}\n\treturn fn;\n};\n\nexport type Middleware<\n\tOpts extends EndpointOptions = EndpointOptions,\n\tR extends EndpointResponse = EndpointResponse,\n> = (\n\topts: Opts,\n\thandler: (ctx: {\n\t\tbody?: InferBody<Opts>;\n\t\tparams?: Record<string, string>;\n\t\tquery?: Record<string, string>;\n\t}) => Promise<R>,\n) => Endpoint;\n","import type { statusCode } from \"./utils\";\n\ntype Status = keyof typeof statusCode;\n\nexport class APIError extends Error {\n\tstatus: Status;\n\tbody: Record<string, any>;\n\tconstructor(status: Status, body?: Record<string, any>) {\n\t\tsuper(`API Error: ${status} ${body?.message ?? \"\"}`, {\n\t\t\tcause: body,\n\t\t});\n\t\tthis.status = status;\n\t\tthis.body = body ?? {};\n\t\tthis.stack = \"\";\n\t\tthis.name = \"BetterCallAPIError\";\n\t}\n}\n","//https://github.com/honojs/hono/blob/main/src/utils/cookie.ts\n\nexport type Cookie = Record<string, string>;\nexport type SignedCookie = Record<string, string | false>;\n\ntype PartitionCookieConstraint =\n\t| { partition: true; secure: true }\n\t| { partition?: boolean; secure?: boolean }; // reset to default\ntype SecureCookieConstraint = { secure: true };\ntype HostCookieConstraint = { secure: true; path: \"/\"; domain?: undefined };\n\nexport type CookieOptions = {\n\tdomain?: string;\n\texpires?: Date;\n\thttpOnly?: boolean;\n\tmaxAge?: number;\n\tpath?: string;\n\tsecure?: boolean;\n\tsigningSecret?: string;\n\tsameSite?: \"Strict\" | \"Lax\" | \"None\" | \"strict\" | \"lax\" | \"none\";\n\tpartitioned?: boolean;\n\tprefix?: CookiePrefixOptions;\n} & PartitionCookieConstraint;\nexport type CookiePrefixOptions = \"host\" | \"secure\";\n\nexport type CookieConstraint<Name> = Name extends `__Secure-${string}`\n\t? CookieOptions & SecureCookieConstraint\n\t: Name extends `__Host-${string}`\n\t\t? CookieOptions & HostCookieConstraint\n\t\t: CookieOptions;\n\nconst algorithm = { name: \"HMAC\", hash: \"SHA-256\" };\n\nconst getCryptoKey = async (secret: string | BufferSource): Promise<CryptoKey> => {\n\tconst secretBuf = typeof secret === \"string\" ? new TextEncoder().encode(secret) : secret;\n\treturn await crypto.subtle.importKey(\"raw\", secretBuf, algorithm, false, [\"sign\", \"verify\"]);\n};\n\nconst makeSignature = async (value: string, secret: string | BufferSource): Promise<string> => {\n\tconst key = await getCryptoKey(secret);\n\tconst signature = await crypto.subtle.sign(\n\t\talgorithm.name,\n\t\tkey,\n\t\tnew TextEncoder().encode(value),\n\t);\n\t// the returned base64 encoded signature will always be 44 characters long and end with one or two equal signs\n\treturn btoa(String.fromCharCode(...new Uint8Array(signature)));\n};\n\nconst verifySignature = async (\n\tbase64Signature: string,\n\tvalue: string,\n\tsecret: CryptoKey,\n): Promise<boolean> => {\n\ttry {\n\t\tconst signatureBinStr = atob(base64Signature);\n\t\tconst signature = new Uint8Array(signatureBinStr.length);\n\t\tfor (let i = 0, len = signatureBinStr.length; i < len; i++) {\n\t\t\tsignature[i] = signatureBinStr.charCodeAt(i);\n\t\t}\n\t\treturn await crypto.subtle.verify(\n\t\t\talgorithm,\n\t\t\tsecret,\n\t\t\tsignature,\n\t\t\tnew TextEncoder().encode(value),\n\t\t);\n\t} catch (e) {\n\t\treturn false;\n\t}\n};\n\n// all alphanumeric chars and all of _!#$%&'*.^`|~+-\n// (see: https://datatracker.ietf.org/doc/html/rfc6265#section-4.1.1)\nconst validCookieNameRegEx = /^[\\w!#$%&'*.^`|~+-]+$/;\n\n// all ASCII chars 32-126 except 34, 59, and 92 (i.e. space to tilde but not double quote, semicolon, or backslash)\n// (see: https://datatracker.ietf.org/doc/html/rfc6265#section-4.1.1)\n//\n// note: the spec also prohibits comma and space, but we allow both since they are very common in the real world\n// (see: https://github.com/golang/go/issues/7243)\nconst validCookieValueRegEx = /^[ !#-:<-[\\]-~]*$/;\n\nexport const parse = (cookie: string, name?: string): Cookie => {\n\tconst pairs = cookie.trim().split(\";\");\n\treturn pairs.reduce((parsedCookie, pairStr) => {\n\t\tpairStr = pairStr.trim();\n\t\tconst valueStartPos = pairStr.indexOf(\"=\");\n\t\tif (valueStartPos === -1) {\n\t\t\treturn parsedCookie;\n\t\t}\n\n\t\tconst cookieName = pairStr.substring(0, valueStartPos).trim();\n\t\tif ((name && name !== cookieName) || !validCookieNameRegEx.test(cookieName)) {\n\t\t\treturn parsedCookie;\n\t\t}\n\n\t\tlet cookieValue = pairStr.substring(valueStartPos + 1).trim();\n\t\tif (cookieValue.startsWith('\"') && cookieValue.endsWith('\"')) {\n\t\t\tcookieValue = cookieValue.slice(1, -1);\n\t\t}\n\t\tif (validCookieValueRegEx.test(cookieValue)) {\n\t\t\tparsedCookie[cookieName] = decodeURIComponent(cookieValue);\n\t\t}\n\n\t\treturn parsedCookie;\n\t}, {} as Cookie);\n};\n\nexport const parseSigned = async (\n\tcookie: string,\n\tsecret: string | BufferSource,\n\tname?: string,\n): Promise<SignedCookie> => {\n\tconst parsedCookie: SignedCookie = {};\n\tconst secretKey = await getCryptoKey(secret);\n\n\tfor (const [key, value] of Object.entries(parse(cookie, name))) {\n\t\tconst signatureStartPos = value.lastIndexOf(\".\");\n\t\tif (signatureStartPos < 1) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst signedValue = value.substring(0, signatureStartPos);\n\t\tconst signature = value.substring(signatureStartPos + 1);\n\t\tif (signature.length !== 44 || !signature.endsWith(\"=\")) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst isVerified = await verifySignature(signature, signedValue, secretKey);\n\t\tparsedCookie[key] = isVerified ? signedValue : false;\n\t}\n\n\treturn parsedCookie;\n};\n\nconst _serialize = (name: string, value: string, opt: CookieOptions = {}): string => {\n\tlet cookie = `${name}=${value}`;\n\n\tif (name.startsWith(\"__Secure-\") && !opt.secure) {\n\t\t// https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis-13#section-4.1.3.1\n\t\tthrow new Error(\"__Secure- Cookie must have Secure attributes\");\n\t}\n\n\tif (name.startsWith(\"__Host-\")) {\n\t\t// https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis-13#section-4.1.3.2\n\t\tif (!opt.secure) {\n\t\t\tthrow new Error(\"__Host- Cookie must have Secure attributes\");\n\t\t}\n\n\t\tif (opt.path !== \"/\") {\n\t\t\tthrow new Error('__Host- Cookie must have Path attributes with \"/\"');\n\t\t}\n\n\t\tif (opt.domain) {\n\t\t\tthrow new Error(\"__Host- Cookie must not have Domain attributes\");\n\t\t}\n\t}\n\n\tif (opt && typeof opt.maxAge === \"number\" && opt.maxAge >= 0) {\n\t\tif (opt.maxAge > 34560000) {\n\t\t\t// https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis-13#section-4.1.2.2\n\t\t\tthrow new Error(\n\t\t\t\t\"Cookies Max-Age SHOULD NOT be greater than 400 days (34560000 seconds) in duration.\",\n\t\t\t);\n\t\t}\n\t\tcookie += `; Max-Age=${Math.floor(opt.maxAge)}`;\n\t}\n\n\tif (opt.domain && opt.prefix !== \"host\") {\n\t\tcookie += `; Domain=${opt.domain}`;\n\t}\n\n\tif (opt.path) {\n\t\tcookie += `; Path=${opt.path}`;\n\t}\n\n\tif (opt.expires) {\n\t\tif (opt.expires.getTime() - Date.now() > 34560000_000) {\n\t\t\t// https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis-13#section-4.1.2.1\n\t\t\tthrow new Error(\n\t\t\t\t\"Cookies Expires SHOULD NOT be greater than 400 days (34560000 seconds) in the future.\",\n\t\t\t);\n\t\t}\n\t\tcookie += `; Expires=${opt.expires.toUTCString()}`;\n\t}\n\n\tif (opt.httpOnly) {\n\t\tcookie += \"; HttpOnly\";\n\t}\n\n\tif (opt.secure) {\n\t\tcookie += \"; Secure\";\n\t}\n\n\tif (opt.sameSite) {\n\t\tcookie += `; SameSite=${opt.sameSite.charAt(0).toUpperCase() + opt.sameSite.slice(1)}`;\n\t}\n\n\tif (opt.partitioned) {\n\t\t// FIXME: replace link to RFC\n\t\t// https://www.ietf.org/archive/id/draft-cutler-httpbis-partitioned-cookies-01.html#section-2.3\n\t\tif (!opt.secure) {\n\t\t\tthrow new Error(\"Partitioned Cookie must have Secure attributes\");\n\t\t}\n\t\tcookie += \"; Partitioned\";\n\t}\n\n\treturn cookie;\n};\n\nexport const serialize = <Name extends string>(\n\tname: Name,\n\tvalue: string,\n\topt?: CookieConstraint<Name>,\n): string => {\n\tvalue = encodeURIComponent(value);\n\treturn _serialize(name, value, opt);\n};\n\nexport const serializeSigned = async (\n\tname: string,\n\tvalue: string,\n\tsecret: string | BufferSource,\n\topt: CookieOptions = {},\n): Promise<string> => {\n\tconst signature = await makeSignature(value, secret);\n\tvalue = `${value}.${signature}`;\n\tvalue = encodeURIComponent(value);\n\treturn _serialize(name, value, opt);\n};\n","//https://github.com/honojs/hono/blob/main/src/helper/cookie/index.ts\n\nimport {\n\tparse,\n\tparseSigned,\n\tserialize,\n\tserializeSigned,\n\ttype CookieOptions,\n\ttype CookiePrefixOptions,\n} from \"./cookie\";\n\nexport const getCookie = (cookie?: string, key?: string, prefix?: CookiePrefixOptions) => {\n\tif (!cookie) {\n\t\treturn undefined;\n\t}\n\tlet finalKey = key;\n\tif (prefix === \"secure\") {\n\t\tfinalKey = \"__Secure-\" + key;\n\t} else if (prefix === \"host\") {\n\t\tfinalKey = \"__Host-\" + key;\n\t} else {\n\t\treturn undefined;\n\t}\n\tconst obj = parse(cookie, finalKey);\n\treturn obj[finalKey];\n};\n\nexport const setCookie = (\n\theader: Headers,\n\tname: string,\n\tvalue: string,\n\topt?: CookieOptions,\n): void => {\n\t// Cookie names prefixed with __Secure- can be used only if they are set with the secure attribute.\n\t// Cookie names prefixed with __Host- can be used only if they are set with the secure attribute, must have a path of / (meaning any path at the host)\n\t// and must not have a Domain attribute.\n\t// Read more at https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie#cookie_prefixes'\n\tlet cookie;\n\tif (opt?.prefix === \"secure\") {\n\t\tcookie = serialize(\"__Secure-\" + name, value, { path: \"/\", ...opt, secure: true });\n\t} else if (opt?.prefix === \"host\") {\n\t\tcookie = serialize(\"__Host-\" + name, value, {\n\t\t\t...opt,\n\t\t\tpath: \"/\",\n\t\t\tsecure: true,\n\t\t\tdomain: undefined,\n\t\t});\n\t} else {\n\t\tcookie = serialize(name, value, { path: \"/\", ...opt });\n\t}\n\theader.append(\"Set-Cookie\", cookie);\n};\n\nexport const setSignedCookie = async (\n\theader: Headers,\n\tname: string,\n\tvalue: string,\n\tsecret: string | BufferSource,\n\topt?: CookieOptions,\n): Promise<void> => {\n\tlet cookie;\n\tif (opt?.prefix === \"secure\") {\n\t\tcookie = await serializeSigned(\"__Secure-\" + name, value, secret, {\n\t\t\tpath: \"/\",\n\t\t\t...opt,\n\t\t\tsecure: true,\n\t\t});\n\t} else if (opt?.prefix === \"host\") {\n\t\tcookie = await serializeSigned(\"__Host-\" + name, value, secret, {\n\t\t\t...opt,\n\t\t\tpath: \"/\",\n\t\t\tsecure: true,\n\t\t\tdomain: undefined,\n\t\t});\n\t} else {\n\t\tcookie = await serializeSigned(name, value, secret, { path: \"/\", ...opt });\n\t}\n\theader.append(\"Set-Cookie\", cookie);\n};\n\nexport const getSignedCookie = async (\n\theader: Headers,\n\tsecret: string,\n\tkey: string,\n\tprefix?: CookiePrefixOptions,\n) => {\n\tconst cookie = header.get(\"Cookie\");\n\tif (!cookie) {\n\t\treturn undefined;\n\t}\n\tlet finalKey = key;\n\tif (prefix === \"secure\") {\n\t\tfinalKey = \"__Secure-\" + key;\n\t} else if (prefix === \"host\") {\n\t\tfinalKey = \"__Host-\" + key;\n\t}\n\tconst obj = await parseSigned(cookie, secret, finalKey);\n\treturn obj[finalKey];\n};\n","import { createRouter as createRou3Router, addRoute, findRoute } from \"rou3\";\nimport { getBody, shouldSerialize, statusCode } from \"./utils\";\nimport { APIError } from \"./error\";\nimport type { Middleware, MiddlewareHandler } from \"./middleware\";\nimport type { Endpoint, Method } from \"./types\";\n\ninterface RouterConfig {\n\t/**\n\t * Throw error if error occurred other than APIError\n\t */\n\tthrowError?: boolean;\n\t/**\n\t * Handle error\n\t */\n\tonError?: (e: unknown) => void | Promise<void> | Response | Promise<Response>;\n\t/**\n\t * Base path for the router\n\t */\n\tbasePath?: string;\n\t/**\n\t * Middlewares for the router\n\t */\n\trouterMiddleware?: {\n\t\tpath: string;\n\t\tmiddleware: Endpoint;\n\t}[];\n\textraContext?: Record<string, any>;\n}\n\nexport const createRouter = <E extends Record<string, Endpoint>, Config extends RouterConfig>(\n\tendpoints: E,\n\tconfig?: Config,\n) => {\n\tconst _endpoints = Object.values(endpoints);\n\tconst router = createRou3Router();\n\tfor (const endpoint of _endpoints) {\n\t\tif (Array.isArray(endpoint.options?.method)) {\n\t\t\tfor (const method of endpoint.options.method) {\n\t\t\t\taddRoute(router, method, endpoint.path, endpoint);\n\t\t\t}\n\t\t} else {\n\t\t\taddRoute(router, endpoint.options.method, endpoint.path, endpoint);\n\t\t}\n\t}\n\n\tconst middlewareRouter = createRou3Router();\n\tfor (const route of config?.routerMiddleware || []) {\n\t\taddRoute(middlewareRouter, \"*\", route.path, route.middleware);\n\t}\n\n\tconst handler = async (request: Request) => {\n\t\tconst url = new URL(request.url);\n\t\tlet path = url.pathname;\n\t\tif (config?.basePath) {\n\t\t\tpath = path.split(config.basePath)[1];\n\t\t}\n\t\tconst method = request.method;\n\t\tconst route = findRoute(router, method, path);\n\t\tconst handler = route?.data as Endpoint;\n\t\tconst body = await getBody(request);\n\t\tconst headers = request.headers;\n\t\tconst query = Object.fromEntries(url.searchParams);\n\t\tconst middleware = findRoute(middlewareRouter, \"*\", path)?.data as Endpoint | undefined;\n\t\t//handler 404\n\t\tif (!handler) {\n\t\t\treturn new Response(null, {\n\t\t\t\tstatus: 404,\n\t\t\t\tstatusText: \"Not Found\",\n\t\t\t});\n\t\t}\n\t\ttry {\n\t\t\tlet middlewareContext: Record<string, any> = {};\n\t\t\tif (middleware) {\n\t\t\t\tconst res = await middleware({\n\t\t\t\t\tpath: path,\n\t\t\t\t\tmethod: method as \"GET\",\n\t\t\t\t\theaders,\n\t\t\t\t\tparams: route?.params as any,\n\t\t\t\t\trequest: request,\n\t\t\t\t\tbody: body,\n\t\t\t\t\tquery,\n\t\t\t\t\t...config?.extraContext,\n\t\t\t\t});\n\t\t\t\tif (res) {\n\t\t\t\t\tmiddlewareContext = {\n\t\t\t\t\t\t...res,\n\t\t\t\t\t\t...middlewareContext,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst handlerRes = await handler({\n\t\t\t\tpath: path,\n\t\t\t\tmethod: method as \"GET\",\n\t\t\t\theaders,\n\t\t\t\tparams: route?.params as any,\n\t\t\t\trequest: request,\n\t\t\t\tbody: body,\n\t\t\t\tquery,\n\t\t\t\t...middlewareContext,\n\t\t\t\t...config?.extraContext,\n\t\t\t});\n\t\t\tif (handlerRes instanceof Response) {\n\t\t\t\treturn handlerRes;\n\t\t\t}\n\t\t\tconst resBody = shouldSerialize(handlerRes) ? JSON.stringify(handlerRes) : handlerRes;\n\t\t\treturn new Response(resBody as any, {\n\t\t\t\theaders: handler.headers,\n\t\t\t});\n\t\t} catch (e) {\n\t\t\tif (config?.onError) {\n\t\t\t\tconst onErrorRes = await config.onError(e);\n\t\t\t\tif (onErrorRes instanceof Response) {\n\t\t\t\t\treturn onErrorRes;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (e instanceof APIError) {\n\t\t\t\treturn new Response(e.body ? JSON.stringify(e.body) : null, {\n\t\t\t\t\tstatus: statusCode[e.status],\n\t\t\t\t\tstatusText: e.status,\n\t\t\t\t\theaders: handler.headers,\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (config?.throwError) {\n\t\t\t\tthrow e;\n\t\t\t}\n\t\t\treturn new Response(null, {\n\t\t\t\tstatus: 500,\n\t\t\t\tstatusText: \"Internal Server Error\",\n\t\t\t});\n\t\t}\n\t};\n\treturn {\n\t\thandler,\n\t\tendpoints,\n\t};\n};\n\nexport type Router = ReturnType<typeof createRouter>;\n","export async function getBody(request: Request) {\n\tconst contentType = request.headers.get(\"content-type\") || \"\";\n\n\tif (!request.body) {\n\t\treturn undefined;\n\t}\n\n\tif (contentType.includes(\"application/json\")) {\n\t\treturn await request.json();\n\t}\n\n\tif (contentType.includes(\"application/x-www-form-urlencoded\")) {\n\t\tconst formData = await request.formData();\n\t\tconst result: Record<string, string> = {};\n\t\tformData.forEach((value, key) => {\n\t\t\tresult[key] = value.toString();\n\t\t});\n\t\treturn result;\n\t}\n\n\tif (contentType.includes(\"multipart/form-data\")) {\n\t\tconst formData = await request.formData();\n\t\tconst result: Record<string, any> = {};\n\t\tformData.forEach((value, key) => {\n\t\t\tresult[key] = value;\n\t\t});\n\t\treturn result;\n\t}\n\n\tif (contentType.includes(\"text/plain\")) {\n\t\treturn await request.text();\n\t}\n\n\tif (contentType.includes(\"application/octet-stream\")) {\n\t\treturn await request.arrayBuffer();\n\t}\n\n\tif (\n\t\tcontentType.includes(\"application/pdf\") ||\n\t\tcontentType.includes(\"image/\") ||\n\t\tcontentType.includes(\"video/\")\n\t) {\n\t\tconst blob = await request.blob();\n\t\treturn blob;\n\t}\n\n\tif (contentType.includes(\"application/stream\") || request.body instanceof ReadableStream) {\n\t\treturn request.body;\n\t}\n\n\treturn await request.text();\n}\n\nexport function shouldSerialize(body: any) {\n\treturn (\n\t\ttypeof body === \"object\" &&\n\t\tbody !== null &&\n\t\t!(body instanceof Blob) &&\n\t\t!(body instanceof FormData)\n\t);\n}\n\nexport const statusCode = {\n\tOK: 200,\n\tCREATED: 201,\n\tACCEPTED: 202,\n\tNO_CONTENT: 204,\n\tMULTIPLE_CHOICES: 300,\n\tMOVED_PERMANENTLY: 301,\n\tFOUND: 302,\n\tSEE_OTHER: 303,\n\tNOT_MODIFIED: 304,\n\tTEMPORARY_REDIRECT: 307,\n\tBAD_REQUEST: 400,\n\tUNAUTHORIZED: 401,\n\tPAYMENT_REQUIRED: 402,\n\tFORBIDDEN: 403,\n\tNOT_FOUND: 404,\n\tMETHOD_NOT_ALLOWED: 405,\n\tNOT_ACCEPTABLE: 406,\n\tPROXY_AUTHENTICATION_REQUIRED: 407,\n\tREQUEST_TIMEOUT: 408,\n\tCONFLICT: 409,\n\tGONE: 410,\n\tLENGTH_REQUIRED: 411,\n\tPRECONDITION_FAILED: 412,\n\tPAYLOAD_TOO_LARGE: 413,\n\tURI_TOO_LONG: 414,\n\tUNSUPPORTED_MEDIA_TYPE: 415,\n\tRANGE_NOT_SATISFIABLE: 416,\n\tEXPECTATION_FAILED: 417,\n\t\"I'M_A_TEAPOT\": 418,\n\tMISDIRECTED_REQUEST: 421,\n\tUNPROCESSABLE_ENTITY: 422,\n\tLOCKED: 423,\n\tFAILED_DEPENDENCY: 424,\n\tTOO_EARLY: 425,\n\tUPGRADE_REQUIRED: 426,\n\tPRECONDITION_REQUIRED: 428,\n\tTOO_MANY_REQUESTS: 429,\n\tREQUEST_HEADER_FIELDS_TOO_LARGE: 431,\n\tUNAVAILABLE_FOR_LEGAL_REASONS: 451,\n\tINTERNAL_SERVER_ERROR: 500,\n\tNOT_IMPLEMENTED: 501,\n\tBAD_GATEWAY: 502,\n\tSERVICE_UNAVAILABLE: 503,\n\tGATEWAY_TIMEOUT: 504,\n\tHTTP_VERSION_NOT_SUPPORTED: 505,\n\tVARIANT_ALSO_NEGOTIATES: 506,\n\tINSUFFICIENT_STORAGE: 507,\n\tLOOP_DETECTED: 508,\n\tNOT_EXTENDED: 510,\n\tNETWORK_AUTHENTICATION_REQUIRED: 511,\n};\n","import { z, type ZodOptional, type ZodSchema } from \"zod\";\nimport type { Middleware } from \"./middleware\";\nimport type { UnionToIntersection } from \"./helper\";\nimport type { CookiePrefixOptions } from \"./cookie\";\n\nexport interface EndpointOptions {\n\tmethod: Method | Method[];\n\tbody?: ZodSchema;\n\tquery?: ZodSchema;\n\tparams?: ZodSchema<any>;\n\t/**\n\t * If true headers will be required to be passed in the context\n\t */\n\trequireHeaders?: boolean;\n\t/**\n\t * If true request object will be required\n\t */\n\trequireRequest?: boolean;\n\t/**\n\t * List of endpoints that will be called before this endpoint\n\t */\n\tuse?: Endpoint[];\n}\n\nexport type Endpoint<\n\tHandler extends (ctx: any) => Promise<any> = (ctx: any) => Promise<any>,\n\tOption extends EndpointOptions = EndpointOptions,\n> = {\n\tpath: string;\n\toptions: Option;\n\theaders?: Headers;\n} & Handler;\n\nexport type InferParamPath<Path> = Path extends `${infer _Start}:${infer Param}/${infer Rest}`\n\t? { [K in Param | keyof InferParamPath<Rest>]: string }\n\t: Path extends `${infer _Start}:${infer Param}`\n\t\t? { [K in Param]: string }\n\t\t: Path extends `${infer _Start}/${infer Rest}`\n\t\t\t? InferParamPath<Rest>\n\t\t\t: undefined;\n\nexport type InferParamWildCard<Path> = Path extends\n\t| `${infer _Start}/*:${infer Param}/${infer Rest}`\n\t| `${infer _Start}/**:${infer Param}/${infer Rest}`\n\t? { [K in Param | keyof InferParamPath<Rest>]: string }\n\t: Path extends `${infer _Start}/*`\n\t\t? { [K in \"_\"]: string }\n\t\t: Path extends `${infer _Start}/${infer Rest}`\n\t\t\t? InferParamPath<Rest>\n\t\t\t: undefined;\n\nexport type Prettify<T> = {\n\t[key in keyof T]: T[key];\n} & {};\n\nexport interface CookieOptions {\n\t/**\n\t * Max age in seconds\n\t */\n\tmaxAge?: number;\n\t/**\n\t * Domain\n\t */\n\tdomain?: string;\n\t/**\n\t * Path\n\t */\n\tpath?: string;\n\t/**\n\t * Secure\n\t */\n\tsecure?: boolean;\n\t/**\n\t * HttpOnly\n\t */\n\thttpOnly?: boolean;\n\n\t/**\n\t * SameSite\n\t */\n\tsameSite?: \"strict\" | \"lax\" | \"none\";\n\t/**\n\t * Expires\n\t */\n\texpires?: Date;\n}\n\nexport type ContextTools = {\n\t/**\n\t * Set header\n\t *\n\t * If it's called outside of a request it will just be ignored.\n\t */\n\tsetHeader: (key: string, value: string) => void;\n\t/**\n\t * cookie setter.\n\t *\n\t * If it's called outside of a request it will just be ignored.\n\t */\n\tsetCookie: (key: string, value: string, options?: CookieOptions) => void;\n\t/**\n\t * Get cookie value\n\t *\n\t * If it's called outside of a request it will just be ignored.\n\t */\n\tgetCookie: (key: string, value: string, options?: CookieOptions) => string | undefined;\n\t/**\n\t * Set signed cookie\n\t */\n\tsetSignedCookie: (\n\t\tkey: string,\n\t\tvalue: string,\n\t\tsecret: string | BufferSource,\n\t\toptions?: CookieOptions,\n\t) => Promise<void>;\n\t/**\n\t * Get signed cookie value\n\t */\n\n\tgetSignedCookie: (\n\t\tkey: string,\n\t\tsecret: string,\n\t\tprefix?: CookiePrefixOptions,\n\t) => Promise<string | undefined>;\n};\n\nexport type Context<Path extends string, Opts extends EndpointOptions> = InferBody<Opts> &\n\tInferParam<Path> &\n\tInferMethod<Opts[\"method\"]> &\n\tInferHeaders<Opts> &\n\tInferRequest<Opts> &\n\tInferQuery<Opts[\"query\"]>;\n\nexport type InferUse<Opts extends EndpointOptions> = Opts[\"use\"] extends Endpoint[]\n\t? {\n\t\t\tcontext: UnionToIntersection<Awaited<ReturnType<Opts[\"use\"][number]>>>;\n\t\t}\n\t: {};\n\nexport type InferUseOptions<Opts extends EndpointOptions> = Opts[\"use\"] extends Array<infer U>\n\t? UnionToIntersection<\n\t\t\tU extends Endpoint\n\t\t\t\t? U[\"options\"]\n\t\t\t\t: {\n\t\t\t\t\t\tbody?: {};\n\t\t\t\t\t\trequireRequest?: boolean;\n\t\t\t\t\t\trequireHeaders?: boolean;\n\t\t\t\t\t}\n\t\t>\n\t: {\n\t\t\tbody?: {};\n\t\t\trequireRequest?: boolean;\n\t\t\trequireHeaders?: boolean;\n\t\t};\n\nexport type InferMethod<M extends Method | Method[]> = M extends Array<Method>\n\t? {\n\t\t\tmethod: M[number];\n\t\t}\n\t: {\n\t\t\tmethod?: M;\n\t\t};\n\nexport type InferHeaders<\n\tOpt extends EndpointOptions,\n\tHeaderReq = Opt[\"requireHeaders\"],\n> = HeaderReq extends true\n\t? {\n\t\t\theaders: Headers;\n\t\t}\n\t: InferUseOptions<Opt>[\"requireHeaders\"] extends true\n\t\t? {\n\t\t\t\theaders: Headers;\n\t\t\t}\n\t\t: {\n\t\t\t\theaders?: Headers;\n\t\t\t};\n\nexport type InferRequest<\n\tOpt extends EndpointOptions,\n\tRequestReq = Opt[\"requireRequest\"],\n> = RequestReq extends true\n\t? {\n\t\t\trequest: Request;\n\t\t}\n\t: InferUseOptions<Opt>[\"requireRequest\"] extends true\n\t\t? {\n\t\t\t\trequest: Request;\n\t\t\t}\n\t\t: {\n\t\t\t\trequest?: Request;\n\t\t\t};\n\nexport type InferQuery<Query> = Query extends ZodSchema\n\t? Query extends ZodOptional<any>\n\t\t? {\n\t\t\t\tquery?: z.infer<Query>;\n\t\t\t}\n\t\t: {\n\t\t\t\tquery: z.infer<Query>;\n\t\t\t}\n\t: {\n\t\t\tquery?: undefined;\n\t\t};\n\nexport type InferParam<\n\tPath extends string,\n\tParamPath extends InferParamPath<Path> = InferParamPath<Path>,\n\tWildCard extends InferParamWildCard<Path> = InferParamWildCard<Path>,\n> = ParamPath extends undefined\n\t? WildCard extends undefined\n\t\t? {\n\t\t\t\tparams?: Record<string, string>;\n\t\t\t}\n\t\t: {\n\t\t\t\tparams: WildCard;\n\t\t\t}\n\t: {\n\t\t\tparams: Prettify<ParamPath & (WildCard extends undefined ? {} : WildCard)>;\n\t\t};\n\nexport type EndpointResponse = Record<string, any> | string | boolean | number | void | undefined;\n\nexport type Handler<\n\tPath extends string,\n\tOpts extends EndpointOptions,\n\tR extends EndpointResponse,\n\tExtra extends Record<string, any> = {},\n> = (ctx: Prettify<Context<Path, Opts> & InferUse<Opts> & ContextTools> & Extra) => Promise<R>;\n\nexport type Method = \"GET\" | \"POST\" | \"PUT\" | \"DELETE\" | \"PATCH\" | \"*\";\n\nexport type InferBody<\n\tOpts extends EndpointOptions,\n\tBody extends ZodSchema | undefined = Opts[\"body\"] &\n\t\t(undefined extends InferUseOptions<Opts>[\"body\"] ? {} : InferUseOptions<Opts>[\"body\"]),\n> = Body extends ZodSchema\n\t? Body extends ZodOptional<any>\n\t\t? {\n\t\t\t\tbody?: Prettify<z.infer<Body>>;\n\t\t\t}\n\t\t: {\n\t\t\t\tbody: Prettify<z.infer<Body>>;\n\t\t\t}\n\t: {\n\t\t\tbody?: undefined;\n\t\t};\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","algorithm","getCryptoKey","secret","secretBuf","makeSignature","value","key","signature","verifySignature","base64Signature","signatureBinStr","len","validCookieNameRegEx","validCookieValueRegEx","parse","cookie","name","parsedCookie","pairStr","valueStartPos","cookieName","cookieValue","parseSigned","secretKey","signatureStartPos","signedValue","isVerified","_serialize","opt","serialize","serializeSigned","getCookie","cookie","key","prefix","finalKey","parse","setCookie","header","name","value","opt","serialize","setSignedCookie","secret","serializeSigned","getSignedCookie","parseSigned","createEndpointCreator","path","options","handler","createEndpoint","responseHeader","handle","ctx","internalCtx","key","value","setCookie","prefix","header","getCookie","secret","getSignedCookie","setSignedCookie","middleware","res","body","e","APIError","import_rou3","getBody","request","contentType","formData","result","value","key","shouldSerialize","body","statusCode","createRouter","endpoints","config","_endpoints","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
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { E as EndpointOptions, a as EndpointResponse, H as Handler, b as HasRequiredKeys, C as Context, M as Method, P as Prettify, I as InferBody, c as InferRequest, d as InferHeaders, e as ContextTools, f as Endpoint } from './router-
|
|
2
|
-
export { j as CookieOptions, m as InferMethod, o as InferParam, h as InferParamPath, i as InferParamWildCard, n as InferQuery, k as InferUse, l as InferUseOptions, R as Router, g as createRouter } from './router-
|
|
1
|
+
import { E as EndpointOptions, a as EndpointResponse, H as Handler, b as HasRequiredKeys, C as Context, M as Method, P as Prettify, I as InferBody, c as InferRequest, d as InferHeaders, e as ContextTools, f as Endpoint } from './router-BoATPhwk.cjs';
|
|
2
|
+
export { j as CookieOptions, m as InferMethod, o as InferParam, h as InferParamPath, i as InferParamWildCard, n as InferQuery, k as InferUse, l as InferUseOptions, R as Router, g as createRouter } from './router-BoATPhwk.cjs';
|
|
3
3
|
import 'zod';
|
|
4
4
|
|
|
5
5
|
interface EndpointConfig {
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { E as EndpointOptions, a as EndpointResponse, H as Handler, b as HasRequiredKeys, C as Context, M as Method, P as Prettify, I as InferBody, c as InferRequest, d as InferHeaders, e as ContextTools, f as Endpoint } from './router-
|
|
2
|
-
export { j as CookieOptions, m as InferMethod, o as InferParam, h as InferParamPath, i as InferParamWildCard, n as InferQuery, k as InferUse, l as InferUseOptions, R as Router, g as createRouter } from './router-
|
|
1
|
+
import { E as EndpointOptions, a as EndpointResponse, H as Handler, b as HasRequiredKeys, C as Context, M as Method, P as Prettify, I as InferBody, c as InferRequest, d as InferHeaders, e as ContextTools, f as Endpoint } from './router-BoATPhwk.js';
|
|
2
|
+
export { j as CookieOptions, m as InferMethod, o as InferParam, h as InferParamPath, i as InferParamWildCard, n as InferQuery, k as InferUse, l as InferUseOptions, R as Router, g as createRouter } from './router-BoATPhwk.js';
|
|
3
3
|
import 'zod';
|
|
4
4
|
|
|
5
5
|
interface EndpointConfig {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/endpoint.ts","../src/middleware.ts","../src/better-call-error.ts","../src/cookie.ts","../src/cookie-utils.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 {\n\tContext,\n\tContextTools,\n\tCookieOptions,\n\tEndpoint,\n\tEndpointOptions,\n\tEndpointResponse,\n\tHandler,\n} from \"./types\";\nimport { getCookie, getSignedCookie, setCookie, setSignedCookie } from \"./cookie-utils\";\nimport type { CookiePrefixOptions } from \"./cookie\";\n\nexport interface EndpointConfig {\n\t/**\n\t * Throw when the response isn't in 200 range\n\t */\n\tthrowOnError?: boolean;\n}\n\nexport function createEndpointCreator<T extends Record<string, any>>() {\n\treturn <Path extends string, Opts extends EndpointOptions, R extends EndpointResponse>(\n\t\tpath: Path,\n\t\toptions: Opts,\n\t\thandler: Handler<Path, Opts, R, T>,\n\t) => {\n\t\t//@ts-expect-error\n\t\treturn createEndpoint(path, options, handler);\n\t};\n}\n\nexport function createEndpoint<\n\tPath extends string,\n\tOpts extends EndpointOptions,\n\tR extends EndpointResponse,\n>(path: Path, options: Opts, handler: Handler<Path, Opts, R>) {\n\tconst responseHeader = new Headers();\n\ttype Ctx = Context<Path, Opts>;\n\tconst handle = async (...ctx: HasRequiredKeys<Ctx> extends true ? [Ctx] : [Ctx?]) => {\n\t\tlet internalCtx = {\n\t\t\tsetHeader(key: string, value: string) {\n\t\t\t\tresponseHeader.set(key, value);\n\t\t\t},\n\t\t\tsetCookie(key: string, value: string, options?: CookieOptions) {\n\t\t\t\tsetCookie(responseHeader, key, value, options);\n\t\t\t},\n\t\t\tgetCookie(key: string, prefix?: CookiePrefixOptions) {\n\t\t\t\tconst header = ctx[0]?.headers;\n\t\t\t\tconst cookie = getCookie(header?.get(\"Cookie\") || \"\", key, prefix);\n\t\t\t\treturn cookie;\n\t\t\t},\n\t\t\tgetSignedCookie(key: string, secret: string, prefix?: CookiePrefixOptions) {\n\t\t\t\tconst header = ctx[0]?.headers;\n\t\t\t\tif (!header) {\n\t\t\t\t\tthrow new TypeError(\"Headers are required\");\n\t\t\t\t}\n\t\t\t\tconst cookie = getSignedCookie(header, secret, key, prefix);\n\t\t\t\treturn cookie;\n\t\t\t},\n\t\t\tasync setSignedCookie(\n\t\t\t\tkey: string,\n\t\t\t\tvalue: string,\n\t\t\t\tsecret: string | BufferSource,\n\t\t\t\toptions?: CookieOptions,\n\t\t\t) {\n\t\t\t\tawait setSignedCookie(responseHeader, key, value, secret, options);\n\t\t\t},\n\t\t\t...(ctx[0] || {}),\n\t\t\tcontext: {},\n\t\t};\n\t\tif (options.use?.length) {\n\t\t\tfor (const middleware of options.use) {\n\t\t\t\tconst res = (await middleware(internalCtx)) as Endpoint;\n\t\t\t\tconst body = res.options?.body\n\t\t\t\t\t? res.options.body.parse(internalCtx.body)\n\t\t\t\t\t: undefined;\n\t\t\t\tif (res) {\n\t\t\t\t\tinternalCtx = {\n\t\t\t\t\t\t...internalCtx,\n\t\t\t\t\t\tbody: body\n\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t...body,\n\t\t\t\t\t\t\t\t\t...internalCtx.body,\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t: internalCtx.body,\n\t\t\t\t\t\tcontext: {\n\t\t\t\t\t\t\t...(internalCtx.context || {}),\n\t\t\t\t\t\t\t...res,\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\ttry {\n\t\t\tconst body = options.body ? options.body.parse(internalCtx.body) : internalCtx.body;\n\t\t\tinternalCtx = {\n\t\t\t\t...internalCtx,\n\t\t\t\tbody: body\n\t\t\t\t\t? {\n\t\t\t\t\t\t\t...body,\n\t\t\t\t\t\t\t...internalCtx.body,\n\t\t\t\t\t\t}\n\t\t\t\t\t: internalCtx.body,\n\t\t\t};\n\t\t\tinternalCtx.query = options.query\n\t\t\t\t? options.query.parse(internalCtx.query)\n\t\t\t\t: internalCtx.query;\n\t\t\tinternalCtx.params = options.params\n\t\t\t\t? options.params.parse(internalCtx.params)\n\t\t\t\t: internalCtx.params;\n\t\t} catch (e) {\n\t\t\tif (e instanceof ZodError) {\n\t\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\t\tmessage: e.message,\n\t\t\t\t\tdetails: e.errors,\n\t\t\t\t});\n\t\t\t}\n\t\t\tthrow e;\n\t\t}\n\t\tif (options.requireHeaders && !internalCtx.headers) {\n\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\tmessage: \"Headers are required\",\n\t\t\t});\n\t\t}\n\t\tif (options.requireRequest && !internalCtx.request) {\n\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\tmessage: \"Request is required\",\n\t\t\t});\n\t\t}\n\t\t//@ts-expect-error\n\t\tconst res = await handler(internalCtx);\n\t\treturn res as ReturnType<Handler<Path, Opts, R>>;\n\t};\n\thandle.path = path;\n\thandle.options = options;\n\thandle.method = options.method;\n\thandle.headers = responseHeader;\n\treturn handle;\n}\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}","//https://github.com/honojs/hono/blob/main/src/utils/cookie.ts\n\nexport type Cookie = Record<string, string>;\nexport type SignedCookie = Record<string, string | false>;\n\ntype PartitionCookieConstraint =\n\t| { partition: true; secure: true }\n\t| { partition?: boolean; secure?: boolean }; // reset to default\ntype SecureCookieConstraint = { secure: true };\ntype HostCookieConstraint = { secure: true; path: \"/\"; domain?: undefined };\n\nexport type CookieOptions = {\n\tdomain?: string;\n\texpires?: Date;\n\thttpOnly?: boolean;\n\tmaxAge?: number;\n\tpath?: string;\n\tsecure?: boolean;\n\tsigningSecret?: string;\n\tsameSite?: \"Strict\" | \"Lax\" | \"None\" | \"strict\" | \"lax\" | \"none\";\n\tpartitioned?: boolean;\n\tprefix?: CookiePrefixOptions;\n} & PartitionCookieConstraint;\nexport type CookiePrefixOptions = \"host\" | \"secure\";\n\nexport type CookieConstraint<Name> = Name extends `__Secure-${string}`\n\t? CookieOptions & SecureCookieConstraint\n\t: Name extends `__Host-${string}`\n\t\t? CookieOptions & HostCookieConstraint\n\t\t: CookieOptions;\n\nconst algorithm = { name: \"HMAC\", hash: \"SHA-256\" };\n\nconst getCryptoKey = async (secret: string | BufferSource): Promise<CryptoKey> => {\n\tconst secretBuf = typeof secret === \"string\" ? new TextEncoder().encode(secret) : secret;\n\treturn await crypto.subtle.importKey(\"raw\", secretBuf, algorithm, false, [\"sign\", \"verify\"]);\n};\n\nconst makeSignature = async (value: string, secret: string | BufferSource): Promise<string> => {\n\tconst key = await getCryptoKey(secret);\n\tconst signature = await crypto.subtle.sign(\n\t\talgorithm.name,\n\t\tkey,\n\t\tnew TextEncoder().encode(value),\n\t);\n\t// the returned base64 encoded signature will always be 44 characters long and end with one or two equal signs\n\treturn btoa(String.fromCharCode(...new Uint8Array(signature)));\n};\n\nconst verifySignature = async (\n\tbase64Signature: string,\n\tvalue: string,\n\tsecret: CryptoKey,\n): Promise<boolean> => {\n\ttry {\n\t\tconst signatureBinStr = atob(base64Signature);\n\t\tconst signature = new Uint8Array(signatureBinStr.length);\n\t\tfor (let i = 0, len = signatureBinStr.length; i < len; i++) {\n\t\t\tsignature[i] = signatureBinStr.charCodeAt(i);\n\t\t}\n\t\treturn await crypto.subtle.verify(\n\t\t\talgorithm,\n\t\t\tsecret,\n\t\t\tsignature,\n\t\t\tnew TextEncoder().encode(value),\n\t\t);\n\t} catch (e) {\n\t\treturn false;\n\t}\n};\n\n// all alphanumeric chars and all of _!#$%&'*.^`|~+-\n// (see: https://datatracker.ietf.org/doc/html/rfc6265#section-4.1.1)\nconst validCookieNameRegEx = /^[\\w!#$%&'*.^`|~+-]+$/;\n\n// all ASCII chars 32-126 except 34, 59, and 92 (i.e. space to tilde but not double quote, semicolon, or backslash)\n// (see: https://datatracker.ietf.org/doc/html/rfc6265#section-4.1.1)\n//\n// note: the spec also prohibits comma and space, but we allow both since they are very common in the real world\n// (see: https://github.com/golang/go/issues/7243)\nconst validCookieValueRegEx = /^[ !#-:<-[\\]-~]*$/;\n\nexport const parse = (cookie: string, name?: string): Cookie => {\n\tconst pairs = cookie.trim().split(\";\");\n\treturn pairs.reduce((parsedCookie, pairStr) => {\n\t\tpairStr = pairStr.trim();\n\t\tconst valueStartPos = pairStr.indexOf(\"=\");\n\t\tif (valueStartPos === -1) {\n\t\t\treturn parsedCookie;\n\t\t}\n\n\t\tconst cookieName = pairStr.substring(0, valueStartPos).trim();\n\t\tif ((name && name !== cookieName) || !validCookieNameRegEx.test(cookieName)) {\n\t\t\treturn parsedCookie;\n\t\t}\n\n\t\tlet cookieValue = pairStr.substring(valueStartPos + 1).trim();\n\t\tif (cookieValue.startsWith('\"') && cookieValue.endsWith('\"')) {\n\t\t\tcookieValue = cookieValue.slice(1, -1);\n\t\t}\n\t\tif (validCookieValueRegEx.test(cookieValue)) {\n\t\t\tparsedCookie[cookieName] = decodeURIComponent(cookieValue);\n\t\t}\n\n\t\treturn parsedCookie;\n\t}, {} as Cookie);\n};\n\nexport const parseSigned = async (\n\tcookie: string,\n\tsecret: string | BufferSource,\n\tname?: string,\n): Promise<SignedCookie> => {\n\tconst parsedCookie: SignedCookie = {};\n\tconst secretKey = await getCryptoKey(secret);\n\n\tfor (const [key, value] of Object.entries(parse(cookie, name))) {\n\t\tconst signatureStartPos = value.lastIndexOf(\".\");\n\t\tif (signatureStartPos < 1) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst signedValue = value.substring(0, signatureStartPos);\n\t\tconst signature = value.substring(signatureStartPos + 1);\n\t\tif (signature.length !== 44 || !signature.endsWith(\"=\")) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst isVerified = await verifySignature(signature, signedValue, secretKey);\n\t\tparsedCookie[key] = isVerified ? signedValue : false;\n\t}\n\n\treturn parsedCookie;\n};\n\nconst _serialize = (name: string, value: string, opt: CookieOptions = {}): string => {\n\tlet cookie = `${name}=${value}`;\n\n\tif (name.startsWith(\"__Secure-\") && !opt.secure) {\n\t\t// https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis-13#section-4.1.3.1\n\t\tthrow new Error(\"__Secure- Cookie must have Secure attributes\");\n\t}\n\n\tif (name.startsWith(\"__Host-\")) {\n\t\t// https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis-13#section-4.1.3.2\n\t\tif (!opt.secure) {\n\t\t\tthrow new Error(\"__Host- Cookie must have Secure attributes\");\n\t\t}\n\n\t\tif (opt.path !== \"/\") {\n\t\t\tthrow new Error('__Host- Cookie must have Path attributes with \"/\"');\n\t\t}\n\n\t\tif (opt.domain) {\n\t\t\tthrow new Error(\"__Host- Cookie must not have Domain attributes\");\n\t\t}\n\t}\n\n\tif (opt && typeof opt.maxAge === \"number\" && opt.maxAge >= 0) {\n\t\tif (opt.maxAge > 34560000) {\n\t\t\t// https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis-13#section-4.1.2.2\n\t\t\tthrow new Error(\n\t\t\t\t\"Cookies Max-Age SHOULD NOT be greater than 400 days (34560000 seconds) in duration.\",\n\t\t\t);\n\t\t}\n\t\tcookie += `; Max-Age=${Math.floor(opt.maxAge)}`;\n\t}\n\n\tif (opt.domain && opt.prefix !== \"host\") {\n\t\tcookie += `; Domain=${opt.domain}`;\n\t}\n\n\tif (opt.path) {\n\t\tcookie += `; Path=${opt.path}`;\n\t}\n\n\tif (opt.expires) {\n\t\tif (opt.expires.getTime() - Date.now() > 34560000_000) {\n\t\t\t// https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis-13#section-4.1.2.1\n\t\t\tthrow new Error(\n\t\t\t\t\"Cookies Expires SHOULD NOT be greater than 400 days (34560000 seconds) in the future.\",\n\t\t\t);\n\t\t}\n\t\tcookie += `; Expires=${opt.expires.toUTCString()}`;\n\t}\n\n\tif (opt.httpOnly) {\n\t\tcookie += \"; HttpOnly\";\n\t}\n\n\tif (opt.secure) {\n\t\tcookie += \"; Secure\";\n\t}\n\n\tif (opt.sameSite) {\n\t\tcookie += `; SameSite=${opt.sameSite.charAt(0).toUpperCase() + opt.sameSite.slice(1)}`;\n\t}\n\n\tif (opt.partitioned) {\n\t\t// FIXME: replace link to RFC\n\t\t// https://www.ietf.org/archive/id/draft-cutler-httpbis-partitioned-cookies-01.html#section-2.3\n\t\tif (!opt.secure) {\n\t\t\tthrow new Error(\"Partitioned Cookie must have Secure attributes\");\n\t\t}\n\t\tcookie += \"; Partitioned\";\n\t}\n\n\treturn cookie;\n};\n\nexport const serialize = <Name extends string>(\n\tname: Name,\n\tvalue: string,\n\topt?: CookieConstraint<Name>,\n): string => {\n\tvalue = encodeURIComponent(value);\n\treturn _serialize(name, value, opt);\n};\n\nexport const serializeSigned = async (\n\tname: string,\n\tvalue: string,\n\tsecret: string | BufferSource,\n\topt: CookieOptions = {},\n): Promise<string> => {\n\tconst signature = await makeSignature(value, secret);\n\tvalue = `${value}.${signature}`;\n\tvalue = encodeURIComponent(value);\n\treturn _serialize(name, value, opt);\n};\n","//https://github.com/honojs/hono/blob/main/src/helper/cookie/index.ts\n\nimport {\n\tparse,\n\tparseSigned,\n\tserialize,\n\tserializeSigned,\n\ttype CookieOptions,\n\ttype CookiePrefixOptions,\n} from \"./cookie\";\n\nexport const getCookie = (cookie?: string, key?: string, prefix?: CookiePrefixOptions) => {\n\tif (!cookie) {\n\t\treturn undefined;\n\t}\n\tlet finalKey = key;\n\tif (prefix === \"secure\") {\n\t\tfinalKey = \"__Secure-\" + key;\n\t} else if (prefix === \"host\") {\n\t\tfinalKey = \"__Host-\" + key;\n\t} else {\n\t\treturn undefined;\n\t}\n\tconst obj = parse(cookie, finalKey);\n\treturn obj[finalKey];\n};\n\nexport const setCookie = (\n\theader: Headers,\n\tname: string,\n\tvalue: string,\n\topt?: CookieOptions,\n): void => {\n\t// Cookie names prefixed with __Secure- can be used only if they are set with the secure attribute.\n\t// Cookie names prefixed with __Host- can be used only if they are set with the secure attribute, must have a path of / (meaning any path at the host)\n\t// and must not have a Domain attribute.\n\t// Read more at https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie#cookie_prefixes'\n\tlet cookie;\n\tif (opt?.prefix === \"secure\") {\n\t\tcookie = serialize(\"__Secure-\" + name, value, { path: \"/\", ...opt, secure: true });\n\t} else if (opt?.prefix === \"host\") {\n\t\tcookie = serialize(\"__Host-\" + name, value, {\n\t\t\t...opt,\n\t\t\tpath: \"/\",\n\t\t\tsecure: true,\n\t\t\tdomain: undefined,\n\t\t});\n\t} else {\n\t\tcookie = serialize(name, value, { path: \"/\", ...opt });\n\t}\n\theader.append(\"Set-Cookie\", cookie);\n};\n\nexport const setSignedCookie = async (\n\theader: Headers,\n\tname: string,\n\tvalue: string,\n\tsecret: string | BufferSource,\n\topt?: CookieOptions,\n): Promise<void> => {\n\tlet cookie;\n\tif (opt?.prefix === \"secure\") {\n\t\tcookie = await serializeSigned(\"__Secure-\" + name, value, secret, {\n\t\t\tpath: \"/\",\n\t\t\t...opt,\n\t\t\tsecure: true,\n\t\t});\n\t} else if (opt?.prefix === \"host\") {\n\t\tcookie = await serializeSigned(\"__Host-\" + name, value, secret, {\n\t\t\t...opt,\n\t\t\tpath: \"/\",\n\t\t\tsecure: true,\n\t\t\tdomain: undefined,\n\t\t});\n\t} else {\n\t\tcookie = await serializeSigned(name, value, secret, { path: \"/\", ...opt });\n\t}\n\theader.append(\"Set-Cookie\", cookie);\n};\n\nexport const getSignedCookie = async (\n\theader: Headers,\n\tsecret: string,\n\tkey: string,\n\tprefix?: CookiePrefixOptions,\n) => {\n\tconst cookie = header.get(\"Cookie\");\n\tif (!cookie) {\n\t\treturn undefined;\n\t}\n\tlet finalKey = key;\n\tif (prefix === \"secure\") {\n\t\tfinalKey = \"__Secure-\" + key;\n\t} else if (prefix === \"host\") {\n\t\tfinalKey = \"__Host-\" + key;\n\t}\n\tconst obj = await parseSigned(cookie, secret, finalKey);\n\treturn obj[finalKey];\n};\n","import { createRouter as createRou3Router, addRoute, findRoute } 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\t/**\n\t * Throw error if error occurred other than APIError\n\t */\n\tthrowError?: boolean;\n\t/**\n\t * Handle error\n\t */\n\tonError?: (e: unknown) => void | Promise<void> | Response | Promise<Response>;\n\t/**\n\t * Base path for the router\n\t */\n\tbasePath?: string;\n\t/**\n\t * Middlewares for the router\n\t */\n\trouterMiddleware?: {\n\t\tpath: string;\n\t\tmiddleware: Endpoint;\n\t}[];\n\textraContext?: Record<string, any>;\n}\n\nexport const createRouter = <E extends Record<string, Endpoint>, Config extends RouterConfig>(\n\tendpoints: E,\n\tconfig?: Config,\n) => {\n\tconst _endpoints = Object.values(endpoints);\n\tconst router = createRou3Router();\n\tfor (const endpoint of _endpoints) {\n\t\tif (Array.isArray(endpoint.options?.method)) {\n\t\t\tfor (const method of endpoint.options.method) {\n\t\t\t\taddRoute(router, method, endpoint.path, endpoint);\n\t\t\t}\n\t\t} else {\n\t\t\taddRoute(router, endpoint.options.method, endpoint.path, endpoint);\n\t\t}\n\t}\n\n\tconst middlewareRouter = createRou3Router();\n\tfor (const route of config?.routerMiddleware || []) {\n\t\taddRoute(middlewareRouter, \"*\", route.path, route.middleware);\n\t}\n\n\tconst handler = async (request: Request) => {\n\t\tconst url = new URL(request.url);\n\t\tlet path = url.pathname;\n\t\tif (config?.basePath) {\n\t\t\tpath = path.split(config.basePath)[1];\n\t\t}\n\t\tconst method = request.method;\n\t\tconst route = findRoute(router, method, path);\n\t\tconst handler = route?.data as Endpoint;\n\t\tconst body = await getBody(request);\n\t\tconst headers = request.headers;\n\t\tconst query = Object.fromEntries(url.searchParams);\n\t\tconst middleware = findRoute(middlewareRouter, \"*\", path)?.data as Endpoint | undefined;\n\t\t//handler 404\n\t\tif (!handler) {\n\t\t\treturn new Response(null, {\n\t\t\t\tstatus: 404,\n\t\t\t\tstatusText: \"Not Found\",\n\t\t\t});\n\t\t}\n\t\ttry {\n\t\t\tlet middlewareContext: Record<string, any> = {};\n\t\t\tif (middleware) {\n\t\t\t\tconst res = await middleware({\n\t\t\t\t\tpath: path,\n\t\t\t\t\tmethod: method as \"GET\",\n\t\t\t\t\theaders,\n\t\t\t\t\tparams: route?.params as any,\n\t\t\t\t\trequest: request,\n\t\t\t\t\tbody: body,\n\t\t\t\t\tquery,\n\t\t\t\t\t...config?.extraContext,\n\t\t\t\t});\n\t\t\t\tif (res) {\n\t\t\t\t\tmiddlewareContext = {\n\t\t\t\t\t\t...res,\n\t\t\t\t\t\t...middlewareContext,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst handlerRes = await handler({\n\t\t\t\tpath: path,\n\t\t\t\tmethod: method as \"GET\",\n\t\t\t\theaders,\n\t\t\t\tparams: route?.params as any,\n\t\t\t\trequest: request,\n\t\t\t\tbody: body,\n\t\t\t\tquery,\n\t\t\t\t...middlewareContext,\n\t\t\t\t...config?.extraContext,\n\t\t\t});\n\t\t\tif (handlerRes instanceof Response) {\n\t\t\t\treturn handlerRes;\n\t\t\t}\n\t\t\tconst resBody = shouldSerialize(handlerRes) ? JSON.stringify(handlerRes) : handlerRes;\n\t\t\treturn new Response(resBody as any, {\n\t\t\t\theaders: handler.headers,\n\t\t\t});\n\t\t} catch (e) {\n\t\t\tif (config?.onError) {\n\t\t\t\tconst onErrorRes = await config.onError(e);\n\t\t\t\tif (onErrorRes instanceof Response) {\n\t\t\t\t\treturn onErrorRes;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (e instanceof APIError) {\n\t\t\t\treturn new Response(e.body ? JSON.stringify(e.body) : null, {\n\t\t\t\t\tstatus: statusCode[e.status],\n\t\t\t\t\tstatusText: e.status,\n\t\t\t\t\theaders: handler.headers,\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (config?.throwError) {\n\t\t\t\tthrow e;\n\t\t\t}\n\t\t\treturn new Response(null, {\n\t\t\t\tstatus: 500,\n\t\t\t\tstatusText: \"Internal Server Error\",\n\t\t\t});\n\t\t}\n\t};\n\treturn {\n\t\thandler,\n\t\tendpoints,\n\t};\n};\n\nexport type Router = ReturnType<typeof createRouter>;\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\";\nimport type { CookiePrefixOptions } from \"./cookie\";\n\nexport interface EndpointOptions {\n\tmethod: Method | Method[];\n\tbody?: ZodSchema;\n\tquery?: ZodSchema;\n\tparams?: ZodSchema<any>;\n\t/**\n\t * If true headers will be required to be passed in the context\n\t */\n\trequireHeaders?: boolean;\n\t/**\n\t * If true request object will be required\n\t */\n\trequireRequest?: boolean;\n\t/**\n\t * List of endpoints that will be called before this endpoint\n\t */\n\tuse?: Endpoint[];\n}\n\nexport type Endpoint<\n\tHandler extends (ctx: any) => Promise<any> = (ctx: any) => Promise<any>,\n\tOption extends EndpointOptions = EndpointOptions,\n> = {\n\tpath: string;\n\toptions: Option;\n\theaders?: Headers;\n} & Handler;\n\nexport type InferParamPath<Path> = Path extends `${infer _Start}:${infer Param}/${infer Rest}`\n\t? { [K in Param | keyof InferParamPath<Rest>]: string }\n\t: Path extends `${infer _Start}:${infer Param}`\n\t\t? { [K in Param]: string }\n\t\t: Path extends `${infer _Start}/${infer Rest}`\n\t\t\t? InferParamPath<Rest>\n\t\t\t: undefined;\n\nexport type InferParamWildCard<Path> = Path extends\n\t| `${infer _Start}/*:${infer Param}/${infer Rest}`\n\t| `${infer _Start}/**:${infer Param}/${infer Rest}`\n\t? { [K in Param | keyof InferParamPath<Rest>]: string }\n\t: Path extends `${infer _Start}/*`\n\t\t? { [K in \"_\"]: string }\n\t\t: Path extends `${infer _Start}/${infer Rest}`\n\t\t\t? InferParamPath<Rest>\n\t\t\t: undefined;\n\nexport type Prettify<T> = {\n\t[key in keyof T]: T[key];\n} & {};\n\nexport interface CookieOptions {\n\t/**\n\t * Max age in seconds\n\t */\n\tmaxAge?: number;\n\t/**\n\t * Domain\n\t */\n\tdomain?: string;\n\t/**\n\t * Path\n\t */\n\tpath?: string;\n\t/**\n\t * Secure\n\t */\n\tsecure?: boolean;\n\t/**\n\t * HttpOnly\n\t */\n\thttpOnly?: boolean;\n\n\t/**\n\t * SameSite\n\t */\n\tsameSite?: \"strict\" | \"lax\" | \"none\";\n\t/**\n\t * Expires\n\t */\n\texpires?: Date;\n}\n\nexport type ContextTools = {\n\t/**\n\t * Set header\n\t *\n\t * If it's called outside of a request it will just be ignored.\n\t */\n\tsetHeader: (key: string, value: string) => void;\n\t/**\n\t * cookie setter.\n\t *\n\t * If it's called outside of a request it will just be ignored.\n\t */\n\tsetCookie: (key: string, value: string, options?: CookieOptions) => void;\n\t/**\n\t * Get cookie value\n\t *\n\t * If it's called outside of a request it will just be ignored.\n\t */\n\tgetCookie: (key: string, value: string, options?: CookieOptions) => string | undefined;\n\t/**\n\t * Set signed cookie\n\t */\n\tsetSignedCookie: (\n\t\tkey: string,\n\t\tvalue: string,\n\t\tsecret: string | BufferSource,\n\t\toptions?: CookieOptions,\n\t) => Promise<void>;\n\t/**\n\t * Get signed cookie value\n\t */\n\n\tgetSignedCookie: (\n\t\tkey: string,\n\t\tsecret: string,\n\t\tprefix?: CookiePrefixOptions,\n\t) => Promise<string | undefined>;\n};\n\nexport type Context<Path extends string, Opts extends EndpointOptions> = InferBody<Opts> &\n\tInferParam<Path> &\n\tInferMethod<Opts[\"method\"]> &\n\tInferHeaders<Opts> &\n\tInferRequest<Opts> &\n\tInferQuery<Opts[\"query\"]>;\n\nexport type InferUse<Opts extends EndpointOptions> = Opts[\"use\"] extends Endpoint[]\n\t? {\n\t\t\tcontext: UnionToIntersection<Awaited<ReturnType<Opts[\"use\"][number]>>>;\n\t\t}\n\t: {};\n\nexport type InferUseOptions<Opts extends EndpointOptions> = Opts[\"use\"] extends Array<infer U>\n\t? UnionToIntersection<\n\t\t\tU extends Endpoint\n\t\t\t\t? U[\"options\"]\n\t\t\t\t: {\n\t\t\t\t\t\tbody?: {};\n\t\t\t\t\t\trequireRequest?: boolean;\n\t\t\t\t\t\trequireHeaders?: boolean;\n\t\t\t\t\t}\n\t\t>\n\t: {\n\t\t\tbody?: {};\n\t\t\trequireRequest?: boolean;\n\t\t\trequireHeaders?: boolean;\n\t\t};\n\nexport type InferMethod<M extends Method | Method[]> = M extends Array<Method>\n\t? {\n\t\t\tmethod: M[number];\n\t\t}\n\t: {\n\t\t\tmethod?: M;\n\t\t};\n\nexport type InferHeaders<\n\tOpt extends EndpointOptions,\n\tHeaderReq = Opt[\"requireHeaders\"],\n> = HeaderReq extends true\n\t? {\n\t\t\theaders: Headers;\n\t\t}\n\t: InferUseOptions<Opt>[\"requireHeaders\"] extends true\n\t\t? {\n\t\t\t\theaders: Headers;\n\t\t\t}\n\t\t: {\n\t\t\t\theaders?: Headers;\n\t\t\t};\n\nexport type InferRequest<\n\tOpt extends EndpointOptions,\n\tRequestReq = Opt[\"requireRequest\"],\n> = RequestReq extends true\n\t? {\n\t\t\trequest: Request;\n\t\t}\n\t: InferUseOptions<Opt>[\"requireRequest\"] extends true\n\t\t? {\n\t\t\t\trequest: Request;\n\t\t\t}\n\t\t: {\n\t\t\t\trequest?: Request;\n\t\t\t};\n\nexport type InferQuery<Query> = Query extends ZodSchema\n\t? Query extends ZodOptional<any>\n\t\t? {\n\t\t\t\tquery?: z.infer<Query>;\n\t\t\t}\n\t\t: {\n\t\t\t\tquery: z.infer<Query>;\n\t\t\t}\n\t: {\n\t\t\tquery?: undefined;\n\t\t};\n\nexport type InferParam<\n\tPath extends string,\n\tParamPath extends InferParamPath<Path> = InferParamPath<Path>,\n\tWildCard extends InferParamWildCard<Path> = InferParamWildCard<Path>,\n> = ParamPath extends undefined\n\t? WildCard extends undefined\n\t\t? {\n\t\t\t\tparams?: Record<string, string>;\n\t\t\t}\n\t\t: {\n\t\t\t\tparams: WildCard;\n\t\t\t}\n\t: {\n\t\t\tparams: Prettify<ParamPath & (WildCard extends undefined ? {} : WildCard)>;\n\t\t};\n\nexport type EndpointResponse = Record<string, any> | string | boolean | number | void | undefined;\n\nexport type Handler<\n\tPath extends string,\n\tOpts extends EndpointOptions,\n\tR extends EndpointResponse,\n\tExtra extends Record<string, any> = {},\n> = (ctx: Prettify<Context<Path, Opts> & InferUse<Opts> & ContextTools> & Extra) => Promise<R>;\n\nexport type Method = \"GET\" | \"POST\" | \"PUT\" | \"DELETE\" | \"PATCH\" | \"*\";\n\nexport type InferBody<\n\tOpts extends EndpointOptions,\n\tBody extends ZodSchema | undefined = Opts[\"body\"] &\n\t\t(undefined extends InferUseOptions<Opts>[\"body\"] ? {} : InferUseOptions<Opts>[\"body\"]),\n> = Body extends ZodSchema\n\t? Body extends ZodOptional<any>\n\t\t? {\n\t\t\t\tbody?: Prettify<z.infer<Body>>;\n\t\t\t}\n\t\t: {\n\t\t\t\tbody: Prettify<z.infer<Body>>;\n\t\t\t}\n\t: {\n\t\t\tbody?: undefined;\n\t\t};\n"],"mappings":"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","names":["ZodError","createMiddleware","optionsOrHandler","handler","createEndpoint","createMiddlewareCreator","fn","APIError","status","body","__publicField","algorithm","getCryptoKey","secret","secretBuf","makeSignature","value","key","signature","verifySignature","base64Signature","signatureBinStr","len","validCookieNameRegEx","validCookieValueRegEx","parse","cookie","name","parsedCookie","pairStr","valueStartPos","cookieName","cookieValue","parseSigned","secretKey","signatureStartPos","signedValue","isVerified","_serialize","opt","serialize","serializeSigned","getCookie","cookie","key","prefix","finalKey","parse","setCookie","header","name","value","opt","serialize","setSignedCookie","secret","serializeSigned","getSignedCookie","parseSigned","createEndpointCreator","path","options","handler","createEndpoint","responseHeader","handle","ctx","internalCtx","key","value","setCookie","prefix","header","getCookie","secret","getSignedCookie","setSignedCookie","middleware","res","body","e","ZodError","APIError","createRou3Router","addRoute","findRoute","getBody","request","contentType","formData","result","value","key","shouldSerialize","body","statusCode","createRouter","endpoints","config","_endpoints","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/error.ts","../src/cookie.ts","../src/cookie-utils.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 \"./error\";\nimport type { HasRequiredKeys, UnionToIntersection } from \"./helper\";\nimport type {\n\tContext,\n\tContextTools,\n\tCookieOptions,\n\tEndpoint,\n\tEndpointOptions,\n\tEndpointResponse,\n\tHandler,\n} from \"./types\";\nimport { getCookie, getSignedCookie, setCookie, setSignedCookie } from \"./cookie-utils\";\nimport type { CookiePrefixOptions } from \"./cookie\";\n\nexport interface EndpointConfig {\n\t/**\n\t * Throw when the response isn't in 200 range\n\t */\n\tthrowOnError?: boolean;\n}\n\nexport function createEndpointCreator<T extends Record<string, any>>() {\n\treturn <Path extends string, Opts extends EndpointOptions, R extends EndpointResponse>(\n\t\tpath: Path,\n\t\toptions: Opts,\n\t\thandler: Handler<Path, Opts, R, T>,\n\t) => {\n\t\t//@ts-expect-error\n\t\treturn createEndpoint(path, options, handler);\n\t};\n}\n\nexport function createEndpoint<\n\tPath extends string,\n\tOpts extends EndpointOptions,\n\tR extends EndpointResponse,\n>(path: Path, options: Opts, handler: Handler<Path, Opts, R>) {\n\tconst responseHeader = new Headers();\n\ttype Ctx = Context<Path, Opts>;\n\tconst handle = async (...ctx: HasRequiredKeys<Ctx> extends true ? [Ctx] : [Ctx?]) => {\n\t\tlet internalCtx = {\n\t\t\tsetHeader(key: string, value: string) {\n\t\t\t\tresponseHeader.set(key, value);\n\t\t\t},\n\t\t\tsetCookie(key: string, value: string, options?: CookieOptions) {\n\t\t\t\tsetCookie(responseHeader, key, value, options);\n\t\t\t},\n\t\t\tgetCookie(key: string, prefix?: CookiePrefixOptions) {\n\t\t\t\tconst header = ctx[0]?.headers;\n\t\t\t\tconst cookie = getCookie(header?.get(\"Cookie\") || \"\", key, prefix);\n\t\t\t\treturn cookie;\n\t\t\t},\n\t\t\tgetSignedCookie(key: string, secret: string, prefix?: CookiePrefixOptions) {\n\t\t\t\tconst header = ctx[0]?.headers;\n\t\t\t\tif (!header) {\n\t\t\t\t\tthrow new TypeError(\"Headers are required\");\n\t\t\t\t}\n\t\t\t\tconst cookie = getSignedCookie(header, secret, key, prefix);\n\t\t\t\treturn cookie;\n\t\t\t},\n\t\t\tasync setSignedCookie(\n\t\t\t\tkey: string,\n\t\t\t\tvalue: string,\n\t\t\t\tsecret: string | BufferSource,\n\t\t\t\toptions?: CookieOptions,\n\t\t\t) {\n\t\t\t\tawait setSignedCookie(responseHeader, key, value, secret, options);\n\t\t\t},\n\t\t\t...(ctx[0] || {}),\n\t\t\tcontext: {},\n\t\t};\n\t\tif (options.use?.length) {\n\t\t\tfor (const middleware of options.use) {\n\t\t\t\tconst res = (await middleware(internalCtx)) as Endpoint;\n\t\t\t\tconst body = res.options?.body\n\t\t\t\t\t? res.options.body.parse(internalCtx.body)\n\t\t\t\t\t: undefined;\n\t\t\t\tif (res) {\n\t\t\t\t\tinternalCtx = {\n\t\t\t\t\t\t...internalCtx,\n\t\t\t\t\t\tbody: body\n\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t...body,\n\t\t\t\t\t\t\t\t\t...internalCtx.body,\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t: internalCtx.body,\n\t\t\t\t\t\tcontext: {\n\t\t\t\t\t\t\t...(internalCtx.context || {}),\n\t\t\t\t\t\t\t...res,\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\ttry {\n\t\t\tconst body = options.body ? options.body.parse(internalCtx.body) : internalCtx.body;\n\t\t\tinternalCtx = {\n\t\t\t\t...internalCtx,\n\t\t\t\tbody: body\n\t\t\t\t\t? {\n\t\t\t\t\t\t\t...body,\n\t\t\t\t\t\t\t...internalCtx.body,\n\t\t\t\t\t\t}\n\t\t\t\t\t: internalCtx.body,\n\t\t\t};\n\t\t\tinternalCtx.query = options.query\n\t\t\t\t? options.query.parse(internalCtx.query)\n\t\t\t\t: internalCtx.query;\n\t\t\tinternalCtx.params = options.params\n\t\t\t\t? options.params.parse(internalCtx.params)\n\t\t\t\t: internalCtx.params;\n\t\t} catch (e) {\n\t\t\tif (e instanceof ZodError) {\n\t\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\t\tmessage: e.message,\n\t\t\t\t\tdetails: e.errors,\n\t\t\t\t});\n\t\t\t}\n\t\t\tthrow e;\n\t\t}\n\t\tif (options.requireHeaders && !internalCtx.headers) {\n\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\tmessage: \"Headers are required\",\n\t\t\t});\n\t\t}\n\t\tif (options.requireRequest && !internalCtx.request) {\n\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\tmessage: \"Request is required\",\n\t\t\t});\n\t\t}\n\t\t//@ts-expect-error\n\t\tconst res = await handler(internalCtx);\n\t\treturn res as ReturnType<Handler<Path, Opts, R>>;\n\t};\n\thandle.path = path;\n\thandle.options = options;\n\thandle.method = options.method;\n\thandle.headers = responseHeader;\n\treturn handle;\n}\n","import { z } from \"zod\";\nimport type {\n\tContextTools,\n\tEndpoint,\n\tEndpointOptions,\n\tEndpointResponse,\n\tHandler,\n\tInferBody,\n\tInferHeaders,\n\tInferRequest,\n\tPrettify,\n} from \"./types\";\nimport { createEndpoint } from \"./endpoint\";\n\nexport type MiddlewareHandler<\n\tOpts extends EndpointOptions,\n\tR extends EndpointResponse,\n\tExtra extends Record<string, any> = {},\n> = (\n\tctx: Prettify<\n\t\tInferBody<Opts> &\n\t\t\tInferRequest<Opts> &\n\t\t\tInferHeaders<Opts> & {\n\t\t\t\tparams?: Record<string, string>;\n\t\t\t\tquery?: Record<string, string>;\n\t\t\t} & ContextTools\n\t> &\n\t\tExtra,\n) => Promise<R>;\n\nexport function createMiddleware<Opts extends EndpointOptions, R extends EndpointResponse>(\n\toptionsOrHandler: MiddlewareHandler<Opts, R>,\n): Endpoint<Handler<string, Opts, R>, Opts>;\nexport function createMiddleware<\n\tOpts extends Omit<EndpointOptions, \"method\">,\n\tR extends EndpointResponse,\n>(\n\toptionsOrHandler: Opts,\n\thandler: MiddlewareHandler<\n\t\tOpts & {\n\t\t\tmethod: \"*\";\n\t\t},\n\t\tR\n\t>,\n): Endpoint<\n\tHandler<\n\t\tstring,\n\t\tOpts & {\n\t\t\tmethod: \"*\";\n\t\t},\n\t\tR\n\t>,\n\tOpts & {\n\t\tmethod: \"*\";\n\t}\n>;\nexport function createMiddleware(optionsOrHandler: any, handler?: any) {\n\tif (typeof optionsOrHandler === \"function\") {\n\t\treturn createEndpoint(\n\t\t\t\"*\",\n\t\t\t{\n\t\t\t\tmethod: \"*\",\n\t\t\t},\n\t\t\toptionsOrHandler,\n\t\t);\n\t}\n\tif (!handler) {\n\t\tthrow new Error(\"Middleware handler is required\");\n\t}\n\tconst endpoint = createEndpoint(\n\t\t\"*\",\n\t\t{\n\t\t\t...optionsOrHandler,\n\t\t\tmethod: \"*\",\n\t\t},\n\t\thandler,\n\t);\n\treturn endpoint as any;\n}\n\nexport const createMiddlewareCreator = <ExtraContext extends Record<string, any> = {}>() => {\n\tfunction fn<Opts extends EndpointOptions, R extends EndpointResponse>(\n\t\toptionsOrHandler: MiddlewareHandler<Opts, R, ExtraContext>,\n\t): Endpoint<Handler<string, Opts, R>, Opts>;\n\tfunction fn<Opts extends Omit<EndpointOptions, \"method\">, R extends EndpointResponse>(\n\t\toptionsOrHandler: Opts,\n\t\thandler: MiddlewareHandler<\n\t\t\tOpts & {\n\t\t\t\tmethod: \"*\";\n\t\t\t},\n\t\t\tR,\n\t\t\tExtraContext\n\t\t>,\n\t): Endpoint<\n\t\tHandler<\n\t\t\tstring,\n\t\t\tOpts & {\n\t\t\t\tmethod: \"*\";\n\t\t\t},\n\t\t\tR\n\t\t>,\n\t\tOpts & {\n\t\t\tmethod: \"*\";\n\t\t}\n\t>;\n\tfunction fn(optionsOrHandler: any, handler?: any) {\n\t\tif (typeof optionsOrHandler === \"function\") {\n\t\t\treturn createEndpoint(\n\t\t\t\t\"*\",\n\t\t\t\t{\n\t\t\t\t\tmethod: \"*\",\n\t\t\t\t},\n\t\t\t\toptionsOrHandler,\n\t\t\t);\n\t\t}\n\t\tif (!handler) {\n\t\t\tthrow new Error(\"Middleware handler is required\");\n\t\t}\n\t\tconst endpoint = createEndpoint(\n\t\t\t\"*\",\n\t\t\t{\n\t\t\t\t...optionsOrHandler,\n\t\t\t\tmethod: \"*\",\n\t\t\t},\n\t\t\thandler,\n\t\t);\n\t\treturn endpoint as any;\n\t}\n\treturn fn;\n};\n\nexport type Middleware<\n\tOpts extends EndpointOptions = EndpointOptions,\n\tR extends EndpointResponse = EndpointResponse,\n> = (\n\topts: Opts,\n\thandler: (ctx: {\n\t\tbody?: InferBody<Opts>;\n\t\tparams?: Record<string, string>;\n\t\tquery?: Record<string, string>;\n\t}) => Promise<R>,\n) => Endpoint;\n","import type { statusCode } from \"./utils\";\n\ntype Status = keyof typeof statusCode;\n\nexport class APIError extends Error {\n\tstatus: Status;\n\tbody: Record<string, any>;\n\tconstructor(status: Status, body?: Record<string, any>) {\n\t\tsuper(`API Error: ${status} ${body?.message ?? \"\"}`, {\n\t\t\tcause: body,\n\t\t});\n\t\tthis.status = status;\n\t\tthis.body = body ?? {};\n\t\tthis.stack = \"\";\n\t\tthis.name = \"BetterCallAPIError\";\n\t}\n}\n","//https://github.com/honojs/hono/blob/main/src/utils/cookie.ts\n\nexport type Cookie = Record<string, string>;\nexport type SignedCookie = Record<string, string | false>;\n\ntype PartitionCookieConstraint =\n\t| { partition: true; secure: true }\n\t| { partition?: boolean; secure?: boolean }; // reset to default\ntype SecureCookieConstraint = { secure: true };\ntype HostCookieConstraint = { secure: true; path: \"/\"; domain?: undefined };\n\nexport type CookieOptions = {\n\tdomain?: string;\n\texpires?: Date;\n\thttpOnly?: boolean;\n\tmaxAge?: number;\n\tpath?: string;\n\tsecure?: boolean;\n\tsigningSecret?: string;\n\tsameSite?: \"Strict\" | \"Lax\" | \"None\" | \"strict\" | \"lax\" | \"none\";\n\tpartitioned?: boolean;\n\tprefix?: CookiePrefixOptions;\n} & PartitionCookieConstraint;\nexport type CookiePrefixOptions = \"host\" | \"secure\";\n\nexport type CookieConstraint<Name> = Name extends `__Secure-${string}`\n\t? CookieOptions & SecureCookieConstraint\n\t: Name extends `__Host-${string}`\n\t\t? CookieOptions & HostCookieConstraint\n\t\t: CookieOptions;\n\nconst algorithm = { name: \"HMAC\", hash: \"SHA-256\" };\n\nconst getCryptoKey = async (secret: string | BufferSource): Promise<CryptoKey> => {\n\tconst secretBuf = typeof secret === \"string\" ? new TextEncoder().encode(secret) : secret;\n\treturn await crypto.subtle.importKey(\"raw\", secretBuf, algorithm, false, [\"sign\", \"verify\"]);\n};\n\nconst makeSignature = async (value: string, secret: string | BufferSource): Promise<string> => {\n\tconst key = await getCryptoKey(secret);\n\tconst signature = await crypto.subtle.sign(\n\t\talgorithm.name,\n\t\tkey,\n\t\tnew TextEncoder().encode(value),\n\t);\n\t// the returned base64 encoded signature will always be 44 characters long and end with one or two equal signs\n\treturn btoa(String.fromCharCode(...new Uint8Array(signature)));\n};\n\nconst verifySignature = async (\n\tbase64Signature: string,\n\tvalue: string,\n\tsecret: CryptoKey,\n): Promise<boolean> => {\n\ttry {\n\t\tconst signatureBinStr = atob(base64Signature);\n\t\tconst signature = new Uint8Array(signatureBinStr.length);\n\t\tfor (let i = 0, len = signatureBinStr.length; i < len; i++) {\n\t\t\tsignature[i] = signatureBinStr.charCodeAt(i);\n\t\t}\n\t\treturn await crypto.subtle.verify(\n\t\t\talgorithm,\n\t\t\tsecret,\n\t\t\tsignature,\n\t\t\tnew TextEncoder().encode(value),\n\t\t);\n\t} catch (e) {\n\t\treturn false;\n\t}\n};\n\n// all alphanumeric chars and all of _!#$%&'*.^`|~+-\n// (see: https://datatracker.ietf.org/doc/html/rfc6265#section-4.1.1)\nconst validCookieNameRegEx = /^[\\w!#$%&'*.^`|~+-]+$/;\n\n// all ASCII chars 32-126 except 34, 59, and 92 (i.e. space to tilde but not double quote, semicolon, or backslash)\n// (see: https://datatracker.ietf.org/doc/html/rfc6265#section-4.1.1)\n//\n// note: the spec also prohibits comma and space, but we allow both since they are very common in the real world\n// (see: https://github.com/golang/go/issues/7243)\nconst validCookieValueRegEx = /^[ !#-:<-[\\]-~]*$/;\n\nexport const parse = (cookie: string, name?: string): Cookie => {\n\tconst pairs = cookie.trim().split(\";\");\n\treturn pairs.reduce((parsedCookie, pairStr) => {\n\t\tpairStr = pairStr.trim();\n\t\tconst valueStartPos = pairStr.indexOf(\"=\");\n\t\tif (valueStartPos === -1) {\n\t\t\treturn parsedCookie;\n\t\t}\n\n\t\tconst cookieName = pairStr.substring(0, valueStartPos).trim();\n\t\tif ((name && name !== cookieName) || !validCookieNameRegEx.test(cookieName)) {\n\t\t\treturn parsedCookie;\n\t\t}\n\n\t\tlet cookieValue = pairStr.substring(valueStartPos + 1).trim();\n\t\tif (cookieValue.startsWith('\"') && cookieValue.endsWith('\"')) {\n\t\t\tcookieValue = cookieValue.slice(1, -1);\n\t\t}\n\t\tif (validCookieValueRegEx.test(cookieValue)) {\n\t\t\tparsedCookie[cookieName] = decodeURIComponent(cookieValue);\n\t\t}\n\n\t\treturn parsedCookie;\n\t}, {} as Cookie);\n};\n\nexport const parseSigned = async (\n\tcookie: string,\n\tsecret: string | BufferSource,\n\tname?: string,\n): Promise<SignedCookie> => {\n\tconst parsedCookie: SignedCookie = {};\n\tconst secretKey = await getCryptoKey(secret);\n\n\tfor (const [key, value] of Object.entries(parse(cookie, name))) {\n\t\tconst signatureStartPos = value.lastIndexOf(\".\");\n\t\tif (signatureStartPos < 1) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst signedValue = value.substring(0, signatureStartPos);\n\t\tconst signature = value.substring(signatureStartPos + 1);\n\t\tif (signature.length !== 44 || !signature.endsWith(\"=\")) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst isVerified = await verifySignature(signature, signedValue, secretKey);\n\t\tparsedCookie[key] = isVerified ? signedValue : false;\n\t}\n\n\treturn parsedCookie;\n};\n\nconst _serialize = (name: string, value: string, opt: CookieOptions = {}): string => {\n\tlet cookie = `${name}=${value}`;\n\n\tif (name.startsWith(\"__Secure-\") && !opt.secure) {\n\t\t// https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis-13#section-4.1.3.1\n\t\tthrow new Error(\"__Secure- Cookie must have Secure attributes\");\n\t}\n\n\tif (name.startsWith(\"__Host-\")) {\n\t\t// https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis-13#section-4.1.3.2\n\t\tif (!opt.secure) {\n\t\t\tthrow new Error(\"__Host- Cookie must have Secure attributes\");\n\t\t}\n\n\t\tif (opt.path !== \"/\") {\n\t\t\tthrow new Error('__Host- Cookie must have Path attributes with \"/\"');\n\t\t}\n\n\t\tif (opt.domain) {\n\t\t\tthrow new Error(\"__Host- Cookie must not have Domain attributes\");\n\t\t}\n\t}\n\n\tif (opt && typeof opt.maxAge === \"number\" && opt.maxAge >= 0) {\n\t\tif (opt.maxAge > 34560000) {\n\t\t\t// https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis-13#section-4.1.2.2\n\t\t\tthrow new Error(\n\t\t\t\t\"Cookies Max-Age SHOULD NOT be greater than 400 days (34560000 seconds) in duration.\",\n\t\t\t);\n\t\t}\n\t\tcookie += `; Max-Age=${Math.floor(opt.maxAge)}`;\n\t}\n\n\tif (opt.domain && opt.prefix !== \"host\") {\n\t\tcookie += `; Domain=${opt.domain}`;\n\t}\n\n\tif (opt.path) {\n\t\tcookie += `; Path=${opt.path}`;\n\t}\n\n\tif (opt.expires) {\n\t\tif (opt.expires.getTime() - Date.now() > 34560000_000) {\n\t\t\t// https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis-13#section-4.1.2.1\n\t\t\tthrow new Error(\n\t\t\t\t\"Cookies Expires SHOULD NOT be greater than 400 days (34560000 seconds) in the future.\",\n\t\t\t);\n\t\t}\n\t\tcookie += `; Expires=${opt.expires.toUTCString()}`;\n\t}\n\n\tif (opt.httpOnly) {\n\t\tcookie += \"; HttpOnly\";\n\t}\n\n\tif (opt.secure) {\n\t\tcookie += \"; Secure\";\n\t}\n\n\tif (opt.sameSite) {\n\t\tcookie += `; SameSite=${opt.sameSite.charAt(0).toUpperCase() + opt.sameSite.slice(1)}`;\n\t}\n\n\tif (opt.partitioned) {\n\t\t// FIXME: replace link to RFC\n\t\t// https://www.ietf.org/archive/id/draft-cutler-httpbis-partitioned-cookies-01.html#section-2.3\n\t\tif (!opt.secure) {\n\t\t\tthrow new Error(\"Partitioned Cookie must have Secure attributes\");\n\t\t}\n\t\tcookie += \"; Partitioned\";\n\t}\n\n\treturn cookie;\n};\n\nexport const serialize = <Name extends string>(\n\tname: Name,\n\tvalue: string,\n\topt?: CookieConstraint<Name>,\n): string => {\n\tvalue = encodeURIComponent(value);\n\treturn _serialize(name, value, opt);\n};\n\nexport const serializeSigned = async (\n\tname: string,\n\tvalue: string,\n\tsecret: string | BufferSource,\n\topt: CookieOptions = {},\n): Promise<string> => {\n\tconst signature = await makeSignature(value, secret);\n\tvalue = `${value}.${signature}`;\n\tvalue = encodeURIComponent(value);\n\treturn _serialize(name, value, opt);\n};\n","//https://github.com/honojs/hono/blob/main/src/helper/cookie/index.ts\n\nimport {\n\tparse,\n\tparseSigned,\n\tserialize,\n\tserializeSigned,\n\ttype CookieOptions,\n\ttype CookiePrefixOptions,\n} from \"./cookie\";\n\nexport const getCookie = (cookie?: string, key?: string, prefix?: CookiePrefixOptions) => {\n\tif (!cookie) {\n\t\treturn undefined;\n\t}\n\tlet finalKey = key;\n\tif (prefix === \"secure\") {\n\t\tfinalKey = \"__Secure-\" + key;\n\t} else if (prefix === \"host\") {\n\t\tfinalKey = \"__Host-\" + key;\n\t} else {\n\t\treturn undefined;\n\t}\n\tconst obj = parse(cookie, finalKey);\n\treturn obj[finalKey];\n};\n\nexport const setCookie = (\n\theader: Headers,\n\tname: string,\n\tvalue: string,\n\topt?: CookieOptions,\n): void => {\n\t// Cookie names prefixed with __Secure- can be used only if they are set with the secure attribute.\n\t// Cookie names prefixed with __Host- can be used only if they are set with the secure attribute, must have a path of / (meaning any path at the host)\n\t// and must not have a Domain attribute.\n\t// Read more at https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie#cookie_prefixes'\n\tlet cookie;\n\tif (opt?.prefix === \"secure\") {\n\t\tcookie = serialize(\"__Secure-\" + name, value, { path: \"/\", ...opt, secure: true });\n\t} else if (opt?.prefix === \"host\") {\n\t\tcookie = serialize(\"__Host-\" + name, value, {\n\t\t\t...opt,\n\t\t\tpath: \"/\",\n\t\t\tsecure: true,\n\t\t\tdomain: undefined,\n\t\t});\n\t} else {\n\t\tcookie = serialize(name, value, { path: \"/\", ...opt });\n\t}\n\theader.append(\"Set-Cookie\", cookie);\n};\n\nexport const setSignedCookie = async (\n\theader: Headers,\n\tname: string,\n\tvalue: string,\n\tsecret: string | BufferSource,\n\topt?: CookieOptions,\n): Promise<void> => {\n\tlet cookie;\n\tif (opt?.prefix === \"secure\") {\n\t\tcookie = await serializeSigned(\"__Secure-\" + name, value, secret, {\n\t\t\tpath: \"/\",\n\t\t\t...opt,\n\t\t\tsecure: true,\n\t\t});\n\t} else if (opt?.prefix === \"host\") {\n\t\tcookie = await serializeSigned(\"__Host-\" + name, value, secret, {\n\t\t\t...opt,\n\t\t\tpath: \"/\",\n\t\t\tsecure: true,\n\t\t\tdomain: undefined,\n\t\t});\n\t} else {\n\t\tcookie = await serializeSigned(name, value, secret, { path: \"/\", ...opt });\n\t}\n\theader.append(\"Set-Cookie\", cookie);\n};\n\nexport const getSignedCookie = async (\n\theader: Headers,\n\tsecret: string,\n\tkey: string,\n\tprefix?: CookiePrefixOptions,\n) => {\n\tconst cookie = header.get(\"Cookie\");\n\tif (!cookie) {\n\t\treturn undefined;\n\t}\n\tlet finalKey = key;\n\tif (prefix === \"secure\") {\n\t\tfinalKey = \"__Secure-\" + key;\n\t} else if (prefix === \"host\") {\n\t\tfinalKey = \"__Host-\" + key;\n\t}\n\tconst obj = await parseSigned(cookie, secret, finalKey);\n\treturn obj[finalKey];\n};\n","import { createRouter as createRou3Router, addRoute, findRoute } from \"rou3\";\nimport { getBody, shouldSerialize, statusCode } from \"./utils\";\nimport { APIError } from \"./error\";\nimport type { Middleware, MiddlewareHandler } from \"./middleware\";\nimport type { Endpoint, Method } from \"./types\";\n\ninterface RouterConfig {\n\t/**\n\t * Throw error if error occurred other than APIError\n\t */\n\tthrowError?: boolean;\n\t/**\n\t * Handle error\n\t */\n\tonError?: (e: unknown) => void | Promise<void> | Response | Promise<Response>;\n\t/**\n\t * Base path for the router\n\t */\n\tbasePath?: string;\n\t/**\n\t * Middlewares for the router\n\t */\n\trouterMiddleware?: {\n\t\tpath: string;\n\t\tmiddleware: Endpoint;\n\t}[];\n\textraContext?: Record<string, any>;\n}\n\nexport const createRouter = <E extends Record<string, Endpoint>, Config extends RouterConfig>(\n\tendpoints: E,\n\tconfig?: Config,\n) => {\n\tconst _endpoints = Object.values(endpoints);\n\tconst router = createRou3Router();\n\tfor (const endpoint of _endpoints) {\n\t\tif (Array.isArray(endpoint.options?.method)) {\n\t\t\tfor (const method of endpoint.options.method) {\n\t\t\t\taddRoute(router, method, endpoint.path, endpoint);\n\t\t\t}\n\t\t} else {\n\t\t\taddRoute(router, endpoint.options.method, endpoint.path, endpoint);\n\t\t}\n\t}\n\n\tconst middlewareRouter = createRou3Router();\n\tfor (const route of config?.routerMiddleware || []) {\n\t\taddRoute(middlewareRouter, \"*\", route.path, route.middleware);\n\t}\n\n\tconst handler = async (request: Request) => {\n\t\tconst url = new URL(request.url);\n\t\tlet path = url.pathname;\n\t\tif (config?.basePath) {\n\t\t\tpath = path.split(config.basePath)[1];\n\t\t}\n\t\tconst method = request.method;\n\t\tconst route = findRoute(router, method, path);\n\t\tconst handler = route?.data as Endpoint;\n\t\tconst body = await getBody(request);\n\t\tconst headers = request.headers;\n\t\tconst query = Object.fromEntries(url.searchParams);\n\t\tconst middleware = findRoute(middlewareRouter, \"*\", path)?.data as Endpoint | undefined;\n\t\t//handler 404\n\t\tif (!handler) {\n\t\t\treturn new Response(null, {\n\t\t\t\tstatus: 404,\n\t\t\t\tstatusText: \"Not Found\",\n\t\t\t});\n\t\t}\n\t\ttry {\n\t\t\tlet middlewareContext: Record<string, any> = {};\n\t\t\tif (middleware) {\n\t\t\t\tconst res = await middleware({\n\t\t\t\t\tpath: path,\n\t\t\t\t\tmethod: method as \"GET\",\n\t\t\t\t\theaders,\n\t\t\t\t\tparams: route?.params as any,\n\t\t\t\t\trequest: request,\n\t\t\t\t\tbody: body,\n\t\t\t\t\tquery,\n\t\t\t\t\t...config?.extraContext,\n\t\t\t\t});\n\t\t\t\tif (res) {\n\t\t\t\t\tmiddlewareContext = {\n\t\t\t\t\t\t...res,\n\t\t\t\t\t\t...middlewareContext,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst handlerRes = await handler({\n\t\t\t\tpath: path,\n\t\t\t\tmethod: method as \"GET\",\n\t\t\t\theaders,\n\t\t\t\tparams: route?.params as any,\n\t\t\t\trequest: request,\n\t\t\t\tbody: body,\n\t\t\t\tquery,\n\t\t\t\t...middlewareContext,\n\t\t\t\t...config?.extraContext,\n\t\t\t});\n\t\t\tif (handlerRes instanceof Response) {\n\t\t\t\treturn handlerRes;\n\t\t\t}\n\t\t\tconst resBody = shouldSerialize(handlerRes) ? JSON.stringify(handlerRes) : handlerRes;\n\t\t\treturn new Response(resBody as any, {\n\t\t\t\theaders: handler.headers,\n\t\t\t});\n\t\t} catch (e) {\n\t\t\tif (config?.onError) {\n\t\t\t\tconst onErrorRes = await config.onError(e);\n\t\t\t\tif (onErrorRes instanceof Response) {\n\t\t\t\t\treturn onErrorRes;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (e instanceof APIError) {\n\t\t\t\treturn new Response(e.body ? JSON.stringify(e.body) : null, {\n\t\t\t\t\tstatus: statusCode[e.status],\n\t\t\t\t\tstatusText: e.status,\n\t\t\t\t\theaders: handler.headers,\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (config?.throwError) {\n\t\t\t\tthrow e;\n\t\t\t}\n\t\t\treturn new Response(null, {\n\t\t\t\tstatus: 500,\n\t\t\t\tstatusText: \"Internal Server Error\",\n\t\t\t});\n\t\t}\n\t};\n\treturn {\n\t\thandler,\n\t\tendpoints,\n\t};\n};\n\nexport type Router = ReturnType<typeof createRouter>;\n","export async function getBody(request: Request) {\n\tconst contentType = request.headers.get(\"content-type\") || \"\";\n\n\tif (!request.body) {\n\t\treturn undefined;\n\t}\n\n\tif (contentType.includes(\"application/json\")) {\n\t\treturn await request.json();\n\t}\n\n\tif (contentType.includes(\"application/x-www-form-urlencoded\")) {\n\t\tconst formData = await request.formData();\n\t\tconst result: Record<string, string> = {};\n\t\tformData.forEach((value, key) => {\n\t\t\tresult[key] = value.toString();\n\t\t});\n\t\treturn result;\n\t}\n\n\tif (contentType.includes(\"multipart/form-data\")) {\n\t\tconst formData = await request.formData();\n\t\tconst result: Record<string, any> = {};\n\t\tformData.forEach((value, key) => {\n\t\t\tresult[key] = value;\n\t\t});\n\t\treturn result;\n\t}\n\n\tif (contentType.includes(\"text/plain\")) {\n\t\treturn await request.text();\n\t}\n\n\tif (contentType.includes(\"application/octet-stream\")) {\n\t\treturn await request.arrayBuffer();\n\t}\n\n\tif (\n\t\tcontentType.includes(\"application/pdf\") ||\n\t\tcontentType.includes(\"image/\") ||\n\t\tcontentType.includes(\"video/\")\n\t) {\n\t\tconst blob = await request.blob();\n\t\treturn blob;\n\t}\n\n\tif (contentType.includes(\"application/stream\") || request.body instanceof ReadableStream) {\n\t\treturn request.body;\n\t}\n\n\treturn await request.text();\n}\n\nexport function shouldSerialize(body: any) {\n\treturn (\n\t\ttypeof body === \"object\" &&\n\t\tbody !== null &&\n\t\t!(body instanceof Blob) &&\n\t\t!(body instanceof FormData)\n\t);\n}\n\nexport const statusCode = {\n\tOK: 200,\n\tCREATED: 201,\n\tACCEPTED: 202,\n\tNO_CONTENT: 204,\n\tMULTIPLE_CHOICES: 300,\n\tMOVED_PERMANENTLY: 301,\n\tFOUND: 302,\n\tSEE_OTHER: 303,\n\tNOT_MODIFIED: 304,\n\tTEMPORARY_REDIRECT: 307,\n\tBAD_REQUEST: 400,\n\tUNAUTHORIZED: 401,\n\tPAYMENT_REQUIRED: 402,\n\tFORBIDDEN: 403,\n\tNOT_FOUND: 404,\n\tMETHOD_NOT_ALLOWED: 405,\n\tNOT_ACCEPTABLE: 406,\n\tPROXY_AUTHENTICATION_REQUIRED: 407,\n\tREQUEST_TIMEOUT: 408,\n\tCONFLICT: 409,\n\tGONE: 410,\n\tLENGTH_REQUIRED: 411,\n\tPRECONDITION_FAILED: 412,\n\tPAYLOAD_TOO_LARGE: 413,\n\tURI_TOO_LONG: 414,\n\tUNSUPPORTED_MEDIA_TYPE: 415,\n\tRANGE_NOT_SATISFIABLE: 416,\n\tEXPECTATION_FAILED: 417,\n\t\"I'M_A_TEAPOT\": 418,\n\tMISDIRECTED_REQUEST: 421,\n\tUNPROCESSABLE_ENTITY: 422,\n\tLOCKED: 423,\n\tFAILED_DEPENDENCY: 424,\n\tTOO_EARLY: 425,\n\tUPGRADE_REQUIRED: 426,\n\tPRECONDITION_REQUIRED: 428,\n\tTOO_MANY_REQUESTS: 429,\n\tREQUEST_HEADER_FIELDS_TOO_LARGE: 431,\n\tUNAVAILABLE_FOR_LEGAL_REASONS: 451,\n\tINTERNAL_SERVER_ERROR: 500,\n\tNOT_IMPLEMENTED: 501,\n\tBAD_GATEWAY: 502,\n\tSERVICE_UNAVAILABLE: 503,\n\tGATEWAY_TIMEOUT: 504,\n\tHTTP_VERSION_NOT_SUPPORTED: 505,\n\tVARIANT_ALSO_NEGOTIATES: 506,\n\tINSUFFICIENT_STORAGE: 507,\n\tLOOP_DETECTED: 508,\n\tNOT_EXTENDED: 510,\n\tNETWORK_AUTHENTICATION_REQUIRED: 511,\n};\n","import { z, type ZodOptional, type ZodSchema } from \"zod\";\nimport type { Middleware } from \"./middleware\";\nimport type { UnionToIntersection } from \"./helper\";\nimport type { CookiePrefixOptions } from \"./cookie\";\n\nexport interface EndpointOptions {\n\tmethod: Method | Method[];\n\tbody?: ZodSchema;\n\tquery?: ZodSchema;\n\tparams?: ZodSchema<any>;\n\t/**\n\t * If true headers will be required to be passed in the context\n\t */\n\trequireHeaders?: boolean;\n\t/**\n\t * If true request object will be required\n\t */\n\trequireRequest?: boolean;\n\t/**\n\t * List of endpoints that will be called before this endpoint\n\t */\n\tuse?: Endpoint[];\n}\n\nexport type Endpoint<\n\tHandler extends (ctx: any) => Promise<any> = (ctx: any) => Promise<any>,\n\tOption extends EndpointOptions = EndpointOptions,\n> = {\n\tpath: string;\n\toptions: Option;\n\theaders?: Headers;\n} & Handler;\n\nexport type InferParamPath<Path> = Path extends `${infer _Start}:${infer Param}/${infer Rest}`\n\t? { [K in Param | keyof InferParamPath<Rest>]: string }\n\t: Path extends `${infer _Start}:${infer Param}`\n\t\t? { [K in Param]: string }\n\t\t: Path extends `${infer _Start}/${infer Rest}`\n\t\t\t? InferParamPath<Rest>\n\t\t\t: undefined;\n\nexport type InferParamWildCard<Path> = Path extends\n\t| `${infer _Start}/*:${infer Param}/${infer Rest}`\n\t| `${infer _Start}/**:${infer Param}/${infer Rest}`\n\t? { [K in Param | keyof InferParamPath<Rest>]: string }\n\t: Path extends `${infer _Start}/*`\n\t\t? { [K in \"_\"]: string }\n\t\t: Path extends `${infer _Start}/${infer Rest}`\n\t\t\t? InferParamPath<Rest>\n\t\t\t: undefined;\n\nexport type Prettify<T> = {\n\t[key in keyof T]: T[key];\n} & {};\n\nexport interface CookieOptions {\n\t/**\n\t * Max age in seconds\n\t */\n\tmaxAge?: number;\n\t/**\n\t * Domain\n\t */\n\tdomain?: string;\n\t/**\n\t * Path\n\t */\n\tpath?: string;\n\t/**\n\t * Secure\n\t */\n\tsecure?: boolean;\n\t/**\n\t * HttpOnly\n\t */\n\thttpOnly?: boolean;\n\n\t/**\n\t * SameSite\n\t */\n\tsameSite?: \"strict\" | \"lax\" | \"none\";\n\t/**\n\t * Expires\n\t */\n\texpires?: Date;\n}\n\nexport type ContextTools = {\n\t/**\n\t * Set header\n\t *\n\t * If it's called outside of a request it will just be ignored.\n\t */\n\tsetHeader: (key: string, value: string) => void;\n\t/**\n\t * cookie setter.\n\t *\n\t * If it's called outside of a request it will just be ignored.\n\t */\n\tsetCookie: (key: string, value: string, options?: CookieOptions) => void;\n\t/**\n\t * Get cookie value\n\t *\n\t * If it's called outside of a request it will just be ignored.\n\t */\n\tgetCookie: (key: string, value: string, options?: CookieOptions) => string | undefined;\n\t/**\n\t * Set signed cookie\n\t */\n\tsetSignedCookie: (\n\t\tkey: string,\n\t\tvalue: string,\n\t\tsecret: string | BufferSource,\n\t\toptions?: CookieOptions,\n\t) => Promise<void>;\n\t/**\n\t * Get signed cookie value\n\t */\n\n\tgetSignedCookie: (\n\t\tkey: string,\n\t\tsecret: string,\n\t\tprefix?: CookiePrefixOptions,\n\t) => Promise<string | undefined>;\n};\n\nexport type Context<Path extends string, Opts extends EndpointOptions> = InferBody<Opts> &\n\tInferParam<Path> &\n\tInferMethod<Opts[\"method\"]> &\n\tInferHeaders<Opts> &\n\tInferRequest<Opts> &\n\tInferQuery<Opts[\"query\"]>;\n\nexport type InferUse<Opts extends EndpointOptions> = Opts[\"use\"] extends Endpoint[]\n\t? {\n\t\t\tcontext: UnionToIntersection<Awaited<ReturnType<Opts[\"use\"][number]>>>;\n\t\t}\n\t: {};\n\nexport type InferUseOptions<Opts extends EndpointOptions> = Opts[\"use\"] extends Array<infer U>\n\t? UnionToIntersection<\n\t\t\tU extends Endpoint\n\t\t\t\t? U[\"options\"]\n\t\t\t\t: {\n\t\t\t\t\t\tbody?: {};\n\t\t\t\t\t\trequireRequest?: boolean;\n\t\t\t\t\t\trequireHeaders?: boolean;\n\t\t\t\t\t}\n\t\t>\n\t: {\n\t\t\tbody?: {};\n\t\t\trequireRequest?: boolean;\n\t\t\trequireHeaders?: boolean;\n\t\t};\n\nexport type InferMethod<M extends Method | Method[]> = M extends Array<Method>\n\t? {\n\t\t\tmethod: M[number];\n\t\t}\n\t: {\n\t\t\tmethod?: M;\n\t\t};\n\nexport type InferHeaders<\n\tOpt extends EndpointOptions,\n\tHeaderReq = Opt[\"requireHeaders\"],\n> = HeaderReq extends true\n\t? {\n\t\t\theaders: Headers;\n\t\t}\n\t: InferUseOptions<Opt>[\"requireHeaders\"] extends true\n\t\t? {\n\t\t\t\theaders: Headers;\n\t\t\t}\n\t\t: {\n\t\t\t\theaders?: Headers;\n\t\t\t};\n\nexport type InferRequest<\n\tOpt extends EndpointOptions,\n\tRequestReq = Opt[\"requireRequest\"],\n> = RequestReq extends true\n\t? {\n\t\t\trequest: Request;\n\t\t}\n\t: InferUseOptions<Opt>[\"requireRequest\"] extends true\n\t\t? {\n\t\t\t\trequest: Request;\n\t\t\t}\n\t\t: {\n\t\t\t\trequest?: Request;\n\t\t\t};\n\nexport type InferQuery<Query> = Query extends ZodSchema\n\t? Query extends ZodOptional<any>\n\t\t? {\n\t\t\t\tquery?: z.infer<Query>;\n\t\t\t}\n\t\t: {\n\t\t\t\tquery: z.infer<Query>;\n\t\t\t}\n\t: {\n\t\t\tquery?: undefined;\n\t\t};\n\nexport type InferParam<\n\tPath extends string,\n\tParamPath extends InferParamPath<Path> = InferParamPath<Path>,\n\tWildCard extends InferParamWildCard<Path> = InferParamWildCard<Path>,\n> = ParamPath extends undefined\n\t? WildCard extends undefined\n\t\t? {\n\t\t\t\tparams?: Record<string, string>;\n\t\t\t}\n\t\t: {\n\t\t\t\tparams: WildCard;\n\t\t\t}\n\t: {\n\t\t\tparams: Prettify<ParamPath & (WildCard extends undefined ? {} : WildCard)>;\n\t\t};\n\nexport type EndpointResponse = Record<string, any> | string | boolean | number | void | undefined;\n\nexport type Handler<\n\tPath extends string,\n\tOpts extends EndpointOptions,\n\tR extends EndpointResponse,\n\tExtra extends Record<string, any> = {},\n> = (ctx: Prettify<Context<Path, Opts> & InferUse<Opts> & ContextTools> & Extra) => Promise<R>;\n\nexport type Method = \"GET\" | \"POST\" | \"PUT\" | \"DELETE\" | \"PATCH\" | \"*\";\n\nexport type InferBody<\n\tOpts extends EndpointOptions,\n\tBody extends ZodSchema | undefined = Opts[\"body\"] &\n\t\t(undefined extends InferUseOptions<Opts>[\"body\"] ? {} : InferUseOptions<Opts>[\"body\"]),\n> = Body extends ZodSchema\n\t? Body extends ZodOptional<any>\n\t\t? {\n\t\t\t\tbody?: Prettify<z.infer<Body>>;\n\t\t\t}\n\t\t: {\n\t\t\t\tbody: Prettify<z.infer<Body>>;\n\t\t\t}\n\t: {\n\t\t\tbody?: undefined;\n\t\t};\n"],"mappings":"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","names":["ZodError","createMiddleware","optionsOrHandler","handler","createEndpoint","createMiddlewareCreator","fn","APIError","status","body","__publicField","algorithm","getCryptoKey","secret","secretBuf","makeSignature","value","key","signature","verifySignature","base64Signature","signatureBinStr","len","validCookieNameRegEx","validCookieValueRegEx","parse","cookie","name","parsedCookie","pairStr","valueStartPos","cookieName","cookieValue","parseSigned","secretKey","signatureStartPos","signedValue","isVerified","_serialize","opt","serialize","serializeSigned","getCookie","cookie","key","prefix","finalKey","parse","setCookie","header","name","value","opt","serialize","setSignedCookie","secret","serializeSigned","getSignedCookie","parseSigned","createEndpointCreator","path","options","handler","createEndpoint","responseHeader","handle","ctx","internalCtx","key","value","setCookie","prefix","header","getCookie","secret","getSignedCookie","setSignedCookie","middleware","res","body","e","ZodError","APIError","createRou3Router","addRoute","findRoute","getBody","request","contentType","formData","result","value","key","shouldSerialize","body","statusCode","createRouter","endpoints","config","_endpoints","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,6 +1,6 @@
|
|
|
1
1
|
import { ZodSchema, ZodOptional, z } from 'zod';
|
|
2
2
|
|
|
3
|
-
type UnionToIntersection<Union> = (Union extends unknown ? (distributedUnion: Union) => void : never) extends (
|
|
3
|
+
type UnionToIntersection<Union> = (Union extends unknown ? (distributedUnion: Union) => void : never) extends (mergedIntersection: infer Intersection) => void ? Intersection & Union : never;
|
|
4
4
|
type RequiredKeysOf<BaseType extends object> = Exclude<{
|
|
5
5
|
[Key in keyof BaseType]: BaseType extends Record<Key, BaseType[Key]> ? Key : never;
|
|
6
6
|
}[keyof BaseType], undefined>;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ZodSchema, ZodOptional, z } from 'zod';
|
|
2
2
|
|
|
3
|
-
type UnionToIntersection<Union> = (Union extends unknown ? (distributedUnion: Union) => void : never) extends (
|
|
3
|
+
type UnionToIntersection<Union> = (Union extends unknown ? (distributedUnion: Union) => void : never) extends (mergedIntersection: infer Intersection) => void ? Intersection & Union : never;
|
|
4
4
|
type RequiredKeysOf<BaseType extends object> = Exclude<{
|
|
5
5
|
[Key in keyof BaseType]: BaseType extends Record<Key, BaseType[Key]> ? Key : never;
|
|
6
6
|
}[keyof BaseType], undefined>;
|
package/package.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "better-call",
|
|
3
|
-
"version": "0.0.5-beta.
|
|
3
|
+
"version": "0.0.5-beta.21",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./dist/index.cjs",
|
|
6
6
|
"module": "./dist/index.js",
|
|
7
7
|
"types": "./dist/index.d.ts",
|
|
8
8
|
"scripts": {
|
|
9
|
-
"test": "vitest",
|
|
9
|
+
"test": "pnpm typecheck && vitest",
|
|
10
10
|
"typecheck": "tsc --noEmit",
|
|
11
11
|
"bump": "bumpp",
|
|
12
12
|
"build": "tsup"
|