@robinpath/router 0.1.0 → 0.1.1
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/README.md +95 -95
- package/package.json +37 -7
- package/dist/index.d.ts +0 -6
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -6
- package/dist/index.js.map +0 -1
- package/dist/router.d.ts +0 -167
- package/dist/router.d.ts.map +0 -1
- package/dist/router.js +0 -413
- package/dist/router.js.map +0 -1
package/README.md
CHANGED
|
@@ -1,95 +1,95 @@
|
|
|
1
|
-
# @robinpath/router
|
|
2
|
-
|
|
3
|
-
> URL routing and pattern matching with support for path parameters (:param), wildcards (*), route groups, and middleware. No external dependencies.
|
|
4
|
-
|
|
5
|
-
   
|
|
6
|
-
|
|
7
|
-
## Why use this module?
|
|
8
|
-
|
|
9
|
-
The `router` module lets you:
|
|
10
|
-
|
|
11
|
-
- Create a new router instance
|
|
12
|
-
- Add a route with method, path pattern, and handler
|
|
13
|
-
- Match a URL against registered routes and return the matching route
|
|
14
|
-
- Extract path parameters from a URL using a pattern
|
|
15
|
-
- Parse a URL into pathname, segments, and query parameters
|
|
16
|
-
|
|
17
|
-
All functions are callable directly from RobinPath scripts with a simple, consistent API.
|
|
18
|
-
|
|
19
|
-
## Installation
|
|
20
|
-
|
|
21
|
-
```bash
|
|
22
|
-
npm install @robinpath/router
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
## Quick Start
|
|
26
|
-
|
|
27
|
-
No credentials needed — start using it right away:
|
|
28
|
-
|
|
29
|
-
```robinpath
|
|
30
|
-
router.add
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
## Available Functions
|
|
34
|
-
|
|
35
|
-
| Function | Description |
|
|
36
|
-
|----------|-------------|
|
|
37
|
-
| `router.create` | Create a new router instance |
|
|
38
|
-
| `router.add` | Add a route with method, path pattern, and handler |
|
|
39
|
-
| `router.match` | Match a URL against registered routes and return the matching route |
|
|
40
|
-
| `router.params` | Extract path parameters from a URL using a pattern |
|
|
41
|
-
| `router.parse` | Parse a URL into pathname, segments, and query parameters |
|
|
42
|
-
| `router.build` | Build a URL from a pattern and parameter values |
|
|
43
|
-
| `router.normalize` | Normalize a URL path (collapse slashes, ensure leading slash, strip trailing slash) |
|
|
44
|
-
| `router.isMatch` | Test if a URL path matches a route pattern |
|
|
45
|
-
| `router.group` | Create a route group with a shared prefix |
|
|
46
|
-
| `router.list` | List all routes registered in a router |
|
|
47
|
-
| `router.remove` | Remove routes by method and/or path |
|
|
48
|
-
| `router.middleware` | Add a middleware function to the router |
|
|
49
|
-
|
|
50
|
-
## Examples
|
|
51
|
-
|
|
52
|
-
### Add a route with method, path pattern, and handler
|
|
53
|
-
|
|
54
|
-
```robinpath
|
|
55
|
-
router.add
|
|
56
|
-
```
|
|
57
|
-
|
|
58
|
-
### Match a URL against registered routes and return the matching route
|
|
59
|
-
|
|
60
|
-
```robinpath
|
|
61
|
-
router.match
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
### Extract path parameters from a URL using a pattern
|
|
65
|
-
|
|
66
|
-
```robinpath
|
|
67
|
-
router.params
|
|
68
|
-
```
|
|
69
|
-
|
|
70
|
-
## Integration with RobinPath
|
|
71
|
-
|
|
72
|
-
```typescript
|
|
73
|
-
import { RobinPath } from "@wiredwp/robinpath";
|
|
74
|
-
import Module from "@robinpath/router";
|
|
75
|
-
|
|
76
|
-
const rp = new RobinPath();
|
|
77
|
-
rp.registerModule(Module.name, Module.functions);
|
|
78
|
-
rp.registerModuleMeta(Module.name, Module.functionMetadata);
|
|
79
|
-
|
|
80
|
-
const result = await rp.executeScript(`
|
|
81
|
-
router.add
|
|
82
|
-
`);
|
|
83
|
-
```
|
|
84
|
-
|
|
85
|
-
## Full API Reference
|
|
86
|
-
|
|
87
|
-
See [MODULE.md](./MODULE.md) for complete documentation including all parameters, return types, error handling, and advanced examples.
|
|
88
|
-
|
|
89
|
-
## Related Modules
|
|
90
|
-
|
|
91
|
-
- [`@robinpath/json`](../json) — JSON module for complementary functionality
|
|
92
|
-
|
|
93
|
-
## License
|
|
94
|
-
|
|
95
|
-
MIT
|
|
1
|
+
# @robinpath/router
|
|
2
|
+
|
|
3
|
+
> URL routing and pattern matching with support for path parameters (:param), wildcards (*), route groups, and middleware. No external dependencies.
|
|
4
|
+
|
|
5
|
+
   
|
|
6
|
+
|
|
7
|
+
## Why use this module?
|
|
8
|
+
|
|
9
|
+
The `router` module lets you:
|
|
10
|
+
|
|
11
|
+
- Create a new router instance
|
|
12
|
+
- Add a route with method, path pattern, and handler
|
|
13
|
+
- Match a URL against registered routes and return the matching route
|
|
14
|
+
- Extract path parameters from a URL using a pattern
|
|
15
|
+
- Parse a URL into pathname, segments, and query parameters
|
|
16
|
+
|
|
17
|
+
All functions are callable directly from RobinPath scripts with a simple, consistent API.
|
|
18
|
+
|
|
19
|
+
## Installation
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
npm install @robinpath/router
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Quick Start
|
|
26
|
+
|
|
27
|
+
No credentials needed — start using it right away:
|
|
28
|
+
|
|
29
|
+
```robinpath
|
|
30
|
+
router.add
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## Available Functions
|
|
34
|
+
|
|
35
|
+
| Function | Description |
|
|
36
|
+
|----------|-------------|
|
|
37
|
+
| `router.create` | Create a new router instance |
|
|
38
|
+
| `router.add` | Add a route with method, path pattern, and handler |
|
|
39
|
+
| `router.match` | Match a URL against registered routes and return the matching route |
|
|
40
|
+
| `router.params` | Extract path parameters from a URL using a pattern |
|
|
41
|
+
| `router.parse` | Parse a URL into pathname, segments, and query parameters |
|
|
42
|
+
| `router.build` | Build a URL from a pattern and parameter values |
|
|
43
|
+
| `router.normalize` | Normalize a URL path (collapse slashes, ensure leading slash, strip trailing slash) |
|
|
44
|
+
| `router.isMatch` | Test if a URL path matches a route pattern |
|
|
45
|
+
| `router.group` | Create a route group with a shared prefix |
|
|
46
|
+
| `router.list` | List all routes registered in a router |
|
|
47
|
+
| `router.remove` | Remove routes by method and/or path |
|
|
48
|
+
| `router.middleware` | Add a middleware function to the router |
|
|
49
|
+
|
|
50
|
+
## Examples
|
|
51
|
+
|
|
52
|
+
### Add a route with method, path pattern, and handler
|
|
53
|
+
|
|
54
|
+
```robinpath
|
|
55
|
+
router.add
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### Match a URL against registered routes and return the matching route
|
|
59
|
+
|
|
60
|
+
```robinpath
|
|
61
|
+
router.match
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### Extract path parameters from a URL using a pattern
|
|
65
|
+
|
|
66
|
+
```robinpath
|
|
67
|
+
router.params
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
## Integration with RobinPath
|
|
71
|
+
|
|
72
|
+
```typescript
|
|
73
|
+
import { RobinPath } from "@wiredwp/robinpath";
|
|
74
|
+
import Module from "@robinpath/router";
|
|
75
|
+
|
|
76
|
+
const rp = new RobinPath();
|
|
77
|
+
rp.registerModule(Module.name, Module.functions);
|
|
78
|
+
rp.registerModuleMeta(Module.name, Module.functionMetadata);
|
|
79
|
+
|
|
80
|
+
const result = await rp.executeScript(`
|
|
81
|
+
router.add
|
|
82
|
+
`);
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
## Full API Reference
|
|
86
|
+
|
|
87
|
+
See [MODULE.md](./MODULE.md) for complete documentation including all parameters, return types, error handling, and advanced examples.
|
|
88
|
+
|
|
89
|
+
## Related Modules
|
|
90
|
+
|
|
91
|
+
- [`@robinpath/json`](../json) — JSON module for complementary functionality
|
|
92
|
+
|
|
93
|
+
## License
|
|
94
|
+
|
|
95
|
+
MIT
|
package/package.json
CHANGED
|
@@ -1,13 +1,43 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@robinpath/router",
|
|
3
|
-
"version": "0.1.
|
|
4
|
-
"publishConfig": {
|
|
3
|
+
"version": "0.1.1",
|
|
4
|
+
"publishConfig": {
|
|
5
|
+
"access": "public"
|
|
6
|
+
},
|
|
5
7
|
"type": "module",
|
|
6
8
|
"main": "dist/index.js",
|
|
7
9
|
"types": "dist/index.d.ts",
|
|
8
|
-
"exports": {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
10
|
+
"exports": {
|
|
11
|
+
".": {
|
|
12
|
+
"import": "./dist/index.js",
|
|
13
|
+
"types": "./dist/index.d.ts"
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
"files": [
|
|
17
|
+
"dist"
|
|
18
|
+
],
|
|
19
|
+
"scripts": {
|
|
20
|
+
"build": "tsc",
|
|
21
|
+
"test": "node --import tsx --test tests/*.test.ts"
|
|
22
|
+
},
|
|
23
|
+
"peerDependencies": {
|
|
24
|
+
"@robinpath/core": ">=0.20.0"
|
|
25
|
+
},
|
|
26
|
+
"devDependencies": {
|
|
27
|
+
"@robinpath/core": "^0.30.1",
|
|
28
|
+
"tsx": "^4.19.0",
|
|
29
|
+
"typescript": "^5.6.0"
|
|
30
|
+
},
|
|
31
|
+
"description": "URL routing and pattern matching with support for path parameters (:param), wildcards (*), route groups, and middleware. No external dependencies.",
|
|
32
|
+
"keywords": [
|
|
33
|
+
"router",
|
|
34
|
+
"web"
|
|
35
|
+
],
|
|
36
|
+
"license": "MIT",
|
|
37
|
+
"robinpath": {
|
|
38
|
+
"category": "web",
|
|
39
|
+
"type": "utility",
|
|
40
|
+
"auth": "none",
|
|
41
|
+
"functionCount": 12
|
|
42
|
+
}
|
|
13
43
|
}
|
package/dist/index.d.ts
DELETED
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import type { ModuleAdapter } from "@wiredwp/robinpath";
|
|
2
|
-
declare const RouterModule: ModuleAdapter;
|
|
3
|
-
export default RouterModule;
|
|
4
|
-
export { RouterModule };
|
|
5
|
-
export { RouterFunctions, RouterFunctionMetadata, RouterModuleMetadata } from "./router.js";
|
|
6
|
-
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGxD,QAAA,MAAM,YAAY,EAAE,aAA2K,CAAC;AAEhM,eAAe,YAAY,CAAC;AAC5B,OAAO,EAAE,YAAY,EAAE,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/index.js
DELETED
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import { RouterFunctions, RouterFunctionMetadata, RouterModuleMetadata } from "./router.js";
|
|
2
|
-
const RouterModule = { name: "router", functions: RouterFunctions, functionMetadata: RouterFunctionMetadata, moduleMetadata: RouterModuleMetadata, global: false };
|
|
3
|
-
export default RouterModule;
|
|
4
|
-
export { RouterModule };
|
|
5
|
-
export { RouterFunctions, RouterFunctionMetadata, RouterModuleMetadata } from "./router.js";
|
|
6
|
-
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAE5F,MAAM,YAAY,GAAkB,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,eAAe,EAAE,gBAAgB,EAAE,sBAA6B,EAAE,cAAc,EAAE,oBAA2B,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;AAEhM,eAAe,YAAY,CAAC;AAC5B,OAAO,EAAE,YAAY,EAAE,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/router.d.ts
DELETED
|
@@ -1,167 +0,0 @@
|
|
|
1
|
-
import type { BuiltinHandler } from "@wiredwp/robinpath";
|
|
2
|
-
export declare const RouterFunctions: {
|
|
3
|
-
create: BuiltinHandler;
|
|
4
|
-
add: BuiltinHandler;
|
|
5
|
-
match: BuiltinHandler;
|
|
6
|
-
params: BuiltinHandler;
|
|
7
|
-
parse: BuiltinHandler;
|
|
8
|
-
build: BuiltinHandler;
|
|
9
|
-
normalize: BuiltinHandler;
|
|
10
|
-
isMatch: BuiltinHandler;
|
|
11
|
-
group: BuiltinHandler;
|
|
12
|
-
list: BuiltinHandler;
|
|
13
|
-
remove: BuiltinHandler;
|
|
14
|
-
middleware: BuiltinHandler;
|
|
15
|
-
};
|
|
16
|
-
export declare const RouterFunctionMetadata: {
|
|
17
|
-
create: {
|
|
18
|
-
description: string;
|
|
19
|
-
parameters: {
|
|
20
|
-
name: string;
|
|
21
|
-
dataType: string;
|
|
22
|
-
description: string;
|
|
23
|
-
optional: boolean;
|
|
24
|
-
}[];
|
|
25
|
-
returnType: string;
|
|
26
|
-
returnDescription: string;
|
|
27
|
-
};
|
|
28
|
-
add: {
|
|
29
|
-
description: string;
|
|
30
|
-
parameters: ({
|
|
31
|
-
name: string;
|
|
32
|
-
dataType: string;
|
|
33
|
-
description: string;
|
|
34
|
-
optional?: undefined;
|
|
35
|
-
} | {
|
|
36
|
-
name: string;
|
|
37
|
-
dataType: string;
|
|
38
|
-
description: string;
|
|
39
|
-
optional: boolean;
|
|
40
|
-
})[];
|
|
41
|
-
returnType: string;
|
|
42
|
-
returnDescription: string;
|
|
43
|
-
};
|
|
44
|
-
match: {
|
|
45
|
-
description: string;
|
|
46
|
-
parameters: ({
|
|
47
|
-
name: string;
|
|
48
|
-
dataType: string;
|
|
49
|
-
description: string;
|
|
50
|
-
optional?: undefined;
|
|
51
|
-
} | {
|
|
52
|
-
name: string;
|
|
53
|
-
dataType: string;
|
|
54
|
-
description: string;
|
|
55
|
-
optional: boolean;
|
|
56
|
-
})[];
|
|
57
|
-
returnType: string;
|
|
58
|
-
returnDescription: string;
|
|
59
|
-
};
|
|
60
|
-
params: {
|
|
61
|
-
description: string;
|
|
62
|
-
parameters: {
|
|
63
|
-
name: string;
|
|
64
|
-
dataType: string;
|
|
65
|
-
description: string;
|
|
66
|
-
}[];
|
|
67
|
-
returnType: string;
|
|
68
|
-
returnDescription: string;
|
|
69
|
-
};
|
|
70
|
-
parse: {
|
|
71
|
-
description: string;
|
|
72
|
-
parameters: {
|
|
73
|
-
name: string;
|
|
74
|
-
dataType: string;
|
|
75
|
-
description: string;
|
|
76
|
-
}[];
|
|
77
|
-
returnType: string;
|
|
78
|
-
returnDescription: string;
|
|
79
|
-
};
|
|
80
|
-
build: {
|
|
81
|
-
description: string;
|
|
82
|
-
parameters: ({
|
|
83
|
-
name: string;
|
|
84
|
-
dataType: string;
|
|
85
|
-
description: string;
|
|
86
|
-
optional?: undefined;
|
|
87
|
-
} | {
|
|
88
|
-
name: string;
|
|
89
|
-
dataType: string;
|
|
90
|
-
description: string;
|
|
91
|
-
optional: boolean;
|
|
92
|
-
})[];
|
|
93
|
-
returnType: string;
|
|
94
|
-
returnDescription: string;
|
|
95
|
-
};
|
|
96
|
-
normalize: {
|
|
97
|
-
description: string;
|
|
98
|
-
parameters: {
|
|
99
|
-
name: string;
|
|
100
|
-
dataType: string;
|
|
101
|
-
description: string;
|
|
102
|
-
}[];
|
|
103
|
-
returnType: string;
|
|
104
|
-
returnDescription: string;
|
|
105
|
-
};
|
|
106
|
-
isMatch: {
|
|
107
|
-
description: string;
|
|
108
|
-
parameters: {
|
|
109
|
-
name: string;
|
|
110
|
-
dataType: string;
|
|
111
|
-
description: string;
|
|
112
|
-
}[];
|
|
113
|
-
returnType: string;
|
|
114
|
-
returnDescription: string;
|
|
115
|
-
};
|
|
116
|
-
group: {
|
|
117
|
-
description: string;
|
|
118
|
-
parameters: {
|
|
119
|
-
name: string;
|
|
120
|
-
dataType: string;
|
|
121
|
-
description: string;
|
|
122
|
-
}[];
|
|
123
|
-
returnType: string;
|
|
124
|
-
returnDescription: string;
|
|
125
|
-
};
|
|
126
|
-
list: {
|
|
127
|
-
description: string;
|
|
128
|
-
parameters: {
|
|
129
|
-
name: string;
|
|
130
|
-
dataType: string;
|
|
131
|
-
description: string;
|
|
132
|
-
}[];
|
|
133
|
-
returnType: string;
|
|
134
|
-
returnDescription: string;
|
|
135
|
-
};
|
|
136
|
-
remove: {
|
|
137
|
-
description: string;
|
|
138
|
-
parameters: ({
|
|
139
|
-
name: string;
|
|
140
|
-
dataType: string;
|
|
141
|
-
description: string;
|
|
142
|
-
optional?: undefined;
|
|
143
|
-
} | {
|
|
144
|
-
name: string;
|
|
145
|
-
dataType: string;
|
|
146
|
-
description: string;
|
|
147
|
-
optional: boolean;
|
|
148
|
-
})[];
|
|
149
|
-
returnType: string;
|
|
150
|
-
returnDescription: string;
|
|
151
|
-
};
|
|
152
|
-
middleware: {
|
|
153
|
-
description: string;
|
|
154
|
-
parameters: {
|
|
155
|
-
name: string;
|
|
156
|
-
dataType: string;
|
|
157
|
-
description: string;
|
|
158
|
-
}[];
|
|
159
|
-
returnType: string;
|
|
160
|
-
returnDescription: string;
|
|
161
|
-
};
|
|
162
|
-
};
|
|
163
|
-
export declare const RouterModuleMetadata: {
|
|
164
|
-
description: string;
|
|
165
|
-
version: string;
|
|
166
|
-
};
|
|
167
|
-
//# sourceMappingURL=router.d.ts.map
|
package/dist/router.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAoC,MAAM,oBAAoB,CAAC;AA8U3F,eAAO,MAAM,eAAe;;;;;;;;;;;;;CAa3B,CAAC;AAEF,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4HlC,CAAC;AAEF,eAAO,MAAM,oBAAoB;;;CAGhC,CAAC"}
|
package/dist/router.js
DELETED
|
@@ -1,413 +0,0 @@
|
|
|
1
|
-
const routers = new Map();
|
|
2
|
-
// ---------------------------------------------------------------------------
|
|
3
|
-
// Pattern matching helpers
|
|
4
|
-
// ---------------------------------------------------------------------------
|
|
5
|
-
function normalizePath(p) {
|
|
6
|
-
if (!p)
|
|
7
|
-
return "/";
|
|
8
|
-
// Collapse multiple slashes, ensure leading slash, strip trailing slash
|
|
9
|
-
let normalized = ("/" + p).replace(/\/+/g, "/");
|
|
10
|
-
if (normalized.length > 1 && normalized.endsWith("/")) {
|
|
11
|
-
normalized = normalized.slice(0, -1);
|
|
12
|
-
}
|
|
13
|
-
return normalized;
|
|
14
|
-
}
|
|
15
|
-
function patternToSegments(pattern) {
|
|
16
|
-
return normalizePath(pattern).split("/").filter(Boolean);
|
|
17
|
-
}
|
|
18
|
-
function pathToSegments(p) {
|
|
19
|
-
return normalizePath(p).split("/").filter(Boolean);
|
|
20
|
-
}
|
|
21
|
-
function segmentsMatch(patternSegs, pathSegs) {
|
|
22
|
-
for (let i = 0; i < patternSegs.length; i++) {
|
|
23
|
-
const seg = patternSegs[i];
|
|
24
|
-
if (seg === "*")
|
|
25
|
-
return true; // wildcard matches rest
|
|
26
|
-
if (i >= pathSegs.length)
|
|
27
|
-
return false;
|
|
28
|
-
if (seg.startsWith(":"))
|
|
29
|
-
continue; // param matches anything
|
|
30
|
-
if (seg !== pathSegs[i])
|
|
31
|
-
return false;
|
|
32
|
-
}
|
|
33
|
-
return patternSegs.length === pathSegs.length;
|
|
34
|
-
}
|
|
35
|
-
function extractPathParams(pattern, pathname) {
|
|
36
|
-
const patternSegs = patternToSegments(pattern);
|
|
37
|
-
const pathSegs = pathToSegments(pathname);
|
|
38
|
-
const params = {};
|
|
39
|
-
for (let i = 0; i < patternSegs.length; i++) {
|
|
40
|
-
if (patternSegs[i] === "*") {
|
|
41
|
-
params["*"] = pathSegs.slice(i).join("/");
|
|
42
|
-
break;
|
|
43
|
-
}
|
|
44
|
-
if (patternSegs[i].startsWith(":")) {
|
|
45
|
-
params[patternSegs[i].slice(1)] = pathSegs[i] || "";
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
return params;
|
|
49
|
-
}
|
|
50
|
-
function getRouter(id) {
|
|
51
|
-
const inst = routers.get(id);
|
|
52
|
-
if (!inst)
|
|
53
|
-
throw new Error(`Router "${id}" not found`);
|
|
54
|
-
return inst;
|
|
55
|
-
}
|
|
56
|
-
// ---------------------------------------------------------------------------
|
|
57
|
-
// Functions
|
|
58
|
-
// ---------------------------------------------------------------------------
|
|
59
|
-
const create = (args) => {
|
|
60
|
-
const opts = (args[0] ?? {});
|
|
61
|
-
const id = (opts.id ?? opts.name ?? `router_${routers.size + 1}`);
|
|
62
|
-
const prefix = (opts.prefix ?? "");
|
|
63
|
-
if (routers.has(id))
|
|
64
|
-
throw new Error(`Router "${id}" already exists`);
|
|
65
|
-
const inst = {
|
|
66
|
-
id,
|
|
67
|
-
prefix: prefix ? normalizePath(prefix) : "",
|
|
68
|
-
routes: [],
|
|
69
|
-
middlewares: [],
|
|
70
|
-
};
|
|
71
|
-
routers.set(id, inst);
|
|
72
|
-
return { id, prefix: inst.prefix };
|
|
73
|
-
};
|
|
74
|
-
const add = (args) => {
|
|
75
|
-
const opts = (args[0] ?? {});
|
|
76
|
-
const id = opts.id;
|
|
77
|
-
const method = (opts.method ?? "GET").toUpperCase();
|
|
78
|
-
const routePath = opts.path;
|
|
79
|
-
const handler = opts.handler;
|
|
80
|
-
if (!id)
|
|
81
|
-
throw new Error("Router id is required");
|
|
82
|
-
if (!routePath)
|
|
83
|
-
throw new Error("path is required");
|
|
84
|
-
const inst = getRouter(id);
|
|
85
|
-
const fullPath = inst.prefix ? normalizePath(inst.prefix + "/" + routePath) : normalizePath(routePath);
|
|
86
|
-
const entry = {
|
|
87
|
-
method,
|
|
88
|
-
path: fullPath,
|
|
89
|
-
handler,
|
|
90
|
-
middlewares: [],
|
|
91
|
-
};
|
|
92
|
-
inst.routes.push(entry);
|
|
93
|
-
return { id, method, path: fullPath, routeCount: inst.routes.length };
|
|
94
|
-
};
|
|
95
|
-
const match = (args) => {
|
|
96
|
-
const opts = (args[0] ?? {});
|
|
97
|
-
const id = opts.id;
|
|
98
|
-
const method = (opts.method ?? "GET").toUpperCase();
|
|
99
|
-
const url = opts.url;
|
|
100
|
-
if (!id)
|
|
101
|
-
throw new Error("Router id is required");
|
|
102
|
-
if (!url)
|
|
103
|
-
throw new Error("url is required");
|
|
104
|
-
const inst = getRouter(id);
|
|
105
|
-
const pathname = normalizePath(url.split("?")[0]);
|
|
106
|
-
const pathSegs = pathToSegments(pathname);
|
|
107
|
-
for (const route of inst.routes) {
|
|
108
|
-
if (route.method !== "*" && route.method !== method)
|
|
109
|
-
continue;
|
|
110
|
-
const patternSegs = patternToSegments(route.path);
|
|
111
|
-
if (segmentsMatch(patternSegs, pathSegs)) {
|
|
112
|
-
const params = extractPathParams(route.path, pathname);
|
|
113
|
-
return {
|
|
114
|
-
matched: true,
|
|
115
|
-
method: route.method,
|
|
116
|
-
path: route.path,
|
|
117
|
-
handler: route.handler,
|
|
118
|
-
params,
|
|
119
|
-
};
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
return { matched: false, method, url: pathname, handler: null, params: {} };
|
|
123
|
-
};
|
|
124
|
-
const params = (args) => {
|
|
125
|
-
const opts = (args[0] ?? {});
|
|
126
|
-
const pattern = opts.pattern;
|
|
127
|
-
const url = opts.url;
|
|
128
|
-
if (!pattern)
|
|
129
|
-
throw new Error("pattern is required");
|
|
130
|
-
if (!url)
|
|
131
|
-
throw new Error("url is required");
|
|
132
|
-
const pathname = normalizePath(url.split("?")[0]);
|
|
133
|
-
return extractPathParams(pattern, pathname);
|
|
134
|
-
};
|
|
135
|
-
const parse = (args) => {
|
|
136
|
-
const opts = (args[0] ?? {});
|
|
137
|
-
const url = opts.url;
|
|
138
|
-
if (!url)
|
|
139
|
-
throw new Error("url is required");
|
|
140
|
-
const questionIdx = url.indexOf("?");
|
|
141
|
-
const pathname = questionIdx >= 0 ? url.slice(0, questionIdx) : url;
|
|
142
|
-
const queryString = questionIdx >= 0 ? url.slice(questionIdx + 1) : "";
|
|
143
|
-
const segments = pathToSegments(pathname);
|
|
144
|
-
const query = {};
|
|
145
|
-
if (queryString) {
|
|
146
|
-
for (const pair of queryString.split("&")) {
|
|
147
|
-
const eqIdx = pair.indexOf("=");
|
|
148
|
-
if (eqIdx >= 0) {
|
|
149
|
-
const key = decodeURIComponent(pair.slice(0, eqIdx));
|
|
150
|
-
const value = decodeURIComponent(pair.slice(eqIdx + 1));
|
|
151
|
-
query[key] = value;
|
|
152
|
-
}
|
|
153
|
-
else {
|
|
154
|
-
query[decodeURIComponent(pair)] = "";
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
return { pathname: normalizePath(pathname), segments, query };
|
|
159
|
-
};
|
|
160
|
-
const build = (args) => {
|
|
161
|
-
const opts = (args[0] ?? {});
|
|
162
|
-
const pattern = opts.pattern;
|
|
163
|
-
const paramValues = (opts.params ?? {});
|
|
164
|
-
const queryValues = (opts.query ?? null);
|
|
165
|
-
if (!pattern)
|
|
166
|
-
throw new Error("pattern is required");
|
|
167
|
-
const segments = patternToSegments(pattern);
|
|
168
|
-
const builtSegments = [];
|
|
169
|
-
for (const seg of segments) {
|
|
170
|
-
if (seg.startsWith(":")) {
|
|
171
|
-
const paramName = seg.slice(1);
|
|
172
|
-
if (!(paramName in paramValues))
|
|
173
|
-
throw new Error(`Missing param "${paramName}"`);
|
|
174
|
-
builtSegments.push(encodeURIComponent(paramValues[paramName]));
|
|
175
|
-
}
|
|
176
|
-
else if (seg === "*") {
|
|
177
|
-
if ("*" in paramValues) {
|
|
178
|
-
builtSegments.push(paramValues["*"]);
|
|
179
|
-
}
|
|
180
|
-
break;
|
|
181
|
-
}
|
|
182
|
-
else {
|
|
183
|
-
builtSegments.push(seg);
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
let url = "/" + builtSegments.join("/");
|
|
187
|
-
if (queryValues && Object.keys(queryValues).length > 0) {
|
|
188
|
-
const qs = Object.entries(queryValues)
|
|
189
|
-
.map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(v)}`)
|
|
190
|
-
.join("&");
|
|
191
|
-
url += "?" + qs;
|
|
192
|
-
}
|
|
193
|
-
return url;
|
|
194
|
-
};
|
|
195
|
-
const normalize = (args) => {
|
|
196
|
-
const opts = (args[0] ?? {});
|
|
197
|
-
const p = (opts.path ?? opts.url ?? "");
|
|
198
|
-
return normalizePath(p);
|
|
199
|
-
};
|
|
200
|
-
const isMatch = (args) => {
|
|
201
|
-
const opts = (args[0] ?? {});
|
|
202
|
-
const pattern = opts.pattern;
|
|
203
|
-
const url = opts.url;
|
|
204
|
-
if (!pattern)
|
|
205
|
-
throw new Error("pattern is required");
|
|
206
|
-
if (!url)
|
|
207
|
-
throw new Error("url is required");
|
|
208
|
-
const pathname = normalizePath(url.split("?")[0]);
|
|
209
|
-
const patternSegs = patternToSegments(pattern);
|
|
210
|
-
const pathSegs = pathToSegments(pathname);
|
|
211
|
-
return segmentsMatch(patternSegs, pathSegs);
|
|
212
|
-
};
|
|
213
|
-
const group = (args) => {
|
|
214
|
-
const opts = (args[0] ?? {});
|
|
215
|
-
const id = opts.id;
|
|
216
|
-
const prefix = opts.prefix;
|
|
217
|
-
const routes = (opts.routes ?? []);
|
|
218
|
-
if (!id)
|
|
219
|
-
throw new Error("Router id is required");
|
|
220
|
-
if (!prefix)
|
|
221
|
-
throw new Error("prefix is required");
|
|
222
|
-
const inst = getRouter(id);
|
|
223
|
-
const added = [];
|
|
224
|
-
for (const r of routes) {
|
|
225
|
-
const method = (r.method ?? "GET").toUpperCase();
|
|
226
|
-
const routePath = r.path;
|
|
227
|
-
const handler = r.handler;
|
|
228
|
-
if (!routePath)
|
|
229
|
-
throw new Error("Each route in the group must have a path");
|
|
230
|
-
const fullPath = normalizePath((inst.prefix ? inst.prefix : "") + "/" + prefix + "/" + routePath);
|
|
231
|
-
inst.routes.push({ method, path: fullPath, handler, middlewares: [] });
|
|
232
|
-
added.push({ method, path: fullPath });
|
|
233
|
-
}
|
|
234
|
-
return { id, prefix: normalizePath(prefix), added, routeCount: inst.routes.length };
|
|
235
|
-
};
|
|
236
|
-
const list = (args) => {
|
|
237
|
-
const opts = (args[0] ?? {});
|
|
238
|
-
const id = opts.id;
|
|
239
|
-
if (!id)
|
|
240
|
-
throw new Error("Router id is required");
|
|
241
|
-
const inst = getRouter(id);
|
|
242
|
-
return inst.routes.map((r) => ({
|
|
243
|
-
method: r.method,
|
|
244
|
-
path: r.path,
|
|
245
|
-
}));
|
|
246
|
-
};
|
|
247
|
-
const remove = (args) => {
|
|
248
|
-
const opts = (args[0] ?? {});
|
|
249
|
-
const id = opts.id;
|
|
250
|
-
const method = opts.method ? (opts.method.toUpperCase()) : undefined;
|
|
251
|
-
const routePath = opts.path;
|
|
252
|
-
if (!id)
|
|
253
|
-
throw new Error("Router id is required");
|
|
254
|
-
const inst = getRouter(id);
|
|
255
|
-
const before = inst.routes.length;
|
|
256
|
-
inst.routes = inst.routes.filter((r) => {
|
|
257
|
-
if (method && routePath)
|
|
258
|
-
return !(r.method === method && r.path === normalizePath(routePath));
|
|
259
|
-
if (routePath)
|
|
260
|
-
return r.path !== normalizePath(routePath);
|
|
261
|
-
if (method)
|
|
262
|
-
return r.method !== method;
|
|
263
|
-
return true;
|
|
264
|
-
});
|
|
265
|
-
return { id, removed: before - inst.routes.length, routeCount: inst.routes.length };
|
|
266
|
-
};
|
|
267
|
-
const middlewareFn = (args) => {
|
|
268
|
-
const opts = (args[0] ?? {});
|
|
269
|
-
const id = opts.id;
|
|
270
|
-
const fn = opts.handler;
|
|
271
|
-
if (!id)
|
|
272
|
-
throw new Error("Router id is required");
|
|
273
|
-
if (typeof fn !== "function")
|
|
274
|
-
throw new Error("handler must be a function");
|
|
275
|
-
const inst = getRouter(id);
|
|
276
|
-
inst.middlewares.push(fn);
|
|
277
|
-
return { id, middlewareCount: inst.middlewares.length };
|
|
278
|
-
};
|
|
279
|
-
// ---------------------------------------------------------------------------
|
|
280
|
-
// Exports
|
|
281
|
-
// ---------------------------------------------------------------------------
|
|
282
|
-
export const RouterFunctions = {
|
|
283
|
-
create,
|
|
284
|
-
add,
|
|
285
|
-
match,
|
|
286
|
-
params,
|
|
287
|
-
parse,
|
|
288
|
-
build,
|
|
289
|
-
normalize,
|
|
290
|
-
isMatch,
|
|
291
|
-
group,
|
|
292
|
-
list,
|
|
293
|
-
remove,
|
|
294
|
-
middleware: middlewareFn,
|
|
295
|
-
};
|
|
296
|
-
export const RouterFunctionMetadata = {
|
|
297
|
-
create: {
|
|
298
|
-
description: "Create a new router instance",
|
|
299
|
-
parameters: [
|
|
300
|
-
{ name: "id", dataType: "string", description: "Unique router identifier", optional: true },
|
|
301
|
-
{ name: "prefix", dataType: "string", description: "Base prefix for all routes", optional: true },
|
|
302
|
-
],
|
|
303
|
-
returnType: "object",
|
|
304
|
-
returnDescription: "API response.",
|
|
305
|
-
},
|
|
306
|
-
add: {
|
|
307
|
-
description: "Add a route with method, path pattern, and handler",
|
|
308
|
-
parameters: [
|
|
309
|
-
{ name: "id", dataType: "string", description: "Router identifier" },
|
|
310
|
-
{ name: "method", dataType: "string", description: "HTTP method (default GET)", optional: true },
|
|
311
|
-
{ name: "path", dataType: "string", description: "Route path pattern (supports :param and *)" },
|
|
312
|
-
{ name: "handler", dataType: "any", description: "Route handler" },
|
|
313
|
-
],
|
|
314
|
-
returnType: "object",
|
|
315
|
-
returnDescription: "API response.",
|
|
316
|
-
},
|
|
317
|
-
match: {
|
|
318
|
-
description: "Match a URL against registered routes and return the matching route",
|
|
319
|
-
parameters: [
|
|
320
|
-
{ name: "id", dataType: "string", description: "Router identifier" },
|
|
321
|
-
{ name: "method", dataType: "string", description: "HTTP method", optional: true },
|
|
322
|
-
{ name: "url", dataType: "string", description: "URL to match" },
|
|
323
|
-
],
|
|
324
|
-
returnType: "object",
|
|
325
|
-
returnDescription: "API response.",
|
|
326
|
-
},
|
|
327
|
-
params: {
|
|
328
|
-
description: "Extract path parameters from a URL using a pattern",
|
|
329
|
-
parameters: [
|
|
330
|
-
{ name: "pattern", dataType: "string", description: "Route pattern with :param placeholders" },
|
|
331
|
-
{ name: "url", dataType: "string", description: "URL to extract params from" },
|
|
332
|
-
],
|
|
333
|
-
returnType: "object",
|
|
334
|
-
returnDescription: "API response.",
|
|
335
|
-
},
|
|
336
|
-
parse: {
|
|
337
|
-
description: "Parse a URL into pathname, segments, and query parameters",
|
|
338
|
-
parameters: [
|
|
339
|
-
{ name: "url", dataType: "string", description: "URL to parse" },
|
|
340
|
-
],
|
|
341
|
-
returnType: "object",
|
|
342
|
-
returnDescription: "API response.",
|
|
343
|
-
},
|
|
344
|
-
build: {
|
|
345
|
-
description: "Build a URL from a pattern and parameter values",
|
|
346
|
-
parameters: [
|
|
347
|
-
{ name: "pattern", dataType: "string", description: "Route pattern with :param placeholders" },
|
|
348
|
-
{ name: "params", dataType: "object", description: "Parameter values to substitute" },
|
|
349
|
-
{ name: "query", dataType: "object", description: "Query parameters to append", optional: true },
|
|
350
|
-
],
|
|
351
|
-
returnType: "object",
|
|
352
|
-
returnDescription: "API response.",
|
|
353
|
-
},
|
|
354
|
-
normalize: {
|
|
355
|
-
description: "Normalize a URL path (collapse slashes, ensure leading slash, strip trailing slash)",
|
|
356
|
-
parameters: [
|
|
357
|
-
{ name: "path", dataType: "string", description: "Path to normalize" },
|
|
358
|
-
],
|
|
359
|
-
returnType: "object",
|
|
360
|
-
returnDescription: "API response.",
|
|
361
|
-
},
|
|
362
|
-
isMatch: {
|
|
363
|
-
description: "Test if a URL path matches a route pattern",
|
|
364
|
-
parameters: [
|
|
365
|
-
{ name: "pattern", dataType: "string", description: "Route pattern" },
|
|
366
|
-
{ name: "url", dataType: "string", description: "URL to test" },
|
|
367
|
-
],
|
|
368
|
-
returnType: "object",
|
|
369
|
-
returnDescription: "API response.",
|
|
370
|
-
},
|
|
371
|
-
group: {
|
|
372
|
-
description: "Create a route group with a shared prefix",
|
|
373
|
-
parameters: [
|
|
374
|
-
{ name: "id", dataType: "string", description: "Router identifier" },
|
|
375
|
-
{ name: "prefix", dataType: "string", description: "Prefix for all routes in the group" },
|
|
376
|
-
{ name: "routes", dataType: "array", description: "Array of route definitions { method, path, handler }" },
|
|
377
|
-
],
|
|
378
|
-
returnType: "object",
|
|
379
|
-
returnDescription: "API response.",
|
|
380
|
-
},
|
|
381
|
-
list: {
|
|
382
|
-
description: "List all routes registered in a router",
|
|
383
|
-
parameters: [
|
|
384
|
-
{ name: "id", dataType: "string", description: "Router identifier" },
|
|
385
|
-
],
|
|
386
|
-
returnType: "object",
|
|
387
|
-
returnDescription: "API response.",
|
|
388
|
-
},
|
|
389
|
-
remove: {
|
|
390
|
-
description: "Remove routes by method and/or path",
|
|
391
|
-
parameters: [
|
|
392
|
-
{ name: "id", dataType: "string", description: "Router identifier" },
|
|
393
|
-
{ name: "method", dataType: "string", description: "HTTP method to filter", optional: true },
|
|
394
|
-
{ name: "path", dataType: "string", description: "Route path to filter", optional: true },
|
|
395
|
-
],
|
|
396
|
-
returnType: "object",
|
|
397
|
-
returnDescription: "API response.",
|
|
398
|
-
},
|
|
399
|
-
middleware: {
|
|
400
|
-
description: "Add a middleware function to the router",
|
|
401
|
-
parameters: [
|
|
402
|
-
{ name: "id", dataType: "string", description: "Router identifier" },
|
|
403
|
-
{ name: "handler", dataType: "string", description: "Middleware function (ctx: any) => ctx" },
|
|
404
|
-
],
|
|
405
|
-
returnType: "object",
|
|
406
|
-
returnDescription: "API response.",
|
|
407
|
-
},
|
|
408
|
-
};
|
|
409
|
-
export const RouterModuleMetadata = {
|
|
410
|
-
description: "URL routing and pattern matching with support for path parameters (:param), wildcards (*), route groups, and middleware. No external dependencies.",
|
|
411
|
-
version: "1.0.0",
|
|
412
|
-
};
|
|
413
|
-
//# sourceMappingURL=router.js.map
|
package/dist/router.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"router.js","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"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"}
|