@visulima/connect 1.3.2 → 1.3.4

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 CHANGED
@@ -1,3 +1,19 @@
1
+ ## @visulima/connect [1.3.4](https://github.com/visulima/visulima/compare/@visulima/connect@1.3.3...@visulima/connect@1.3.4) (2023-05-25)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * chore updated the deps and the engine to allow node v20 ([c8607af](https://github.com/visulima/visulima/commit/c8607afe426f4940dc00dfcbf2baa0f635d68a6b))
7
+ * fixed all calls to radar with sonarjs, removed radar eslint package ([001aecf](https://github.com/visulima/visulima/commit/001aecf78dde134bade44f382698d52eedbd3bbe))
8
+ * updated package deps ([5f605aa](https://github.com/visulima/visulima/commit/5f605aab74a7c1f4cbdfe4502363e36d57716921))
9
+
10
+ ## @visulima/connect [1.3.3](https://github.com/visulima/visulima/compare/@visulima/connect@1.3.2...@visulima/connect@1.3.3) (2023-01-25)
11
+
12
+
13
+ ### Bug Fixes
14
+
15
+ * updated tsconfig to use module esnext and target es2021 ([#107](https://github.com/visulima/visulima/issues/107)) ([e888fe8](https://github.com/visulima/visulima/commit/e888fe8d15c99453a3c04f2cf9d2f6c69c158648))
16
+
1
17
  ## @visulima/connect [1.3.2](https://github.com/visulima/visulima/compare/@visulima/connect@1.3.1...@visulima/connect@1.3.2) (2023-01-08)
2
18
 
3
19
 
package/dist/index.d.ts CHANGED
@@ -2,11 +2,11 @@ import * as zod from 'zod';
2
2
  import { AnyZodObject, ZodObject } from 'zod';
3
3
  import { IncomingMessage, ServerResponse } from 'node:http';
4
4
 
5
- type HttpMethod = "GET" | "HEAD" | "POST" | "PUT" | "PATCH" | "DELETE";
5
+ type HttpMethod = "DELETE" | "GET" | "HEAD" | "PATCH" | "POST" | "PUT";
6
6
 
7
7
  type FunctionLike = (...arguments_: any[]) => unknown;
8
8
 
9
- type RouteMatch = string | RegExp;
9
+ type RouteMatch = RegExp | string;
10
10
 
11
11
  type NextHandler = () => ValueOrPromise<any>;
12
12
 
@@ -18,10 +18,11 @@ type FindResult<H extends FunctionLike> = {
18
18
  middleOnly: boolean;
19
19
  };
20
20
 
21
- type RoutesExtendedRequestHandler<Request extends object, Context extends unknown, RResponse extends unknown, Routes> = (
21
+ type RoutesExtendedRequestHandler<Request extends object, Context, RResponse, Routes> = (
22
22
  request: Request,
23
23
  response: Context,
24
24
  routes: Routes,
25
+ // eslint-disable-next-line @typescript-eslint/no-invalid-void-type
25
26
  ) => ValueOrPromise<RResponse | void>;
26
27
 
27
28
  interface HandlerOptions<Handler extends FunctionLike> {
@@ -29,15 +30,15 @@ interface HandlerOptions<Handler extends FunctionLike> {
29
30
  onError?: (error: unknown, ...arguments_: Parameters<Handler>) => ReturnType<Handler>;
30
31
  }
31
32
 
32
- type ValueOrPromise<T> = T | Promise<T>;
33
+ type ValueOrPromise<T> = Promise<T> | T;
33
34
 
34
35
  type RouteShortcutMethod<This, Schema extends AnyZodObject, H extends FunctionLike> = (
35
- route: RouteMatch | Nextable<H>,
36
- zodSchemaOrRouteOrFns?: Schema | RouteMatch | Nextable<H> | string,
36
+ route: Nextable<H> | RouteMatch,
37
+ zodSchemaOrRouteOrFns?: Nextable<H> | RouteMatch | Schema | string,
37
38
  ...fns: Nextable<H>[]
38
39
  ) => This;
39
40
 
40
- declare type Route<H> = {
41
+ type Route<H> = {
41
42
  method: HttpMethod | "";
42
43
  fns: (H | Router<H extends FunctionLike ? H : never>)[];
43
44
  isMiddleware: boolean;
@@ -51,14 +52,14 @@ declare class Router<H extends FunctionLike> {
51
52
  base: string;
52
53
  routes: Route<Nextable<H>>[];
53
54
  constructor(base?: string, routes?: Route<Nextable<H>>[]);
54
- add(method: HttpMethod | "", route: RouteMatch | Nextable<H>, ...fns: Nextable<H>[]): this;
55
- use(base: RouteMatch | Nextable<H> | Router<H>, ...fns: (Nextable<H> | Router<H>)[]): this;
55
+ add(method: HttpMethod | "", route: Nextable<H> | RouteMatch, ...fns: Nextable<H>[]): this;
56
+ use(base: Nextable<H> | RouteMatch | Router<H>, ...fns: (Nextable<H> | Router<H>)[]): this;
56
57
  clone(base?: string): Router<H>;
57
58
  static exec<H extends FunctionLike>(fns: Nextable<H>[], ...arguments_: Parameters<H>): Promise<unknown>;
58
59
  find(method: HttpMethod, pathname: string): FindResult<H>;
59
60
  }
60
61
 
61
- declare type RequestHandler$1<R extends Request, Context> = (request: R, context_: Context) => ValueOrPromise<Response | void>;
62
+ type RequestHandler$1<R extends Request, Context> = (request: R, context_: Context) => ValueOrPromise<Response | void>;
62
63
  declare class EdgeRouter<R extends Request = Request, Context = unknown, RResponse extends Response = Response, Schema extends AnyZodObject = ZodObject<any>> {
63
64
  private router;
64
65
  private readonly onNoMatch;
@@ -72,19 +73,15 @@ declare class EdgeRouter<R extends Request = Request, Context = unknown, RRespon
72
73
  put: RouteShortcutMethod<this, Schema, RequestHandler$1<R, Context>>;
73
74
  patch: RouteShortcutMethod<this, Schema, RequestHandler$1<R, Context>>;
74
75
  delete: RouteShortcutMethod<this, Schema, RequestHandler$1<R, Context>>;
75
- use(base: RouteMatch | Nextable<RequestHandler$1<R, Context>> | EdgeRouter<R, Context>, ...fns: (Nextable<RequestHandler$1<R, Context>> | EdgeRouter<R, Context>)[]): this;
76
+ use(base: EdgeRouter<R, Context> | Nextable<RequestHandler$1<R, Context>> | RouteMatch, ...fns: (EdgeRouter<R, Context> | Nextable<RequestHandler$1<R, Context>>)[]): this;
76
77
  private prepareRequest;
77
78
  clone(): EdgeRouter<R, Context, RResponse, Schema>;
78
79
  run(request: R, context_: Context): Promise<unknown>;
79
- handler(): (request: R, context_: Context) => Promise<any>;
80
+ handler(): (request: R, context_: Context) => Promise<any> | ReturnType<FunctionLike> | ValueOrPromise<RResponse>;
80
81
  }
81
- declare function createEdgeRouter<R extends Request, Context>(options?: HandlerOptions<RoutesExtendedRequestHandler<R, Context, Response, Route<Nextable<FunctionLike>>[]>>): EdgeRouter<R, Context, Response, ZodObject<any, "strip", zod.ZodTypeAny, {
82
- [x: string]: any;
83
- }, {
84
- [x: string]: any;
85
- }>>;
82
+ declare function createEdgeRouter<R extends Request, Context>(options?: HandlerOptions<RoutesExtendedRequestHandler<R, Context, Response, Route<Nextable<FunctionLike>>[]>>): EdgeRouter<R, Context>;
86
83
 
87
- declare type RequestHandler<Request extends IncomingMessage, Response extends ServerResponse> = (request: Request, response: Response) => ValueOrPromise<void>;
84
+ type RequestHandler<Request extends IncomingMessage, Response extends ServerResponse> = (request: Request, response: Response) => ValueOrPromise<void>;
88
85
  declare class NodeRouter<Request extends IncomingMessage = IncomingMessage, Response extends ServerResponse = ServerResponse, Schema extends AnyZodObject = ZodObject<any>> {
89
86
  private router;
90
87
  private readonly onNoMatch;
@@ -98,7 +95,7 @@ declare class NodeRouter<Request extends IncomingMessage = IncomingMessage, Resp
98
95
  put: RouteShortcutMethod<this, Schema, RequestHandler<Request, Response>>;
99
96
  patch: RouteShortcutMethod<this, Schema, RequestHandler<Request, Response>>;
100
97
  delete: RouteShortcutMethod<this, Schema, RequestHandler<Request, Response>>;
101
- use(base: RouteMatch | Nextable<RequestHandler<Request, Response>> | NodeRouter<Request, Response, Schema>, ...fns: (Nextable<RequestHandler<Request, Response>> | NodeRouter<Request, Response, Schema>)[]): this;
98
+ use(base: Nextable<RequestHandler<Request, Response>> | NodeRouter<Request, Response, Schema> | RouteMatch, ...fns: (Nextable<RequestHandler<Request, Response>> | NodeRouter<Request, Response, Schema>)[]): this;
102
99
  private prepareRequest;
103
100
  clone(): NodeRouter<Request, Response, Schema>;
104
101
  run(request: Request, response: Response): Promise<unknown>;
@@ -108,7 +105,7 @@ declare const createRouter: <Request_1 extends IncomingMessage, Response_1 exten
108
105
  body?: AnyZodObject | undefined;
109
106
  headers?: AnyZodObject | undefined;
110
107
  query?: AnyZodObject | undefined;
111
- }, "strip", zod.ZodTypeAny, {
108
+ }, zod.UnknownKeysParam, zod.ZodTypeAny, {
112
109
  body?: unknown;
113
110
  headers?: unknown;
114
111
  query?: unknown;
@@ -118,15 +115,15 @@ declare const createRouter: <Request_1 extends IncomingMessage, Response_1 exten
118
115
  query?: unknown;
119
116
  }>>(options?: HandlerOptions<RoutesExtendedRequestHandler<Request_1, Response_1, Response_1, Route<Nextable<FunctionLike>>[]>>) => NodeRouter<Request_1, Response_1, Schema>;
120
117
 
121
- declare type NextFunction = (error?: any) => void;
118
+ type NextFunction = (error?: any) => void;
122
119
  declare const expressWrapper: <Request_1 extends IncomingMessage, Response_1 extends ServerResponse<IncomingMessage>>(function_: ExpressRequestHandler<Request_1, Response_1>) => Nextable<RequestHandler<Request_1, Response_1>>;
123
- declare type ExpressRequestHandler<Request, Response> = (request: Request, response: Response, next: NextFunction) => void;
120
+ type ExpressRequestHandler<Request, Response> = (request: Request, response: Response, next: NextFunction) => void;
124
121
 
125
- declare const withZod: <Request_1 extends object, Response_1 extends unknown, Handler extends Nextable<any>, Schema extends ZodObject<{
122
+ declare const withZod: <Request_1, Response_1, Handler extends Nextable<any>, Schema extends ZodObject<{
126
123
  body?: AnyZodObject | undefined;
127
124
  headers?: AnyZodObject | undefined;
128
125
  query?: AnyZodObject | undefined;
129
- }, "strip", zod.ZodTypeAny, {
126
+ }, zod.UnknownKeysParam, zod.ZodTypeAny, {
130
127
  body?: unknown;
131
128
  headers?: unknown;
132
129
  query?: unknown;
@@ -136,6 +133,6 @@ declare const withZod: <Request_1 extends object, Response_1 extends unknown, Ha
136
133
  query?: unknown;
137
134
  }>>(schema: Schema, handler: Handler) => (request: Request_1, response: Response_1, next: NextHandler) => Promise<Response_1>;
138
135
 
139
- declare const sendJson: (response: ServerResponse, statusCode: number, jsonBody: any) => void;
136
+ declare const sendJson: (response: ServerResponse, statusCode: number, jsonBody: unknown) => void;
140
137
 
141
138
  export { RequestHandler$1 as EdgeRequestHandler, EdgeRouter, ExpressRequestHandler, FindResult, FunctionLike, HandlerOptions, HttpMethod, NextHandler, Nextable, RequestHandler as NodeRequestHandler, NodeRouter, Route, RouteShortcutMethod, Router, ValueOrPromise, createEdgeRouter, createRouter as createNodeRouter, createRouter, expressWrapper, sendJson, withZod };
package/dist/index.js CHANGED
@@ -1,2 +1,23 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }var _httperrors = require('http-errors'); var _httperrors2 = _interopRequireDefault(_httperrors);var _zod = require('zod');var S=(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")),_httperrors2.default.call(void 0, 422,a)}return e(r,s,n)},h= exports.withZod =S;var _regexparam = require('regexparam');var u=class{constructor(e="/",t=[]){this.base=e;this.routes=t}add(e,t,...s){if(typeof t=="function"&&(s.unshift(t),t=""),t==="")this.routes.push({matchAll:!0,method:e,fns:s,isMiddleware:!1});else{let{keys:n,pattern:r}=_regexparam.parse.call(void 0, t);this.routes.push({keys:n,pattern:r,method:e,fns:s,isMiddleware:!1})}return this}use(e,...t){(typeof e=="function"||e instanceof u)&&(t.unshift(e),e="/"),t=t.map(r=>{if(r instanceof u){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.call(void 0, e,!0);return this.routes.push({keys:s,pattern:n,method:"",fns:t,isMiddleware:!0}),this}clone(e){return new u(e,[...this.routes])}static async exec(e,...t){let s=0,n=()=>e[++s](...t,n);return e[s](...t,n)}find(e,t){let s=!0,n=[],r={},d=e==="HEAD";return Object.values(this.routes).forEach(a=>{if(a.method!==e&&a.method!==""&&!(d&&a.method==="GET"))return;let R=!1;if("matchAll"in a)R=!0;else if(a.keys===!1){let i=a.pattern.exec(t);if(i===null)return;i.groups!==void 0&&Object.keys(i.groups).forEach(p=>{r[p]=i.groups[p]}),R=!0}else if(a.keys.length>0){let i=a.pattern.exec(t);if(i===null)return;for(let p=0;p<a.keys.length;){let x=a.keys[p];r[x]=i[++p]}R=!0}else a.pattern.test(t)&&(R=!0);R&&(n.push(...a.fns.flatMap(i=>{if(i instanceof u){let p=i.base,x=t.slice(p.length);x[0]!="/"&&(x=`/${x}`);let m=i.find(e,x);return m.middleOnly||(s=!1),Object.assign(r,m.params),m.fns}return i})),a.isMiddleware||(s=!1))}),{fns:n,params:r,middleOnly:s}}};var N=async o=>new Response(o.method==="HEAD"?null:`Route ${o.method} ${o.url} not found`,{status:404}),g=async o=>(console.error(o),new Response("Internal Server Error",{status:500}));function H(o){return(o.nextUrl||new URL(o.url)).pathname}var l=class{constructor(e={}){this.router=new u;this.all=this.add.bind(this,"");this.get=this.add.bind(this,"GET");this.head=this.add.bind(this,"HEAD");this.post=this.add.bind(this,"POST");this.put=this.add.bind(this,"PUT");this.patch=this.add.bind(this,"PATCH");this.delete=this.add.bind(this,"DELETE");this.onNoMatch=e.onNoMatch||N,this.onError=e.onError||g}add(e,t,s,...n){return typeof t=="string"&&typeof s=="function"?n=[s]:typeof s=="object"?typeof t=="function"?n=[h(s,t)]:n=n.map(r=>h(s,r)):typeof s=="function"&&(n=[s]),this.router.add(e,t,...n),this}use(e,...t){return(typeof e=="function"||e instanceof l)&&(t.unshift(e),e="/"),this.router.use(e,...t.map(s=>s instanceof l?s.router:s)),this}prepareRequest(e,t){e.params={...t.params,...e.params}}clone(){let e=new l({onNoMatch:this.onNoMatch,onError:this.onError});return e.router=this.router.clone(),e}async run(e,t){let s=this.router.find(e.method,H(e));if(s.fns.length!==0)return this.prepareRequest(e,s),u.exec(s.fns,e,t)}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):u.exec(n.fns,t,s))}catch(r){return this.onError(r,t,s,e)}}}};function E(o={}){return new l(o)}var k=o=>(e,t,s)=>new Promise((n,r)=>{o(e,t,d=>d?r(d):n())}).then(s),C= exports.expressWrapper =k;var w=async(o,e)=>{e.statusCode=404,e.end(o.method==="HEAD"?void 0:`Route ${o.method} ${o.url} not found`)},v=async(o,e,t)=>{t.statusCode=500,console.error(o),t.end("Internal Server Error")};function y(o){let e=o.indexOf("?");return e===-1?o:o.slice(0,Math.max(0,e))}var c=class{constructor(e={}){this.router=new u;this.all=this.add.bind(this,"");this.get=this.add.bind(this,"GET");this.head=this.add.bind(this,"HEAD");this.post=this.add.bind(this,"POST");this.put=this.add.bind(this,"PUT");this.patch=this.add.bind(this,"PATCH");this.delete=this.add.bind(this,"DELETE");this.onNoMatch=e.onNoMatch||w,this.onError=e.onError||v}add(e,t,s,...n){return typeof t=="string"&&typeof s=="function"?n=[s]:typeof s=="object"?typeof t=="function"?n=[h(s,t)]:n=n.map(r=>h(s,r)):typeof s=="function"&&(n=[s]),this.router.add(e,t,...n),this}use(e,...t){return(typeof e=="function"||e instanceof c)&&(t.unshift(e),e="/"),this.router.use(e,...t.map(s=>s instanceof c?s.router:s)),this}prepareRequest(e,t){e.params={...t.params,...e.params}}clone(){let e=new c({onNoMatch:this.onNoMatch,onError:this.onError});return e.router=this.router.clone(),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),u.exec(s.fns,e,t)}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):u.exec(n.fns,t,s))}catch(r){await this.onError(r,t,s,e)}}}},q= exports.createNodeRouter = exports.createRouter =(o={})=>new c(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))},L= exports.sendJson =j;exports.EdgeRouter = l; exports.NodeRouter = c; exports.Router = u; exports.createEdgeRouter = E; exports.createNodeRouter = q; exports.createRouter = q; exports.expressWrapper = C; exports.sendJson = L; exports.withZod = h;
1
+ 'use strict';
2
+
3
+ var N = require('http-errors');
4
+ var zod = require('zod');
5
+ var regexparam = require('regexparam');
6
+
7
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
8
+
9
+ var N__default = /*#__PURE__*/_interopDefault(N);
10
+
11
+ var M=Object.defineProperty;var S=(o,e,t)=>e in o?M(o,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):o[e]=t;var a=(o,e,t)=>(S(o,typeof e!="symbol"?e+"":e,t),t);var E=(o,e)=>async(t,s,n)=>{let r=t;try{r=await o.parseAsync(t);}catch(d){let{message:u}=d;throw d instanceof zod.ZodError&&typeof d.format=="function"&&(u=d.issues.map(p=>`${p.path.join("/")} - ${p.message}`).join("/n")),N__default.default(422,u)}return e(r,s,n)},x=E;var i=class{constructor(e="/",t=[]){this.base=e;this.routes=t;}add(e,t,...s){if(typeof t=="function"&&(s.unshift(t),t=""),t==="")this.routes.push({matchAll:!0,method:e,fns:s,isMiddleware:!1});else {let{keys:n,pattern:r}=regexparam.parse(t);this.routes.push({keys:n,pattern:r,method:e,fns:s,isMiddleware:!1});}return this}use(e,...t){(typeof e=="function"||e instanceof i)&&(t.unshift(e),e="/"),t=t.map(r=>{if(r instanceof i){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({keys:s,pattern:n,method:"",fns:t,isMiddleware:!0}),this}clone(e){return new i(e,[...this.routes])}static async exec(e,...t){let s=0,n=()=>e[++s](...t,n);return e[s](...t,n)}find(e,t){let s=!0,n=[],r={},d=e==="HEAD";return Object.values(this.routes).forEach(u=>{if(u.method!==e&&u.method!==""&&!(d&&u.method==="GET"))return;let p=!1;if("matchAll"in u)p=!0;else if(u.keys===!1){let R=u.pattern.exec(t);if(R===null)return;R.groups!==void 0&&Object.keys(R.groups).forEach(l=>{r[l]=R.groups[l];}),p=!0;}else if(u.keys.length>0){let R=u.pattern.exec(t);if(R===null)return;for(let l=0;l<u.keys.length;){let m=u.keys[l];r[m]=R[++l];}p=!0;}else u.pattern.test(t)&&(p=!0);p&&(n.push(...u.fns.flatMap(R=>{if(R instanceof i){let{base:l}=R,m=t.slice(l.length);m.startsWith("/")||(m=`/${m}`);let f=R.find(e,m);return f.middleOnly||(s=!1),Object.assign(r,f.params),f.fns}return R})),u.isMiddleware||(s=!1));}),{fns:n,params:r,middleOnly:s}}};var k=async o=>new Response(o.method==="HEAD"?null:`Route ${o.method} ${o.url} not found`,{status:404}),C=async o=>(console.error(o),new Response("Internal Server Error",{status:500}));function y(o){return (o.nextUrl??new URL(o.url)).pathname}var c=class{constructor(e={}){a(this,"router",new i);a(this,"onNoMatch");a(this,"onError");a(this,"all",this.add.bind(this,""));a(this,"get",this.add.bind(this,"GET"));a(this,"head",this.add.bind(this,"HEAD"));a(this,"post",this.add.bind(this,"POST"));a(this,"put",this.add.bind(this,"PUT"));a(this,"patch",this.add.bind(this,"PATCH"));a(this,"delete",this.add.bind(this,"DELETE"));this.onNoMatch=e.onNoMatch??k,this.onError=e.onError??C;}add(e,t,s,...n){return typeof t=="string"&&typeof s=="function"?n=[s]:typeof s=="object"?typeof t=="function"?n=[x(s,t)]:n=n.map(r=>x(s,r)):typeof s=="function"&&(n=[s]),this.router.add(e,t,...n),this}use(e,...t){return (typeof e=="function"||e instanceof c)&&(t.unshift(e),e="/"),this.router.use(e,...t.map(s=>s instanceof c?s.router:s)),this}prepareRequest(e,t){e.params={...t.params,...e.params};}clone(){let e=new c({onNoMatch:this.onNoMatch,onError:this.onError});return e.router=this.router.clone(),e}async run(e,t){let s=this.router.find(e.method,y(e));if(s.fns.length!==0)return this.prepareRequest(e,s),i.exec(s.fns,e,t)}handler(){let{routes:e}=this.router;return async(t,s)=>{let n=this.router.find(t.method,y(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 this.onError(r,t,s,e)}}}};function w(o={}){return new c(o)}var v=o=>(e,t,s)=>new Promise((n,r)=>{o(e,t,d=>d?r(d):n());}).then(s),L=v;var j=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");};function b(o){let e=o.indexOf("?");return e===-1?o:o.slice(0,Math.max(0,e))}var h=class{constructor(e={}){a(this,"router",new i);a(this,"onNoMatch");a(this,"onError");a(this,"all",this.add.bind(this,""));a(this,"get",this.add.bind(this,"GET"));a(this,"head",this.add.bind(this,"HEAD"));a(this,"post",this.add.bind(this,"POST"));a(this,"put",this.add.bind(this,"PUT"));a(this,"patch",this.add.bind(this,"PATCH"));a(this,"delete",this.add.bind(this,"DELETE"));this.onNoMatch=e.onNoMatch??j,this.onError=e.onError??P;}add(e,t,s,...n){return typeof t=="string"&&typeof s=="function"?n=[s]:typeof s=="object"?typeof t=="function"?n=[x(s,t)]:n=n.map(r=>x(s,r)):typeof s=="function"&&(n=[s]),this.router.add(e,t,...n),this}use(e,...t){return (typeof e=="function"||e instanceof h)&&(t.unshift(e),e="/"),this.router.use(e,...t.map(s=>s instanceof h?s.router:s)),this}prepareRequest(e,t){e.params={...t.params,...e.params};}clone(){let e=new h({onNoMatch:this.onNoMatch,onError:this.onError});return e.router=this.router.clone(),e}async run(e,t){let s=this.router.find(e.method,b(e.url));if(s.fns.length!==0)return this.prepareRequest(e,s),i.exec(s.fns,e,t)}handler(){let{routes:e}=this.router;return async(t,s)=>{let n=this.router.find(t.method,b(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);}}}},q=(o={})=>new h(o);var Z=(o,e,t)=>{o.setHeader("content-type","application/json; charset=utf-8"),o.statusCode=e,o.end(JSON.stringify(t,null,2));},A=Z;
12
+
13
+ exports.EdgeRouter = c;
14
+ exports.NodeRouter = h;
15
+ exports.Router = i;
16
+ exports.createEdgeRouter = w;
17
+ exports.createNodeRouter = q;
18
+ exports.createRouter = q;
19
+ exports.expressWrapper = L;
20
+ exports.sendJson = A;
21
+ exports.withZod = x;
22
+ //# sourceMappingURL=out.js.map
2
23
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/adapter/with-zod.ts","../src/router.ts","../src/edge.ts","../src/adapter/express.ts","../src/node.ts","../src/utils/send-json.ts"],"names":["createHttpError","ZodError","withZod","schema","handler","request","response","next","transformedRequest","error","message","issue","with_zod_default","parse","Router","base","routes","method","route","fns","keys","pattern","function_","arguments_","index","pathname","middleOnly","parameters","isHead","matched","matches","key","parameterKey","stripPathname","result","onNoMatch","onError","getPathname","EdgeRouter","options","routeOrFunction","zodOrRouteOrFunction","findResult","r","context_","createEdgeRouter","expressWrapper","resolve","reject","express_default","_request","url","queryIndex","NodeRouter","createRouter","sendJson","statusCode","jsonBody","send_json_default"],"mappings":"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","sourcesContent":["import createHttpError from \"http-errors\";\nimport type { AnyZodObject } from \"zod\";\nimport { ZodError, ZodObject } from \"zod\";\n\nimport type { Nextable, NextHandler } from \"../types\";\n\nconst withZod = <\n Request extends object,\n Response extends unknown,\n Handler extends Nextable<any>,\n Schema extends ZodObject<{ body?: AnyZodObject; headers?: AnyZodObject; query?: AnyZodObject }>,\n >(\n schema: Schema,\n handler: Handler,\n ): ((request: Request, response: Response, next: NextHandler) => Promise<Response>) => 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;\n\n // eslint-disable-next-line unicorn/consistent-destructuring\n if (error instanceof ZodError && typeof error.format === \"function\") {\n // eslint-disable-next-line unicorn/consistent-destructuring\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 {\n FindResult, FunctionLike, HttpMethod, Nextable, RouteMatch,\n} from \"./types\";\n\nexport type Route<H> = {\n method: HttpMethod | \"\";\n fns: (H | Router<H extends FunctionLike ? H : never>)[];\n isMiddleware: boolean;\n} & (\n | {\n keys: string[] | false;\n pattern: RegExp;\n }\n | { matchAll: true }\n);\n\nexport class Router<H extends FunctionLike> {\n constructor(public base: string = \"/\", public routes: Route<Nextable<H>>[] = []) {}\n\n public add(method: HttpMethod | \"\", route: RouteMatch | Nextable<H>, ...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 matchAll: true,\n method,\n fns,\n isMiddleware: false,\n });\n } else {\n const { keys, pattern } = parse(route);\n\n this.routes.push({\n keys,\n pattern,\n method,\n fns,\n isMiddleware: false,\n });\n }\n\n return this;\n }\n\n public use(base: RouteMatch | Nextable<H> | Router<H>, ...fns: (Nextable<H> | Router<H>)[]) {\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\") return function_.clone(base);\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 keys,\n pattern,\n method: \"\",\n fns,\n isMiddleware: true,\n });\n\n return this;\n }\n\n public clone(base?: string) {\n return new Router<H>(base, [...this.routes]);\n }\n\n static async exec<H extends FunctionLike>(fns: Nextable<H>[], ...arguments_: Parameters<H>): Promise<unknown> {\n let index = 0;\n\n // eslint-disable-next-line no-plusplus\n const next = () => (fns[++index] as FunctionLike)(...arguments_, next);\n\n return (fns[index] as FunctionLike)(...arguments_, next);\n }\n\n // eslint-disable-next-line radar/cognitive-complexity\n 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 radar/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-ignore @TODO: fix this\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 for (let index = 0; index < route.keys.length;) {\n const parameterKey = route.keys[index];\n\n // @ts-ignore @TODO: fix this\n // eslint-disable-next-line no-plusplus\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_.base as string;\n\n let stripPathname = pathname.slice(base.length);\n\n // fix stripped pathname, not sure why this happens\n // eslint-disable-next-line eqeqeq\n if (stripPathname[0] != \"/\") {\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 if (!route.isMiddleware) middleOnly = false;\n }\n });\n\n return { fns, params: parameters, middleOnly };\n }\n}\n","import type { AnyZodObject } from \"zod\";\nimport { ZodObject } from \"zod\";\n\nimport withZod from \"./adapter/with-zod\";\nimport { Route, 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\n// eslint-disable-next-line max-len\nconst onNoMatch = async (request: Request) => 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 return new Response(\"Internal Server Error\", { status: 500 });\n};\n\nexport function getPathname(request: Request & { nextUrl?: URL }) {\n // eslint-disable-next-line compat/compat\n return (request.nextUrl || new URL(request.url)).pathname;\n}\n\n// eslint-disable-next-line max-len\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 private router = new Router<RequestHandler<R, Context>>();\n\n private readonly onNoMatch: RoutesExtendedRequestHandler<R, Context, RResponse, Route<Nextable<FunctionLike>>[]>;\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 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 = 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 private add(\n method: HttpMethod | \"\",\n routeOrFunction: RouteMatch | Nextable<RequestHandler<R, Context>>,\n zodOrRouteOrFunction?: RouteMatch | Schema | Nextable<RequestHandler<R, Context>>,\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,max-len\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 public all: RouteShortcutMethod<this, Schema, RequestHandler<R, Context>> = this.add.bind(this, \"\");\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 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 patch: RouteShortcutMethod<this, Schema, RequestHandler<R, Context>> = this.add.bind(this, \"PATCH\");\n\n public delete: RouteShortcutMethod<this, Schema, RequestHandler<R, Context>> = this.add.bind(this, \"DELETE\");\n\n public use(\n base: RouteMatch | Nextable<RequestHandler<R, Context>> | EdgeRouter<R, Context>,\n ...fns: (Nextable<RequestHandler<R, Context>> | EdgeRouter<R, Context>)[]\n ) {\n if (typeof base === \"function\" || base instanceof EdgeRouter) {\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 EdgeRouter ? function_.router : function_)));\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 public clone() {\n const r = new EdgeRouter<R, Context, RResponse, Schema>({ onNoMatch: this.onNoMatch, onError: this.onError });\n\n r.router = this.router.clone();\n\n return r;\n }\n\n async run(request: R, context_: Context) {\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 Router.exec(result.fns, request, context_);\n }\n\n handler() {\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 this.onError(error, request, context_, routes);\n }\n };\n }\n}\n\nexport function createEdgeRouter<R extends Request, Context>(\n options: HandlerOptions<RoutesExtendedRequestHandler<R, Context, Response, Route<Nextable<FunctionLike>>[]>> = {},\n) {\n return new EdgeRouter<R, Context, Response>(options);\n}\n","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 = <Request extends IncomingMessage, Response extends ServerResponse>(\n function_: ExpressRequestHandler<Request, Response>,\n // eslint-disable-next-line compat/compat\n): Nextable<RequestHandler<Request, Response>> => (request, response, next) => new Promise<void>((resolve, reject) => {\n function_(request, response, (error) => (error ? reject(error) : resolve()));\n // eslint-disable-next-line promise/no-callback-in-promise\n }).then(next);\n\nexport type ExpressRequestHandler<Request, Response> = (request: Request, response: Response, next: NextFunction) => void;\n\nexport default expressWrapper;\n","import type { IncomingMessage, ServerResponse } from \"node:http\";\nimport type { AnyZodObject } from \"zod\";\nimport { 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 // eslint-disable-next-line no-console\n console.error(error);\n\n response.end(\"Internal Server Error\");\n};\n\nexport function getPathname(url: 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<any>,\n> {\n private router = new Router<RequestHandler<Request, Response>>();\n\n private readonly onNoMatch: RoutesExtendedRequestHandler<Request, Response, Response, Route<Nextable<FunctionLike>>[]>;\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 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 private add(\n method: HttpMethod | \"\",\n routeOrFunction: RouteMatch | Nextable<RequestHandler<Request, Response>>,\n zodOrRouteOrFunction?: RouteMatch | Schema | Nextable<RequestHandler<Request, Response>>,\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 // eslint-disable-next-line unicorn/prefer-ternary\n if (typeof routeOrFunction === \"function\") {\n // eslint-disable-next-line no-param-reassign\n fns = [withZod<Request, Response, Nextable<RequestHandler<Request, Response>>, Schema>(\n zodOrRouteOrFunction as Schema,\n routeOrFunction,\n )];\n } else {\n // eslint-disable-next-line no-param-reassign,max-len\n fns = fns.map((function_) => withZod<Request, Response, Nextable<RequestHandler<Request, Response>>, 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 public all: RouteShortcutMethod<this, Schema, RequestHandler<Request, Response>> = this.add.bind(this, \"\");\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 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 patch: RouteShortcutMethod<this, Schema, RequestHandler<Request, Response>> = this.add.bind(this, \"PATCH\");\n\n public delete: RouteShortcutMethod<this, Schema, RequestHandler<Request, Response>> = this.add.bind(this, \"DELETE\");\n\n public use(\n base: RouteMatch | Nextable<RequestHandler<Request, Response>> | NodeRouter<Request, Response, Schema>,\n ...fns: (Nextable<RequestHandler<Request, Response>> | NodeRouter<Request, Response, Schema>)[]\n ) {\n if (typeof base === \"function\" || base instanceof NodeRouter) {\n fns.unshift(base);\n // eslint-disable-next-line no-param-reassign\n base = \"/\";\n }\n this.router.use(base, ...fns.map((function_) => (function_ instanceof NodeRouter ? function_.router : function_)));\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 public clone() {\n const r = new NodeRouter<Request, Response, Schema>({ onNoMatch: this.onNoMatch, onError: this.onError });\n\n r.router = this.router.clone();\n\n return r;\n }\n\n 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 Router.exec(result.fns, request, response);\n }\n\n handler() {\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\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 ) => 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: any): 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/with-zod.ts","../src/router.ts","../src/edge.ts","../src/adapter/express.ts","../src/node.ts","../src/utils/send-json.ts"],"names":["createHttpError","ZodError","withZod","schema","handler","request","response","next","transformedRequest","error","message","issue","with_zod_default","parse","Router","base","routes","method","route","fns","keys","pattern","function_","arguments_","index","pathname","middleOnly","parameters","isHead","matched","matches","key","parameterKey","stripPathname","result","onNoMatch","onError","getPathname","EdgeRouter","options","__publicField","routeOrFunction","zodOrRouteOrFunction","findResult","r","context_","createEdgeRouter","expressWrapper","resolve","reject","express_default","_request","url","queryIndex","NodeRouter","createRouter","sendJson","statusCode","jsonBody","send_json_default"],"mappings":"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","sourcesContent":["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,\n Response,\n Handler extends Nextable<any>,\n Schema extends ZodObject<{ body?: AnyZodObject; headers?: AnyZodObject; query?: AnyZodObject }>,\n >(\n schema: Schema,\n handler: Handler,\n ): ((request: Request, response: Response, next: NextHandler) => Promise<Response>) => 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;\n\n // eslint-disable-next-line unicorn/consistent-destructuring\n if (error instanceof ZodError && typeof error.format === \"function\") {\n // eslint-disable-next-line unicorn/consistent-destructuring\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 {\n FindResult, FunctionLike, HttpMethod, Nextable, RouteMatch,\n} from \"./types\";\n\nexport type Route<H> = {\n method: HttpMethod | \"\";\n fns: (H | Router<H extends FunctionLike ? H : never>)[];\n isMiddleware: boolean;\n} & (\n | {\n keys: string[] | false;\n pattern: RegExp;\n }\n | { matchAll: true }\n);\n\nexport class Router<H extends FunctionLike> {\n public constructor(public base: string = \"/\", public routes: Route<Nextable<H>>[] = []) {}\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 matchAll: true,\n method,\n fns,\n isMiddleware: false,\n });\n } else {\n const { keys, pattern } = parse(route);\n\n this.routes.push({\n keys,\n pattern,\n method,\n fns,\n isMiddleware: false,\n });\n }\n\n return this;\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\") return function_.clone(base);\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 keys,\n pattern,\n method: \"\",\n fns,\n isMiddleware: true,\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 static async exec<H extends FunctionLike>(fns: Nextable<H>[], ...arguments_: Parameters<H>): Promise<unknown> {\n let index = 0;\n\n // eslint-disable-next-line no-plusplus\n const next = () => (fns[++index] as FunctionLike)(...arguments_, next);\n\n return (fns[index] as FunctionLike)(...arguments_, next);\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 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 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 for (let index = 0; index < route.keys.length;) {\n const parameterKey = route.keys[index];\n\n // @ts-expect-error @TODO: fix this\n // eslint-disable-next-line no-plusplus\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 // eslint-disable-next-line eqeqeq\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 if (!route.isMiddleware) middleOnly = false;\n }\n });\n\n return { fns, params: parameters, middleOnly };\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\n// eslint-disable-next-line max-len\nconst onNoMatch = async (request: Request) => 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 return new Response(\"Internal Server Error\", { status: 500 });\n};\n\nexport function getPathname(request: Request & { nextUrl?: URL }): string {\n // eslint-disable-next-line compat/compat\n return (request.nextUrl ?? new URL(request.url)).pathname;\n}\n\n// eslint-disable-next-line max-len,@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 private router = new Router<RequestHandler<R, Context>>();\n\n private readonly onNoMatch: RoutesExtendedRequestHandler<R, Context, RResponse, Route<Nextable<FunctionLike>>[]>;\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 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 = 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 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,max-len\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 public all: RouteShortcutMethod<this, Schema, RequestHandler<R, Context>> = this.add.bind(this, \"\");\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 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 patch: RouteShortcutMethod<this, Schema, RequestHandler<R, Context>> = this.add.bind(this, \"PATCH\");\n\n public delete: RouteShortcutMethod<this, Schema, RequestHandler<R, Context>> = this.add.bind(this, \"DELETE\");\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 // 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 public clone(): EdgeRouter<R, Context, RResponse, Schema> {\n const r = new EdgeRouter<R, Context, RResponse, Schema>({ onNoMatch: this.onNoMatch, onError: this.onError });\n\n r.router = this.router.clone();\n\n return r;\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 Router.exec(result.fns, request, context_);\n }\n\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 this.onError(error, request, context_, routes);\n }\n };\n }\n}\n\nexport function createEdgeRouter<R extends Request, Context>(\n options: HandlerOptions<RoutesExtendedRequestHandler<R, Context, Response, Route<Nextable<FunctionLike>>[]>> = {},\n): EdgeRouter<R, Context> {\n return new EdgeRouter<R, Context, Response>(options);\n}\n","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 = <Request extends IncomingMessage, Response extends ServerResponse>(\n function_: ExpressRequestHandler<Request, Response>,\n // eslint-disable-next-line compat/compat\n): Nextable<RequestHandler<Request, Response>> => (request, response, next) => new Promise<void>((resolve, reject) => {\n function_(request, response, (error) => (error ? reject(error) : resolve()));\n // eslint-disable-next-line promise/no-callback-in-promise\n }).then(next);\n\nexport type ExpressRequestHandler<Request, Response> = (request: Request, response: Response, next: NextFunction) => void;\n\nexport default expressWrapper;\n","import type { IncomingMessage, ServerResponse } from \"node:http\";\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 // eslint-disable-next-line no-console\n console.error(error);\n\n response.end(\"Internal Server Error\");\n};\n\nexport function 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<any>,\n> {\n private router = new Router<RequestHandler<Request, Response>>();\n\n private readonly onNoMatch: RoutesExtendedRequestHandler<Request, Response, Response, Route<Nextable<FunctionLike>>[]>;\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 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 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 // eslint-disable-next-line unicorn/prefer-ternary\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,max-len\n fns = fns.map((function_) => withZod<Request, Response, Nextable<RequestHandler<Request, Response>>, 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 public all: RouteShortcutMethod<this, Schema, RequestHandler<Request, Response>> = this.add.bind(this, \"\");\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 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 patch: RouteShortcutMethod<this, Schema, RequestHandler<Request, Response>> = this.add.bind(this, \"PATCH\");\n\n public delete: RouteShortcutMethod<this, Schema, RequestHandler<Request, Response>> = this.add.bind(this, \"DELETE\");\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 this.router.use(base, ...fns.map((function_) => (function_ instanceof NodeRouter ? function_.router : function_)));\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 public clone(): NodeRouter<Request, Response, Schema> {\n const r = new NodeRouter<Request, Response, Schema>({ onNoMatch: this.onNoMatch, onError: this.onError });\n\n r.router = this.router.clone();\n\n return r;\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 Router.exec(result.fns, request, response);\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\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
@@ -1,2 +1,9 @@
1
- import b from"http-errors";import{ZodError as M}from"zod";var S=(o,e)=>async(t,s,n)=>{let r=t;try{r=await o.parseAsync(t)}catch(d){let{message:a}=d;throw d instanceof M&&typeof d.format=="function"&&(a=d.issues.map(R=>`${R.path.join("/")} - ${R.message}`).join("/n")),b(422,a)}return e(r,s,n)},h=S;import{parse as f}from"regexparam";var u=class{constructor(e="/",t=[]){this.base=e;this.routes=t}add(e,t,...s){if(typeof t=="function"&&(s.unshift(t),t=""),t==="")this.routes.push({matchAll:!0,method:e,fns:s,isMiddleware:!1});else{let{keys:n,pattern:r}=f(t);this.routes.push({keys:n,pattern:r,method:e,fns:s,isMiddleware:!1})}return this}use(e,...t){(typeof e=="function"||e instanceof u)&&(t.unshift(e),e="/"),t=t.map(r=>{if(r instanceof u){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}=f(e,!0);return this.routes.push({keys:s,pattern:n,method:"",fns:t,isMiddleware:!0}),this}clone(e){return new u(e,[...this.routes])}static async exec(e,...t){let s=0,n=()=>e[++s](...t,n);return e[s](...t,n)}find(e,t){let s=!0,n=[],r={},d=e==="HEAD";return Object.values(this.routes).forEach(a=>{if(a.method!==e&&a.method!==""&&!(d&&a.method==="GET"))return;let R=!1;if("matchAll"in a)R=!0;else if(a.keys===!1){let i=a.pattern.exec(t);if(i===null)return;i.groups!==void 0&&Object.keys(i.groups).forEach(p=>{r[p]=i.groups[p]}),R=!0}else if(a.keys.length>0){let i=a.pattern.exec(t);if(i===null)return;for(let p=0;p<a.keys.length;){let x=a.keys[p];r[x]=i[++p]}R=!0}else a.pattern.test(t)&&(R=!0);R&&(n.push(...a.fns.flatMap(i=>{if(i instanceof u){let p=i.base,x=t.slice(p.length);x[0]!="/"&&(x=`/${x}`);let m=i.find(e,x);return m.middleOnly||(s=!1),Object.assign(r,m.params),m.fns}return i})),a.isMiddleware||(s=!1))}),{fns:n,params:r,middleOnly:s}}};var N=async o=>new Response(o.method==="HEAD"?null:`Route ${o.method} ${o.url} not found`,{status:404}),g=async o=>(console.error(o),new Response("Internal Server Error",{status:500}));function H(o){return(o.nextUrl||new URL(o.url)).pathname}var l=class{constructor(e={}){this.router=new u;this.all=this.add.bind(this,"");this.get=this.add.bind(this,"GET");this.head=this.add.bind(this,"HEAD");this.post=this.add.bind(this,"POST");this.put=this.add.bind(this,"PUT");this.patch=this.add.bind(this,"PATCH");this.delete=this.add.bind(this,"DELETE");this.onNoMatch=e.onNoMatch||N,this.onError=e.onError||g}add(e,t,s,...n){return typeof t=="string"&&typeof s=="function"?n=[s]:typeof s=="object"?typeof t=="function"?n=[h(s,t)]:n=n.map(r=>h(s,r)):typeof s=="function"&&(n=[s]),this.router.add(e,t,...n),this}use(e,...t){return(typeof e=="function"||e instanceof l)&&(t.unshift(e),e="/"),this.router.use(e,...t.map(s=>s instanceof l?s.router:s)),this}prepareRequest(e,t){e.params={...t.params,...e.params}}clone(){let e=new l({onNoMatch:this.onNoMatch,onError:this.onError});return e.router=this.router.clone(),e}async run(e,t){let s=this.router.find(e.method,H(e));if(s.fns.length!==0)return this.prepareRequest(e,s),u.exec(s.fns,e,t)}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):u.exec(n.fns,t,s))}catch(r){return this.onError(r,t,s,e)}}}};function E(o={}){return new l(o)}var k=o=>(e,t,s)=>new Promise((n,r)=>{o(e,t,d=>d?r(d):n())}).then(s),C=k;var w=async(o,e)=>{e.statusCode=404,e.end(o.method==="HEAD"?void 0:`Route ${o.method} ${o.url} not found`)},v=async(o,e,t)=>{t.statusCode=500,console.error(o),t.end("Internal Server Error")};function y(o){let e=o.indexOf("?");return e===-1?o:o.slice(0,Math.max(0,e))}var c=class{constructor(e={}){this.router=new u;this.all=this.add.bind(this,"");this.get=this.add.bind(this,"GET");this.head=this.add.bind(this,"HEAD");this.post=this.add.bind(this,"POST");this.put=this.add.bind(this,"PUT");this.patch=this.add.bind(this,"PATCH");this.delete=this.add.bind(this,"DELETE");this.onNoMatch=e.onNoMatch||w,this.onError=e.onError||v}add(e,t,s,...n){return typeof t=="string"&&typeof s=="function"?n=[s]:typeof s=="object"?typeof t=="function"?n=[h(s,t)]:n=n.map(r=>h(s,r)):typeof s=="function"&&(n=[s]),this.router.add(e,t,...n),this}use(e,...t){return(typeof e=="function"||e instanceof c)&&(t.unshift(e),e="/"),this.router.use(e,...t.map(s=>s instanceof c?s.router:s)),this}prepareRequest(e,t){e.params={...t.params,...e.params}}clone(){let e=new c({onNoMatch:this.onNoMatch,onError:this.onError});return e.router=this.router.clone(),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),u.exec(s.fns,e,t)}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):u.exec(n.fns,t,s))}catch(r){await this.onError(r,t,s,e)}}}},q=(o={})=>new c(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))},L=j;export{l as EdgeRouter,c as NodeRouter,u as Router,E as createEdgeRouter,q as createNodeRouter,q as createRouter,C as expressWrapper,L as sendJson,h as withZod};
1
+ import N from 'http-errors';
2
+ import { ZodError } from 'zod';
3
+ import { parse } from 'regexparam';
4
+
5
+ var M=Object.defineProperty;var S=(o,e,t)=>e in o?M(o,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):o[e]=t;var a=(o,e,t)=>(S(o,typeof e!="symbol"?e+"":e,t),t);var E=(o,e)=>async(t,s,n)=>{let r=t;try{r=await o.parseAsync(t);}catch(d){let{message:u}=d;throw d instanceof ZodError&&typeof d.format=="function"&&(u=d.issues.map(p=>`${p.path.join("/")} - ${p.message}`).join("/n")),N(422,u)}return e(r,s,n)},x=E;var i=class{constructor(e="/",t=[]){this.base=e;this.routes=t;}add(e,t,...s){if(typeof t=="function"&&(s.unshift(t),t=""),t==="")this.routes.push({matchAll:!0,method:e,fns:s,isMiddleware:!1});else {let{keys:n,pattern:r}=parse(t);this.routes.push({keys:n,pattern:r,method:e,fns:s,isMiddleware:!1});}return this}use(e,...t){(typeof e=="function"||e instanceof i)&&(t.unshift(e),e="/"),t=t.map(r=>{if(r instanceof i){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({keys:s,pattern:n,method:"",fns:t,isMiddleware:!0}),this}clone(e){return new i(e,[...this.routes])}static async exec(e,...t){let s=0,n=()=>e[++s](...t,n);return e[s](...t,n)}find(e,t){let s=!0,n=[],r={},d=e==="HEAD";return Object.values(this.routes).forEach(u=>{if(u.method!==e&&u.method!==""&&!(d&&u.method==="GET"))return;let p=!1;if("matchAll"in u)p=!0;else if(u.keys===!1){let R=u.pattern.exec(t);if(R===null)return;R.groups!==void 0&&Object.keys(R.groups).forEach(l=>{r[l]=R.groups[l];}),p=!0;}else if(u.keys.length>0){let R=u.pattern.exec(t);if(R===null)return;for(let l=0;l<u.keys.length;){let m=u.keys[l];r[m]=R[++l];}p=!0;}else u.pattern.test(t)&&(p=!0);p&&(n.push(...u.fns.flatMap(R=>{if(R instanceof i){let{base:l}=R,m=t.slice(l.length);m.startsWith("/")||(m=`/${m}`);let f=R.find(e,m);return f.middleOnly||(s=!1),Object.assign(r,f.params),f.fns}return R})),u.isMiddleware||(s=!1));}),{fns:n,params:r,middleOnly:s}}};var k=async o=>new Response(o.method==="HEAD"?null:`Route ${o.method} ${o.url} not found`,{status:404}),C=async o=>(console.error(o),new Response("Internal Server Error",{status:500}));function y(o){return (o.nextUrl??new URL(o.url)).pathname}var c=class{constructor(e={}){a(this,"router",new i);a(this,"onNoMatch");a(this,"onError");a(this,"all",this.add.bind(this,""));a(this,"get",this.add.bind(this,"GET"));a(this,"head",this.add.bind(this,"HEAD"));a(this,"post",this.add.bind(this,"POST"));a(this,"put",this.add.bind(this,"PUT"));a(this,"patch",this.add.bind(this,"PATCH"));a(this,"delete",this.add.bind(this,"DELETE"));this.onNoMatch=e.onNoMatch??k,this.onError=e.onError??C;}add(e,t,s,...n){return typeof t=="string"&&typeof s=="function"?n=[s]:typeof s=="object"?typeof t=="function"?n=[x(s,t)]:n=n.map(r=>x(s,r)):typeof s=="function"&&(n=[s]),this.router.add(e,t,...n),this}use(e,...t){return (typeof e=="function"||e instanceof c)&&(t.unshift(e),e="/"),this.router.use(e,...t.map(s=>s instanceof c?s.router:s)),this}prepareRequest(e,t){e.params={...t.params,...e.params};}clone(){let e=new c({onNoMatch:this.onNoMatch,onError:this.onError});return e.router=this.router.clone(),e}async run(e,t){let s=this.router.find(e.method,y(e));if(s.fns.length!==0)return this.prepareRequest(e,s),i.exec(s.fns,e,t)}handler(){let{routes:e}=this.router;return async(t,s)=>{let n=this.router.find(t.method,y(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 this.onError(r,t,s,e)}}}};function w(o={}){return new c(o)}var v=o=>(e,t,s)=>new Promise((n,r)=>{o(e,t,d=>d?r(d):n());}).then(s),L=v;var j=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");};function b(o){let e=o.indexOf("?");return e===-1?o:o.slice(0,Math.max(0,e))}var h=class{constructor(e={}){a(this,"router",new i);a(this,"onNoMatch");a(this,"onError");a(this,"all",this.add.bind(this,""));a(this,"get",this.add.bind(this,"GET"));a(this,"head",this.add.bind(this,"HEAD"));a(this,"post",this.add.bind(this,"POST"));a(this,"put",this.add.bind(this,"PUT"));a(this,"patch",this.add.bind(this,"PATCH"));a(this,"delete",this.add.bind(this,"DELETE"));this.onNoMatch=e.onNoMatch??j,this.onError=e.onError??P;}add(e,t,s,...n){return typeof t=="string"&&typeof s=="function"?n=[s]:typeof s=="object"?typeof t=="function"?n=[x(s,t)]:n=n.map(r=>x(s,r)):typeof s=="function"&&(n=[s]),this.router.add(e,t,...n),this}use(e,...t){return (typeof e=="function"||e instanceof h)&&(t.unshift(e),e="/"),this.router.use(e,...t.map(s=>s instanceof h?s.router:s)),this}prepareRequest(e,t){e.params={...t.params,...e.params};}clone(){let e=new h({onNoMatch:this.onNoMatch,onError:this.onError});return e.router=this.router.clone(),e}async run(e,t){let s=this.router.find(e.method,b(e.url));if(s.fns.length!==0)return this.prepareRequest(e,s),i.exec(s.fns,e,t)}handler(){let{routes:e}=this.router;return async(t,s)=>{let n=this.router.find(t.method,b(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);}}}},q=(o={})=>new h(o);var Z=(o,e,t)=>{o.setHeader("content-type","application/json; charset=utf-8"),o.statusCode=e,o.end(JSON.stringify(t,null,2));},A=Z;
6
+
7
+ export { c as EdgeRouter, h as NodeRouter, i as Router, w as createEdgeRouter, q as createNodeRouter, q as createRouter, L as expressWrapper, A as sendJson, x as withZod };
8
+ //# sourceMappingURL=out.js.map
2
9
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/adapter/with-zod.ts","../src/router.ts","../src/edge.ts","../src/adapter/express.ts","../src/node.ts","../src/utils/send-json.ts"],"sourcesContent":["import createHttpError from \"http-errors\";\nimport type { AnyZodObject } from \"zod\";\nimport { ZodError, ZodObject } from \"zod\";\n\nimport type { Nextable, NextHandler } from \"../types\";\n\nconst withZod = <\n Request extends object,\n Response extends unknown,\n Handler extends Nextable<any>,\n Schema extends ZodObject<{ body?: AnyZodObject; headers?: AnyZodObject; query?: AnyZodObject }>,\n >(\n schema: Schema,\n handler: Handler,\n ): ((request: Request, response: Response, next: NextHandler) => Promise<Response>) => 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;\n\n // eslint-disable-next-line unicorn/consistent-destructuring\n if (error instanceof ZodError && typeof error.format === \"function\") {\n // eslint-disable-next-line unicorn/consistent-destructuring\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 {\n FindResult, FunctionLike, HttpMethod, Nextable, RouteMatch,\n} from \"./types\";\n\nexport type Route<H> = {\n method: HttpMethod | \"\";\n fns: (H | Router<H extends FunctionLike ? H : never>)[];\n isMiddleware: boolean;\n} & (\n | {\n keys: string[] | false;\n pattern: RegExp;\n }\n | { matchAll: true }\n);\n\nexport class Router<H extends FunctionLike> {\n constructor(public base: string = \"/\", public routes: Route<Nextable<H>>[] = []) {}\n\n public add(method: HttpMethod | \"\", route: RouteMatch | Nextable<H>, ...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 matchAll: true,\n method,\n fns,\n isMiddleware: false,\n });\n } else {\n const { keys, pattern } = parse(route);\n\n this.routes.push({\n keys,\n pattern,\n method,\n fns,\n isMiddleware: false,\n });\n }\n\n return this;\n }\n\n public use(base: RouteMatch | Nextable<H> | Router<H>, ...fns: (Nextable<H> | Router<H>)[]) {\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\") return function_.clone(base);\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 keys,\n pattern,\n method: \"\",\n fns,\n isMiddleware: true,\n });\n\n return this;\n }\n\n public clone(base?: string) {\n return new Router<H>(base, [...this.routes]);\n }\n\n static async exec<H extends FunctionLike>(fns: Nextable<H>[], ...arguments_: Parameters<H>): Promise<unknown> {\n let index = 0;\n\n // eslint-disable-next-line no-plusplus\n const next = () => (fns[++index] as FunctionLike)(...arguments_, next);\n\n return (fns[index] as FunctionLike)(...arguments_, next);\n }\n\n // eslint-disable-next-line radar/cognitive-complexity\n 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 radar/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-ignore @TODO: fix this\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 for (let index = 0; index < route.keys.length;) {\n const parameterKey = route.keys[index];\n\n // @ts-ignore @TODO: fix this\n // eslint-disable-next-line no-plusplus\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_.base as string;\n\n let stripPathname = pathname.slice(base.length);\n\n // fix stripped pathname, not sure why this happens\n // eslint-disable-next-line eqeqeq\n if (stripPathname[0] != \"/\") {\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 if (!route.isMiddleware) middleOnly = false;\n }\n });\n\n return { fns, params: parameters, middleOnly };\n }\n}\n","import type { AnyZodObject } from \"zod\";\nimport { ZodObject } from \"zod\";\n\nimport withZod from \"./adapter/with-zod\";\nimport { Route, 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\n// eslint-disable-next-line max-len\nconst onNoMatch = async (request: Request) => 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 return new Response(\"Internal Server Error\", { status: 500 });\n};\n\nexport function getPathname(request: Request & { nextUrl?: URL }) {\n // eslint-disable-next-line compat/compat\n return (request.nextUrl || new URL(request.url)).pathname;\n}\n\n// eslint-disable-next-line max-len\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 private router = new Router<RequestHandler<R, Context>>();\n\n private readonly onNoMatch: RoutesExtendedRequestHandler<R, Context, RResponse, Route<Nextable<FunctionLike>>[]>;\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 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 = 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 private add(\n method: HttpMethod | \"\",\n routeOrFunction: RouteMatch | Nextable<RequestHandler<R, Context>>,\n zodOrRouteOrFunction?: RouteMatch | Schema | Nextable<RequestHandler<R, Context>>,\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,max-len\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 public all: RouteShortcutMethod<this, Schema, RequestHandler<R, Context>> = this.add.bind(this, \"\");\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 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 patch: RouteShortcutMethod<this, Schema, RequestHandler<R, Context>> = this.add.bind(this, \"PATCH\");\n\n public delete: RouteShortcutMethod<this, Schema, RequestHandler<R, Context>> = this.add.bind(this, \"DELETE\");\n\n public use(\n base: RouteMatch | Nextable<RequestHandler<R, Context>> | EdgeRouter<R, Context>,\n ...fns: (Nextable<RequestHandler<R, Context>> | EdgeRouter<R, Context>)[]\n ) {\n if (typeof base === \"function\" || base instanceof EdgeRouter) {\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 EdgeRouter ? function_.router : function_)));\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 public clone() {\n const r = new EdgeRouter<R, Context, RResponse, Schema>({ onNoMatch: this.onNoMatch, onError: this.onError });\n\n r.router = this.router.clone();\n\n return r;\n }\n\n async run(request: R, context_: Context) {\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 Router.exec(result.fns, request, context_);\n }\n\n handler() {\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 this.onError(error, request, context_, routes);\n }\n };\n }\n}\n\nexport function createEdgeRouter<R extends Request, Context>(\n options: HandlerOptions<RoutesExtendedRequestHandler<R, Context, Response, Route<Nextable<FunctionLike>>[]>> = {},\n) {\n return new EdgeRouter<R, Context, Response>(options);\n}\n","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 = <Request extends IncomingMessage, Response extends ServerResponse>(\n function_: ExpressRequestHandler<Request, Response>,\n // eslint-disable-next-line compat/compat\n): Nextable<RequestHandler<Request, Response>> => (request, response, next) => new Promise<void>((resolve, reject) => {\n function_(request, response, (error) => (error ? reject(error) : resolve()));\n // eslint-disable-next-line promise/no-callback-in-promise\n }).then(next);\n\nexport type ExpressRequestHandler<Request, Response> = (request: Request, response: Response, next: NextFunction) => void;\n\nexport default expressWrapper;\n","import type { IncomingMessage, ServerResponse } from \"node:http\";\nimport type { AnyZodObject } from \"zod\";\nimport { 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 // eslint-disable-next-line no-console\n console.error(error);\n\n response.end(\"Internal Server Error\");\n};\n\nexport function getPathname(url: 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<any>,\n> {\n private router = new Router<RequestHandler<Request, Response>>();\n\n private readonly onNoMatch: RoutesExtendedRequestHandler<Request, Response, Response, Route<Nextable<FunctionLike>>[]>;\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 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 private add(\n method: HttpMethod | \"\",\n routeOrFunction: RouteMatch | Nextable<RequestHandler<Request, Response>>,\n zodOrRouteOrFunction?: RouteMatch | Schema | Nextable<RequestHandler<Request, Response>>,\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 // eslint-disable-next-line unicorn/prefer-ternary\n if (typeof routeOrFunction === \"function\") {\n // eslint-disable-next-line no-param-reassign\n fns = [withZod<Request, Response, Nextable<RequestHandler<Request, Response>>, Schema>(\n zodOrRouteOrFunction as Schema,\n routeOrFunction,\n )];\n } else {\n // eslint-disable-next-line no-param-reassign,max-len\n fns = fns.map((function_) => withZod<Request, Response, Nextable<RequestHandler<Request, Response>>, 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 public all: RouteShortcutMethod<this, Schema, RequestHandler<Request, Response>> = this.add.bind(this, \"\");\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 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 patch: RouteShortcutMethod<this, Schema, RequestHandler<Request, Response>> = this.add.bind(this, \"PATCH\");\n\n public delete: RouteShortcutMethod<this, Schema, RequestHandler<Request, Response>> = this.add.bind(this, \"DELETE\");\n\n public use(\n base: RouteMatch | Nextable<RequestHandler<Request, Response>> | NodeRouter<Request, Response, Schema>,\n ...fns: (Nextable<RequestHandler<Request, Response>> | NodeRouter<Request, Response, Schema>)[]\n ) {\n if (typeof base === \"function\" || base instanceof NodeRouter) {\n fns.unshift(base);\n // eslint-disable-next-line no-param-reassign\n base = \"/\";\n }\n this.router.use(base, ...fns.map((function_) => (function_ instanceof NodeRouter ? function_.router : function_)));\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 public clone() {\n const r = new NodeRouter<Request, Response, Schema>({ onNoMatch: this.onNoMatch, onError: this.onError });\n\n r.router = this.router.clone();\n\n return r;\n }\n\n 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 Router.exec(result.fns, request, response);\n }\n\n handler() {\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\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 ) => 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: any): 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"],"mappings":"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","names":["createHttpError","ZodError","withZod","schema","handler","request","response","next","transformedRequest","error","message","issue","with_zod_default","parse","Router","base","routes","method","route","fns","keys","pattern","function_","arguments_","index","next","pathname","middleOnly","parameters","isHead","matched","matches","key","parameterKey","stripPathname","result","onNoMatch","request","onError","error","getPathname","EdgeRouter","options","Router","method","routeOrFunction","zodOrRouteOrFunction","fns","with_zod_default","function_","base","findResult","r","context_","result","routes","createEdgeRouter","expressWrapper","function_","request","response","next","resolve","reject","error","express_default","onNoMatch","request","response","onError","error","_request","getPathname","url","queryIndex","NodeRouter","options","Router","method","routeOrFunction","zodOrRouteOrFunction","fns","with_zod_default","function_","base","findResult","r","result","routes","createRouter","sendJson","response","statusCode","jsonBody","send_json_default"]}
1
+ {"version":3,"sources":["../src/adapter/with-zod.ts","../src/router.ts","../src/edge.ts","../src/adapter/express.ts","../src/node.ts","../src/utils/send-json.ts"],"names":["createHttpError","ZodError","withZod","schema","handler","request","response","next","transformedRequest","error","message","issue","with_zod_default","parse","Router","base","routes","method","route","fns","keys","pattern","function_","arguments_","index","pathname","middleOnly","parameters","isHead","matched","matches","key","parameterKey","stripPathname","result","onNoMatch","onError","getPathname","EdgeRouter","options","__publicField","routeOrFunction","zodOrRouteOrFunction","findResult","r","context_","createEdgeRouter","expressWrapper","resolve","reject","express_default","_request","url","queryIndex","NodeRouter","createRouter","sendJson","statusCode","jsonBody","send_json_default"],"mappings":"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","sourcesContent":["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,\n Response,\n Handler extends Nextable<any>,\n Schema extends ZodObject<{ body?: AnyZodObject; headers?: AnyZodObject; query?: AnyZodObject }>,\n >(\n schema: Schema,\n handler: Handler,\n ): ((request: Request, response: Response, next: NextHandler) => Promise<Response>) => 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;\n\n // eslint-disable-next-line unicorn/consistent-destructuring\n if (error instanceof ZodError && typeof error.format === \"function\") {\n // eslint-disable-next-line unicorn/consistent-destructuring\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 {\n FindResult, FunctionLike, HttpMethod, Nextable, RouteMatch,\n} from \"./types\";\n\nexport type Route<H> = {\n method: HttpMethod | \"\";\n fns: (H | Router<H extends FunctionLike ? H : never>)[];\n isMiddleware: boolean;\n} & (\n | {\n keys: string[] | false;\n pattern: RegExp;\n }\n | { matchAll: true }\n);\n\nexport class Router<H extends FunctionLike> {\n public constructor(public base: string = \"/\", public routes: Route<Nextable<H>>[] = []) {}\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 matchAll: true,\n method,\n fns,\n isMiddleware: false,\n });\n } else {\n const { keys, pattern } = parse(route);\n\n this.routes.push({\n keys,\n pattern,\n method,\n fns,\n isMiddleware: false,\n });\n }\n\n return this;\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\") return function_.clone(base);\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 keys,\n pattern,\n method: \"\",\n fns,\n isMiddleware: true,\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 static async exec<H extends FunctionLike>(fns: Nextable<H>[], ...arguments_: Parameters<H>): Promise<unknown> {\n let index = 0;\n\n // eslint-disable-next-line no-plusplus\n const next = () => (fns[++index] as FunctionLike)(...arguments_, next);\n\n return (fns[index] as FunctionLike)(...arguments_, next);\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 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 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 for (let index = 0; index < route.keys.length;) {\n const parameterKey = route.keys[index];\n\n // @ts-expect-error @TODO: fix this\n // eslint-disable-next-line no-plusplus\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 // eslint-disable-next-line eqeqeq\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 if (!route.isMiddleware) middleOnly = false;\n }\n });\n\n return { fns, params: parameters, middleOnly };\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\n// eslint-disable-next-line max-len\nconst onNoMatch = async (request: Request) => 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 return new Response(\"Internal Server Error\", { status: 500 });\n};\n\nexport function getPathname(request: Request & { nextUrl?: URL }): string {\n // eslint-disable-next-line compat/compat\n return (request.nextUrl ?? new URL(request.url)).pathname;\n}\n\n// eslint-disable-next-line max-len,@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 private router = new Router<RequestHandler<R, Context>>();\n\n private readonly onNoMatch: RoutesExtendedRequestHandler<R, Context, RResponse, Route<Nextable<FunctionLike>>[]>;\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 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 = 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 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,max-len\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 public all: RouteShortcutMethod<this, Schema, RequestHandler<R, Context>> = this.add.bind(this, \"\");\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 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 patch: RouteShortcutMethod<this, Schema, RequestHandler<R, Context>> = this.add.bind(this, \"PATCH\");\n\n public delete: RouteShortcutMethod<this, Schema, RequestHandler<R, Context>> = this.add.bind(this, \"DELETE\");\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 // 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 public clone(): EdgeRouter<R, Context, RResponse, Schema> {\n const r = new EdgeRouter<R, Context, RResponse, Schema>({ onNoMatch: this.onNoMatch, onError: this.onError });\n\n r.router = this.router.clone();\n\n return r;\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 Router.exec(result.fns, request, context_);\n }\n\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 this.onError(error, request, context_, routes);\n }\n };\n }\n}\n\nexport function createEdgeRouter<R extends Request, Context>(\n options: HandlerOptions<RoutesExtendedRequestHandler<R, Context, Response, Route<Nextable<FunctionLike>>[]>> = {},\n): EdgeRouter<R, Context> {\n return new EdgeRouter<R, Context, Response>(options);\n}\n","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 = <Request extends IncomingMessage, Response extends ServerResponse>(\n function_: ExpressRequestHandler<Request, Response>,\n // eslint-disable-next-line compat/compat\n): Nextable<RequestHandler<Request, Response>> => (request, response, next) => new Promise<void>((resolve, reject) => {\n function_(request, response, (error) => (error ? reject(error) : resolve()));\n // eslint-disable-next-line promise/no-callback-in-promise\n }).then(next);\n\nexport type ExpressRequestHandler<Request, Response> = (request: Request, response: Response, next: NextFunction) => void;\n\nexport default expressWrapper;\n","import type { IncomingMessage, ServerResponse } from \"node:http\";\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 // eslint-disable-next-line no-console\n console.error(error);\n\n response.end(\"Internal Server Error\");\n};\n\nexport function 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<any>,\n> {\n private router = new Router<RequestHandler<Request, Response>>();\n\n private readonly onNoMatch: RoutesExtendedRequestHandler<Request, Response, Response, Route<Nextable<FunctionLike>>[]>;\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 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 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 // eslint-disable-next-line unicorn/prefer-ternary\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,max-len\n fns = fns.map((function_) => withZod<Request, Response, Nextable<RequestHandler<Request, Response>>, 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 public all: RouteShortcutMethod<this, Schema, RequestHandler<Request, Response>> = this.add.bind(this, \"\");\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 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 patch: RouteShortcutMethod<this, Schema, RequestHandler<Request, Response>> = this.add.bind(this, \"PATCH\");\n\n public delete: RouteShortcutMethod<this, Schema, RequestHandler<Request, Response>> = this.add.bind(this, \"DELETE\");\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 this.router.use(base, ...fns.map((function_) => (function_ instanceof NodeRouter ? function_.router : function_)));\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 public clone(): NodeRouter<Request, Response, Schema> {\n const r = new NodeRouter<Request, Response, Schema>({ onNoMatch: this.onNoMatch, onError: this.onError });\n\n r.router = this.router.clone();\n\n return r;\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 Router.exec(result.fns, request, response);\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\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": "1.3.2",
3
+ "version": "1.3.4",
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",
@@ -60,35 +60,36 @@
60
60
  "scripts": {
61
61
  "build": "cross-env NODE_ENV=development tsup",
62
62
  "build:prod": "cross-env NODE_ENV=production tsup",
63
- "clean": "rimraf node_modules dist",
63
+ "clean": "rimraf node_modules dist .eslintcache",
64
64
  "coverage": "vitest run --coverage",
65
65
  "dev": "pnpm predev && pnpm run build --watch",
66
66
  "lint:eslint": "cross-env NO_LOGS=true eslint . --ext js,jsx,ts,tsx --max-warnings=0 --config .eslintrc.cjs --cache --cache-strategy content .",
67
67
  "lint:eslint:fix": "pnpm run lint:eslint --fix",
68
- "test": "vitest"
68
+ "test": "vitest run",
69
+ "test:watch": "vitest"
69
70
  },
70
71
  "dependencies": {
71
72
  "http-errors": "^2.0.0",
72
73
  "regexparam": "^2.0.1"
73
74
  },
74
75
  "devDependencies": {
75
- "@anolilab/eslint-config": "^4.1.1",
76
- "@anolilab/semantic-release-preset": "^2.1.0",
77
- "@rushstack/eslint-plugin-security": "^0.5.0",
78
- "@types/http-errors": "^2.0.0",
79
- "@types/node": "^18.11.5",
80
- "@typescript-eslint/eslint-plugin": "^5.41.0",
81
- "@typescript-eslint/parser": "^5.41.0",
82
- "@vitest/coverage-c8": "^0.26.0",
83
- "c8": "^7.12.0",
76
+ "@anolilab/eslint-config": "^5.0.5",
77
+ "@anolilab/semantic-release-preset": "^2.2.1",
78
+ "@rushstack/eslint-plugin-security": "^0.6.0",
79
+ "@types/http-errors": "^2.0.1",
80
+ "@types/node": "18.16.14",
81
+ "@typescript-eslint/eslint-plugin": "^5.59.7",
82
+ "@typescript-eslint/parser": "^5.59.7",
83
+ "@vitest/coverage-c8": "^0.31.1",
84
+ "c8": "^7.13.0",
84
85
  "cross-env": "^7.0.3",
85
- "eslint": "^8.26.0",
86
- "eslint-plugin-compat": "^4.0.2",
86
+ "eslint": "^8.41.0",
87
+ "eslint-plugin-compat": "^4.1.4",
87
88
  "eslint-plugin-eslint-comments": "^3.2.0",
88
- "eslint-plugin-import": "^2.26.0",
89
+ "eslint-plugin-import": "^2.27.5",
89
90
  "eslint-plugin-json": "^3.1.0",
90
- "eslint-plugin-jsonc": "^2.5.0",
91
- "eslint-plugin-jsx-a11y": "^6.6.1",
91
+ "eslint-plugin-jsonc": "^2.8.0",
92
+ "eslint-plugin-jsx-a11y": "^6.7.1",
92
93
  "eslint-plugin-markdown": "^3.0.0",
93
94
  "eslint-plugin-material-ui": "^1.0.1",
94
95
  "eslint-plugin-no-loops": "^0.3.0",
@@ -96,30 +97,29 @@
96
97
  "eslint-plugin-node": "^11.1.0",
97
98
  "eslint-plugin-optimize-regex": "^1.2.1",
98
99
  "eslint-plugin-promise": "^6.1.1",
99
- "eslint-plugin-radar": "^0.2.1",
100
- "eslint-plugin-simple-import-sort": "^8.0.0",
100
+ "eslint-plugin-simple-import-sort": "^10.0.0",
101
101
  "eslint-plugin-sort-keys-fix": "^1.1.2",
102
- "eslint-plugin-testing-library": "^5.9.1",
103
- "eslint-plugin-unicorn": "^45.0.0",
102
+ "eslint-plugin-testing-library": "^5.11.0",
103
+ "eslint-plugin-unicorn": "^47.0.0",
104
104
  "eslint-plugin-you-dont-need-lodash-underscore": "^6.12.0",
105
105
  "eslint-plugin-you-dont-need-momentjs": "^1.6.0",
106
106
  "express": "^4.18.2",
107
- "fastify": "^4.9.2",
107
+ "fastify": "^4.17.0",
108
108
  "isomorphic-fetch": "^3.0.0",
109
- "prettier": "^2.7.1",
110
- "read-pkg": "^7.1.0",
111
- "rimraf": "^3.0.2",
112
- "semantic-release": "^20.0.0",
113
- "tsup": "^6.3.0",
114
- "typescript": "^4.8.4",
115
- "vitest": "^0.26.1",
116
- "zod": "^3.19.1"
109
+ "prettier": "^2.8.8",
110
+ "read-pkg": "^8.0.0",
111
+ "rimraf": "^5.0.1",
112
+ "semantic-release": "^21.0.2",
113
+ "tsup": "^6.7.0",
114
+ "typescript": "^5.0.4",
115
+ "vitest": "^0.31.1",
116
+ "zod": "^3.21.4"
117
117
  },
118
118
  "peerDependencies": {
119
119
  "zod": "^3.19.1"
120
120
  },
121
121
  "engines": {
122
- "node": ">=16.18.0 <=19.0"
122
+ "node": ">=16.18.0 <=20.*"
123
123
  },
124
124
  "publishConfig": {
125
125
  "access": "public"