@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 CHANGED
@@ -1 +1,17 @@
1
- export declare function router(): void;
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 function router() {
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.0",
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.0"
42
+ "vue-router": "^4.2.1"
43
43
  },
44
44
  "devDependencies": {
45
- "@stacksjs/development": "0.52.0"
45
+ "@stacksjs/development": "0.52.2"
46
46
  },
47
47
  "scripts": {
48
48
  "build": "unbuild",