@stacksjs/router 0.52.0 → 0.52.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +17 -1
- package/dist/index.mjs +92 -1
- package/package.json +3 -3
package/dist/index.d.ts
CHANGED
|
@@ -1 +1,17 @@
|
|
|
1
|
-
|
|
1
|
+
import type { HttpMethod, RouteCallback, RouteGroupOptions } from '@stacksjs/types';
|
|
2
|
+
export declare class Router {
|
|
3
|
+
private routes;
|
|
4
|
+
addRoute(method: HttpMethod, url: string, callback: RouteCallback): void;
|
|
5
|
+
group(options: RouteGroupOptions, callback: () => void): void;
|
|
6
|
+
before(callback: RouteCallback): void;
|
|
7
|
+
after(callback: RouteCallback): void;
|
|
8
|
+
handleRequest(method: HttpMethod, url: string): Promise<any>;
|
|
9
|
+
get(url: string, callback: RouteCallback): Promise<void>;
|
|
10
|
+
post(url: string, callback: RouteCallback): Promise<void>;
|
|
11
|
+
put(url: string, callback: RouteCallback): Promise<void>;
|
|
12
|
+
patch(url: string, callback: RouteCallback): Promise<void>;
|
|
13
|
+
delete(url: string, callback: RouteCallback): Promise<void>;
|
|
14
|
+
private matchRoute;
|
|
15
|
+
private extractParams;
|
|
16
|
+
private getMiddleware;
|
|
17
|
+
}
|
package/dist/index.mjs
CHANGED
|
@@ -1,2 +1,93 @@
|
|
|
1
|
-
export
|
|
1
|
+
export class Router {
|
|
2
|
+
constructor() {
|
|
3
|
+
this.routes = [];
|
|
4
|
+
}
|
|
5
|
+
addRoute(method, url, callback) {
|
|
6
|
+
const paramNames = [];
|
|
7
|
+
const pattern = new RegExp(`^${url.replace(/:[a-zA-Z]+/g, (match) => {
|
|
8
|
+
paramNames.push(match.slice(1));
|
|
9
|
+
return "([a-zA-Z0-9-]+)";
|
|
10
|
+
})}$`);
|
|
11
|
+
this.routes.push({ method, pattern, callback, paramNames });
|
|
12
|
+
}
|
|
13
|
+
group(options, callback) {
|
|
14
|
+
const { prefix = "", middleware = [] } = options;
|
|
15
|
+
const routes = this.routes.slice();
|
|
16
|
+
this.routes = [];
|
|
17
|
+
middleware.forEach((m) => {
|
|
18
|
+
if (m.before)
|
|
19
|
+
this.before(m.before);
|
|
20
|
+
if (m.after)
|
|
21
|
+
this.after(m.after);
|
|
22
|
+
});
|
|
23
|
+
callback();
|
|
24
|
+
this.routes = this.routes.map((r) => {
|
|
25
|
+
return {
|
|
26
|
+
...r,
|
|
27
|
+
pattern: new RegExp(`^${prefix}${r.pattern.source}$`)
|
|
28
|
+
};
|
|
29
|
+
}).concat(routes);
|
|
30
|
+
}
|
|
31
|
+
before(callback) {
|
|
32
|
+
this.routes.unshift({ method: "before", pattern: /^$/, callback, paramNames: [] });
|
|
33
|
+
}
|
|
34
|
+
after(callback) {
|
|
35
|
+
this.routes.push({ method: "after", pattern: /^$/, callback, paramNames: [] });
|
|
36
|
+
}
|
|
37
|
+
async handleRequest(method, url) {
|
|
38
|
+
const route = this.matchRoute(method, url);
|
|
39
|
+
if (!route)
|
|
40
|
+
throw new Error("Route not found");
|
|
41
|
+
const params = this.extractParams(route, url);
|
|
42
|
+
const middleware = this.getMiddleware(route);
|
|
43
|
+
if (middleware.before)
|
|
44
|
+
await middleware.before(params);
|
|
45
|
+
const result = await route.callback(params);
|
|
46
|
+
if (middleware.after)
|
|
47
|
+
await middleware.after(params);
|
|
48
|
+
return result;
|
|
49
|
+
}
|
|
50
|
+
async get(url, callback) {
|
|
51
|
+
this.addRoute("get", url, callback);
|
|
52
|
+
}
|
|
53
|
+
async post(url, callback) {
|
|
54
|
+
this.addRoute("post", url, callback);
|
|
55
|
+
}
|
|
56
|
+
async put(url, callback) {
|
|
57
|
+
this.addRoute("put", url, callback);
|
|
58
|
+
}
|
|
59
|
+
async patch(url, callback) {
|
|
60
|
+
this.addRoute("patch", url, callback);
|
|
61
|
+
}
|
|
62
|
+
async delete(url, callback) {
|
|
63
|
+
this.addRoute("delete", url, callback);
|
|
64
|
+
}
|
|
65
|
+
matchRoute(method, url) {
|
|
66
|
+
const route = this.routes.find((r) => r.method === method && r.pattern.test(url));
|
|
67
|
+
return route || null;
|
|
68
|
+
}
|
|
69
|
+
extractParams(route, url) {
|
|
70
|
+
const matches = url.match(route.pattern);
|
|
71
|
+
const params = {};
|
|
72
|
+
if (matches) {
|
|
73
|
+
route.paramNames.forEach((name, i) => {
|
|
74
|
+
params[name] = matches[i + 1];
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
return params;
|
|
78
|
+
}
|
|
79
|
+
getMiddleware(route) {
|
|
80
|
+
const before = this.routes.filter((r) => r.method === "before");
|
|
81
|
+
const after = this.routes.filter((r) => r.method === "after");
|
|
82
|
+
const middleware = {};
|
|
83
|
+
before.forEach((b) => {
|
|
84
|
+
if (b.pattern.test(route.pattern.source))
|
|
85
|
+
middleware.before = b.callback;
|
|
86
|
+
});
|
|
87
|
+
after.forEach((a) => {
|
|
88
|
+
if (a.pattern.test(route.pattern.source))
|
|
89
|
+
middleware.after = a.callback;
|
|
90
|
+
});
|
|
91
|
+
return middleware;
|
|
92
|
+
}
|
|
2
93
|
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@stacksjs/router",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.52.
|
|
4
|
+
"version": "0.52.2",
|
|
5
5
|
"packageManager": "pnpm@8.5.1",
|
|
6
6
|
"description": "The Stacks framework router.",
|
|
7
7
|
"author": "Chris Breuer",
|
|
@@ -39,10 +39,10 @@
|
|
|
39
39
|
"README.md"
|
|
40
40
|
],
|
|
41
41
|
"peerDependencies": {
|
|
42
|
-
"vue-router": "^4.2.
|
|
42
|
+
"vue-router": "^4.2.1"
|
|
43
43
|
},
|
|
44
44
|
"devDependencies": {
|
|
45
|
-
"@stacksjs/development": "0.52.
|
|
45
|
+
"@stacksjs/development": "0.52.2"
|
|
46
46
|
},
|
|
47
47
|
"scripts": {
|
|
48
48
|
"build": "unbuild",
|