@visulima/connect 2.1.14 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +24 -0
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2 -2
- package/dist/index.mjs.map +1 -1
- package/package.json +6 -6
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,27 @@
|
|
|
1
|
+
## @visulima/connect [3.0.0](https://github.com/visulima/visulima/compare/@visulima/connect@2.1.14...@visulima/connect@3.0.0) (2024-03-04)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### ⚠ BREAKING CHANGES
|
|
5
|
+
|
|
6
|
+
* upgraded regexparam to v3
|
|
7
|
+
|
|
8
|
+
Signed-off-by: prisis <d.bannert@anolilab.de>
|
|
9
|
+
|
|
10
|
+
### Features
|
|
11
|
+
|
|
12
|
+
* request.params.wild changed to request.params["*"] ([e683936](https://github.com/visulima/visulima/commit/e6839366660f51da095c598563d395967860c23e))
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
### Bug Fixes
|
|
16
|
+
|
|
17
|
+
* fixed all found type issues ([eaa40d1](https://github.com/visulima/visulima/commit/eaa40d11f3fc056dfddcc25404bf109587ef2862))
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
### Dependencies
|
|
22
|
+
|
|
23
|
+
* **@visulima/nextra-theme-docs:** upgraded to 4.0.15
|
|
24
|
+
|
|
1
25
|
## @visulima/connect [2.1.14](https://github.com/visulima/visulima/compare/@visulima/connect@2.1.13...@visulima/connect@2.1.14) (2024-02-26)
|
|
2
26
|
|
|
3
27
|
|
package/dist/index.js
CHANGED
|
@@ -8,7 +8,7 @@ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
|
8
8
|
|
|
9
9
|
var N__default = /*#__PURE__*/_interopDefault(N);
|
|
10
10
|
|
|
11
|
-
var S=o=>async(e,t,s)=>await new Promise((n,r)=>{o(e,t,d=>d?r(d):n());}).then(s),M=S;var g=(o,e)=>async(t,s,n)=>{let r=t;try{r=await o.parseAsync(t);}catch(d){let{message:a}=d;throw d instanceof zod.ZodError&&typeof d.format=="function"&&(a=d.issues.map(R=>`${R.path.join("/")} - ${R.message}`).join("/n")),N__default.default(422,a)}return e(r,s,n)},
|
|
11
|
+
var S=o=>async(e,t,s)=>await new Promise((n,r)=>{o(e,t,d=>d?r(d):n());}).then(s),M=S;var g=(o,e)=>async(t,s,n)=>{let r=t;try{r=await o.parseAsync(t);}catch(d){let{message:a}=d;throw d instanceof zod.ZodError&&typeof d.format=="function"&&(a=d.issues.map(R=>`${R.path.join("/")} - ${R.message}`).join("/n")),N__default.default(422,a)}return e(r,s,n)},c=g;var i=class o{constructor(e="/",t=[]){this.base=e;this.routes=t;}static async exec(e,...t){let s=0,n=()=>{let r=e[++s];return r===void 0?Promise.resolve():r(...t,n)};return e[s](...t,n)}add(e,t,...s){if(typeof t=="function"&&(s.unshift(t),t=""),t==="")this.routes.push({fns:s,isMiddleware:!1,matchAll:!0,method:e});else {let{keys:n,pattern:r}=regexparam.parse(t);this.routes.push({fns:s,isMiddleware:!1,keys:n,method:e,pattern:r});}return this}clone(e){return new o(e,[...this.routes])}find(e,t){let s=!0,n=[],r={},d=e==="HEAD";for(let a of this.routes){if(a.method!==e&&a.method!==""&&!(d&&a.method==="GET"))continue;let R=!1;if("matchAll"in a)R=!0;else if(a.keys===!1){let u=a.pattern.exec(t);if(u===null)continue;u.groups!==void 0&&Object.keys(u.groups).forEach(p=>{r[p]=u.groups[p];}),R=!0;}else if(a.keys.length>0){let u=a.pattern.exec(t);if(u===null)continue;for(let p=0;p<a.keys.length;){let h=a.keys[p];r[h]=u[++p];}R=!0;}else a.pattern.test(t)&&(R=!0);R&&(n.push(...a.fns.flatMap(u=>{if(u instanceof o){let{base:p}=u,h=t.slice(p.length);h.startsWith("/")||(h=`/${h}`);let f=u.find(e,h);return f.middleOnly||(s=!1),Object.assign(r,f.params),f.fns}return u})),a.isMiddleware||(s=!1));}return {fns:n,middleOnly:s,params:r}}use(e,...t){(typeof e=="function"||e instanceof o)&&(t.unshift(e),e="/"),t=t.map(r=>{if(r instanceof o){if(typeof e=="string")return r.clone(e);throw new Error("Mounting a router to RegExp base is not supported")}return r});let{keys:s,pattern:n}=regexparam.parse(e,!0);return this.routes.push({fns:t,isMiddleware:!0,keys:s,method:"",pattern:n}),this}};var C=async o=>new Response(o.method==="HEAD"?null:`Route ${o.method} ${o.url} not found`,{status:404}),k=async o=>(console.error(o),new Response("Internal Server Error",{status:500})),H=o=>(o.nextUrl??new URL(o.url)).pathname,x=class o{all=this.add.bind(this,"");connect=this.add.bind(this,"CONNECT");delete=this.add.bind(this,"DELETE");get=this.add.bind(this,"GET");head=this.add.bind(this,"HEAD");options=this.add.bind(this,"OPTIONS");patch=this.add.bind(this,"PATCH");post=this.add.bind(this,"POST");put=this.add.bind(this,"PUT");trace=this.add.bind(this,"TRACE");onError;onNoMatch;router=new i;constructor(e={}){this.onNoMatch=e.onNoMatch??C,this.onError=e.onError??k;}clone(){let e=new o({onError:this.onError,onNoMatch:this.onNoMatch});return e.router=this.router.clone(),e}handler(){let{routes:e}=this.router;return async(t,s)=>{let n=this.router.find(t.method,H(t));this.prepareRequest(t,n);try{return await(n.fns.length===0||n.middleOnly?this.onNoMatch(t,s,e):i.exec(n.fns,t,s))}catch(r){return await this.onError(r,t,s,e)}}}async run(e,t){let s=this.router.find(e.method,H(e));if(s.fns.length!==0)return this.prepareRequest(e,s),await i.exec(s.fns,e,t)}use(e,...t){return (typeof e=="function"||e instanceof o)&&(t.unshift(e),e="/"),this.router.use(e,...t.map(s=>s instanceof o?s.router:s)),this}add(e,t,s,...n){return typeof t=="string"&&typeof s=="function"?n=[s]:typeof s=="object"?typeof t=="function"?n=[c(s,t)]:n=n.map(r=>c(s,r)):typeof s=="function"&&(n=[s]),this.router.add(e,t,...n),this}prepareRequest(e,t){e.params={...t.params,...e.params};}},w=(o={})=>new x(o);var v=async(o,e)=>{e.statusCode=404,e.end(o.method==="HEAD"?void 0:`Route ${o.method} ${o.url} not found`);},L=async(o,e,t)=>{t.statusCode=500,console.error(o),t.end("Internal Server Error");},q=o=>{let e=o.indexOf("?");return e===-1?o:o.slice(0,Math.max(0,e))},m=class o{all=this.add.bind(this,"");connect=this.add.bind(this,"CONNECT");delete=this.add.bind(this,"DELETE");get=this.add.bind(this,"GET");head=this.add.bind(this,"HEAD");options=this.add.bind(this,"OPTIONS");patch=this.add.bind(this,"PATCH");post=this.add.bind(this,"POST");put=this.add.bind(this,"PUT");trace=this.add.bind(this,"TRACE");onError;onNoMatch;router=new i;constructor(e={}){this.onNoMatch=e.onNoMatch??v,this.onError=e.onError??L;}clone(){let e=new o({onError:this.onError,onNoMatch:this.onNoMatch});return e.router=this.router.clone(),e}handler(){let{routes:e}=this.router;return async(t,s)=>{let n=this.router.find(t.method,q(t.url));this.prepareRequest(t,n);try{await(n.fns.length===0||n.middleOnly?this.onNoMatch(t,s,e):i.exec(n.fns,t,s));}catch(r){await this.onError(r,t,s,e);}}}async run(e,t){let s=this.router.find(e.method,q(e.url));if(s.fns.length!==0)return this.prepareRequest(e,s),await i.exec(s.fns,e,t)}use(e,...t){return (typeof e=="function"||e instanceof o)&&(t.unshift(e),e="/"),this.router.use(e,...t.map(s=>s instanceof o?s.router:s)),this}add(e,t,s,...n){return typeof t=="string"&&typeof s=="function"?n=[s]:typeof s=="object"?typeof t=="function"?n=[c(s,t)]:n=n.map(r=>c(s,r)):typeof s=="function"&&(n=[s]),this.router.add(e,t,...n),this}prepareRequest(e,t){e.params={...t.params,...e.params};}},y=(o={})=>new m(o);var P=(o,e,t)=>{o.setHeader("content-type","application/json; charset=utf-8"),o.statusCode=e,o.end(JSON.stringify(t,null,2));},j=P;
|
|
12
12
|
|
|
13
13
|
exports.EdgeRouter = x;
|
|
14
14
|
exports.NodeRouter = m;
|
|
@@ -18,6 +18,6 @@ exports.createNodeRouter = y;
|
|
|
18
18
|
exports.createRouter = y;
|
|
19
19
|
exports.expressWrapper = M;
|
|
20
20
|
exports.sendJson = j;
|
|
21
|
-
exports.withZod =
|
|
21
|
+
exports.withZod = c;
|
|
22
22
|
//# sourceMappingURL=out.js.map
|
|
23
23
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/adapter/express.ts","../src/adapter/with-zod.ts","../src/router.ts","../src/edge.ts","../src/node.ts","../src/utils/send-json.ts"],"names":["expressWrapper","function_","request","response","next","resolve","reject","error","express_default","createHttpError","ZodError","withZod","schema","handler","transformedRequest","message","issue","with_zod_default","parse","Router","_Router","base","routes","fns","arguments_","index","method","route","keys","pattern","pathname","middleOnly","parameters","isHead","matched","matches","key","parameterKey","stripPathname","result","onNoMatch","onError","getPathname","EdgeRouter","_EdgeRouter","options","r","context_","routeOrFunction","zodOrRouteOrFunction","findResult","createEdgeRouter","_request","url","queryIndex","NodeRouter","_NodeRouter","createRouter","sendJson","statusCode","jsonBody","send_json_default"],"mappings":"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","sourcesContent":["import type { IncomingMessage, ServerResponse } from \"node:http\";\n\nimport type { RequestHandler } from \"../node\";\nimport type { Nextable } from \"../types\";\n\ntype NextFunction = (error?: any) => void;\n\nconst expressWrapper =\n <Request extends IncomingMessage, Response extends ServerResponse>(\n function_: ExpressRequestHandler<Request, Response>,\n ): Nextable<RequestHandler<Request, Response>> =>\n async (request, response, next) =>\n // eslint-disable-next-line compat/compat\n await new Promise<void>((resolve, reject): void => {\n function_(request, response, (error) => (error ? reject(error) : resolve()));\n // eslint-disable-next-line promise/no-callback-in-promise\n }).then<Nextable<RequestHandler<Request, Response>>>(next);\n\nexport type ExpressRequestHandler<Request, Response> = (request: Request, response: Response, next: NextFunction) => void;\n\nexport default expressWrapper;\n","import createHttpError from \"http-errors\";\nimport type { AnyZodObject, ZodObject } from \"zod\";\nimport { ZodError } from \"zod\";\n\nimport type { Nextable, NextHandler } from \"../types\";\n\nconst withZod =\n <Request, Response, Handler extends Nextable<any>, Schema extends ZodObject<{ body?: AnyZodObject; headers?: AnyZodObject; query?: AnyZodObject }>>(\n schema: Schema,\n handler: Handler,\n ): ((request: Request, response: Response, next: NextHandler) => Promise<Response>) =>\n async (request: Request, response: Response, next) => {\n let transformedRequest: Request = request;\n\n try {\n transformedRequest = (await schema.parseAsync(request)) as Request;\n } catch (error: any) {\n let { message } = error as Error;\n\n if (error instanceof ZodError && typeof error.format === \"function\") {\n message = error.issues.map((issue) => `${issue.path.join(\"/\")} - ${issue.message}`).join(\"/n\");\n }\n\n throw createHttpError(422, message);\n }\n\n return handler(transformedRequest, response, next);\n };\n\nexport default withZod;\n","/**\n * Agnostic router class\n * Adapted from lukeed/trouter library:\n * https://github.com/lukeed/trouter/blob/master/index.mjs\n */\nimport { parse } from \"regexparam\";\n\nimport type { FindResult, FunctionLike, HttpMethod, Nextable, RouteMatch } from \"./types\";\n\nexport type Route<H> = {\n fns: (H | Router<H extends FunctionLike ? H : never>)[];\n isMiddleware: boolean;\n method: HttpMethod | \"\";\n} & (\n | {\n keys: string[] | false;\n pattern: RegExp;\n }\n | { matchAll: true }\n);\n\nexport class Router<H extends FunctionLike> {\n public static async exec<FL extends FunctionLike>(fns: (Nextable<FL> | undefined)[], ...arguments_: Parameters<FL>): Promise<any> {\n let index = 0;\n\n const next = () => {\n // eslint-disable-next-line no-plusplus,@typescript-eslint/naming-convention,no-underscore-dangle\n const function_ = fns[++index];\n\n if (function_ === undefined) {\n return Promise.resolve();\n }\n\n return function_(...arguments_, next);\n };\n\n // eslint-disable-next-line security/detect-object-injection\n return (fns[index] as FunctionLike)(...arguments_, next);\n }\n\n public constructor(\n public base = \"/\",\n public routes: Route<Nextable<H>>[] = [],\n ) {}\n\n public add(method: HttpMethod | \"\", route: Nextable<H> | RouteMatch, ...fns: Nextable<H>[]): this {\n if (typeof route === \"function\") {\n fns.unshift(route);\n // eslint-disable-next-line no-param-reassign\n route = \"\";\n }\n\n if (route === \"\") {\n this.routes.push({\n fns,\n isMiddleware: false,\n matchAll: true,\n method,\n });\n } else {\n const { keys, pattern } = parse(route);\n\n this.routes.push({\n fns,\n isMiddleware: false,\n keys,\n method,\n pattern,\n });\n }\n\n return this;\n }\n\n public clone(base?: string): Router<H> {\n return new Router<H>(base, [...this.routes]);\n }\n\n public find(method: HttpMethod, pathname: string): FindResult<H> {\n let middleOnly = true;\n\n const fns: Nextable<H>[] = [];\n const parameters: Record<string, string> = {};\n const isHead = method === \"HEAD\";\n\n // eslint-disable-next-line sonarjs/cognitive-complexity\n Object.values(this.routes).forEach((route) => {\n if (\n route.method !== method &&\n // matches any method\n route.method !== \"\" &&\n // The HEAD method requests that the target resource transfer a representation of its state, as for a GET request...\n !(isHead && route.method === \"GET\")\n ) {\n return;\n }\n\n let matched = false;\n\n if (\"matchAll\" in route) {\n matched = true;\n } else if (route.keys === false) {\n // routes.key is RegExp: https://github.com/lukeed/regexparam/blob/master/src/index.js#L2\n const matches = route.pattern.exec(pathname);\n\n if (matches === null) {\n return;\n }\n\n // eslint-disable-next-line no-void\n if (matches.groups !== void 0) {\n Object.keys(matches.groups).forEach((key) => {\n // @ts-expect-error @TODO: fix this\n // eslint-disable-next-line security/detect-object-injection\n parameters[key] = matches.groups[key] as string;\n });\n }\n\n matched = true;\n } else if (route.keys.length > 0) {\n const matches = route.pattern.exec(pathname);\n\n if (matches === null) {\n return;\n }\n\n // eslint-disable-next-line no-loops/no-loops\n for (let index = 0; index < route.keys.length; ) {\n // eslint-disable-next-line security/detect-object-injection\n const parameterKey = route.keys[index];\n\n // @ts-expect-error @TODO: fix this\n // eslint-disable-next-line no-plusplus,security/detect-object-injection\n parameters[parameterKey] = matches[++index];\n }\n\n matched = true;\n } else if (route.pattern.test(pathname)) {\n matched = true;\n } // else not a match\n\n if (matched) {\n fns.push(\n ...route.fns.flatMap((function_) => {\n if (function_ instanceof Router) {\n const { base } = function_;\n\n let stripPathname = pathname.slice(base.length);\n\n // fix stripped pathname, not sure why this happens\n\n if (!stripPathname.startsWith(\"/\")) {\n stripPathname = `/${stripPathname}`;\n }\n\n // eslint-disable-next-line unicorn/no-array-callback-reference, unicorn/no-array-method-this-argument\n const result = function_.find(method, stripPathname);\n\n if (!result.middleOnly) {\n middleOnly = false;\n }\n\n // merge params\n Object.assign(parameters, result.params);\n\n return result.fns;\n }\n\n return function_;\n }),\n );\n\n if (!route.isMiddleware) {\n middleOnly = false;\n }\n }\n });\n\n return { fns, middleOnly, params: parameters };\n }\n\n public use(base: Nextable<H> | RouteMatch | Router<H>, ...fns: (Nextable<H> | Router<H>)[]): this {\n if (typeof base === \"function\" || base instanceof Router) {\n fns.unshift(base);\n // eslint-disable-next-line no-param-reassign\n base = \"/\";\n }\n // mount subrouter\n // eslint-disable-next-line no-param-reassign\n fns = fns.map((function_) => {\n if (function_ instanceof Router) {\n if (typeof base === \"string\") {\n return function_.clone(base);\n }\n\n throw new Error(\"Mounting a router to RegExp base is not supported\");\n }\n return function_;\n });\n\n const { keys, pattern } = parse(base, true);\n\n this.routes.push({\n fns,\n isMiddleware: true,\n keys,\n method: \"\",\n pattern,\n });\n\n return this;\n }\n}\n","import type { AnyZodObject, ZodObject } from \"zod\";\n\nimport withZod from \"./adapter/with-zod\";\nimport type { Route } from \"./router\";\nimport { Router } from \"./router\";\nimport type {\n FindResult,\n FunctionLike,\n HandlerOptions,\n HttpMethod,\n Nextable,\n RouteMatch,\n RoutesExtendedRequestHandler,\n RouteShortcutMethod,\n ValueOrPromise,\n} from \"./types\";\n\nconst onNoMatch = async (request: Request) =>\n new Response(request.method === \"HEAD\" ? null : `Route ${request.method} ${request.url} not found`, { status: 404 });\n\nconst onError = async (error: unknown) => {\n // eslint-disable-next-line no-console\n console.error(error);\n\n return new Response(\"Internal Server Error\", { status: 500 });\n};\n\nexport const getPathname = (request: Request & { nextUrl?: URL }): string =>\n // eslint-disable-next-line compat/compat\n (request.nextUrl ?? new URL(request.url)).pathname;\n\n// eslint-disable-next-line @typescript-eslint/no-invalid-void-type\nexport type RequestHandler<R extends Request, Context> = (request: R, context_: Context) => ValueOrPromise<Response | void>;\n\nexport class EdgeRouter<R extends Request = Request, Context = unknown, RResponse extends Response = Response, Schema extends AnyZodObject = ZodObject<any>> {\n public all: RouteShortcutMethod<this, Schema, RequestHandler<R, Context>> = this.add.bind(this, \"\");\n\n public connect: RouteShortcutMethod<this, Schema, RequestHandler<R, Context>> = this.add.bind(this, \"CONNECT\");\n\n public delete: RouteShortcutMethod<this, Schema, RequestHandler<R, Context>> = this.add.bind(this, \"DELETE\");\n\n public get: RouteShortcutMethod<this, Schema, RequestHandler<R, Context>> = this.add.bind(this, \"GET\");\n\n public head: RouteShortcutMethod<this, Schema, RequestHandler<R, Context>> = this.add.bind(this, \"HEAD\");\n\n public options: RouteShortcutMethod<this, Schema, RequestHandler<R, Context>> = this.add.bind(this, \"OPTIONS\");\n\n public patch: RouteShortcutMethod<this, Schema, RequestHandler<R, Context>> = this.add.bind(this, \"PATCH\");\n\n public post: RouteShortcutMethod<this, Schema, RequestHandler<R, Context>> = this.add.bind(this, \"POST\");\n\n public put: RouteShortcutMethod<this, Schema, RequestHandler<R, Context>> = this.add.bind(this, \"PUT\");\n\n public trace: RouteShortcutMethod<this, Schema, RequestHandler<R, Context>> = this.add.bind(this, \"TRACE\");\n\n private readonly onError: (\n error: unknown,\n ...arguments_: Parameters<RoutesExtendedRequestHandler<R, Context, RResponse, Route<Nextable<FunctionLike>>[]>>\n ) => ReturnType<RoutesExtendedRequestHandler<R, Context, RResponse, Route<Nextable<FunctionLike>>[]>>;\n\n private readonly onNoMatch: RoutesExtendedRequestHandler<R, Context, RResponse, Route<Nextable<FunctionLike>>[]>;\n\n private router = new Router<RequestHandler<R, Context>>();\n\n public constructor(options: HandlerOptions<RoutesExtendedRequestHandler<R, Context, RResponse, Route<Nextable<FunctionLike>>[]>> = {}) {\n this.onNoMatch = options.onNoMatch ?? (onNoMatch as unknown as RoutesExtendedRequestHandler<R, Context, RResponse, Route<Nextable<FunctionLike>>[]>);\n this.onError =\n options.onError ??\n (onError as unknown as (\n error: unknown,\n ...arguments_: Parameters<RoutesExtendedRequestHandler<R, Context, RResponse, Route<Nextable<FunctionLike>>[]>>\n ) => ReturnType<RoutesExtendedRequestHandler<R, Context, RResponse, Route<Nextable<FunctionLike>>[]>>);\n }\n\n public clone(): EdgeRouter<R, Context, RResponse, Schema> {\n const r = new EdgeRouter<R, Context, RResponse, Schema>({ onError: this.onError, onNoMatch: this.onNoMatch });\n\n r.router = this.router.clone();\n\n return r;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents\n public handler(): (request: R, context_: Context) => Promise<any> | ReturnType<FunctionLike> | ValueOrPromise<RResponse> {\n const { routes } = this.router as Router<FunctionLike>;\n\n return async (request: R, context_: Context): Promise<any> => {\n // eslint-disable-next-line unicorn/no-array-callback-reference,unicorn/no-array-method-this-argument\n const result = this.router.find(request.method as HttpMethod, getPathname(request));\n\n this.prepareRequest(request, result);\n\n try {\n return await (result.fns.length === 0 || result.middleOnly\n ? this.onNoMatch(request, context_, routes)\n : Router.exec(result.fns, request, context_));\n } catch (error) {\n return await this.onError(error, request, context_, routes);\n }\n };\n }\n\n public async run(request: R, context_: Context): Promise<unknown> {\n // eslint-disable-next-line unicorn/no-array-callback-reference,unicorn/no-array-method-this-argument\n const result = this.router.find(request.method as HttpMethod, getPathname(request));\n\n if (result.fns.length === 0) {\n return;\n }\n\n this.prepareRequest(request, result);\n\n // eslint-disable-next-line consistent-return\n return await Router.exec(result.fns, request, context_);\n }\n\n public use(\n base: EdgeRouter<R, Context> | Nextable<RequestHandler<R, Context>> | RouteMatch,\n ...fns: (EdgeRouter<R, Context> | Nextable<RequestHandler<R, Context>>)[]\n ): this {\n if (typeof base === \"function\" || base instanceof EdgeRouter) {\n fns.unshift(base as EdgeRouter<R, Context>);\n // eslint-disable-next-line no-param-reassign\n base = \"/\";\n }\n\n this.router.use(base, ...fns.map((function_) => (function_ instanceof EdgeRouter ? function_.router : function_)));\n\n return this;\n }\n\n private add(\n method: HttpMethod | \"\",\n routeOrFunction: Nextable<RequestHandler<R, Context>> | RouteMatch,\n zodOrRouteOrFunction?: Nextable<RequestHandler<R, Context>> | RouteMatch | Schema,\n ...fns: Nextable<RequestHandler<R, Context>>[]\n ) {\n if (typeof routeOrFunction === \"string\" && typeof zodOrRouteOrFunction === \"function\") {\n // eslint-disable-next-line no-param-reassign\n fns = [zodOrRouteOrFunction];\n } else if (typeof zodOrRouteOrFunction === \"object\") {\n // eslint-disable-next-line unicorn/prefer-ternary\n if (typeof routeOrFunction === \"function\") {\n // eslint-disable-next-line no-param-reassign\n fns = [withZod<R, Context, Nextable<RequestHandler<R, Context>>, Schema>(zodOrRouteOrFunction as Schema, routeOrFunction)];\n } else {\n // eslint-disable-next-line no-param-reassign\n fns = fns.map((function_) => withZod<R, Context, Nextable<RequestHandler<R, Context>>, Schema>(zodOrRouteOrFunction as Schema, function_));\n }\n } else if (typeof zodOrRouteOrFunction === \"function\") {\n // eslint-disable-next-line no-param-reassign\n fns = [zodOrRouteOrFunction];\n }\n\n this.router.add(method, routeOrFunction, ...fns);\n\n return this;\n }\n\n // eslint-disable-next-line class-methods-use-this\n private prepareRequest(request: R & { params?: Record<string, unknown> }, findResult: FindResult<RequestHandler<R, Context>>) {\n request.params = {\n ...findResult.params,\n ...request.params, // original params will take precedence\n };\n }\n}\n\nexport const createEdgeRouter = <R extends Request, Context>(\n options: HandlerOptions<RoutesExtendedRequestHandler<R, Context, Response, Route<Nextable<FunctionLike>>[]>> = {},\n): EdgeRouter<R, Context> => new EdgeRouter<R, Context, Response>(options);\n","import type { IncomingMessage, ServerResponse } from \"node:http\";\n\nimport type { AnyZodObject, ZodObject } from \"zod\";\n\nimport withZod from \"./adapter/with-zod\";\nimport type { Route } from \"./router\";\nimport { Router } from \"./router\";\nimport type {\n FindResult,\n FunctionLike,\n HandlerOptions,\n HttpMethod,\n Nextable,\n RouteMatch,\n RoutesExtendedRequestHandler,\n RouteShortcutMethod,\n ValueOrPromise,\n} from \"./types\";\n\nconst onNoMatch = async (request: IncomingMessage, response: ServerResponse) => {\n response.statusCode = 404;\n response.end(request.method === \"HEAD\" ? undefined : `Route ${request.method} ${request.url} not found`);\n};\n\nconst onError = async (error: unknown, _request: IncomingMessage, response: ServerResponse) => {\n response.statusCode = 500;\n\n // eslint-disable-next-line no-console\n console.error(error);\n\n response.end(\"Internal Server Error\");\n};\n\nexport const getPathname = (url: string): string => {\n const queryIndex = url.indexOf(\"?\");\n\n return queryIndex === -1 ? url : url.slice(0, Math.max(0, queryIndex));\n};\n\nexport type RequestHandler<Request extends IncomingMessage, Response extends ServerResponse> = (request: Request, response: Response) => ValueOrPromise<void>;\n\nexport class NodeRouter<\n Request extends IncomingMessage = IncomingMessage,\n Response extends ServerResponse = ServerResponse,\n Schema extends AnyZodObject = ZodObject<never>,\n> {\n public all: RouteShortcutMethod<this, Schema, RequestHandler<Request, Response>> = this.add.bind(this, \"\");\n\n public connect: RouteShortcutMethod<this, Schema, RequestHandler<Request, Response>> = this.add.bind(this, \"CONNECT\");\n\n public delete: RouteShortcutMethod<this, Schema, RequestHandler<Request, Response>> = this.add.bind(this, \"DELETE\");\n\n public get: RouteShortcutMethod<this, Schema, RequestHandler<Request, Response>> = this.add.bind(this, \"GET\");\n\n public head: RouteShortcutMethod<this, Schema, RequestHandler<Request, Response>> = this.add.bind(this, \"HEAD\");\n\n public options: RouteShortcutMethod<this, Schema, RequestHandler<Request, Response>> = this.add.bind(this, \"OPTIONS\");\n\n public patch: RouteShortcutMethod<this, Schema, RequestHandler<Request, Response>> = this.add.bind(this, \"PATCH\");\n\n public post: RouteShortcutMethod<this, Schema, RequestHandler<Request, Response>> = this.add.bind(this, \"POST\");\n\n public put: RouteShortcutMethod<this, Schema, RequestHandler<Request, Response>> = this.add.bind(this, \"PUT\");\n\n public trace: RouteShortcutMethod<this, Schema, RequestHandler<Request, Response>> = this.add.bind(this, \"TRACE\");\n\n private readonly onError: (\n error: unknown,\n ...arguments_: Parameters<RoutesExtendedRequestHandler<Request, Response, Response, Route<Nextable<FunctionLike>>[]>>\n ) => ReturnType<RoutesExtendedRequestHandler<Request, Response, Response, Route<Nextable<FunctionLike>>[]>>;\n\n private readonly onNoMatch: RoutesExtendedRequestHandler<Request, Response, Response, Route<Nextable<FunctionLike>>[]>;\n\n private router = new Router<RequestHandler<Request, Response>>();\n\n public constructor(options: HandlerOptions<RoutesExtendedRequestHandler<Request, Response, Response, Route<Nextable<FunctionLike>>[]>> = {}) {\n this.onNoMatch = options.onNoMatch ?? onNoMatch;\n this.onError = options.onError ?? onError;\n }\n\n public clone(): NodeRouter<Request, Response, Schema> {\n const r = new NodeRouter<Request, Response, Schema>({ onError: this.onError, onNoMatch: this.onNoMatch });\n\n r.router = this.router.clone();\n\n return r;\n }\n\n public handler(): (request: Request, response: Response) => Promise<void> {\n const { routes } = this.router as Router<FunctionLike>;\n\n return async (request: Request, response: Response) => {\n // eslint-disable-next-line unicorn/no-array-callback-reference,unicorn/no-array-method-this-argument\n const result = this.router.find(request.method as HttpMethod, getPathname(request.url as string));\n\n this.prepareRequest(request, result);\n\n try {\n await (result.fns.length === 0 || result.middleOnly ? this.onNoMatch(request, response, routes) : Router.exec(result.fns, request, response));\n } catch (error) {\n await this.onError(error, request, response, routes);\n }\n };\n }\n\n public async run(request: Request, response: Response): Promise<unknown> {\n // eslint-disable-next-line unicorn/no-array-callback-reference,unicorn/no-array-method-this-argument\n const result = this.router.find(request.method as HttpMethod, getPathname(request.url as string));\n\n if (result.fns.length === 0) {\n return;\n }\n\n this.prepareRequest(request, result);\n\n // eslint-disable-next-line consistent-return\n return await Router.exec(result.fns, request, response);\n }\n\n public use(\n base: Nextable<RequestHandler<Request, Response>> | NodeRouter<Request, Response, Schema> | RouteMatch,\n ...fns: (Nextable<RequestHandler<Request, Response>> | NodeRouter<Request, Response, Schema>)[]\n ): this {\n if (typeof base === \"function\" || base instanceof NodeRouter) {\n fns.unshift(base);\n // eslint-disable-next-line no-param-reassign\n base = \"/\";\n }\n\n this.router.use(base, ...fns.map((function_) => (function_ instanceof NodeRouter ? function_.router : function_)));\n\n return this;\n }\n\n private add(\n method: HttpMethod | \"\",\n routeOrFunction: Nextable<RequestHandler<Request, Response>> | RouteMatch,\n zodOrRouteOrFunction?: Nextable<RequestHandler<Request, Response>> | RouteMatch | Schema,\n ...fns: Nextable<RequestHandler<Request, Response>>[]\n ) {\n if (typeof routeOrFunction === \"string\" && typeof zodOrRouteOrFunction === \"function\") {\n // eslint-disable-next-line no-param-reassign\n fns = [zodOrRouteOrFunction];\n } else if (typeof zodOrRouteOrFunction === \"object\") {\n if (typeof routeOrFunction === \"function\") {\n // eslint-disable-next-line no-param-reassign\n fns = [withZod<Request, Response, Nextable<RequestHandler<Request, Response>>, Schema>(zodOrRouteOrFunction as Schema, routeOrFunction)];\n } else {\n // eslint-disable-next-line no-param-reassign\n fns = fns.map((function_) =>\n withZod<Request, Response, Nextable<RequestHandler<Request, Response>>, Schema>(zodOrRouteOrFunction as Schema, function_),\n );\n }\n } else if (typeof zodOrRouteOrFunction === \"function\") {\n // eslint-disable-next-line no-param-reassign\n fns = [zodOrRouteOrFunction];\n }\n\n this.router.add(method, routeOrFunction, ...fns);\n\n return this;\n }\n\n // eslint-disable-next-line class-methods-use-this\n private prepareRequest(request: Request & { params?: Record<string, unknown> }, findResult: FindResult<RequestHandler<Request, Response>>) {\n request.params = {\n ...findResult.params,\n ...request.params, // original params will take precedence\n };\n }\n}\n\nexport const createRouter = <\n Request extends IncomingMessage,\n Response extends ServerResponse,\n Schema extends AnyZodObject = ZodObject<{ body?: AnyZodObject; headers?: AnyZodObject; query?: AnyZodObject }>,\n>(\n options: HandlerOptions<RoutesExtendedRequestHandler<Request, Response, Response, Route<Nextable<FunctionLike>>[]>> = {},\n): NodeRouter<Request, Response, Schema> => new NodeRouter<Request, Response, Schema>(options);\n","import type { ServerResponse } from \"node:http\";\n\n/**\n * Send `JSON` object\n * @param {ServerResponse} response response object\n * @param {number} statusCode\n * @param {any} jsonBody of data\n */\nconst sendJson = (response: ServerResponse, statusCode: number, jsonBody: unknown): void => {\n // Set header to application/json\n response.setHeader(\"content-type\", \"application/json; charset=utf-8\");\n\n response.statusCode = statusCode;\n response.end(JSON.stringify(jsonBody, null, 2));\n};\n\nexport default sendJson;\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/adapter/express.ts","../src/adapter/with-zod.ts","../src/router.ts","../src/edge.ts","../src/node.ts","../src/utils/send-json.ts"],"names":["expressWrapper","function_","request","response","next","resolve","reject","error","express_default","createHttpError","ZodError","withZod","schema","handler","transformedRequest","message","issue","with_zod_default","parse","Router","_Router","base","routes","fns","arguments_","index","method","route","keys","pattern","pathname","middleOnly","parameters","isHead","matched","matches","key","parameterKey","stripPathname","result","onNoMatch","onError","getPathname","EdgeRouter","_EdgeRouter","options","r","context_","routeOrFunction","zodOrRouteOrFunction","findResult","createEdgeRouter","_request","url","queryIndex","NodeRouter","_NodeRouter","createRouter","sendJson","statusCode","jsonBody","send_json_default"],"mappings":"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","sourcesContent":["import type { IncomingMessage, ServerResponse } from \"node:http\";\n\nimport type { RequestHandler } from \"../node\";\nimport type { Nextable } from \"../types\";\n\ntype NextFunction = (error?: any) => void;\n\nconst expressWrapper =\n <Request extends IncomingMessage, Response extends ServerResponse>(\n function_: ExpressRequestHandler<Request, Response>,\n ): Nextable<RequestHandler<Request, Response>> =>\n async (request, response, next) =>\n // eslint-disable-next-line compat/compat\n await new Promise<void>((resolve, reject): void => {\n function_(request, response, (error) => (error ? reject(error) : resolve()));\n // eslint-disable-next-line promise/no-callback-in-promise\n }).then<Nextable<RequestHandler<Request, Response>>>(next);\n\nexport type ExpressRequestHandler<Request, Response> = (request: Request, response: Response, next: NextFunction) => void;\n\nexport default expressWrapper;\n","import createHttpError from \"http-errors\";\nimport type { AnyZodObject, ZodObject } from \"zod\";\nimport { ZodError } from \"zod\";\n\nimport type { Nextable, NextHandler } from \"../types\";\n\nconst withZod =\n <Request, Response, Handler extends Nextable<any>, Schema extends ZodObject<{ body?: AnyZodObject; headers?: AnyZodObject; query?: AnyZodObject }>>(\n schema: Schema,\n handler: Handler,\n ): ((request: Request, response: Response, next: NextHandler) => Promise<Response>) =>\n async (request: Request, response: Response, next) => {\n let transformedRequest: Request = request;\n\n try {\n transformedRequest = (await schema.parseAsync(request)) as Request;\n } catch (error: any) {\n let { message } = error as Error;\n\n if (error instanceof ZodError && typeof error.format === \"function\") {\n message = error.issues.map((issue) => `${issue.path.join(\"/\")} - ${issue.message}`).join(\"/n\");\n }\n\n throw createHttpError(422, message);\n }\n\n return handler(transformedRequest, response, next);\n };\n\nexport default withZod;\n","/**\n * Agnostic router class\n * Adapted from lukeed/trouter library:\n * https://github.com/lukeed/trouter/blob/master/index.mjs\n */\nimport { parse } from \"regexparam\";\n\nimport type { FindResult, FunctionLike, HttpMethod, Nextable, RouteMatch } from \"./types\";\n\nexport type Route<H> = {\n fns: (H | Router<H extends FunctionLike ? H : never>)[];\n isMiddleware: boolean;\n method: HttpMethod | \"\";\n} & (\n | {\n keys: string[] | false;\n pattern: RegExp;\n }\n | { matchAll: true }\n);\n\nexport class Router<H extends FunctionLike> {\n public static async exec<FL extends FunctionLike>(fns: (Nextable<FL> | undefined)[], ...arguments_: Parameters<FL>): Promise<any> {\n let index = 0;\n\n const next = () => {\n // eslint-disable-next-line no-plusplus,@typescript-eslint/naming-convention,no-underscore-dangle\n const function_ = fns[++index];\n\n if (function_ === undefined) {\n return Promise.resolve();\n }\n\n return function_(...arguments_, next);\n };\n\n // eslint-disable-next-line security/detect-object-injection\n return (fns[index] as FunctionLike)(...arguments_, next);\n }\n\n public constructor(\n public base = \"/\",\n public routes: Route<Nextable<H>>[] = [],\n ) {}\n\n public add(method: HttpMethod | \"\", route: Nextable<H> | RouteMatch, ...fns: Nextable<H>[]): this {\n if (typeof route === \"function\") {\n fns.unshift(route);\n // eslint-disable-next-line no-param-reassign\n route = \"\";\n }\n\n if (route === \"\") {\n this.routes.push({\n fns,\n isMiddleware: false,\n matchAll: true,\n method,\n });\n } else {\n const { keys, pattern } = parse(route);\n\n this.routes.push({\n fns,\n isMiddleware: false,\n keys,\n method,\n pattern,\n });\n }\n\n return this;\n }\n\n public clone(base?: string): Router<H> {\n return new Router<H>(base, [...this.routes]);\n }\n\n // eslint-disable-next-line sonarjs/cognitive-complexity\n public find(method: HttpMethod, pathname: string): FindResult<H> {\n let middleOnly = true;\n\n const fns: Nextable<H>[] = [];\n const parameters: Record<string, string> = {};\n const isHead = method === \"HEAD\";\n\n // eslint-disable-next-line no-loops/no-loops,no-restricted-syntax\n for (const route of this.routes) {\n if (\n route.method !== method &&\n // matches any method\n route.method !== \"\" &&\n // The HEAD method requests that the target resource transfer a representation of its state, as for a GET request...\n !(isHead && route.method === \"GET\")\n ) {\n // eslint-disable-next-line no-continue\n continue;\n }\n\n let matched = false;\n\n if (\"matchAll\" in route) {\n matched = true;\n } else if (route.keys === false) {\n // routes.key is RegExp: https://github.com/lukeed/regexparam/blob/master/src/index.js#L2\n const matches = route.pattern.exec(pathname);\n\n if (matches === null) {\n // eslint-disable-next-line no-continue\n continue;\n }\n\n // eslint-disable-next-line no-void\n if (matches.groups !== void 0) {\n Object.keys(matches.groups).forEach((key) => {\n // @ts-expect-error @TODO: fix this\n // eslint-disable-next-line security/detect-object-injection\n parameters[key] = matches.groups[key] as string;\n });\n }\n\n matched = true;\n } else if (route.keys.length > 0) {\n const matches = route.pattern.exec(pathname);\n\n if (matches === null) {\n // eslint-disable-next-line no-continue\n continue;\n }\n\n // eslint-disable-next-line no-loops/no-loops\n for (let index = 0; index < route.keys.length; ) {\n // eslint-disable-next-line security/detect-object-injection\n const parameterKey = route.keys[index];\n\n // @ts-expect-error @TODO: fix this\n // eslint-disable-next-line no-plusplus,security/detect-object-injection\n parameters[parameterKey] = matches[++index];\n }\n\n matched = true;\n } else if (route.pattern.test(pathname)) {\n matched = true;\n } // else not a match\n\n if (matched) {\n fns.push(\n // eslint-disable-next-line @typescript-eslint/no-loop-func\n ...route.fns.flatMap((function_) => {\n if (function_ instanceof Router) {\n const { base } = function_;\n\n let stripPathname = pathname.slice(base.length);\n\n // fix stripped pathname, not sure why this happens\n\n if (!stripPathname.startsWith(\"/\")) {\n stripPathname = `/${stripPathname}`;\n }\n\n // eslint-disable-next-line unicorn/no-array-callback-reference, unicorn/no-array-method-this-argument\n const result = function_.find(method, stripPathname);\n\n if (!result.middleOnly) {\n middleOnly = false;\n }\n\n // merge params\n Object.assign(parameters, result.params);\n\n return result.fns;\n }\n\n return function_;\n }),\n );\n\n if (!route.isMiddleware) {\n middleOnly = false;\n }\n }\n }\n\n return { fns, middleOnly, params: parameters };\n }\n\n public use(base: Nextable<H> | RouteMatch | Router<H>, ...fns: (Nextable<H> | Router<H>)[]): this {\n if (typeof base === \"function\" || base instanceof Router) {\n fns.unshift(base);\n // eslint-disable-next-line no-param-reassign\n base = \"/\";\n }\n // mount subrouter\n // eslint-disable-next-line no-param-reassign\n fns = fns.map((function_) => {\n if (function_ instanceof Router) {\n if (typeof base === \"string\") {\n return function_.clone(base);\n }\n\n throw new Error(\"Mounting a router to RegExp base is not supported\");\n }\n return function_;\n });\n\n const { keys, pattern } = parse(base, true);\n\n this.routes.push({\n fns,\n isMiddleware: true,\n keys,\n method: \"\",\n pattern,\n });\n\n return this;\n }\n}\n","import type { AnyZodObject, ZodObject } from \"zod\";\n\nimport withZod from \"./adapter/with-zod\";\nimport type { Route } from \"./router\";\nimport { Router } from \"./router\";\nimport type {\n FindResult,\n FunctionLike,\n HandlerOptions,\n HttpMethod,\n Nextable,\n RouteMatch,\n RoutesExtendedRequestHandler,\n RouteShortcutMethod,\n ValueOrPromise,\n} from \"./types\";\n\nconst onNoMatch = async (request: Request) =>\n new Response(request.method === \"HEAD\" ? null : `Route ${request.method} ${request.url} not found`, { status: 404 });\n\nconst onError = async (error: unknown) => {\n // eslint-disable-next-line no-console\n console.error(error);\n\n return new Response(\"Internal Server Error\", { status: 500 });\n};\n\nexport const getPathname = (request: Request & { nextUrl?: URL }): string =>\n // eslint-disable-next-line compat/compat\n (request.nextUrl ?? new URL(request.url)).pathname;\n\n// eslint-disable-next-line @typescript-eslint/no-invalid-void-type\nexport type RequestHandler<R extends Request, Context> = (request: R, context_: Context) => ValueOrPromise<Response | void>;\n\nexport class EdgeRouter<R extends Request = Request, Context = unknown, RResponse extends Response = Response, Schema extends AnyZodObject = ZodObject<any>> {\n public all: RouteShortcutMethod<this, Schema, RequestHandler<R, Context>> = this.add.bind(this, \"\");\n\n public connect: RouteShortcutMethod<this, Schema, RequestHandler<R, Context>> = this.add.bind(this, \"CONNECT\");\n\n public delete: RouteShortcutMethod<this, Schema, RequestHandler<R, Context>> = this.add.bind(this, \"DELETE\");\n\n public get: RouteShortcutMethod<this, Schema, RequestHandler<R, Context>> = this.add.bind(this, \"GET\");\n\n public head: RouteShortcutMethod<this, Schema, RequestHandler<R, Context>> = this.add.bind(this, \"HEAD\");\n\n public options: RouteShortcutMethod<this, Schema, RequestHandler<R, Context>> = this.add.bind(this, \"OPTIONS\");\n\n public patch: RouteShortcutMethod<this, Schema, RequestHandler<R, Context>> = this.add.bind(this, \"PATCH\");\n\n public post: RouteShortcutMethod<this, Schema, RequestHandler<R, Context>> = this.add.bind(this, \"POST\");\n\n public put: RouteShortcutMethod<this, Schema, RequestHandler<R, Context>> = this.add.bind(this, \"PUT\");\n\n public trace: RouteShortcutMethod<this, Schema, RequestHandler<R, Context>> = this.add.bind(this, \"TRACE\");\n\n private readonly onError: (\n error: unknown,\n ...arguments_: Parameters<RoutesExtendedRequestHandler<R, Context, RResponse, Route<Nextable<FunctionLike>>[]>>\n ) => ReturnType<RoutesExtendedRequestHandler<R, Context, RResponse, Route<Nextable<FunctionLike>>[]>>;\n\n private readonly onNoMatch: RoutesExtendedRequestHandler<R, Context, RResponse, Route<Nextable<FunctionLike>>[]>;\n\n private router = new Router<RequestHandler<R, Context>>();\n\n public constructor(options: HandlerOptions<RoutesExtendedRequestHandler<R, Context, RResponse, Route<Nextable<FunctionLike>>[]>> = {}) {\n this.onNoMatch = options.onNoMatch ?? (onNoMatch as unknown as RoutesExtendedRequestHandler<R, Context, RResponse, Route<Nextable<FunctionLike>>[]>);\n this.onError =\n options.onError ??\n (onError as unknown as (\n error: unknown,\n ...arguments_: Parameters<RoutesExtendedRequestHandler<R, Context, RResponse, Route<Nextable<FunctionLike>>[]>>\n ) => ReturnType<RoutesExtendedRequestHandler<R, Context, RResponse, Route<Nextable<FunctionLike>>[]>>);\n }\n\n public clone(): EdgeRouter<R, Context, RResponse, Schema> {\n const r = new EdgeRouter<R, Context, RResponse, Schema>({ onError: this.onError, onNoMatch: this.onNoMatch });\n\n r.router = this.router.clone();\n\n return r;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents\n public handler(): (request: R, context_: Context) => Promise<any> | ReturnType<FunctionLike> | ValueOrPromise<RResponse> {\n const { routes } = this.router as Router<FunctionLike>;\n\n return async (request: R, context_: Context): Promise<any> => {\n // eslint-disable-next-line unicorn/no-array-callback-reference,unicorn/no-array-method-this-argument\n const result = this.router.find(request.method as HttpMethod, getPathname(request));\n\n this.prepareRequest(request, result);\n\n try {\n return await (result.fns.length === 0 || result.middleOnly\n ? this.onNoMatch(request, context_, routes)\n : Router.exec(result.fns, request, context_));\n } catch (error) {\n return await this.onError(error, request, context_, routes);\n }\n };\n }\n\n public async run(request: R, context_: Context): Promise<unknown> {\n // eslint-disable-next-line unicorn/no-array-callback-reference,unicorn/no-array-method-this-argument\n const result = this.router.find(request.method as HttpMethod, getPathname(request));\n\n if (result.fns.length === 0) {\n return;\n }\n\n this.prepareRequest(request, result);\n\n // eslint-disable-next-line consistent-return\n return await Router.exec(result.fns, request, context_);\n }\n\n public use(\n base: EdgeRouter<R, Context> | Nextable<RequestHandler<R, Context>> | RouteMatch,\n ...fns: (EdgeRouter<R, Context> | Nextable<RequestHandler<R, Context>>)[]\n ): this {\n if (typeof base === \"function\" || base instanceof EdgeRouter) {\n fns.unshift(base as EdgeRouter<R, Context>);\n // eslint-disable-next-line no-param-reassign\n base = \"/\";\n }\n\n this.router.use(base, ...fns.map((function_) => (function_ instanceof EdgeRouter ? function_.router : function_)));\n\n return this;\n }\n\n private add(\n method: HttpMethod | \"\",\n routeOrFunction: Nextable<RequestHandler<R, Context>> | RouteMatch,\n zodOrRouteOrFunction?: Nextable<RequestHandler<R, Context>> | RouteMatch | Schema,\n ...fns: Nextable<RequestHandler<R, Context>>[]\n ) {\n if (typeof routeOrFunction === \"string\" && typeof zodOrRouteOrFunction === \"function\") {\n // eslint-disable-next-line no-param-reassign\n fns = [zodOrRouteOrFunction];\n } else if (typeof zodOrRouteOrFunction === \"object\") {\n // eslint-disable-next-line unicorn/prefer-ternary\n if (typeof routeOrFunction === \"function\") {\n // eslint-disable-next-line no-param-reassign\n fns = [withZod<R, Context, Nextable<RequestHandler<R, Context>>, Schema>(zodOrRouteOrFunction as Schema, routeOrFunction)];\n } else {\n // eslint-disable-next-line no-param-reassign\n fns = fns.map((function_) => withZod<R, Context, Nextable<RequestHandler<R, Context>>, Schema>(zodOrRouteOrFunction as Schema, function_));\n }\n } else if (typeof zodOrRouteOrFunction === \"function\") {\n // eslint-disable-next-line no-param-reassign\n fns = [zodOrRouteOrFunction];\n }\n\n this.router.add(method, routeOrFunction, ...fns);\n\n return this;\n }\n\n // eslint-disable-next-line class-methods-use-this\n private prepareRequest(request: R & { params?: Record<string, unknown> }, findResult: FindResult<RequestHandler<R, Context>>) {\n request.params = {\n ...findResult.params,\n ...request.params, // original params will take precedence\n };\n }\n}\n\nexport const createEdgeRouter = <R extends Request, Context>(\n options: HandlerOptions<RoutesExtendedRequestHandler<R, Context, Response, Route<Nextable<FunctionLike>>[]>> = {},\n): EdgeRouter<R, Context> => new EdgeRouter<R, Context, Response>(options);\n","import type { IncomingMessage, ServerResponse } from \"node:http\";\n\nimport type { AnyZodObject, ZodObject } from \"zod\";\n\nimport withZod from \"./adapter/with-zod\";\nimport type { Route } from \"./router\";\nimport { Router } from \"./router\";\nimport type {\n FindResult,\n FunctionLike,\n HandlerOptions,\n HttpMethod,\n Nextable,\n RouteMatch,\n RoutesExtendedRequestHandler,\n RouteShortcutMethod,\n ValueOrPromise,\n} from \"./types\";\n\nconst onNoMatch = async (request: IncomingMessage, response: ServerResponse) => {\n response.statusCode = 404;\n response.end(request.method === \"HEAD\" ? undefined : `Route ${request.method} ${request.url} not found`);\n};\n\nconst onError = async (error: unknown, _request: IncomingMessage, response: ServerResponse) => {\n response.statusCode = 500;\n\n // eslint-disable-next-line no-console\n console.error(error);\n\n response.end(\"Internal Server Error\");\n};\n\nexport const getPathname = (url: string): string => {\n const queryIndex = url.indexOf(\"?\");\n\n return queryIndex === -1 ? url : url.slice(0, Math.max(0, queryIndex));\n};\n\nexport type RequestHandler<Request extends IncomingMessage, Response extends ServerResponse> = (request: Request, response: Response) => ValueOrPromise<void>;\n\nexport class NodeRouter<\n Request extends IncomingMessage = IncomingMessage,\n Response extends ServerResponse = ServerResponse,\n Schema extends AnyZodObject = ZodObject<never>,\n> {\n public all: RouteShortcutMethod<this, Schema, RequestHandler<Request, Response>> = this.add.bind(this, \"\");\n\n public connect: RouteShortcutMethod<this, Schema, RequestHandler<Request, Response>> = this.add.bind(this, \"CONNECT\");\n\n public delete: RouteShortcutMethod<this, Schema, RequestHandler<Request, Response>> = this.add.bind(this, \"DELETE\");\n\n public get: RouteShortcutMethod<this, Schema, RequestHandler<Request, Response>> = this.add.bind(this, \"GET\");\n\n public head: RouteShortcutMethod<this, Schema, RequestHandler<Request, Response>> = this.add.bind(this, \"HEAD\");\n\n public options: RouteShortcutMethod<this, Schema, RequestHandler<Request, Response>> = this.add.bind(this, \"OPTIONS\");\n\n public patch: RouteShortcutMethod<this, Schema, RequestHandler<Request, Response>> = this.add.bind(this, \"PATCH\");\n\n public post: RouteShortcutMethod<this, Schema, RequestHandler<Request, Response>> = this.add.bind(this, \"POST\");\n\n public put: RouteShortcutMethod<this, Schema, RequestHandler<Request, Response>> = this.add.bind(this, \"PUT\");\n\n public trace: RouteShortcutMethod<this, Schema, RequestHandler<Request, Response>> = this.add.bind(this, \"TRACE\");\n\n private readonly onError: (\n error: unknown,\n ...arguments_: Parameters<RoutesExtendedRequestHandler<Request, Response, Response, Route<Nextable<FunctionLike>>[]>>\n ) => ReturnType<RoutesExtendedRequestHandler<Request, Response, Response, Route<Nextable<FunctionLike>>[]>>;\n\n private readonly onNoMatch: RoutesExtendedRequestHandler<Request, Response, Response, Route<Nextable<FunctionLike>>[]>;\n\n private router = new Router<RequestHandler<Request, Response>>();\n\n public constructor(options: HandlerOptions<RoutesExtendedRequestHandler<Request, Response, Response, Route<Nextable<FunctionLike>>[]>> = {}) {\n this.onNoMatch = options.onNoMatch ?? onNoMatch;\n this.onError = options.onError ?? onError;\n }\n\n public clone(): NodeRouter<Request, Response, Schema> {\n const r = new NodeRouter<Request, Response, Schema>({ onError: this.onError, onNoMatch: this.onNoMatch });\n\n r.router = this.router.clone();\n\n return r;\n }\n\n public handler(): (request: Request, response: Response) => Promise<void> {\n const { routes } = this.router as Router<FunctionLike>;\n\n return async (request: Request, response: Response) => {\n // eslint-disable-next-line unicorn/no-array-callback-reference,unicorn/no-array-method-this-argument\n const result = this.router.find(request.method as HttpMethod, getPathname(request.url as string));\n\n this.prepareRequest(request, result);\n\n try {\n await (result.fns.length === 0 || result.middleOnly ? this.onNoMatch(request, response, routes) : Router.exec(result.fns, request, response));\n } catch (error) {\n await this.onError(error, request, response, routes);\n }\n };\n }\n\n public async run(request: Request, response: Response): Promise<unknown> {\n // eslint-disable-next-line unicorn/no-array-callback-reference,unicorn/no-array-method-this-argument\n const result = this.router.find(request.method as HttpMethod, getPathname(request.url as string));\n\n if (result.fns.length === 0) {\n return;\n }\n\n this.prepareRequest(request, result);\n\n // eslint-disable-next-line consistent-return\n return await Router.exec(result.fns, request, response);\n }\n\n public use(\n base: Nextable<RequestHandler<Request, Response>> | NodeRouter<Request, Response, Schema> | RouteMatch,\n ...fns: (Nextable<RequestHandler<Request, Response>> | NodeRouter<Request, Response, Schema>)[]\n ): this {\n if (typeof base === \"function\" || base instanceof NodeRouter) {\n fns.unshift(base);\n // eslint-disable-next-line no-param-reassign\n base = \"/\";\n }\n\n this.router.use(base, ...fns.map((function_) => (function_ instanceof NodeRouter ? function_.router : function_)));\n\n return this;\n }\n\n private add(\n method: HttpMethod | \"\",\n routeOrFunction: Nextable<RequestHandler<Request, Response>> | RouteMatch,\n zodOrRouteOrFunction?: Nextable<RequestHandler<Request, Response>> | RouteMatch | Schema,\n ...fns: Nextable<RequestHandler<Request, Response>>[]\n ) {\n if (typeof routeOrFunction === \"string\" && typeof zodOrRouteOrFunction === \"function\") {\n // eslint-disable-next-line no-param-reassign\n fns = [zodOrRouteOrFunction];\n } else if (typeof zodOrRouteOrFunction === \"object\") {\n if (typeof routeOrFunction === \"function\") {\n // eslint-disable-next-line no-param-reassign\n fns = [withZod<Request, Response, Nextable<RequestHandler<Request, Response>>, Schema>(zodOrRouteOrFunction as Schema, routeOrFunction)];\n } else {\n // eslint-disable-next-line no-param-reassign\n fns = fns.map((function_) =>\n withZod<Request, Response, Nextable<RequestHandler<Request, Response>>, Schema>(zodOrRouteOrFunction as Schema, function_),\n );\n }\n } else if (typeof zodOrRouteOrFunction === \"function\") {\n // eslint-disable-next-line no-param-reassign\n fns = [zodOrRouteOrFunction];\n }\n\n this.router.add(method, routeOrFunction, ...fns);\n\n return this;\n }\n\n // eslint-disable-next-line class-methods-use-this\n private prepareRequest(request: Request & { params?: Record<string, unknown> }, findResult: FindResult<RequestHandler<Request, Response>>) {\n request.params = {\n ...findResult.params,\n ...request.params, // original params will take precedence\n };\n }\n}\n\nexport const createRouter = <\n Request extends IncomingMessage,\n Response extends ServerResponse,\n Schema extends AnyZodObject = ZodObject<{ body?: AnyZodObject; headers?: AnyZodObject; query?: AnyZodObject }>,\n>(\n options: HandlerOptions<RoutesExtendedRequestHandler<Request, Response, Response, Route<Nextable<FunctionLike>>[]>> = {},\n): NodeRouter<Request, Response, Schema> => new NodeRouter<Request, Response, Schema>(options);\n","import type { ServerResponse } from \"node:http\";\n\n/**\n * Send `JSON` object\n * @param {ServerResponse} response response object\n * @param {number} statusCode\n * @param {any} jsonBody of data\n */\nconst sendJson = (response: ServerResponse, statusCode: number, jsonBody: unknown): void => {\n // Set header to application/json\n response.setHeader(\"content-type\", \"application/json; charset=utf-8\");\n\n response.statusCode = statusCode;\n response.end(JSON.stringify(jsonBody, null, 2));\n};\n\nexport default sendJson;\n"]}
|
package/dist/index.mjs
CHANGED
|
@@ -2,8 +2,8 @@ import E from 'http-errors';
|
|
|
2
2
|
import { ZodError } from 'zod';
|
|
3
3
|
import { parse } from 'regexparam';
|
|
4
4
|
|
|
5
|
-
var M=o=>async(e,t,s)=>await new Promise((n,r)=>{o(e,t,d=>d?r(d):n());}).then(s),N=M;var C=(o,e)=>async(t,s,n)=>{let r=t;try{r=await o.parseAsync(t);}catch(d){let{message:a}=d;throw d instanceof ZodError&&typeof d.format=="function"&&(a=d.issues.map(R=>`${R.path.join("/")} - ${R.message}`).join("/n")),E(422,a)}return e(r,s,n)},
|
|
5
|
+
var M=o=>async(e,t,s)=>await new Promise((n,r)=>{o(e,t,d=>d?r(d):n());}).then(s),N=M;var C=(o,e)=>async(t,s,n)=>{let r=t;try{r=await o.parseAsync(t);}catch(d){let{message:a}=d;throw d instanceof ZodError&&typeof d.format=="function"&&(a=d.issues.map(R=>`${R.path.join("/")} - ${R.message}`).join("/n")),E(422,a)}return e(r,s,n)},c=C;var i=class o{constructor(e="/",t=[]){this.base=e;this.routes=t;}static async exec(e,...t){let s=0,n=()=>{let r=e[++s];return r===void 0?Promise.resolve():r(...t,n)};return e[s](...t,n)}add(e,t,...s){if(typeof t=="function"&&(s.unshift(t),t=""),t==="")this.routes.push({fns:s,isMiddleware:!1,matchAll:!0,method:e});else {let{keys:n,pattern:r}=parse(t);this.routes.push({fns:s,isMiddleware:!1,keys:n,method:e,pattern:r});}return this}clone(e){return new o(e,[...this.routes])}find(e,t){let s=!0,n=[],r={},d=e==="HEAD";for(let a of this.routes){if(a.method!==e&&a.method!==""&&!(d&&a.method==="GET"))continue;let R=!1;if("matchAll"in a)R=!0;else if(a.keys===!1){let u=a.pattern.exec(t);if(u===null)continue;u.groups!==void 0&&Object.keys(u.groups).forEach(p=>{r[p]=u.groups[p];}),R=!0;}else if(a.keys.length>0){let u=a.pattern.exec(t);if(u===null)continue;for(let p=0;p<a.keys.length;){let h=a.keys[p];r[h]=u[++p];}R=!0;}else a.pattern.test(t)&&(R=!0);R&&(n.push(...a.fns.flatMap(u=>{if(u instanceof o){let{base:p}=u,h=t.slice(p.length);h.startsWith("/")||(h=`/${h}`);let b=u.find(e,h);return b.middleOnly||(s=!1),Object.assign(r,b.params),b.fns}return u})),a.isMiddleware||(s=!1));}return {fns:n,middleOnly:s,params:r}}use(e,...t){(typeof e=="function"||e instanceof o)&&(t.unshift(e),e="/"),t=t.map(r=>{if(r instanceof o){if(typeof e=="string")return r.clone(e);throw new Error("Mounting a router to RegExp base is not supported")}return r});let{keys:s,pattern:n}=parse(e,!0);return this.routes.push({fns:t,isMiddleware:!0,keys:s,method:"",pattern:n}),this}};var k=async o=>new Response(o.method==="HEAD"?null:`Route ${o.method} ${o.url} not found`,{status:404}),w=async o=>(console.error(o),new Response("Internal Server Error",{status:500})),q=o=>(o.nextUrl??new URL(o.url)).pathname,m=class o{all=this.add.bind(this,"");connect=this.add.bind(this,"CONNECT");delete=this.add.bind(this,"DELETE");get=this.add.bind(this,"GET");head=this.add.bind(this,"HEAD");options=this.add.bind(this,"OPTIONS");patch=this.add.bind(this,"PATCH");post=this.add.bind(this,"POST");put=this.add.bind(this,"PUT");trace=this.add.bind(this,"TRACE");onError;onNoMatch;router=new i;constructor(e={}){this.onNoMatch=e.onNoMatch??k,this.onError=e.onError??w;}clone(){let e=new o({onError:this.onError,onNoMatch:this.onNoMatch});return e.router=this.router.clone(),e}handler(){let{routes:e}=this.router;return async(t,s)=>{let n=this.router.find(t.method,q(t));this.prepareRequest(t,n);try{return await(n.fns.length===0||n.middleOnly?this.onNoMatch(t,s,e):i.exec(n.fns,t,s))}catch(r){return await this.onError(r,t,s,e)}}}async run(e,t){let s=this.router.find(e.method,q(e));if(s.fns.length!==0)return this.prepareRequest(e,s),await i.exec(s.fns,e,t)}use(e,...t){return (typeof e=="function"||e instanceof o)&&(t.unshift(e),e="/"),this.router.use(e,...t.map(s=>s instanceof o?s.router:s)),this}add(e,t,s,...n){return typeof t=="string"&&typeof s=="function"?n=[s]:typeof s=="object"?typeof t=="function"?n=[c(s,t)]:n=n.map(r=>c(s,r)):typeof s=="function"&&(n=[s]),this.router.add(e,t,...n),this}prepareRequest(e,t){e.params={...t.params,...e.params};}},v=(o={})=>new m(o);var L=async(o,e)=>{e.statusCode=404,e.end(o.method==="HEAD"?void 0:`Route ${o.method} ${o.url} not found`);},P=async(o,e,t)=>{t.statusCode=500,console.error(o),t.end("Internal Server Error");},y=o=>{let e=o.indexOf("?");return e===-1?o:o.slice(0,Math.max(0,e))},f=class o{all=this.add.bind(this,"");connect=this.add.bind(this,"CONNECT");delete=this.add.bind(this,"DELETE");get=this.add.bind(this,"GET");head=this.add.bind(this,"HEAD");options=this.add.bind(this,"OPTIONS");patch=this.add.bind(this,"PATCH");post=this.add.bind(this,"POST");put=this.add.bind(this,"PUT");trace=this.add.bind(this,"TRACE");onError;onNoMatch;router=new i;constructor(e={}){this.onNoMatch=e.onNoMatch??L,this.onError=e.onError??P;}clone(){let e=new o({onError:this.onError,onNoMatch:this.onNoMatch});return e.router=this.router.clone(),e}handler(){let{routes:e}=this.router;return async(t,s)=>{let n=this.router.find(t.method,y(t.url));this.prepareRequest(t,n);try{await(n.fns.length===0||n.middleOnly?this.onNoMatch(t,s,e):i.exec(n.fns,t,s));}catch(r){await this.onError(r,t,s,e);}}}async run(e,t){let s=this.router.find(e.method,y(e.url));if(s.fns.length!==0)return this.prepareRequest(e,s),await i.exec(s.fns,e,t)}use(e,...t){return (typeof e=="function"||e instanceof o)&&(t.unshift(e),e="/"),this.router.use(e,...t.map(s=>s instanceof o?s.router:s)),this}add(e,t,s,...n){return typeof t=="string"&&typeof s=="function"?n=[s]:typeof s=="object"?typeof t=="function"?n=[c(s,t)]:n=n.map(r=>c(s,r)):typeof s=="function"&&(n=[s]),this.router.add(e,t,...n),this}prepareRequest(e,t){e.params={...t.params,...e.params};}},S=(o={})=>new f(o);var j=(o,e,t)=>{o.setHeader("content-type","application/json; charset=utf-8"),o.statusCode=e,o.end(JSON.stringify(t,null,2));},A=j;
|
|
6
6
|
|
|
7
|
-
export { m as EdgeRouter, f as NodeRouter, i as Router, v as createEdgeRouter, S as createNodeRouter, S as createRouter, N as expressWrapper, A as sendJson,
|
|
7
|
+
export { m as EdgeRouter, f as NodeRouter, i as Router, v as createEdgeRouter, S as createNodeRouter, S as createRouter, N as expressWrapper, A as sendJson, c as withZod };
|
|
8
8
|
//# sourceMappingURL=out.js.map
|
|
9
9
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/adapter/express.ts","../src/adapter/with-zod.ts","../src/router.ts","../src/edge.ts","../src/node.ts","../src/utils/send-json.ts"],"names":["expressWrapper","function_","request","response","next","resolve","reject","error","express_default","createHttpError","ZodError","withZod","schema","handler","transformedRequest","message","issue","with_zod_default","parse","Router","_Router","base","routes","fns","arguments_","index","method","route","keys","pattern","pathname","middleOnly","parameters","isHead","matched","matches","key","parameterKey","stripPathname","result","onNoMatch","onError","getPathname","EdgeRouter","_EdgeRouter","options","r","context_","routeOrFunction","zodOrRouteOrFunction","findResult","createEdgeRouter","_request","url","queryIndex","NodeRouter","_NodeRouter","createRouter","sendJson","statusCode","jsonBody","send_json_default"],"mappings":"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","sourcesContent":["import type { IncomingMessage, ServerResponse } from \"node:http\";\n\nimport type { RequestHandler } from \"../node\";\nimport type { Nextable } from \"../types\";\n\ntype NextFunction = (error?: any) => void;\n\nconst expressWrapper =\n <Request extends IncomingMessage, Response extends ServerResponse>(\n function_: ExpressRequestHandler<Request, Response>,\n ): Nextable<RequestHandler<Request, Response>> =>\n async (request, response, next) =>\n // eslint-disable-next-line compat/compat\n await new Promise<void>((resolve, reject): void => {\n function_(request, response, (error) => (error ? reject(error) : resolve()));\n // eslint-disable-next-line promise/no-callback-in-promise\n }).then<Nextable<RequestHandler<Request, Response>>>(next);\n\nexport type ExpressRequestHandler<Request, Response> = (request: Request, response: Response, next: NextFunction) => void;\n\nexport default expressWrapper;\n","import createHttpError from \"http-errors\";\nimport type { AnyZodObject, ZodObject } from \"zod\";\nimport { ZodError } from \"zod\";\n\nimport type { Nextable, NextHandler } from \"../types\";\n\nconst withZod =\n <Request, Response, Handler extends Nextable<any>, Schema extends ZodObject<{ body?: AnyZodObject; headers?: AnyZodObject; query?: AnyZodObject }>>(\n schema: Schema,\n handler: Handler,\n ): ((request: Request, response: Response, next: NextHandler) => Promise<Response>) =>\n async (request: Request, response: Response, next) => {\n let transformedRequest: Request = request;\n\n try {\n transformedRequest = (await schema.parseAsync(request)) as Request;\n } catch (error: any) {\n let { message } = error as Error;\n\n if (error instanceof ZodError && typeof error.format === \"function\") {\n message = error.issues.map((issue) => `${issue.path.join(\"/\")} - ${issue.message}`).join(\"/n\");\n }\n\n throw createHttpError(422, message);\n }\n\n return handler(transformedRequest, response, next);\n };\n\nexport default withZod;\n","/**\n * Agnostic router class\n * Adapted from lukeed/trouter library:\n * https://github.com/lukeed/trouter/blob/master/index.mjs\n */\nimport { parse } from \"regexparam\";\n\nimport type { FindResult, FunctionLike, HttpMethod, Nextable, RouteMatch } from \"./types\";\n\nexport type Route<H> = {\n fns: (H | Router<H extends FunctionLike ? H : never>)[];\n isMiddleware: boolean;\n method: HttpMethod | \"\";\n} & (\n | {\n keys: string[] | false;\n pattern: RegExp;\n }\n | { matchAll: true }\n);\n\nexport class Router<H extends FunctionLike> {\n public static async exec<FL extends FunctionLike>(fns: (Nextable<FL> | undefined)[], ...arguments_: Parameters<FL>): Promise<any> {\n let index = 0;\n\n const next = () => {\n // eslint-disable-next-line no-plusplus,@typescript-eslint/naming-convention,no-underscore-dangle\n const function_ = fns[++index];\n\n if (function_ === undefined) {\n return Promise.resolve();\n }\n\n return function_(...arguments_, next);\n };\n\n // eslint-disable-next-line security/detect-object-injection\n return (fns[index] as FunctionLike)(...arguments_, next);\n }\n\n public constructor(\n public base = \"/\",\n public routes: Route<Nextable<H>>[] = [],\n ) {}\n\n public add(method: HttpMethod | \"\", route: Nextable<H> | RouteMatch, ...fns: Nextable<H>[]): this {\n if (typeof route === \"function\") {\n fns.unshift(route);\n // eslint-disable-next-line no-param-reassign\n route = \"\";\n }\n\n if (route === \"\") {\n this.routes.push({\n fns,\n isMiddleware: false,\n matchAll: true,\n method,\n });\n } else {\n const { keys, pattern } = parse(route);\n\n this.routes.push({\n fns,\n isMiddleware: false,\n keys,\n method,\n pattern,\n });\n }\n\n return this;\n }\n\n public clone(base?: string): Router<H> {\n return new Router<H>(base, [...this.routes]);\n }\n\n public find(method: HttpMethod, pathname: string): FindResult<H> {\n let middleOnly = true;\n\n const fns: Nextable<H>[] = [];\n const parameters: Record<string, string> = {};\n const isHead = method === \"HEAD\";\n\n // eslint-disable-next-line sonarjs/cognitive-complexity\n Object.values(this.routes).forEach((route) => {\n if (\n route.method !== method &&\n // matches any method\n route.method !== \"\" &&\n // The HEAD method requests that the target resource transfer a representation of its state, as for a GET request...\n !(isHead && route.method === \"GET\")\n ) {\n return;\n }\n\n let matched = false;\n\n if (\"matchAll\" in route) {\n matched = true;\n } else if (route.keys === false) {\n // routes.key is RegExp: https://github.com/lukeed/regexparam/blob/master/src/index.js#L2\n const matches = route.pattern.exec(pathname);\n\n if (matches === null) {\n return;\n }\n\n // eslint-disable-next-line no-void\n if (matches.groups !== void 0) {\n Object.keys(matches.groups).forEach((key) => {\n // @ts-expect-error @TODO: fix this\n // eslint-disable-next-line security/detect-object-injection\n parameters[key] = matches.groups[key] as string;\n });\n }\n\n matched = true;\n } else if (route.keys.length > 0) {\n const matches = route.pattern.exec(pathname);\n\n if (matches === null) {\n return;\n }\n\n // eslint-disable-next-line no-loops/no-loops\n for (let index = 0; index < route.keys.length; ) {\n // eslint-disable-next-line security/detect-object-injection\n const parameterKey = route.keys[index];\n\n // @ts-expect-error @TODO: fix this\n // eslint-disable-next-line no-plusplus,security/detect-object-injection\n parameters[parameterKey] = matches[++index];\n }\n\n matched = true;\n } else if (route.pattern.test(pathname)) {\n matched = true;\n } // else not a match\n\n if (matched) {\n fns.push(\n ...route.fns.flatMap((function_) => {\n if (function_ instanceof Router) {\n const { base } = function_;\n\n let stripPathname = pathname.slice(base.length);\n\n // fix stripped pathname, not sure why this happens\n\n if (!stripPathname.startsWith(\"/\")) {\n stripPathname = `/${stripPathname}`;\n }\n\n // eslint-disable-next-line unicorn/no-array-callback-reference, unicorn/no-array-method-this-argument\n const result = function_.find(method, stripPathname);\n\n if (!result.middleOnly) {\n middleOnly = false;\n }\n\n // merge params\n Object.assign(parameters, result.params);\n\n return result.fns;\n }\n\n return function_;\n }),\n );\n\n if (!route.isMiddleware) {\n middleOnly = false;\n }\n }\n });\n\n return { fns, middleOnly, params: parameters };\n }\n\n public use(base: Nextable<H> | RouteMatch | Router<H>, ...fns: (Nextable<H> | Router<H>)[]): this {\n if (typeof base === \"function\" || base instanceof Router) {\n fns.unshift(base);\n // eslint-disable-next-line no-param-reassign\n base = \"/\";\n }\n // mount subrouter\n // eslint-disable-next-line no-param-reassign\n fns = fns.map((function_) => {\n if (function_ instanceof Router) {\n if (typeof base === \"string\") {\n return function_.clone(base);\n }\n\n throw new Error(\"Mounting a router to RegExp base is not supported\");\n }\n return function_;\n });\n\n const { keys, pattern } = parse(base, true);\n\n this.routes.push({\n fns,\n isMiddleware: true,\n keys,\n method: \"\",\n pattern,\n });\n\n return this;\n }\n}\n","import type { AnyZodObject, ZodObject } from \"zod\";\n\nimport withZod from \"./adapter/with-zod\";\nimport type { Route } from \"./router\";\nimport { Router } from \"./router\";\nimport type {\n FindResult,\n FunctionLike,\n HandlerOptions,\n HttpMethod,\n Nextable,\n RouteMatch,\n RoutesExtendedRequestHandler,\n RouteShortcutMethod,\n ValueOrPromise,\n} from \"./types\";\n\nconst onNoMatch = async (request: Request) =>\n new Response(request.method === \"HEAD\" ? null : `Route ${request.method} ${request.url} not found`, { status: 404 });\n\nconst onError = async (error: unknown) => {\n // eslint-disable-next-line no-console\n console.error(error);\n\n return new Response(\"Internal Server Error\", { status: 500 });\n};\n\nexport const getPathname = (request: Request & { nextUrl?: URL }): string =>\n // eslint-disable-next-line compat/compat\n (request.nextUrl ?? new URL(request.url)).pathname;\n\n// eslint-disable-next-line @typescript-eslint/no-invalid-void-type\nexport type RequestHandler<R extends Request, Context> = (request: R, context_: Context) => ValueOrPromise<Response | void>;\n\nexport class EdgeRouter<R extends Request = Request, Context = unknown, RResponse extends Response = Response, Schema extends AnyZodObject = ZodObject<any>> {\n public all: RouteShortcutMethod<this, Schema, RequestHandler<R, Context>> = this.add.bind(this, \"\");\n\n public connect: RouteShortcutMethod<this, Schema, RequestHandler<R, Context>> = this.add.bind(this, \"CONNECT\");\n\n public delete: RouteShortcutMethod<this, Schema, RequestHandler<R, Context>> = this.add.bind(this, \"DELETE\");\n\n public get: RouteShortcutMethod<this, Schema, RequestHandler<R, Context>> = this.add.bind(this, \"GET\");\n\n public head: RouteShortcutMethod<this, Schema, RequestHandler<R, Context>> = this.add.bind(this, \"HEAD\");\n\n public options: RouteShortcutMethod<this, Schema, RequestHandler<R, Context>> = this.add.bind(this, \"OPTIONS\");\n\n public patch: RouteShortcutMethod<this, Schema, RequestHandler<R, Context>> = this.add.bind(this, \"PATCH\");\n\n public post: RouteShortcutMethod<this, Schema, RequestHandler<R, Context>> = this.add.bind(this, \"POST\");\n\n public put: RouteShortcutMethod<this, Schema, RequestHandler<R, Context>> = this.add.bind(this, \"PUT\");\n\n public trace: RouteShortcutMethod<this, Schema, RequestHandler<R, Context>> = this.add.bind(this, \"TRACE\");\n\n private readonly onError: (\n error: unknown,\n ...arguments_: Parameters<RoutesExtendedRequestHandler<R, Context, RResponse, Route<Nextable<FunctionLike>>[]>>\n ) => ReturnType<RoutesExtendedRequestHandler<R, Context, RResponse, Route<Nextable<FunctionLike>>[]>>;\n\n private readonly onNoMatch: RoutesExtendedRequestHandler<R, Context, RResponse, Route<Nextable<FunctionLike>>[]>;\n\n private router = new Router<RequestHandler<R, Context>>();\n\n public constructor(options: HandlerOptions<RoutesExtendedRequestHandler<R, Context, RResponse, Route<Nextable<FunctionLike>>[]>> = {}) {\n this.onNoMatch = options.onNoMatch ?? (onNoMatch as unknown as RoutesExtendedRequestHandler<R, Context, RResponse, Route<Nextable<FunctionLike>>[]>);\n this.onError =\n options.onError ??\n (onError as unknown as (\n error: unknown,\n ...arguments_: Parameters<RoutesExtendedRequestHandler<R, Context, RResponse, Route<Nextable<FunctionLike>>[]>>\n ) => ReturnType<RoutesExtendedRequestHandler<R, Context, RResponse, Route<Nextable<FunctionLike>>[]>>);\n }\n\n public clone(): EdgeRouter<R, Context, RResponse, Schema> {\n const r = new EdgeRouter<R, Context, RResponse, Schema>({ onError: this.onError, onNoMatch: this.onNoMatch });\n\n r.router = this.router.clone();\n\n return r;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents\n public handler(): (request: R, context_: Context) => Promise<any> | ReturnType<FunctionLike> | ValueOrPromise<RResponse> {\n const { routes } = this.router as Router<FunctionLike>;\n\n return async (request: R, context_: Context): Promise<any> => {\n // eslint-disable-next-line unicorn/no-array-callback-reference,unicorn/no-array-method-this-argument\n const result = this.router.find(request.method as HttpMethod, getPathname(request));\n\n this.prepareRequest(request, result);\n\n try {\n return await (result.fns.length === 0 || result.middleOnly\n ? this.onNoMatch(request, context_, routes)\n : Router.exec(result.fns, request, context_));\n } catch (error) {\n return await this.onError(error, request, context_, routes);\n }\n };\n }\n\n public async run(request: R, context_: Context): Promise<unknown> {\n // eslint-disable-next-line unicorn/no-array-callback-reference,unicorn/no-array-method-this-argument\n const result = this.router.find(request.method as HttpMethod, getPathname(request));\n\n if (result.fns.length === 0) {\n return;\n }\n\n this.prepareRequest(request, result);\n\n // eslint-disable-next-line consistent-return\n return await Router.exec(result.fns, request, context_);\n }\n\n public use(\n base: EdgeRouter<R, Context> | Nextable<RequestHandler<R, Context>> | RouteMatch,\n ...fns: (EdgeRouter<R, Context> | Nextable<RequestHandler<R, Context>>)[]\n ): this {\n if (typeof base === \"function\" || base instanceof EdgeRouter) {\n fns.unshift(base as EdgeRouter<R, Context>);\n // eslint-disable-next-line no-param-reassign\n base = \"/\";\n }\n\n this.router.use(base, ...fns.map((function_) => (function_ instanceof EdgeRouter ? function_.router : function_)));\n\n return this;\n }\n\n private add(\n method: HttpMethod | \"\",\n routeOrFunction: Nextable<RequestHandler<R, Context>> | RouteMatch,\n zodOrRouteOrFunction?: Nextable<RequestHandler<R, Context>> | RouteMatch | Schema,\n ...fns: Nextable<RequestHandler<R, Context>>[]\n ) {\n if (typeof routeOrFunction === \"string\" && typeof zodOrRouteOrFunction === \"function\") {\n // eslint-disable-next-line no-param-reassign\n fns = [zodOrRouteOrFunction];\n } else if (typeof zodOrRouteOrFunction === \"object\") {\n // eslint-disable-next-line unicorn/prefer-ternary\n if (typeof routeOrFunction === \"function\") {\n // eslint-disable-next-line no-param-reassign\n fns = [withZod<R, Context, Nextable<RequestHandler<R, Context>>, Schema>(zodOrRouteOrFunction as Schema, routeOrFunction)];\n } else {\n // eslint-disable-next-line no-param-reassign\n fns = fns.map((function_) => withZod<R, Context, Nextable<RequestHandler<R, Context>>, Schema>(zodOrRouteOrFunction as Schema, function_));\n }\n } else if (typeof zodOrRouteOrFunction === \"function\") {\n // eslint-disable-next-line no-param-reassign\n fns = [zodOrRouteOrFunction];\n }\n\n this.router.add(method, routeOrFunction, ...fns);\n\n return this;\n }\n\n // eslint-disable-next-line class-methods-use-this\n private prepareRequest(request: R & { params?: Record<string, unknown> }, findResult: FindResult<RequestHandler<R, Context>>) {\n request.params = {\n ...findResult.params,\n ...request.params, // original params will take precedence\n };\n }\n}\n\nexport const createEdgeRouter = <R extends Request, Context>(\n options: HandlerOptions<RoutesExtendedRequestHandler<R, Context, Response, Route<Nextable<FunctionLike>>[]>> = {},\n): EdgeRouter<R, Context> => new EdgeRouter<R, Context, Response>(options);\n","import type { IncomingMessage, ServerResponse } from \"node:http\";\n\nimport type { AnyZodObject, ZodObject } from \"zod\";\n\nimport withZod from \"./adapter/with-zod\";\nimport type { Route } from \"./router\";\nimport { Router } from \"./router\";\nimport type {\n FindResult,\n FunctionLike,\n HandlerOptions,\n HttpMethod,\n Nextable,\n RouteMatch,\n RoutesExtendedRequestHandler,\n RouteShortcutMethod,\n ValueOrPromise,\n} from \"./types\";\n\nconst onNoMatch = async (request: IncomingMessage, response: ServerResponse) => {\n response.statusCode = 404;\n response.end(request.method === \"HEAD\" ? undefined : `Route ${request.method} ${request.url} not found`);\n};\n\nconst onError = async (error: unknown, _request: IncomingMessage, response: ServerResponse) => {\n response.statusCode = 500;\n\n // eslint-disable-next-line no-console\n console.error(error);\n\n response.end(\"Internal Server Error\");\n};\n\nexport const getPathname = (url: string): string => {\n const queryIndex = url.indexOf(\"?\");\n\n return queryIndex === -1 ? url : url.slice(0, Math.max(0, queryIndex));\n};\n\nexport type RequestHandler<Request extends IncomingMessage, Response extends ServerResponse> = (request: Request, response: Response) => ValueOrPromise<void>;\n\nexport class NodeRouter<\n Request extends IncomingMessage = IncomingMessage,\n Response extends ServerResponse = ServerResponse,\n Schema extends AnyZodObject = ZodObject<never>,\n> {\n public all: RouteShortcutMethod<this, Schema, RequestHandler<Request, Response>> = this.add.bind(this, \"\");\n\n public connect: RouteShortcutMethod<this, Schema, RequestHandler<Request, Response>> = this.add.bind(this, \"CONNECT\");\n\n public delete: RouteShortcutMethod<this, Schema, RequestHandler<Request, Response>> = this.add.bind(this, \"DELETE\");\n\n public get: RouteShortcutMethod<this, Schema, RequestHandler<Request, Response>> = this.add.bind(this, \"GET\");\n\n public head: RouteShortcutMethod<this, Schema, RequestHandler<Request, Response>> = this.add.bind(this, \"HEAD\");\n\n public options: RouteShortcutMethod<this, Schema, RequestHandler<Request, Response>> = this.add.bind(this, \"OPTIONS\");\n\n public patch: RouteShortcutMethod<this, Schema, RequestHandler<Request, Response>> = this.add.bind(this, \"PATCH\");\n\n public post: RouteShortcutMethod<this, Schema, RequestHandler<Request, Response>> = this.add.bind(this, \"POST\");\n\n public put: RouteShortcutMethod<this, Schema, RequestHandler<Request, Response>> = this.add.bind(this, \"PUT\");\n\n public trace: RouteShortcutMethod<this, Schema, RequestHandler<Request, Response>> = this.add.bind(this, \"TRACE\");\n\n private readonly onError: (\n error: unknown,\n ...arguments_: Parameters<RoutesExtendedRequestHandler<Request, Response, Response, Route<Nextable<FunctionLike>>[]>>\n ) => ReturnType<RoutesExtendedRequestHandler<Request, Response, Response, Route<Nextable<FunctionLike>>[]>>;\n\n private readonly onNoMatch: RoutesExtendedRequestHandler<Request, Response, Response, Route<Nextable<FunctionLike>>[]>;\n\n private router = new Router<RequestHandler<Request, Response>>();\n\n public constructor(options: HandlerOptions<RoutesExtendedRequestHandler<Request, Response, Response, Route<Nextable<FunctionLike>>[]>> = {}) {\n this.onNoMatch = options.onNoMatch ?? onNoMatch;\n this.onError = options.onError ?? onError;\n }\n\n public clone(): NodeRouter<Request, Response, Schema> {\n const r = new NodeRouter<Request, Response, Schema>({ onError: this.onError, onNoMatch: this.onNoMatch });\n\n r.router = this.router.clone();\n\n return r;\n }\n\n public handler(): (request: Request, response: Response) => Promise<void> {\n const { routes } = this.router as Router<FunctionLike>;\n\n return async (request: Request, response: Response) => {\n // eslint-disable-next-line unicorn/no-array-callback-reference,unicorn/no-array-method-this-argument\n const result = this.router.find(request.method as HttpMethod, getPathname(request.url as string));\n\n this.prepareRequest(request, result);\n\n try {\n await (result.fns.length === 0 || result.middleOnly ? this.onNoMatch(request, response, routes) : Router.exec(result.fns, request, response));\n } catch (error) {\n await this.onError(error, request, response, routes);\n }\n };\n }\n\n public async run(request: Request, response: Response): Promise<unknown> {\n // eslint-disable-next-line unicorn/no-array-callback-reference,unicorn/no-array-method-this-argument\n const result = this.router.find(request.method as HttpMethod, getPathname(request.url as string));\n\n if (result.fns.length === 0) {\n return;\n }\n\n this.prepareRequest(request, result);\n\n // eslint-disable-next-line consistent-return\n return await Router.exec(result.fns, request, response);\n }\n\n public use(\n base: Nextable<RequestHandler<Request, Response>> | NodeRouter<Request, Response, Schema> | RouteMatch,\n ...fns: (Nextable<RequestHandler<Request, Response>> | NodeRouter<Request, Response, Schema>)[]\n ): this {\n if (typeof base === \"function\" || base instanceof NodeRouter) {\n fns.unshift(base);\n // eslint-disable-next-line no-param-reassign\n base = \"/\";\n }\n\n this.router.use(base, ...fns.map((function_) => (function_ instanceof NodeRouter ? function_.router : function_)));\n\n return this;\n }\n\n private add(\n method: HttpMethod | \"\",\n routeOrFunction: Nextable<RequestHandler<Request, Response>> | RouteMatch,\n zodOrRouteOrFunction?: Nextable<RequestHandler<Request, Response>> | RouteMatch | Schema,\n ...fns: Nextable<RequestHandler<Request, Response>>[]\n ) {\n if (typeof routeOrFunction === \"string\" && typeof zodOrRouteOrFunction === \"function\") {\n // eslint-disable-next-line no-param-reassign\n fns = [zodOrRouteOrFunction];\n } else if (typeof zodOrRouteOrFunction === \"object\") {\n if (typeof routeOrFunction === \"function\") {\n // eslint-disable-next-line no-param-reassign\n fns = [withZod<Request, Response, Nextable<RequestHandler<Request, Response>>, Schema>(zodOrRouteOrFunction as Schema, routeOrFunction)];\n } else {\n // eslint-disable-next-line no-param-reassign\n fns = fns.map((function_) =>\n withZod<Request, Response, Nextable<RequestHandler<Request, Response>>, Schema>(zodOrRouteOrFunction as Schema, function_),\n );\n }\n } else if (typeof zodOrRouteOrFunction === \"function\") {\n // eslint-disable-next-line no-param-reassign\n fns = [zodOrRouteOrFunction];\n }\n\n this.router.add(method, routeOrFunction, ...fns);\n\n return this;\n }\n\n // eslint-disable-next-line class-methods-use-this\n private prepareRequest(request: Request & { params?: Record<string, unknown> }, findResult: FindResult<RequestHandler<Request, Response>>) {\n request.params = {\n ...findResult.params,\n ...request.params, // original params will take precedence\n };\n }\n}\n\nexport const createRouter = <\n Request extends IncomingMessage,\n Response extends ServerResponse,\n Schema extends AnyZodObject = ZodObject<{ body?: AnyZodObject; headers?: AnyZodObject; query?: AnyZodObject }>,\n>(\n options: HandlerOptions<RoutesExtendedRequestHandler<Request, Response, Response, Route<Nextable<FunctionLike>>[]>> = {},\n): NodeRouter<Request, Response, Schema> => new NodeRouter<Request, Response, Schema>(options);\n","import type { ServerResponse } from \"node:http\";\n\n/**\n * Send `JSON` object\n * @param {ServerResponse} response response object\n * @param {number} statusCode\n * @param {any} jsonBody of data\n */\nconst sendJson = (response: ServerResponse, statusCode: number, jsonBody: unknown): void => {\n // Set header to application/json\n response.setHeader(\"content-type\", \"application/json; charset=utf-8\");\n\n response.statusCode = statusCode;\n response.end(JSON.stringify(jsonBody, null, 2));\n};\n\nexport default sendJson;\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/adapter/express.ts","../src/adapter/with-zod.ts","../src/router.ts","../src/edge.ts","../src/node.ts","../src/utils/send-json.ts"],"names":["expressWrapper","function_","request","response","next","resolve","reject","error","express_default","createHttpError","ZodError","withZod","schema","handler","transformedRequest","message","issue","with_zod_default","parse","Router","_Router","base","routes","fns","arguments_","index","method","route","keys","pattern","pathname","middleOnly","parameters","isHead","matched","matches","key","parameterKey","stripPathname","result","onNoMatch","onError","getPathname","EdgeRouter","_EdgeRouter","options","r","context_","routeOrFunction","zodOrRouteOrFunction","findResult","createEdgeRouter","_request","url","queryIndex","NodeRouter","_NodeRouter","createRouter","sendJson","statusCode","jsonBody","send_json_default"],"mappings":"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","sourcesContent":["import type { IncomingMessage, ServerResponse } from \"node:http\";\n\nimport type { RequestHandler } from \"../node\";\nimport type { Nextable } from \"../types\";\n\ntype NextFunction = (error?: any) => void;\n\nconst expressWrapper =\n <Request extends IncomingMessage, Response extends ServerResponse>(\n function_: ExpressRequestHandler<Request, Response>,\n ): Nextable<RequestHandler<Request, Response>> =>\n async (request, response, next) =>\n // eslint-disable-next-line compat/compat\n await new Promise<void>((resolve, reject): void => {\n function_(request, response, (error) => (error ? reject(error) : resolve()));\n // eslint-disable-next-line promise/no-callback-in-promise\n }).then<Nextable<RequestHandler<Request, Response>>>(next);\n\nexport type ExpressRequestHandler<Request, Response> = (request: Request, response: Response, next: NextFunction) => void;\n\nexport default expressWrapper;\n","import createHttpError from \"http-errors\";\nimport type { AnyZodObject, ZodObject } from \"zod\";\nimport { ZodError } from \"zod\";\n\nimport type { Nextable, NextHandler } from \"../types\";\n\nconst withZod =\n <Request, Response, Handler extends Nextable<any>, Schema extends ZodObject<{ body?: AnyZodObject; headers?: AnyZodObject; query?: AnyZodObject }>>(\n schema: Schema,\n handler: Handler,\n ): ((request: Request, response: Response, next: NextHandler) => Promise<Response>) =>\n async (request: Request, response: Response, next) => {\n let transformedRequest: Request = request;\n\n try {\n transformedRequest = (await schema.parseAsync(request)) as Request;\n } catch (error: any) {\n let { message } = error as Error;\n\n if (error instanceof ZodError && typeof error.format === \"function\") {\n message = error.issues.map((issue) => `${issue.path.join(\"/\")} - ${issue.message}`).join(\"/n\");\n }\n\n throw createHttpError(422, message);\n }\n\n return handler(transformedRequest, response, next);\n };\n\nexport default withZod;\n","/**\n * Agnostic router class\n * Adapted from lukeed/trouter library:\n * https://github.com/lukeed/trouter/blob/master/index.mjs\n */\nimport { parse } from \"regexparam\";\n\nimport type { FindResult, FunctionLike, HttpMethod, Nextable, RouteMatch } from \"./types\";\n\nexport type Route<H> = {\n fns: (H | Router<H extends FunctionLike ? H : never>)[];\n isMiddleware: boolean;\n method: HttpMethod | \"\";\n} & (\n | {\n keys: string[] | false;\n pattern: RegExp;\n }\n | { matchAll: true }\n);\n\nexport class Router<H extends FunctionLike> {\n public static async exec<FL extends FunctionLike>(fns: (Nextable<FL> | undefined)[], ...arguments_: Parameters<FL>): Promise<any> {\n let index = 0;\n\n const next = () => {\n // eslint-disable-next-line no-plusplus,@typescript-eslint/naming-convention,no-underscore-dangle\n const function_ = fns[++index];\n\n if (function_ === undefined) {\n return Promise.resolve();\n }\n\n return function_(...arguments_, next);\n };\n\n // eslint-disable-next-line security/detect-object-injection\n return (fns[index] as FunctionLike)(...arguments_, next);\n }\n\n public constructor(\n public base = \"/\",\n public routes: Route<Nextable<H>>[] = [],\n ) {}\n\n public add(method: HttpMethod | \"\", route: Nextable<H> | RouteMatch, ...fns: Nextable<H>[]): this {\n if (typeof route === \"function\") {\n fns.unshift(route);\n // eslint-disable-next-line no-param-reassign\n route = \"\";\n }\n\n if (route === \"\") {\n this.routes.push({\n fns,\n isMiddleware: false,\n matchAll: true,\n method,\n });\n } else {\n const { keys, pattern } = parse(route);\n\n this.routes.push({\n fns,\n isMiddleware: false,\n keys,\n method,\n pattern,\n });\n }\n\n return this;\n }\n\n public clone(base?: string): Router<H> {\n return new Router<H>(base, [...this.routes]);\n }\n\n // eslint-disable-next-line sonarjs/cognitive-complexity\n public find(method: HttpMethod, pathname: string): FindResult<H> {\n let middleOnly = true;\n\n const fns: Nextable<H>[] = [];\n const parameters: Record<string, string> = {};\n const isHead = method === \"HEAD\";\n\n // eslint-disable-next-line no-loops/no-loops,no-restricted-syntax\n for (const route of this.routes) {\n if (\n route.method !== method &&\n // matches any method\n route.method !== \"\" &&\n // The HEAD method requests that the target resource transfer a representation of its state, as for a GET request...\n !(isHead && route.method === \"GET\")\n ) {\n // eslint-disable-next-line no-continue\n continue;\n }\n\n let matched = false;\n\n if (\"matchAll\" in route) {\n matched = true;\n } else if (route.keys === false) {\n // routes.key is RegExp: https://github.com/lukeed/regexparam/blob/master/src/index.js#L2\n const matches = route.pattern.exec(pathname);\n\n if (matches === null) {\n // eslint-disable-next-line no-continue\n continue;\n }\n\n // eslint-disable-next-line no-void\n if (matches.groups !== void 0) {\n Object.keys(matches.groups).forEach((key) => {\n // @ts-expect-error @TODO: fix this\n // eslint-disable-next-line security/detect-object-injection\n parameters[key] = matches.groups[key] as string;\n });\n }\n\n matched = true;\n } else if (route.keys.length > 0) {\n const matches = route.pattern.exec(pathname);\n\n if (matches === null) {\n // eslint-disable-next-line no-continue\n continue;\n }\n\n // eslint-disable-next-line no-loops/no-loops\n for (let index = 0; index < route.keys.length; ) {\n // eslint-disable-next-line security/detect-object-injection\n const parameterKey = route.keys[index];\n\n // @ts-expect-error @TODO: fix this\n // eslint-disable-next-line no-plusplus,security/detect-object-injection\n parameters[parameterKey] = matches[++index];\n }\n\n matched = true;\n } else if (route.pattern.test(pathname)) {\n matched = true;\n } // else not a match\n\n if (matched) {\n fns.push(\n // eslint-disable-next-line @typescript-eslint/no-loop-func\n ...route.fns.flatMap((function_) => {\n if (function_ instanceof Router) {\n const { base } = function_;\n\n let stripPathname = pathname.slice(base.length);\n\n // fix stripped pathname, not sure why this happens\n\n if (!stripPathname.startsWith(\"/\")) {\n stripPathname = `/${stripPathname}`;\n }\n\n // eslint-disable-next-line unicorn/no-array-callback-reference, unicorn/no-array-method-this-argument\n const result = function_.find(method, stripPathname);\n\n if (!result.middleOnly) {\n middleOnly = false;\n }\n\n // merge params\n Object.assign(parameters, result.params);\n\n return result.fns;\n }\n\n return function_;\n }),\n );\n\n if (!route.isMiddleware) {\n middleOnly = false;\n }\n }\n }\n\n return { fns, middleOnly, params: parameters };\n }\n\n public use(base: Nextable<H> | RouteMatch | Router<H>, ...fns: (Nextable<H> | Router<H>)[]): this {\n if (typeof base === \"function\" || base instanceof Router) {\n fns.unshift(base);\n // eslint-disable-next-line no-param-reassign\n base = \"/\";\n }\n // mount subrouter\n // eslint-disable-next-line no-param-reassign\n fns = fns.map((function_) => {\n if (function_ instanceof Router) {\n if (typeof base === \"string\") {\n return function_.clone(base);\n }\n\n throw new Error(\"Mounting a router to RegExp base is not supported\");\n }\n return function_;\n });\n\n const { keys, pattern } = parse(base, true);\n\n this.routes.push({\n fns,\n isMiddleware: true,\n keys,\n method: \"\",\n pattern,\n });\n\n return this;\n }\n}\n","import type { AnyZodObject, ZodObject } from \"zod\";\n\nimport withZod from \"./adapter/with-zod\";\nimport type { Route } from \"./router\";\nimport { Router } from \"./router\";\nimport type {\n FindResult,\n FunctionLike,\n HandlerOptions,\n HttpMethod,\n Nextable,\n RouteMatch,\n RoutesExtendedRequestHandler,\n RouteShortcutMethod,\n ValueOrPromise,\n} from \"./types\";\n\nconst onNoMatch = async (request: Request) =>\n new Response(request.method === \"HEAD\" ? null : `Route ${request.method} ${request.url} not found`, { status: 404 });\n\nconst onError = async (error: unknown) => {\n // eslint-disable-next-line no-console\n console.error(error);\n\n return new Response(\"Internal Server Error\", { status: 500 });\n};\n\nexport const getPathname = (request: Request & { nextUrl?: URL }): string =>\n // eslint-disable-next-line compat/compat\n (request.nextUrl ?? new URL(request.url)).pathname;\n\n// eslint-disable-next-line @typescript-eslint/no-invalid-void-type\nexport type RequestHandler<R extends Request, Context> = (request: R, context_: Context) => ValueOrPromise<Response | void>;\n\nexport class EdgeRouter<R extends Request = Request, Context = unknown, RResponse extends Response = Response, Schema extends AnyZodObject = ZodObject<any>> {\n public all: RouteShortcutMethod<this, Schema, RequestHandler<R, Context>> = this.add.bind(this, \"\");\n\n public connect: RouteShortcutMethod<this, Schema, RequestHandler<R, Context>> = this.add.bind(this, \"CONNECT\");\n\n public delete: RouteShortcutMethod<this, Schema, RequestHandler<R, Context>> = this.add.bind(this, \"DELETE\");\n\n public get: RouteShortcutMethod<this, Schema, RequestHandler<R, Context>> = this.add.bind(this, \"GET\");\n\n public head: RouteShortcutMethod<this, Schema, RequestHandler<R, Context>> = this.add.bind(this, \"HEAD\");\n\n public options: RouteShortcutMethod<this, Schema, RequestHandler<R, Context>> = this.add.bind(this, \"OPTIONS\");\n\n public patch: RouteShortcutMethod<this, Schema, RequestHandler<R, Context>> = this.add.bind(this, \"PATCH\");\n\n public post: RouteShortcutMethod<this, Schema, RequestHandler<R, Context>> = this.add.bind(this, \"POST\");\n\n public put: RouteShortcutMethod<this, Schema, RequestHandler<R, Context>> = this.add.bind(this, \"PUT\");\n\n public trace: RouteShortcutMethod<this, Schema, RequestHandler<R, Context>> = this.add.bind(this, \"TRACE\");\n\n private readonly onError: (\n error: unknown,\n ...arguments_: Parameters<RoutesExtendedRequestHandler<R, Context, RResponse, Route<Nextable<FunctionLike>>[]>>\n ) => ReturnType<RoutesExtendedRequestHandler<R, Context, RResponse, Route<Nextable<FunctionLike>>[]>>;\n\n private readonly onNoMatch: RoutesExtendedRequestHandler<R, Context, RResponse, Route<Nextable<FunctionLike>>[]>;\n\n private router = new Router<RequestHandler<R, Context>>();\n\n public constructor(options: HandlerOptions<RoutesExtendedRequestHandler<R, Context, RResponse, Route<Nextable<FunctionLike>>[]>> = {}) {\n this.onNoMatch = options.onNoMatch ?? (onNoMatch as unknown as RoutesExtendedRequestHandler<R, Context, RResponse, Route<Nextable<FunctionLike>>[]>);\n this.onError =\n options.onError ??\n (onError as unknown as (\n error: unknown,\n ...arguments_: Parameters<RoutesExtendedRequestHandler<R, Context, RResponse, Route<Nextable<FunctionLike>>[]>>\n ) => ReturnType<RoutesExtendedRequestHandler<R, Context, RResponse, Route<Nextable<FunctionLike>>[]>>);\n }\n\n public clone(): EdgeRouter<R, Context, RResponse, Schema> {\n const r = new EdgeRouter<R, Context, RResponse, Schema>({ onError: this.onError, onNoMatch: this.onNoMatch });\n\n r.router = this.router.clone();\n\n return r;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents\n public handler(): (request: R, context_: Context) => Promise<any> | ReturnType<FunctionLike> | ValueOrPromise<RResponse> {\n const { routes } = this.router as Router<FunctionLike>;\n\n return async (request: R, context_: Context): Promise<any> => {\n // eslint-disable-next-line unicorn/no-array-callback-reference,unicorn/no-array-method-this-argument\n const result = this.router.find(request.method as HttpMethod, getPathname(request));\n\n this.prepareRequest(request, result);\n\n try {\n return await (result.fns.length === 0 || result.middleOnly\n ? this.onNoMatch(request, context_, routes)\n : Router.exec(result.fns, request, context_));\n } catch (error) {\n return await this.onError(error, request, context_, routes);\n }\n };\n }\n\n public async run(request: R, context_: Context): Promise<unknown> {\n // eslint-disable-next-line unicorn/no-array-callback-reference,unicorn/no-array-method-this-argument\n const result = this.router.find(request.method as HttpMethod, getPathname(request));\n\n if (result.fns.length === 0) {\n return;\n }\n\n this.prepareRequest(request, result);\n\n // eslint-disable-next-line consistent-return\n return await Router.exec(result.fns, request, context_);\n }\n\n public use(\n base: EdgeRouter<R, Context> | Nextable<RequestHandler<R, Context>> | RouteMatch,\n ...fns: (EdgeRouter<R, Context> | Nextable<RequestHandler<R, Context>>)[]\n ): this {\n if (typeof base === \"function\" || base instanceof EdgeRouter) {\n fns.unshift(base as EdgeRouter<R, Context>);\n // eslint-disable-next-line no-param-reassign\n base = \"/\";\n }\n\n this.router.use(base, ...fns.map((function_) => (function_ instanceof EdgeRouter ? function_.router : function_)));\n\n return this;\n }\n\n private add(\n method: HttpMethod | \"\",\n routeOrFunction: Nextable<RequestHandler<R, Context>> | RouteMatch,\n zodOrRouteOrFunction?: Nextable<RequestHandler<R, Context>> | RouteMatch | Schema,\n ...fns: Nextable<RequestHandler<R, Context>>[]\n ) {\n if (typeof routeOrFunction === \"string\" && typeof zodOrRouteOrFunction === \"function\") {\n // eslint-disable-next-line no-param-reassign\n fns = [zodOrRouteOrFunction];\n } else if (typeof zodOrRouteOrFunction === \"object\") {\n // eslint-disable-next-line unicorn/prefer-ternary\n if (typeof routeOrFunction === \"function\") {\n // eslint-disable-next-line no-param-reassign\n fns = [withZod<R, Context, Nextable<RequestHandler<R, Context>>, Schema>(zodOrRouteOrFunction as Schema, routeOrFunction)];\n } else {\n // eslint-disable-next-line no-param-reassign\n fns = fns.map((function_) => withZod<R, Context, Nextable<RequestHandler<R, Context>>, Schema>(zodOrRouteOrFunction as Schema, function_));\n }\n } else if (typeof zodOrRouteOrFunction === \"function\") {\n // eslint-disable-next-line no-param-reassign\n fns = [zodOrRouteOrFunction];\n }\n\n this.router.add(method, routeOrFunction, ...fns);\n\n return this;\n }\n\n // eslint-disable-next-line class-methods-use-this\n private prepareRequest(request: R & { params?: Record<string, unknown> }, findResult: FindResult<RequestHandler<R, Context>>) {\n request.params = {\n ...findResult.params,\n ...request.params, // original params will take precedence\n };\n }\n}\n\nexport const createEdgeRouter = <R extends Request, Context>(\n options: HandlerOptions<RoutesExtendedRequestHandler<R, Context, Response, Route<Nextable<FunctionLike>>[]>> = {},\n): EdgeRouter<R, Context> => new EdgeRouter<R, Context, Response>(options);\n","import type { IncomingMessage, ServerResponse } from \"node:http\";\n\nimport type { AnyZodObject, ZodObject } from \"zod\";\n\nimport withZod from \"./adapter/with-zod\";\nimport type { Route } from \"./router\";\nimport { Router } from \"./router\";\nimport type {\n FindResult,\n FunctionLike,\n HandlerOptions,\n HttpMethod,\n Nextable,\n RouteMatch,\n RoutesExtendedRequestHandler,\n RouteShortcutMethod,\n ValueOrPromise,\n} from \"./types\";\n\nconst onNoMatch = async (request: IncomingMessage, response: ServerResponse) => {\n response.statusCode = 404;\n response.end(request.method === \"HEAD\" ? undefined : `Route ${request.method} ${request.url} not found`);\n};\n\nconst onError = async (error: unknown, _request: IncomingMessage, response: ServerResponse) => {\n response.statusCode = 500;\n\n // eslint-disable-next-line no-console\n console.error(error);\n\n response.end(\"Internal Server Error\");\n};\n\nexport const getPathname = (url: string): string => {\n const queryIndex = url.indexOf(\"?\");\n\n return queryIndex === -1 ? url : url.slice(0, Math.max(0, queryIndex));\n};\n\nexport type RequestHandler<Request extends IncomingMessage, Response extends ServerResponse> = (request: Request, response: Response) => ValueOrPromise<void>;\n\nexport class NodeRouter<\n Request extends IncomingMessage = IncomingMessage,\n Response extends ServerResponse = ServerResponse,\n Schema extends AnyZodObject = ZodObject<never>,\n> {\n public all: RouteShortcutMethod<this, Schema, RequestHandler<Request, Response>> = this.add.bind(this, \"\");\n\n public connect: RouteShortcutMethod<this, Schema, RequestHandler<Request, Response>> = this.add.bind(this, \"CONNECT\");\n\n public delete: RouteShortcutMethod<this, Schema, RequestHandler<Request, Response>> = this.add.bind(this, \"DELETE\");\n\n public get: RouteShortcutMethod<this, Schema, RequestHandler<Request, Response>> = this.add.bind(this, \"GET\");\n\n public head: RouteShortcutMethod<this, Schema, RequestHandler<Request, Response>> = this.add.bind(this, \"HEAD\");\n\n public options: RouteShortcutMethod<this, Schema, RequestHandler<Request, Response>> = this.add.bind(this, \"OPTIONS\");\n\n public patch: RouteShortcutMethod<this, Schema, RequestHandler<Request, Response>> = this.add.bind(this, \"PATCH\");\n\n public post: RouteShortcutMethod<this, Schema, RequestHandler<Request, Response>> = this.add.bind(this, \"POST\");\n\n public put: RouteShortcutMethod<this, Schema, RequestHandler<Request, Response>> = this.add.bind(this, \"PUT\");\n\n public trace: RouteShortcutMethod<this, Schema, RequestHandler<Request, Response>> = this.add.bind(this, \"TRACE\");\n\n private readonly onError: (\n error: unknown,\n ...arguments_: Parameters<RoutesExtendedRequestHandler<Request, Response, Response, Route<Nextable<FunctionLike>>[]>>\n ) => ReturnType<RoutesExtendedRequestHandler<Request, Response, Response, Route<Nextable<FunctionLike>>[]>>;\n\n private readonly onNoMatch: RoutesExtendedRequestHandler<Request, Response, Response, Route<Nextable<FunctionLike>>[]>;\n\n private router = new Router<RequestHandler<Request, Response>>();\n\n public constructor(options: HandlerOptions<RoutesExtendedRequestHandler<Request, Response, Response, Route<Nextable<FunctionLike>>[]>> = {}) {\n this.onNoMatch = options.onNoMatch ?? onNoMatch;\n this.onError = options.onError ?? onError;\n }\n\n public clone(): NodeRouter<Request, Response, Schema> {\n const r = new NodeRouter<Request, Response, Schema>({ onError: this.onError, onNoMatch: this.onNoMatch });\n\n r.router = this.router.clone();\n\n return r;\n }\n\n public handler(): (request: Request, response: Response) => Promise<void> {\n const { routes } = this.router as Router<FunctionLike>;\n\n return async (request: Request, response: Response) => {\n // eslint-disable-next-line unicorn/no-array-callback-reference,unicorn/no-array-method-this-argument\n const result = this.router.find(request.method as HttpMethod, getPathname(request.url as string));\n\n this.prepareRequest(request, result);\n\n try {\n await (result.fns.length === 0 || result.middleOnly ? this.onNoMatch(request, response, routes) : Router.exec(result.fns, request, response));\n } catch (error) {\n await this.onError(error, request, response, routes);\n }\n };\n }\n\n public async run(request: Request, response: Response): Promise<unknown> {\n // eslint-disable-next-line unicorn/no-array-callback-reference,unicorn/no-array-method-this-argument\n const result = this.router.find(request.method as HttpMethod, getPathname(request.url as string));\n\n if (result.fns.length === 0) {\n return;\n }\n\n this.prepareRequest(request, result);\n\n // eslint-disable-next-line consistent-return\n return await Router.exec(result.fns, request, response);\n }\n\n public use(\n base: Nextable<RequestHandler<Request, Response>> | NodeRouter<Request, Response, Schema> | RouteMatch,\n ...fns: (Nextable<RequestHandler<Request, Response>> | NodeRouter<Request, Response, Schema>)[]\n ): this {\n if (typeof base === \"function\" || base instanceof NodeRouter) {\n fns.unshift(base);\n // eslint-disable-next-line no-param-reassign\n base = \"/\";\n }\n\n this.router.use(base, ...fns.map((function_) => (function_ instanceof NodeRouter ? function_.router : function_)));\n\n return this;\n }\n\n private add(\n method: HttpMethod | \"\",\n routeOrFunction: Nextable<RequestHandler<Request, Response>> | RouteMatch,\n zodOrRouteOrFunction?: Nextable<RequestHandler<Request, Response>> | RouteMatch | Schema,\n ...fns: Nextable<RequestHandler<Request, Response>>[]\n ) {\n if (typeof routeOrFunction === \"string\" && typeof zodOrRouteOrFunction === \"function\") {\n // eslint-disable-next-line no-param-reassign\n fns = [zodOrRouteOrFunction];\n } else if (typeof zodOrRouteOrFunction === \"object\") {\n if (typeof routeOrFunction === \"function\") {\n // eslint-disable-next-line no-param-reassign\n fns = [withZod<Request, Response, Nextable<RequestHandler<Request, Response>>, Schema>(zodOrRouteOrFunction as Schema, routeOrFunction)];\n } else {\n // eslint-disable-next-line no-param-reassign\n fns = fns.map((function_) =>\n withZod<Request, Response, Nextable<RequestHandler<Request, Response>>, Schema>(zodOrRouteOrFunction as Schema, function_),\n );\n }\n } else if (typeof zodOrRouteOrFunction === \"function\") {\n // eslint-disable-next-line no-param-reassign\n fns = [zodOrRouteOrFunction];\n }\n\n this.router.add(method, routeOrFunction, ...fns);\n\n return this;\n }\n\n // eslint-disable-next-line class-methods-use-this\n private prepareRequest(request: Request & { params?: Record<string, unknown> }, findResult: FindResult<RequestHandler<Request, Response>>) {\n request.params = {\n ...findResult.params,\n ...request.params, // original params will take precedence\n };\n }\n}\n\nexport const createRouter = <\n Request extends IncomingMessage,\n Response extends ServerResponse,\n Schema extends AnyZodObject = ZodObject<{ body?: AnyZodObject; headers?: AnyZodObject; query?: AnyZodObject }>,\n>(\n options: HandlerOptions<RoutesExtendedRequestHandler<Request, Response, Response, Route<Nextable<FunctionLike>>[]>> = {},\n): NodeRouter<Request, Response, Schema> => new NodeRouter<Request, Response, Schema>(options);\n","import type { ServerResponse } from \"node:http\";\n\n/**\n * Send `JSON` object\n * @param {ServerResponse} response response object\n * @param {number} statusCode\n * @param {any} jsonBody of data\n */\nconst sendJson = (response: ServerResponse, statusCode: number, jsonBody: unknown): void => {\n // Set header to application/json\n response.setHeader(\"content-type\", \"application/json; charset=utf-8\");\n\n response.statusCode = statusCode;\n response.end(JSON.stringify(jsonBody, null, 2));\n};\n\nexport default sendJson;\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@visulima/connect",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "3.0.0",
|
|
4
4
|
"description": "The minimal router and middleware layer for Next.js, Micro, Vercel, or Node.js http/http2 with support for zod validation.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"javascript",
|
|
@@ -80,17 +80,17 @@
|
|
|
80
80
|
},
|
|
81
81
|
"dependencies": {
|
|
82
82
|
"http-errors": "^2.0.0",
|
|
83
|
-
"regexparam": "^
|
|
83
|
+
"regexparam": "^3.0.0"
|
|
84
84
|
},
|
|
85
85
|
"devDependencies": {
|
|
86
86
|
"@anolilab/eslint-config": "^15.0.3",
|
|
87
87
|
"@anolilab/prettier-config": "^5.0.14",
|
|
88
88
|
"@anolilab/semantic-release-preset": "^8.0.3",
|
|
89
|
-
"@babel/core": "^7.
|
|
89
|
+
"@babel/core": "^7.24.0",
|
|
90
90
|
"@rushstack/eslint-plugin-security": "^0.8.1",
|
|
91
91
|
"@types/http-errors": "^2.0.4",
|
|
92
92
|
"@types/node": "18.18.14",
|
|
93
|
-
"@visulima/nextra-theme-docs": "4.0.
|
|
93
|
+
"@visulima/nextra-theme-docs": "4.0.15",
|
|
94
94
|
"@vitest/coverage-v8": "^1.3.1",
|
|
95
95
|
"@vitest/ui": "^1.3.1",
|
|
96
96
|
"cross-env": "^7.0.3",
|
|
@@ -102,8 +102,8 @@
|
|
|
102
102
|
"eslint-plugin-vitest": "^0.3.22",
|
|
103
103
|
"eslint-plugin-vitest-globals": "^1.4.0",
|
|
104
104
|
"eslint-plugin-zod": "^1.4.0",
|
|
105
|
-
"express": "^4.18.
|
|
106
|
-
"fastify": "^4.26.
|
|
105
|
+
"express": "^4.18.3",
|
|
106
|
+
"fastify": "^4.26.2",
|
|
107
107
|
"isomorphic-fetch": "^3.0.0",
|
|
108
108
|
"prettier": "^3.2.5",
|
|
109
109
|
"rimraf": "^5.0.5",
|