@visulima/connect 3.0.24 → 3.0.26
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 +21 -0
- package/dist/adapter/express.d.cts +7 -0
- package/dist/adapter/express.d.mts +7 -0
- package/dist/adapter/express.d.ts +7 -0
- package/dist/adapter/with-zod.d.cts +8 -0
- package/dist/adapter/with-zod.d.mts +8 -0
- package/dist/adapter/with-zod.d.ts +8 -0
- package/dist/edge.d.cts +30 -0
- package/dist/edge.d.mts +30 -0
- package/dist/edge.d.ts +30 -0
- package/dist/index.cjs +22 -1
- package/dist/index.d.cts +12 -128
- package/dist/index.d.mts +12 -128
- package/dist/index.d.ts +12 -128
- package/dist/index.mjs +6 -1
- package/dist/node.d.cts +33 -0
- package/dist/node.d.mts +33 -0
- package/dist/node.d.ts +33 -0
- package/dist/packem_shared/EdgeRouter-B-e2l9un.cjs +96 -0
- package/dist/packem_shared/EdgeRouter-CdtQHTwm.mjs +90 -0
- package/dist/packem_shared/Router-ChnTdYfl.mjs +135 -0
- package/dist/packem_shared/Router-Eg_OPxIL.cjs +139 -0
- package/dist/packem_shared/createRouter-C8hDVJcV.cjs +102 -0
- package/dist/packem_shared/createRouter-_G1XhaP4.mjs +96 -0
- package/dist/packem_shared/expressWrapper-CTExfWvM.cjs +10 -0
- package/dist/packem_shared/expressWrapper-spfs58is.mjs +8 -0
- package/dist/packem_shared/sendJson-DwLYLDbt.mjs +7 -0
- package/dist/packem_shared/sendJson-pJY2tT2n.cjs +9 -0
- package/dist/packem_shared/withZod-HYgoC7AX.mjs +18 -0
- package/dist/packem_shared/withZod-ULTsdyM5.cjs +24 -0
- package/dist/router.d.cts +21 -0
- package/dist/router.d.mts +21 -0
- package/dist/router.d.ts +21 -0
- package/dist/utils/send-json.d.cts +9 -0
- package/dist/utils/send-json.d.mts +9 -0
- package/dist/utils/send-json.d.ts +9 -0
- package/package.json +1 -1
- package/dist/packem_shared/EdgeRouter-DkYqae6k.mjs +0 -1
- package/dist/packem_shared/EdgeRouter-KIBlNPX3.cjs +0 -1
- package/dist/packem_shared/Router-Dg3J0bWq.mjs +0 -1
- package/dist/packem_shared/Router-fcD22mVn.cjs +0 -1
- package/dist/packem_shared/createRouter-Bp84h_yy.mjs +0 -1
- package/dist/packem_shared/createRouter-CcKo5sWT.cjs +0 -1
- package/dist/packem_shared/expressWrapper-CnZ-5oTw.cjs +0 -1
- package/dist/packem_shared/expressWrapper-D-d31tgs.mjs +0 -1
- package/dist/packem_shared/sendJson-l4jM19lK.cjs +0 -1
- package/dist/packem_shared/sendJson-zUtTFUYn.mjs +0 -1
- package/dist/packem_shared/withZod-CvygheEk.cjs +0 -1
- package/dist/packem_shared/withZod-wmNwBerD.mjs +0 -1
package/dist/index.mjs
CHANGED
|
@@ -1 +1,6 @@
|
|
|
1
|
-
|
|
1
|
+
export { default as expressWrapper } from './packem_shared/expressWrapper-spfs58is.mjs';
|
|
2
|
+
export { default as withZod } from './packem_shared/withZod-HYgoC7AX.mjs';
|
|
3
|
+
export { EdgeRouter, createEdgeRouter } from './packem_shared/EdgeRouter-CdtQHTwm.mjs';
|
|
4
|
+
export { NodeRouter, createRouter as createNodeRouter, createRouter } from './packem_shared/createRouter-_G1XhaP4.mjs';
|
|
5
|
+
export { Router } from './packem_shared/Router-ChnTdYfl.mjs';
|
|
6
|
+
export { default as sendJson } from './packem_shared/sendJson-DwLYLDbt.mjs';
|
package/dist/node.d.cts
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { IncomingMessage, ServerResponse } from "node:http";
|
|
2
|
+
import type { ZodObject } from "zod";
|
|
3
|
+
import type { Route } from "./router.d.cts";
|
|
4
|
+
import type { FunctionLike, HandlerOptions, Nextable, RouteMatch, RoutesExtendedRequestHandler, RouteShortcutMethod, ValueOrPromise } from "./types.d.d.cts";
|
|
5
|
+
export declare const getPathname: (url: string) => string;
|
|
6
|
+
export type RequestHandler<Request extends IncomingMessage, Response extends ServerResponse> = (request: Request, response: Response) => ValueOrPromise<void>;
|
|
7
|
+
export declare class NodeRouter<Request extends IncomingMessage = IncomingMessage, Response extends ServerResponse = ServerResponse, Schema extends ZodObject<any> = ZodObject<never>> {
|
|
8
|
+
all: RouteShortcutMethod<this, Schema, RequestHandler<Request, Response>>;
|
|
9
|
+
connect: RouteShortcutMethod<this, Schema, RequestHandler<Request, Response>>;
|
|
10
|
+
delete: RouteShortcutMethod<this, Schema, RequestHandler<Request, Response>>;
|
|
11
|
+
get: RouteShortcutMethod<this, Schema, RequestHandler<Request, Response>>;
|
|
12
|
+
head: RouteShortcutMethod<this, Schema, RequestHandler<Request, Response>>;
|
|
13
|
+
options: RouteShortcutMethod<this, Schema, RequestHandler<Request, Response>>;
|
|
14
|
+
patch: RouteShortcutMethod<this, Schema, RequestHandler<Request, Response>>;
|
|
15
|
+
post: RouteShortcutMethod<this, Schema, RequestHandler<Request, Response>>;
|
|
16
|
+
put: RouteShortcutMethod<this, Schema, RequestHandler<Request, Response>>;
|
|
17
|
+
trace: RouteShortcutMethod<this, Schema, RequestHandler<Request, Response>>;
|
|
18
|
+
private readonly onError;
|
|
19
|
+
private readonly onNoMatch;
|
|
20
|
+
private router;
|
|
21
|
+
constructor(options?: HandlerOptions<RoutesExtendedRequestHandler<Request, Response, Response, Route<Nextable<FunctionLike>>[]>>);
|
|
22
|
+
clone(): NodeRouter<Request, Response, Schema>;
|
|
23
|
+
handler(): (request: Request, response: Response) => Promise<void>;
|
|
24
|
+
run(request: Request, response: Response): Promise<unknown>;
|
|
25
|
+
use(base: Nextable<RequestHandler<Request, Response>> | NodeRouter<Request, Response, Schema> | RouteMatch, ...fns: (Nextable<RequestHandler<Request, Response>> | NodeRouter<Request, Response, Schema>)[]): this;
|
|
26
|
+
private add;
|
|
27
|
+
private prepareRequest;
|
|
28
|
+
}
|
|
29
|
+
export declare const createRouter: <Request extends IncomingMessage, Response extends ServerResponse, Schema extends ZodObject<any> = ZodObject<{
|
|
30
|
+
body?: ZodObject<any>;
|
|
31
|
+
headers?: ZodObject<any>;
|
|
32
|
+
query?: ZodObject<any>;
|
|
33
|
+
}>>(options?: HandlerOptions<RoutesExtendedRequestHandler<Request, Response, Response, Route<Nextable<FunctionLike>>[]>>) => NodeRouter<Request, Response, Schema>;
|
package/dist/node.d.mts
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { IncomingMessage, ServerResponse } from "node:http";
|
|
2
|
+
import type { ZodObject } from "zod";
|
|
3
|
+
import type { Route } from "./router.d.mts";
|
|
4
|
+
import type { FunctionLike, HandlerOptions, Nextable, RouteMatch, RoutesExtendedRequestHandler, RouteShortcutMethod, ValueOrPromise } from "./types.d.d.mts";
|
|
5
|
+
export declare const getPathname: (url: string) => string;
|
|
6
|
+
export type RequestHandler<Request extends IncomingMessage, Response extends ServerResponse> = (request: Request, response: Response) => ValueOrPromise<void>;
|
|
7
|
+
export declare class NodeRouter<Request extends IncomingMessage = IncomingMessage, Response extends ServerResponse = ServerResponse, Schema extends ZodObject<any> = ZodObject<never>> {
|
|
8
|
+
all: RouteShortcutMethod<this, Schema, RequestHandler<Request, Response>>;
|
|
9
|
+
connect: RouteShortcutMethod<this, Schema, RequestHandler<Request, Response>>;
|
|
10
|
+
delete: RouteShortcutMethod<this, Schema, RequestHandler<Request, Response>>;
|
|
11
|
+
get: RouteShortcutMethod<this, Schema, RequestHandler<Request, Response>>;
|
|
12
|
+
head: RouteShortcutMethod<this, Schema, RequestHandler<Request, Response>>;
|
|
13
|
+
options: RouteShortcutMethod<this, Schema, RequestHandler<Request, Response>>;
|
|
14
|
+
patch: RouteShortcutMethod<this, Schema, RequestHandler<Request, Response>>;
|
|
15
|
+
post: RouteShortcutMethod<this, Schema, RequestHandler<Request, Response>>;
|
|
16
|
+
put: RouteShortcutMethod<this, Schema, RequestHandler<Request, Response>>;
|
|
17
|
+
trace: RouteShortcutMethod<this, Schema, RequestHandler<Request, Response>>;
|
|
18
|
+
private readonly onError;
|
|
19
|
+
private readonly onNoMatch;
|
|
20
|
+
private router;
|
|
21
|
+
constructor(options?: HandlerOptions<RoutesExtendedRequestHandler<Request, Response, Response, Route<Nextable<FunctionLike>>[]>>);
|
|
22
|
+
clone(): NodeRouter<Request, Response, Schema>;
|
|
23
|
+
handler(): (request: Request, response: Response) => Promise<void>;
|
|
24
|
+
run(request: Request, response: Response): Promise<unknown>;
|
|
25
|
+
use(base: Nextable<RequestHandler<Request, Response>> | NodeRouter<Request, Response, Schema> | RouteMatch, ...fns: (Nextable<RequestHandler<Request, Response>> | NodeRouter<Request, Response, Schema>)[]): this;
|
|
26
|
+
private add;
|
|
27
|
+
private prepareRequest;
|
|
28
|
+
}
|
|
29
|
+
export declare const createRouter: <Request extends IncomingMessage, Response extends ServerResponse, Schema extends ZodObject<any> = ZodObject<{
|
|
30
|
+
body?: ZodObject<any>;
|
|
31
|
+
headers?: ZodObject<any>;
|
|
32
|
+
query?: ZodObject<any>;
|
|
33
|
+
}>>(options?: HandlerOptions<RoutesExtendedRequestHandler<Request, Response, Response, Route<Nextable<FunctionLike>>[]>>) => NodeRouter<Request, Response, Schema>;
|
package/dist/node.d.ts
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { IncomingMessage, ServerResponse } from "node:http";
|
|
2
|
+
import type { ZodObject } from "zod";
|
|
3
|
+
import type { Route } from "./router.d.ts";
|
|
4
|
+
import type { FunctionLike, HandlerOptions, Nextable, RouteMatch, RoutesExtendedRequestHandler, RouteShortcutMethod, ValueOrPromise } from "./types.d.d.ts";
|
|
5
|
+
export declare const getPathname: (url: string) => string;
|
|
6
|
+
export type RequestHandler<Request extends IncomingMessage, Response extends ServerResponse> = (request: Request, response: Response) => ValueOrPromise<void>;
|
|
7
|
+
export declare class NodeRouter<Request extends IncomingMessage = IncomingMessage, Response extends ServerResponse = ServerResponse, Schema extends ZodObject<any> = ZodObject<never>> {
|
|
8
|
+
all: RouteShortcutMethod<this, Schema, RequestHandler<Request, Response>>;
|
|
9
|
+
connect: RouteShortcutMethod<this, Schema, RequestHandler<Request, Response>>;
|
|
10
|
+
delete: RouteShortcutMethod<this, Schema, RequestHandler<Request, Response>>;
|
|
11
|
+
get: RouteShortcutMethod<this, Schema, RequestHandler<Request, Response>>;
|
|
12
|
+
head: RouteShortcutMethod<this, Schema, RequestHandler<Request, Response>>;
|
|
13
|
+
options: RouteShortcutMethod<this, Schema, RequestHandler<Request, Response>>;
|
|
14
|
+
patch: RouteShortcutMethod<this, Schema, RequestHandler<Request, Response>>;
|
|
15
|
+
post: RouteShortcutMethod<this, Schema, RequestHandler<Request, Response>>;
|
|
16
|
+
put: RouteShortcutMethod<this, Schema, RequestHandler<Request, Response>>;
|
|
17
|
+
trace: RouteShortcutMethod<this, Schema, RequestHandler<Request, Response>>;
|
|
18
|
+
private readonly onError;
|
|
19
|
+
private readonly onNoMatch;
|
|
20
|
+
private router;
|
|
21
|
+
constructor(options?: HandlerOptions<RoutesExtendedRequestHandler<Request, Response, Response, Route<Nextable<FunctionLike>>[]>>);
|
|
22
|
+
clone(): NodeRouter<Request, Response, Schema>;
|
|
23
|
+
handler(): (request: Request, response: Response) => Promise<void>;
|
|
24
|
+
run(request: Request, response: Response): Promise<unknown>;
|
|
25
|
+
use(base: Nextable<RequestHandler<Request, Response>> | NodeRouter<Request, Response, Schema> | RouteMatch, ...fns: (Nextable<RequestHandler<Request, Response>> | NodeRouter<Request, Response, Schema>)[]): this;
|
|
26
|
+
private add;
|
|
27
|
+
private prepareRequest;
|
|
28
|
+
}
|
|
29
|
+
export declare const createRouter: <Request extends IncomingMessage, Response extends ServerResponse, Schema extends ZodObject<any> = ZodObject<{
|
|
30
|
+
body?: ZodObject<any>;
|
|
31
|
+
headers?: ZodObject<any>;
|
|
32
|
+
query?: ZodObject<any>;
|
|
33
|
+
}>>(options?: HandlerOptions<RoutesExtendedRequestHandler<Request, Response, Response, Route<Nextable<FunctionLike>>[]>>) => NodeRouter<Request, Response, Schema>;
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: 'Module' } });
|
|
4
|
+
|
|
5
|
+
const withZod = require('./withZod-ULTsdyM5.cjs');
|
|
6
|
+
const Router = require('./Router-Eg_OPxIL.cjs');
|
|
7
|
+
|
|
8
|
+
const onNoMatch = async (request) => new Response(request.method === "HEAD" ? null : `Route ${request.method} ${request.url} not found`, { status: 404 });
|
|
9
|
+
const onError = async (error) => {
|
|
10
|
+
console.error(error);
|
|
11
|
+
return new Response("Internal Server Error", { status: 500 });
|
|
12
|
+
};
|
|
13
|
+
const getPathname = (request) => (
|
|
14
|
+
// eslint-disable-next-line compat/compat
|
|
15
|
+
(request.nextUrl ?? new URL(request.url)).pathname
|
|
16
|
+
);
|
|
17
|
+
class EdgeRouter {
|
|
18
|
+
all = this.add.bind(this, "");
|
|
19
|
+
connect = this.add.bind(this, "CONNECT");
|
|
20
|
+
delete = this.add.bind(this, "DELETE");
|
|
21
|
+
get = this.add.bind(this, "GET");
|
|
22
|
+
head = this.add.bind(this, "HEAD");
|
|
23
|
+
options = this.add.bind(this, "OPTIONS");
|
|
24
|
+
patch = this.add.bind(this, "PATCH");
|
|
25
|
+
post = this.add.bind(this, "POST");
|
|
26
|
+
put = this.add.bind(this, "PUT");
|
|
27
|
+
trace = this.add.bind(this, "TRACE");
|
|
28
|
+
onError;
|
|
29
|
+
onNoMatch;
|
|
30
|
+
router = new Router.Router();
|
|
31
|
+
constructor(options = {}) {
|
|
32
|
+
this.onNoMatch = options.onNoMatch ?? onNoMatch;
|
|
33
|
+
this.onError = options.onError ?? onError;
|
|
34
|
+
}
|
|
35
|
+
clone() {
|
|
36
|
+
const r = new EdgeRouter({ onError: this.onError, onNoMatch: this.onNoMatch });
|
|
37
|
+
r.router = this.router.clone();
|
|
38
|
+
return r;
|
|
39
|
+
}
|
|
40
|
+
handler() {
|
|
41
|
+
const { routes } = this.router;
|
|
42
|
+
return async (request, context_) => {
|
|
43
|
+
const result = this.router.find(request.method, getPathname(request));
|
|
44
|
+
this.prepareRequest(request, result);
|
|
45
|
+
try {
|
|
46
|
+
return await (result.fns.length === 0 || result.middleOnly ? this.onNoMatch(request, context_, routes) : Router.Router.exec(result.fns, request, context_));
|
|
47
|
+
} catch (error) {
|
|
48
|
+
return await this.onError(error, request, context_, routes);
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
async run(request, context_) {
|
|
53
|
+
const result = this.router.find(request.method, getPathname(request));
|
|
54
|
+
if (result.fns.length === 0) {
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
this.prepareRequest(request, result);
|
|
58
|
+
return await Router.Router.exec(result.fns, request, context_);
|
|
59
|
+
}
|
|
60
|
+
use(base, ...fns) {
|
|
61
|
+
if (typeof base === "function" || base instanceof EdgeRouter) {
|
|
62
|
+
fns.unshift(base);
|
|
63
|
+
base = "/";
|
|
64
|
+
}
|
|
65
|
+
this.router.use(base, ...fns.map((function_) => function_ instanceof EdgeRouter ? function_.router : function_));
|
|
66
|
+
return this;
|
|
67
|
+
}
|
|
68
|
+
add(method, routeOrFunction, zodOrRouteOrFunction, ...fns) {
|
|
69
|
+
if (typeof routeOrFunction === "string" && typeof zodOrRouteOrFunction === "function") {
|
|
70
|
+
fns = [zodOrRouteOrFunction];
|
|
71
|
+
} else if (typeof zodOrRouteOrFunction === "object") {
|
|
72
|
+
if (typeof routeOrFunction === "function") {
|
|
73
|
+
fns = [withZod(zodOrRouteOrFunction, routeOrFunction)];
|
|
74
|
+
} else {
|
|
75
|
+
fns = fns.map((function_) => withZod(zodOrRouteOrFunction, function_));
|
|
76
|
+
}
|
|
77
|
+
} else if (typeof zodOrRouteOrFunction === "function") {
|
|
78
|
+
fns = [zodOrRouteOrFunction];
|
|
79
|
+
}
|
|
80
|
+
this.router.add(method, routeOrFunction, ...fns);
|
|
81
|
+
return this;
|
|
82
|
+
}
|
|
83
|
+
// eslint-disable-next-line class-methods-use-this
|
|
84
|
+
prepareRequest(request, findResult) {
|
|
85
|
+
request.params = {
|
|
86
|
+
...findResult.params,
|
|
87
|
+
...request.params
|
|
88
|
+
// original params will take precedence
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
const createEdgeRouter = (options = {}) => new EdgeRouter(options);
|
|
93
|
+
|
|
94
|
+
exports.EdgeRouter = EdgeRouter;
|
|
95
|
+
exports.createEdgeRouter = createEdgeRouter;
|
|
96
|
+
exports.getPathname = getPathname;
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import withZod from './withZod-HYgoC7AX.mjs';
|
|
2
|
+
import { Router } from './Router-ChnTdYfl.mjs';
|
|
3
|
+
|
|
4
|
+
const onNoMatch = async (request) => new Response(request.method === "HEAD" ? null : `Route ${request.method} ${request.url} not found`, { status: 404 });
|
|
5
|
+
const onError = async (error) => {
|
|
6
|
+
console.error(error);
|
|
7
|
+
return new Response("Internal Server Error", { status: 500 });
|
|
8
|
+
};
|
|
9
|
+
const getPathname = (request) => (
|
|
10
|
+
// eslint-disable-next-line compat/compat
|
|
11
|
+
(request.nextUrl ?? new URL(request.url)).pathname
|
|
12
|
+
);
|
|
13
|
+
class EdgeRouter {
|
|
14
|
+
all = this.add.bind(this, "");
|
|
15
|
+
connect = this.add.bind(this, "CONNECT");
|
|
16
|
+
delete = this.add.bind(this, "DELETE");
|
|
17
|
+
get = this.add.bind(this, "GET");
|
|
18
|
+
head = this.add.bind(this, "HEAD");
|
|
19
|
+
options = this.add.bind(this, "OPTIONS");
|
|
20
|
+
patch = this.add.bind(this, "PATCH");
|
|
21
|
+
post = this.add.bind(this, "POST");
|
|
22
|
+
put = this.add.bind(this, "PUT");
|
|
23
|
+
trace = this.add.bind(this, "TRACE");
|
|
24
|
+
onError;
|
|
25
|
+
onNoMatch;
|
|
26
|
+
router = new Router();
|
|
27
|
+
constructor(options = {}) {
|
|
28
|
+
this.onNoMatch = options.onNoMatch ?? onNoMatch;
|
|
29
|
+
this.onError = options.onError ?? onError;
|
|
30
|
+
}
|
|
31
|
+
clone() {
|
|
32
|
+
const r = new EdgeRouter({ onError: this.onError, onNoMatch: this.onNoMatch });
|
|
33
|
+
r.router = this.router.clone();
|
|
34
|
+
return r;
|
|
35
|
+
}
|
|
36
|
+
handler() {
|
|
37
|
+
const { routes } = this.router;
|
|
38
|
+
return async (request, context_) => {
|
|
39
|
+
const result = this.router.find(request.method, getPathname(request));
|
|
40
|
+
this.prepareRequest(request, result);
|
|
41
|
+
try {
|
|
42
|
+
return await (result.fns.length === 0 || result.middleOnly ? this.onNoMatch(request, context_, routes) : Router.exec(result.fns, request, context_));
|
|
43
|
+
} catch (error) {
|
|
44
|
+
return await this.onError(error, request, context_, routes);
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
async run(request, context_) {
|
|
49
|
+
const result = this.router.find(request.method, getPathname(request));
|
|
50
|
+
if (result.fns.length === 0) {
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
this.prepareRequest(request, result);
|
|
54
|
+
return await Router.exec(result.fns, request, context_);
|
|
55
|
+
}
|
|
56
|
+
use(base, ...fns) {
|
|
57
|
+
if (typeof base === "function" || base instanceof EdgeRouter) {
|
|
58
|
+
fns.unshift(base);
|
|
59
|
+
base = "/";
|
|
60
|
+
}
|
|
61
|
+
this.router.use(base, ...fns.map((function_) => function_ instanceof EdgeRouter ? function_.router : function_));
|
|
62
|
+
return this;
|
|
63
|
+
}
|
|
64
|
+
add(method, routeOrFunction, zodOrRouteOrFunction, ...fns) {
|
|
65
|
+
if (typeof routeOrFunction === "string" && typeof zodOrRouteOrFunction === "function") {
|
|
66
|
+
fns = [zodOrRouteOrFunction];
|
|
67
|
+
} else if (typeof zodOrRouteOrFunction === "object") {
|
|
68
|
+
if (typeof routeOrFunction === "function") {
|
|
69
|
+
fns = [withZod(zodOrRouteOrFunction, routeOrFunction)];
|
|
70
|
+
} else {
|
|
71
|
+
fns = fns.map((function_) => withZod(zodOrRouteOrFunction, function_));
|
|
72
|
+
}
|
|
73
|
+
} else if (typeof zodOrRouteOrFunction === "function") {
|
|
74
|
+
fns = [zodOrRouteOrFunction];
|
|
75
|
+
}
|
|
76
|
+
this.router.add(method, routeOrFunction, ...fns);
|
|
77
|
+
return this;
|
|
78
|
+
}
|
|
79
|
+
// eslint-disable-next-line class-methods-use-this
|
|
80
|
+
prepareRequest(request, findResult) {
|
|
81
|
+
request.params = {
|
|
82
|
+
...findResult.params,
|
|
83
|
+
...request.params
|
|
84
|
+
// original params will take precedence
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
const createEdgeRouter = (options = {}) => new EdgeRouter(options);
|
|
89
|
+
|
|
90
|
+
export { EdgeRouter, createEdgeRouter, getPathname };
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { parse } from 'regexparam';
|
|
2
|
+
|
|
3
|
+
class Router {
|
|
4
|
+
constructor(base = "/", routes = []) {
|
|
5
|
+
this.base = base;
|
|
6
|
+
this.routes = routes;
|
|
7
|
+
}
|
|
8
|
+
static async exec(fns, ...arguments_) {
|
|
9
|
+
let index = 0;
|
|
10
|
+
const next = () => {
|
|
11
|
+
const function_ = fns[++index];
|
|
12
|
+
if (function_ === void 0) {
|
|
13
|
+
return Promise.resolve();
|
|
14
|
+
}
|
|
15
|
+
return function_(...arguments_, next);
|
|
16
|
+
};
|
|
17
|
+
return fns[index](...arguments_, next);
|
|
18
|
+
}
|
|
19
|
+
add(method, route, ...fns) {
|
|
20
|
+
if (typeof route === "function") {
|
|
21
|
+
fns.unshift(route);
|
|
22
|
+
route = "";
|
|
23
|
+
}
|
|
24
|
+
if (route === "") {
|
|
25
|
+
this.routes.push({
|
|
26
|
+
fns,
|
|
27
|
+
isMiddleware: false,
|
|
28
|
+
matchAll: true,
|
|
29
|
+
method
|
|
30
|
+
});
|
|
31
|
+
} else {
|
|
32
|
+
const { keys, pattern } = parse(route);
|
|
33
|
+
this.routes.push({
|
|
34
|
+
fns,
|
|
35
|
+
isMiddleware: false,
|
|
36
|
+
keys,
|
|
37
|
+
method,
|
|
38
|
+
pattern
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
return this;
|
|
42
|
+
}
|
|
43
|
+
clone(base) {
|
|
44
|
+
return new Router(base, [...this.routes]);
|
|
45
|
+
}
|
|
46
|
+
// eslint-disable-next-line sonarjs/cognitive-complexity
|
|
47
|
+
find(method, pathname) {
|
|
48
|
+
let middleOnly = true;
|
|
49
|
+
const fns = [];
|
|
50
|
+
const parameters = {};
|
|
51
|
+
const isHead = method === "HEAD";
|
|
52
|
+
for (const route of this.routes) {
|
|
53
|
+
if (route.method !== method && route.method !== "" && !(isHead && route.method === "GET")) {
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
let matched = false;
|
|
57
|
+
if ("matchAll" in route) {
|
|
58
|
+
matched = true;
|
|
59
|
+
} else if (route.keys === false) {
|
|
60
|
+
const matches = route.pattern.exec(pathname);
|
|
61
|
+
if (matches === null) {
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
if (matches.groups !== void 0) {
|
|
65
|
+
Object.keys(matches.groups).forEach((key) => {
|
|
66
|
+
parameters[key] = matches.groups[key];
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
matched = true;
|
|
70
|
+
} else if (route.keys.length > 0) {
|
|
71
|
+
const matches = route.pattern.exec(pathname);
|
|
72
|
+
if (matches === null) {
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
for (let index = 0; index < route.keys.length; ) {
|
|
76
|
+
const parameterKey = route.keys[index];
|
|
77
|
+
parameters[parameterKey] = matches[++index];
|
|
78
|
+
}
|
|
79
|
+
matched = true;
|
|
80
|
+
} else if (route.pattern.test(pathname)) {
|
|
81
|
+
matched = true;
|
|
82
|
+
}
|
|
83
|
+
if (matched) {
|
|
84
|
+
fns.push(
|
|
85
|
+
...route.fns.flatMap((function_) => {
|
|
86
|
+
if (function_ instanceof Router) {
|
|
87
|
+
const { base } = function_;
|
|
88
|
+
let stripPathname = pathname.slice(base.length);
|
|
89
|
+
if (!stripPathname.startsWith("/")) {
|
|
90
|
+
stripPathname = `/${stripPathname}`;
|
|
91
|
+
}
|
|
92
|
+
const result = function_.find(method, stripPathname);
|
|
93
|
+
if (!result.middleOnly) {
|
|
94
|
+
middleOnly = false;
|
|
95
|
+
}
|
|
96
|
+
Object.assign(parameters, result.params);
|
|
97
|
+
return result.fns;
|
|
98
|
+
}
|
|
99
|
+
return function_;
|
|
100
|
+
})
|
|
101
|
+
);
|
|
102
|
+
if (!route.isMiddleware) {
|
|
103
|
+
middleOnly = false;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return { fns, middleOnly, params: parameters };
|
|
108
|
+
}
|
|
109
|
+
use(base, ...fns) {
|
|
110
|
+
if (typeof base === "function" || base instanceof Router) {
|
|
111
|
+
fns.unshift(base);
|
|
112
|
+
base = "/";
|
|
113
|
+
}
|
|
114
|
+
fns = fns.map((function_) => {
|
|
115
|
+
if (function_ instanceof Router) {
|
|
116
|
+
if (typeof base === "string") {
|
|
117
|
+
return function_.clone(base);
|
|
118
|
+
}
|
|
119
|
+
throw new Error("Mounting a router to RegExp base is not supported");
|
|
120
|
+
}
|
|
121
|
+
return function_;
|
|
122
|
+
});
|
|
123
|
+
const { keys, pattern } = parse(base, true);
|
|
124
|
+
this.routes.push({
|
|
125
|
+
fns,
|
|
126
|
+
isMiddleware: true,
|
|
127
|
+
keys,
|
|
128
|
+
method: "",
|
|
129
|
+
pattern
|
|
130
|
+
});
|
|
131
|
+
return this;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
export { Router };
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: 'Module' } });
|
|
4
|
+
|
|
5
|
+
const regexparam = require('regexparam');
|
|
6
|
+
|
|
7
|
+
class Router {
|
|
8
|
+
constructor(base = "/", routes = []) {
|
|
9
|
+
this.base = base;
|
|
10
|
+
this.routes = routes;
|
|
11
|
+
}
|
|
12
|
+
static async exec(fns, ...arguments_) {
|
|
13
|
+
let index = 0;
|
|
14
|
+
const next = () => {
|
|
15
|
+
const function_ = fns[++index];
|
|
16
|
+
if (function_ === void 0) {
|
|
17
|
+
return Promise.resolve();
|
|
18
|
+
}
|
|
19
|
+
return function_(...arguments_, next);
|
|
20
|
+
};
|
|
21
|
+
return fns[index](...arguments_, next);
|
|
22
|
+
}
|
|
23
|
+
add(method, route, ...fns) {
|
|
24
|
+
if (typeof route === "function") {
|
|
25
|
+
fns.unshift(route);
|
|
26
|
+
route = "";
|
|
27
|
+
}
|
|
28
|
+
if (route === "") {
|
|
29
|
+
this.routes.push({
|
|
30
|
+
fns,
|
|
31
|
+
isMiddleware: false,
|
|
32
|
+
matchAll: true,
|
|
33
|
+
method
|
|
34
|
+
});
|
|
35
|
+
} else {
|
|
36
|
+
const { keys, pattern } = regexparam.parse(route);
|
|
37
|
+
this.routes.push({
|
|
38
|
+
fns,
|
|
39
|
+
isMiddleware: false,
|
|
40
|
+
keys,
|
|
41
|
+
method,
|
|
42
|
+
pattern
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
return this;
|
|
46
|
+
}
|
|
47
|
+
clone(base) {
|
|
48
|
+
return new Router(base, [...this.routes]);
|
|
49
|
+
}
|
|
50
|
+
// eslint-disable-next-line sonarjs/cognitive-complexity
|
|
51
|
+
find(method, pathname) {
|
|
52
|
+
let middleOnly = true;
|
|
53
|
+
const fns = [];
|
|
54
|
+
const parameters = {};
|
|
55
|
+
const isHead = method === "HEAD";
|
|
56
|
+
for (const route of this.routes) {
|
|
57
|
+
if (route.method !== method && route.method !== "" && !(isHead && route.method === "GET")) {
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
let matched = false;
|
|
61
|
+
if ("matchAll" in route) {
|
|
62
|
+
matched = true;
|
|
63
|
+
} else if (route.keys === false) {
|
|
64
|
+
const matches = route.pattern.exec(pathname);
|
|
65
|
+
if (matches === null) {
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
if (matches.groups !== void 0) {
|
|
69
|
+
Object.keys(matches.groups).forEach((key) => {
|
|
70
|
+
parameters[key] = matches.groups[key];
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
matched = true;
|
|
74
|
+
} else if (route.keys.length > 0) {
|
|
75
|
+
const matches = route.pattern.exec(pathname);
|
|
76
|
+
if (matches === null) {
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
for (let index = 0; index < route.keys.length; ) {
|
|
80
|
+
const parameterKey = route.keys[index];
|
|
81
|
+
parameters[parameterKey] = matches[++index];
|
|
82
|
+
}
|
|
83
|
+
matched = true;
|
|
84
|
+
} else if (route.pattern.test(pathname)) {
|
|
85
|
+
matched = true;
|
|
86
|
+
}
|
|
87
|
+
if (matched) {
|
|
88
|
+
fns.push(
|
|
89
|
+
...route.fns.flatMap((function_) => {
|
|
90
|
+
if (function_ instanceof Router) {
|
|
91
|
+
const { base } = function_;
|
|
92
|
+
let stripPathname = pathname.slice(base.length);
|
|
93
|
+
if (!stripPathname.startsWith("/")) {
|
|
94
|
+
stripPathname = `/${stripPathname}`;
|
|
95
|
+
}
|
|
96
|
+
const result = function_.find(method, stripPathname);
|
|
97
|
+
if (!result.middleOnly) {
|
|
98
|
+
middleOnly = false;
|
|
99
|
+
}
|
|
100
|
+
Object.assign(parameters, result.params);
|
|
101
|
+
return result.fns;
|
|
102
|
+
}
|
|
103
|
+
return function_;
|
|
104
|
+
})
|
|
105
|
+
);
|
|
106
|
+
if (!route.isMiddleware) {
|
|
107
|
+
middleOnly = false;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
return { fns, middleOnly, params: parameters };
|
|
112
|
+
}
|
|
113
|
+
use(base, ...fns) {
|
|
114
|
+
if (typeof base === "function" || base instanceof Router) {
|
|
115
|
+
fns.unshift(base);
|
|
116
|
+
base = "/";
|
|
117
|
+
}
|
|
118
|
+
fns = fns.map((function_) => {
|
|
119
|
+
if (function_ instanceof Router) {
|
|
120
|
+
if (typeof base === "string") {
|
|
121
|
+
return function_.clone(base);
|
|
122
|
+
}
|
|
123
|
+
throw new Error("Mounting a router to RegExp base is not supported");
|
|
124
|
+
}
|
|
125
|
+
return function_;
|
|
126
|
+
});
|
|
127
|
+
const { keys, pattern } = regexparam.parse(base, true);
|
|
128
|
+
this.routes.push({
|
|
129
|
+
fns,
|
|
130
|
+
isMiddleware: true,
|
|
131
|
+
keys,
|
|
132
|
+
method: "",
|
|
133
|
+
pattern
|
|
134
|
+
});
|
|
135
|
+
return this;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
exports.Router = Router;
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: 'Module' } });
|
|
4
|
+
|
|
5
|
+
const withZod = require('./withZod-ULTsdyM5.cjs');
|
|
6
|
+
const Router = require('./Router-Eg_OPxIL.cjs');
|
|
7
|
+
|
|
8
|
+
const onNoMatch = async (request, response) => {
|
|
9
|
+
response.statusCode = 404;
|
|
10
|
+
response.end(request.method === "HEAD" ? void 0 : `Route ${request.method} ${request.url} not found`);
|
|
11
|
+
};
|
|
12
|
+
const onError = async (error, _request, response) => {
|
|
13
|
+
response.statusCode = 500;
|
|
14
|
+
console.error(error);
|
|
15
|
+
response.end("Internal Server Error");
|
|
16
|
+
};
|
|
17
|
+
const getPathname = (url) => {
|
|
18
|
+
const queryIndex = url.indexOf("?");
|
|
19
|
+
return queryIndex === -1 ? url : url.slice(0, Math.max(0, queryIndex));
|
|
20
|
+
};
|
|
21
|
+
class NodeRouter {
|
|
22
|
+
all = this.add.bind(this, "");
|
|
23
|
+
connect = this.add.bind(this, "CONNECT");
|
|
24
|
+
delete = this.add.bind(this, "DELETE");
|
|
25
|
+
get = this.add.bind(this, "GET");
|
|
26
|
+
head = this.add.bind(this, "HEAD");
|
|
27
|
+
options = this.add.bind(this, "OPTIONS");
|
|
28
|
+
patch = this.add.bind(this, "PATCH");
|
|
29
|
+
post = this.add.bind(this, "POST");
|
|
30
|
+
put = this.add.bind(this, "PUT");
|
|
31
|
+
trace = this.add.bind(this, "TRACE");
|
|
32
|
+
onError;
|
|
33
|
+
onNoMatch;
|
|
34
|
+
router = new Router.Router();
|
|
35
|
+
constructor(options = {}) {
|
|
36
|
+
this.onNoMatch = options.onNoMatch ?? onNoMatch;
|
|
37
|
+
this.onError = options.onError ?? onError;
|
|
38
|
+
}
|
|
39
|
+
clone() {
|
|
40
|
+
const r = new NodeRouter({ onError: this.onError, onNoMatch: this.onNoMatch });
|
|
41
|
+
r.router = this.router.clone();
|
|
42
|
+
return r;
|
|
43
|
+
}
|
|
44
|
+
handler() {
|
|
45
|
+
const { routes } = this.router;
|
|
46
|
+
return async (request, response) => {
|
|
47
|
+
const result = this.router.find(request.method, getPathname(request.url));
|
|
48
|
+
this.prepareRequest(request, result);
|
|
49
|
+
try {
|
|
50
|
+
await (result.fns.length === 0 || result.middleOnly ? this.onNoMatch(request, response, routes) : Router.Router.exec(result.fns, request, response));
|
|
51
|
+
} catch (error) {
|
|
52
|
+
await this.onError(error, request, response, routes);
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
async run(request, response) {
|
|
57
|
+
const result = this.router.find(request.method, getPathname(request.url));
|
|
58
|
+
if (result.fns.length === 0) {
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
this.prepareRequest(request, result);
|
|
62
|
+
return await Router.Router.exec(result.fns, request, response);
|
|
63
|
+
}
|
|
64
|
+
use(base, ...fns) {
|
|
65
|
+
if (typeof base === "function" || base instanceof NodeRouter) {
|
|
66
|
+
fns.unshift(base);
|
|
67
|
+
base = "/";
|
|
68
|
+
}
|
|
69
|
+
this.router.use(base, ...fns.map((function_) => function_ instanceof NodeRouter ? function_.router : function_));
|
|
70
|
+
return this;
|
|
71
|
+
}
|
|
72
|
+
add(method, routeOrFunction, zodOrRouteOrFunction, ...fns) {
|
|
73
|
+
if (typeof routeOrFunction === "string" && typeof zodOrRouteOrFunction === "function") {
|
|
74
|
+
fns = [zodOrRouteOrFunction];
|
|
75
|
+
} else if (typeof zodOrRouteOrFunction === "object") {
|
|
76
|
+
if (typeof routeOrFunction === "function") {
|
|
77
|
+
fns = [withZod(zodOrRouteOrFunction, routeOrFunction)];
|
|
78
|
+
} else {
|
|
79
|
+
fns = fns.map(
|
|
80
|
+
(function_) => withZod(zodOrRouteOrFunction, function_)
|
|
81
|
+
);
|
|
82
|
+
}
|
|
83
|
+
} else if (typeof zodOrRouteOrFunction === "function") {
|
|
84
|
+
fns = [zodOrRouteOrFunction];
|
|
85
|
+
}
|
|
86
|
+
this.router.add(method, routeOrFunction, ...fns);
|
|
87
|
+
return this;
|
|
88
|
+
}
|
|
89
|
+
// eslint-disable-next-line class-methods-use-this
|
|
90
|
+
prepareRequest(request, findResult) {
|
|
91
|
+
request.params = {
|
|
92
|
+
...findResult.params,
|
|
93
|
+
...request.params
|
|
94
|
+
// original params will take precedence
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
const createRouter = (options = {}) => new NodeRouter(options);
|
|
99
|
+
|
|
100
|
+
exports.NodeRouter = NodeRouter;
|
|
101
|
+
exports.createRouter = createRouter;
|
|
102
|
+
exports.getPathname = getPathname;
|