@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 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
- ![Category](https://img.shields.io/badge/category-Web-blue) ![Functions](https://img.shields.io/badge/functions-12-green) ![Auth](https://img.shields.io/badge/auth-none-lightgrey) ![License](https://img.shields.io/badge/license-MIT-brightgreen)
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
+ ![Category](https://img.shields.io/badge/category-Web-blue) ![Functions](https://img.shields.io/badge/functions-12-green) ![Auth](https://img.shields.io/badge/auth-none-lightgrey) ![License](https://img.shields.io/badge/license-MIT-brightgreen)
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.0",
4
- "publishConfig": { "access": "public" },
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": { ".": { "import": "./dist/index.js", "types": "./dist/index.d.ts" } },
9
- "files": ["dist"],
10
- "scripts": { "build": "tsc", "test": "node --import tsx --test tests/*.test.ts" },
11
- "peerDependencies": { "@wiredwp/robinpath": ">=0.20.0" },
12
- "devDependencies": { "@wiredwp/robinpath": "^0.30.1", "tsx": "^4.19.0", "typescript": "^5.6.0" }
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
@@ -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
@@ -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
@@ -1 +0,0 @@
1
- {"version":3,"file":"router.js","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"AAqBA,MAAM,OAAO,GAAgC,IAAI,GAAG,EAAE,CAAC;AAEvD,8EAA8E;AAC9E,2BAA2B;AAC3B,8EAA8E;AAE9E,SAAS,aAAa,CAAC,CAAS;IAC9B,IAAI,CAAC,CAAC;QAAE,OAAO,GAAG,CAAC;IACnB,wEAAwE;IACxE,IAAI,UAAU,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAChD,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACtD,UAAU,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACvC,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,SAAS,iBAAiB,CAAC,OAAe;IACxC,OAAO,aAAa,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AAC3D,CAAC;AAED,SAAS,cAAc,CAAC,CAAS;IAC/B,OAAO,aAAa,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AACrD,CAAC;AAED,SAAS,aAAa,CAAC,WAAqB,EAAE,QAAkB;IAC9D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5C,MAAM,GAAG,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QAC3B,IAAI,GAAG,KAAK,GAAG;YAAE,OAAO,IAAI,CAAC,CAAC,wBAAwB;QACtD,IAAI,CAAC,IAAI,QAAQ,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QACvC,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS,CAAC,yBAAyB;QAC5D,IAAI,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;IACxC,CAAC;IACD,OAAO,WAAW,CAAC,MAAM,KAAK,QAAQ,CAAC,MAAM,CAAC;AAChD,CAAC;AAED,SAAS,iBAAiB,CAAC,OAAe,EAAE,QAAgB;IAC1D,MAAM,WAAW,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAC/C,MAAM,QAAQ,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;IAC1C,MAAM,MAAM,GAA2B,EAAE,CAAC;IAE1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5C,IAAI,WAAW,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;YAC3B,MAAM,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC1C,MAAM;QACR,CAAC;QACD,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACnC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACtD,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,SAAS,CAAC,EAAU;IAC3B,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC7B,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;IACvD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,8EAA8E;AAC9E,YAAY;AACZ,8EAA8E;AAE9E,MAAM,MAAM,GAAmB,CAAC,IAAa,EAAW,EAAE;IACxD,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAA4B,CAAC;IACxD,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,IAAI,IAAI,UAAU,OAAO,CAAC,IAAI,GAAG,CAAC,EAAE,CAAW,CAAC;IAC5E,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAW,CAAC;IAE7C,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC;IAEtE,MAAM,IAAI,GAAmB;QAC3B,EAAE;QACF,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE;QAC3C,MAAM,EAAE,EAAE;QACV,WAAW,EAAE,EAAE;KAChB,CAAC;IAEF,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IACtB,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;AACrC,CAAC,CAAC;AAEF,MAAM,GAAG,GAAmB,CAAC,IAAa,EAAW,EAAE;IACrD,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAA4B,CAAC;IACxD,MAAM,EAAE,GAAG,IAAI,CAAC,EAAY,CAAC;IAC7B,MAAM,MAAM,GAAI,CAAC,IAAI,CAAC,MAAM,IAAI,KAAK,CAAY,CAAC,WAAW,EAAE,CAAC;IAChE,MAAM,SAAS,GAAG,IAAI,CAAC,IAAc,CAAC;IACtC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;IAE7B,IAAI,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAClD,IAAI,CAAC,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;IAEpD,MAAM,IAAI,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC;IAC3B,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,GAAG,GAAG,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;IAEvG,MAAM,KAAK,GAAe;QACxB,MAAM;QACN,IAAI,EAAE,QAAQ;QACd,OAAO;QACP,WAAW,EAAE,EAAE;KAChB,CAAC;IAEF,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACxB,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;AACxE,CAAC,CAAC;AAEF,MAAM,KAAK,GAAmB,CAAC,IAAa,EAAW,EAAE;IACvD,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAA4B,CAAC;IACxD,MAAM,EAAE,GAAG,IAAI,CAAC,EAAY,CAAC;IAC7B,MAAM,MAAM,GAAI,CAAC,IAAI,CAAC,MAAM,IAAI,KAAK,CAAY,CAAC,WAAW,EAAE,CAAC;IAChE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAa,CAAC;IAE/B,IAAI,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAClD,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;IAE7C,MAAM,IAAI,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC;IAC3B,MAAM,QAAQ,GAAG,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAClD,MAAM,QAAQ,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;IAE1C,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChC,IAAI,KAAK,CAAC,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM;YAAE,SAAS;QAC9D,MAAM,WAAW,GAAG,iBAAiB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAClD,IAAI,aAAa,CAAC,WAAW,EAAE,QAAQ,CAAC,EAAE,CAAC;YACzC,MAAM,MAAM,GAAG,iBAAiB,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YACvD,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,MAAM;aACP,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;AAC9E,CAAC,CAAC;AAEF,MAAM,MAAM,GAAmB,CAAC,IAAa,EAAW,EAAE;IACxD,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAA4B,CAAC;IACxD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAiB,CAAC;IACvC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAa,CAAC;IAE/B,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;IACrD,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;IAE7C,MAAM,QAAQ,GAAG,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAClD,OAAO,iBAAiB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;AAC9C,CAAC,CAAC;AAEF,MAAM,KAAK,GAAmB,CAAC,IAAa,EAAW,EAAE;IACvD,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAA4B,CAAC;IACxD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAa,CAAC;IAE/B,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;IAE7C,MAAM,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACrC,MAAM,QAAQ,GAAG,WAAW,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IACpE,MAAM,WAAW,GAAG,WAAW,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAEvE,MAAM,QAAQ,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;IAE1C,MAAM,KAAK,GAA2B,EAAE,CAAC;IACzC,IAAI,WAAW,EAAE,CAAC;QAChB,KAAK,MAAM,IAAI,IAAI,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAChC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;gBACf,MAAM,GAAG,GAAG,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;gBACrD,MAAM,KAAK,GAAG,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;gBACxD,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YACrB,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC;YACvC,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,aAAa,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;AAChE,CAAC,CAAC;AAEF,MAAM,KAAK,GAAmB,CAAC,IAAa,EAAW,EAAE;IACvD,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAA4B,CAAC;IACxD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAiB,CAAC;IACvC,MAAM,WAAW,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAA2B,CAAC;IAClE,MAAM,WAAW,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAkC,CAAC;IAE1E,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;IAErD,MAAM,QAAQ,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAC5C,MAAM,aAAa,GAAa,EAAE,CAAC;IAEnC,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC/B,IAAI,CAAC,CAAC,SAAS,IAAI,WAAW,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,SAAS,GAAG,CAAC,CAAC;YACjF,aAAa,CAAC,IAAI,CAAC,kBAAkB,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QACjE,CAAC;aAAM,IAAI,GAAG,KAAK,GAAG,EAAE,CAAC;YACvB,IAAI,GAAG,IAAI,WAAW,EAAE,CAAC;gBACvB,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;YACvC,CAAC;YACD,MAAM;QACR,CAAC;aAAM,CAAC;YACN,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,IAAI,GAAG,GAAG,GAAG,GAAG,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAExC,IAAI,WAAW,IAAI,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvD,MAAM,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;aACnC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,kBAAkB,CAAC,CAAC,CAAC,IAAI,kBAAkB,CAAC,CAAC,CAAC,EAAE,CAAC;aACpE,IAAI,CAAC,GAAG,CAAC,CAAC;QACb,GAAG,IAAI,GAAG,GAAG,EAAE,CAAC;IAClB,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC,CAAC;AAEF,MAAM,SAAS,GAAmB,CAAC,IAAa,EAAW,EAAE;IAC3D,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAA4B,CAAC;IACxD,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,IAAI,EAAE,CAAW,CAAC;IAClD,OAAO,aAAa,CAAC,CAAC,CAAC,CAAC;AAC1B,CAAC,CAAC;AAEF,MAAM,OAAO,GAAmB,CAAC,IAAa,EAAW,EAAE;IACzD,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAA4B,CAAC;IACxD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAiB,CAAC;IACvC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAa,CAAC;IAE/B,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;IACrD,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;IAE7C,MAAM,QAAQ,GAAG,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAClD,MAAM,WAAW,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAC/C,MAAM,QAAQ,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;IAC1C,OAAO,aAAa,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;AAC9C,CAAC,CAAC;AAEF,MAAM,KAAK,GAAmB,CAAC,IAAa,EAAW,EAAE;IACvD,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAA4B,CAAC;IACxD,MAAM,EAAE,GAAG,IAAI,CAAC,EAAY,CAAC;IAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAgB,CAAC;IACrC,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAmC,CAAC;IAErE,IAAI,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAClD,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;IAEnD,MAAM,IAAI,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC;IAC3B,MAAM,KAAK,GAA4C,EAAE,CAAC;IAE1D,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,MAAM,MAAM,GAAI,CAAC,CAAC,CAAC,MAAM,IAAI,KAAK,CAAY,CAAC,WAAW,EAAE,CAAC;QAC7D,MAAM,SAAS,GAAG,CAAC,CAAC,IAAc,CAAC;QACnC,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC;QAE1B,IAAI,CAAC,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAE5E,MAAM,QAAQ,GAAG,aAAa,CAC5B,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,GAAG,MAAM,GAAG,GAAG,GAAG,SAAS,CAClE,CAAC;QAEF,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC;QACvE,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;IACzC,CAAC;IAED,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;AACtF,CAAC,CAAC;AAEF,MAAM,IAAI,GAAmB,CAAC,IAAa,EAAW,EAAE;IACtD,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAA4B,CAAC;IACxD,MAAM,EAAE,GAAG,IAAI,CAAC,EAAY,CAAC;IAE7B,IAAI,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAClD,MAAM,IAAI,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC;IAE3B,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC;QAClC,MAAM,EAAE,CAAC,CAAC,MAAM;QAChB,IAAI,EAAE,CAAC,CAAC,IAAI;KACb,CAAC,CAAC,CAAC;AACN,CAAC,CAAC;AAEF,MAAM,MAAM,GAAmB,CAAC,IAAa,EAAW,EAAE;IACxD,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAA4B,CAAC;IACxD,MAAM,EAAE,GAAG,IAAI,CAAC,EAAY,CAAC;IAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAE,IAAI,CAAC,MAAiB,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACjF,MAAM,SAAS,GAAG,IAAI,CAAC,IAA0B,CAAC;IAElD,IAAI,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAClD,MAAM,IAAI,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC;IAE3B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;IAClC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE;QAC1C,IAAI,MAAM,IAAI,SAAS;YAAE,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI,KAAK,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC;QAC9F,IAAI,SAAS;YAAE,OAAO,CAAC,CAAC,IAAI,KAAK,aAAa,CAAC,SAAS,CAAC,CAAC;QAC1D,IAAI,MAAM;YAAE,OAAO,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC;QACvC,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;IAEH,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;AACtF,CAAC,CAAC;AAEF,MAAM,YAAY,GAAmB,CAAC,IAAa,EAAW,EAAE;IAC9D,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAA4B,CAAC;IACxD,MAAM,EAAE,GAAG,IAAI,CAAC,EAAY,CAAC;IAC7B,MAAM,EAAE,GAAG,IAAI,CAAC,OAAoC,CAAC;IAErD,IAAI,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAClD,IAAI,OAAO,EAAE,KAAK,UAAU;QAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAE5E,MAAM,IAAI,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC;IAC3B,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC1B,OAAO,EAAE,EAAE,EAAE,eAAe,EAAE,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC;AAC1D,CAAC,CAAC;AAEF,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,MAAM;IACN,GAAG;IACH,KAAK;IACL,MAAM;IACN,KAAK;IACL,KAAK;IACL,SAAS;IACT,OAAO;IACP,KAAK;IACL,IAAI;IACJ,MAAM;IACN,UAAU,EAAE,YAAY;CACzB,CAAC;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,MAAM,EAAE;QACN,WAAW,EAAE,8BAA8B;QAC3C,UAAU,EAAE;YACV,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,0BAA0B,EAAE,QAAQ,EAAE,IAAI,EAAE;YAC3F,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,4BAA4B,EAAE,QAAQ,EAAE,IAAI,EAAE;SAClG;QAED,UAAU,EAAE,QAAQ;QACpB,iBAAiB,EAAE,eAAe;KACnC;IACD,GAAG,EAAE;QACH,WAAW,EAAE,oDAAoD;QACjE,UAAU,EAAE;YACV,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,mBAAmB,EAAE;YACpE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,2BAA2B,EAAE,QAAQ,EAAE,IAAI,EAAE;YAChG,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,4CAA4C,EAAE;YAC/F,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE;SACnE;QAED,UAAU,EAAE,QAAQ;QACpB,iBAAiB,EAAE,eAAe;KACnC;IACD,KAAK,EAAE;QACL,WAAW,EAAE,qEAAqE;QAClF,UAAU,EAAE;YACV,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,mBAAmB,EAAE;YACpE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,aAAa,EAAE,QAAQ,EAAE,IAAI,EAAE;YAClF,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,cAAc,EAAE;SACjE;QAED,UAAU,EAAE,QAAQ;QACpB,iBAAiB,EAAE,eAAe;KACnC;IACD,MAAM,EAAE;QACN,WAAW,EAAE,oDAAoD;QACjE,UAAU,EAAE;YACV,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,wCAAwC,EAAE;YAC9F,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,4BAA4B,EAAE;SAC/E;QAED,UAAU,EAAE,QAAQ;QACpB,iBAAiB,EAAE,eAAe;KACnC;IACD,KAAK,EAAE;QACL,WAAW,EAAE,2DAA2D;QACxE,UAAU,EAAE;YACV,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,cAAc,EAAE;SACjE;QAED,UAAU,EAAE,QAAQ;QACpB,iBAAiB,EAAE,eAAe;KACnC;IACD,KAAK,EAAE;QACL,WAAW,EAAE,iDAAiD;QAC9D,UAAU,EAAE;YACV,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,wCAAwC,EAAE;YAC9F,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,gCAAgC,EAAE;YACrF,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,4BAA4B,EAAE,QAAQ,EAAE,IAAI,EAAE;SACjG;QAED,UAAU,EAAE,QAAQ;QACpB,iBAAiB,EAAE,eAAe;KACnC;IACD,SAAS,EAAE;QACT,WAAW,EAAE,qFAAqF;QAClG,UAAU,EAAE;YACV,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,mBAAmB,EAAE;SACvE;QAED,UAAU,EAAE,QAAQ;QACpB,iBAAiB,EAAE,eAAe;KACnC;IACD,OAAO,EAAE;QACP,WAAW,EAAE,4CAA4C;QACzD,UAAU,EAAE;YACV,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,eAAe,EAAE;YACrE,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,aAAa,EAAE;SAChE;QAED,UAAU,EAAE,QAAQ;QACpB,iBAAiB,EAAE,eAAe;KACnC;IACD,KAAK,EAAE;QACL,WAAW,EAAE,2CAA2C;QACxD,UAAU,EAAE;YACV,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,mBAAmB,EAAE;YACpE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,oCAAoC,EAAE;YACzF,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,sDAAsD,EAAE;SAC3G;QAED,UAAU,EAAE,QAAQ;QACpB,iBAAiB,EAAE,eAAe;KACnC;IACD,IAAI,EAAE;QACJ,WAAW,EAAE,wCAAwC;QACrD,UAAU,EAAE;YACV,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,mBAAmB,EAAE;SACrE;QAED,UAAU,EAAE,QAAQ;QACpB,iBAAiB,EAAE,eAAe;KACnC;IACD,MAAM,EAAE;QACN,WAAW,EAAE,qCAAqC;QAClD,UAAU,EAAE;YACV,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,mBAAmB,EAAE;YACpE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,uBAAuB,EAAE,QAAQ,EAAE,IAAI,EAAE;YAC5F,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,sBAAsB,EAAE,QAAQ,EAAE,IAAI,EAAE;SAC1F;QAED,UAAU,EAAE,QAAQ;QACpB,iBAAiB,EAAE,eAAe;KACnC;IACD,UAAU,EAAE;QACV,WAAW,EAAE,yCAAyC;QACtD,UAAU,EAAE;YACV,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,mBAAmB,EAAE;YACpE,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,uCAAuC,EAAE;SAC9F;QAED,UAAU,EAAE,QAAQ;QACpB,iBAAiB,EAAE,eAAe;KACnC;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,WAAW,EAAE,oJAAoJ;IACjK,OAAO,EAAE,OAAO;CACjB,CAAC"}