itty-router 5.0.6 → 5.0.7
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/AutoRouter.js +115 -1
- package/AutoRouter.js.map +1 -1
- package/AutoRouter.mjs +113 -1
- package/AutoRouter.mjs.map +1 -1
- package/IttyRouter.js +41 -1
- package/IttyRouter.js.map +1 -1
- package/IttyRouter.mjs +39 -1
- package/IttyRouter.mjs.map +1 -1
- package/Router.js +59 -1
- package/Router.js.map +1 -1
- package/Router.mjs +57 -1
- package/Router.mjs.map +1 -1
- package/StatusError.js +12 -1
- package/StatusError.js.map +1 -1
- package/StatusError.mjs +10 -1
- package/StatusError.mjs.map +1 -1
- package/cors.js +65 -1
- package/cors.js.map +1 -1
- package/cors.mjs +63 -1
- package/cors.mjs.map +1 -1
- package/createResponse.js +11 -1
- package/createResponse.js.map +1 -1
- package/createResponse.mjs +9 -1
- package/createResponse.mjs.map +1 -1
- package/error.js +37 -1
- package/error.js.map +1 -1
- package/error.mjs +35 -1
- package/error.mjs.map +1 -1
- package/html.js +13 -1
- package/html.js.map +1 -1
- package/html.mjs +11 -1
- package/html.mjs.map +1 -1
- package/index.js +269 -1
- package/index.js.map +1 -1
- package/index.mjs +251 -1
- package/index.mjs.map +1 -1
- package/jpeg.js +13 -1
- package/jpeg.js.map +1 -1
- package/jpeg.mjs +11 -1
- package/jpeg.mjs.map +1 -1
- package/json.js +13 -1
- package/json.js.map +1 -1
- package/json.mjs +11 -1
- package/json.mjs.map +1 -1
- package/package.json +1 -1
- package/png.js +13 -1
- package/png.js.map +1 -1
- package/png.mjs +11 -1
- package/png.mjs.map +1 -1
- package/status.js +5 -1
- package/status.js.map +1 -1
- package/status.mjs +3 -1
- package/status.mjs.map +1 -1
- package/text.js +13 -1
- package/text.js.map +1 -1
- package/text.mjs +11 -1
- package/text.mjs.map +1 -1
- package/webp.js +13 -1
- package/webp.js.map +1 -1
- package/webp.mjs +11 -1
- package/webp.mjs.map +1 -1
- package/websocket.js +17 -1
- package/websocket.js.map +1 -1
- package/websocket.mjs +15 -1
- package/websocket.mjs.map +1 -1
- package/withContent.js +12 -1
- package/withContent.js.map +1 -1
- package/withContent.mjs +10 -1
- package/withContent.mjs.map +1 -1
- package/withCookies.js +11 -1
- package/withCookies.js.map +1 -1
- package/withCookies.mjs +9 -1
- package/withCookies.mjs.map +1 -1
- package/withParams.js +11 -1
- package/withParams.js.map +1 -1
- package/withParams.mjs +9 -1
- package/withParams.mjs.map +1 -1
package/AutoRouter.js
CHANGED
|
@@ -1,2 +1,116 @@
|
|
|
1
|
-
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const Router = ({ base = '', routes = [], ...other } = {}) => ({
|
|
4
|
+
__proto__: new Proxy({}, {
|
|
5
|
+
// @ts-expect-error (we're adding an expected prop "path" to the get)
|
|
6
|
+
get: (target, prop, receiver, path) => (route, ...handlers) => routes.push([
|
|
7
|
+
prop.toUpperCase?.(),
|
|
8
|
+
RegExp(`^${(path = (base + route)
|
|
9
|
+
.replace(/\/+(\/|$)/g, '$1')) // strip double & trailing splash
|
|
10
|
+
.replace(/(\/?\.?):(\w+)\+/g, '($1(?<$2>*))') // greedy params
|
|
11
|
+
.replace(/(\/?\.?):(\w+)/g, '($1(?<$2>[^$1/]+?))') // named params and image format
|
|
12
|
+
.replace(/\./g, '\\.') // dot in path
|
|
13
|
+
.replace(/(\/?)\*/g, '($1.*)?') // wildcard
|
|
14
|
+
}/*$`),
|
|
15
|
+
// @ts-ignore
|
|
16
|
+
handlers, // embed handlers
|
|
17
|
+
path, // embed clean route path
|
|
18
|
+
]) && receiver
|
|
19
|
+
}),
|
|
20
|
+
routes,
|
|
21
|
+
...other,
|
|
22
|
+
async fetch(request, ...args) {
|
|
23
|
+
let response, match, url = new URL(request.url), query = request.query = { __proto__: null };
|
|
24
|
+
// 1. parse query params
|
|
25
|
+
for (let [k, v] of url.searchParams)
|
|
26
|
+
query[k] = query[k] ? [].concat(query[k], v) : v;
|
|
27
|
+
t: try {
|
|
28
|
+
for (let handler of other.before || [])
|
|
29
|
+
if ((response = await handler(request.proxy ?? request, ...args)) != null)
|
|
30
|
+
break t;
|
|
31
|
+
// 2. then test routes
|
|
32
|
+
outer: for (let [method, regex, handlers, path] of routes)
|
|
33
|
+
if ((method == request.method || method == 'ALL') && (match = url.pathname.match(regex))) {
|
|
34
|
+
request.params = match.groups || {}; // embed params in request
|
|
35
|
+
request.route = path; // embed route path in request
|
|
36
|
+
for (let handler of handlers)
|
|
37
|
+
if ((response = await handler(request.proxy ?? request, ...args)) != null)
|
|
38
|
+
break outer;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
catch (err) {
|
|
42
|
+
if (!other.catch)
|
|
43
|
+
throw err;
|
|
44
|
+
response = await other.catch(err, request.proxy ?? request, ...args);
|
|
45
|
+
}
|
|
46
|
+
try {
|
|
47
|
+
for (let handler of other.finally || [])
|
|
48
|
+
response = await handler(response, request.proxy ?? request, ...args) ?? response;
|
|
49
|
+
}
|
|
50
|
+
catch (err) {
|
|
51
|
+
if (!other.catch)
|
|
52
|
+
throw err;
|
|
53
|
+
response = await other.catch(err, request.proxy ?? request, ...args);
|
|
54
|
+
}
|
|
55
|
+
return response;
|
|
56
|
+
},
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
const createResponse = (format = 'text/plain; charset=utf-8', transform) => (body, { ...options } = {}) => {
|
|
60
|
+
if (body === undefined || body instanceof Response)
|
|
61
|
+
return body;
|
|
62
|
+
const response = new Response(transform?.(body) ?? body, options);
|
|
63
|
+
response.headers.set('content-type', format);
|
|
64
|
+
return response;
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
const json = createResponse('application/json; charset=utf-8', JSON.stringify);
|
|
68
|
+
|
|
69
|
+
const getMessage = (code) => ({
|
|
70
|
+
400: 'Bad Request',
|
|
71
|
+
401: 'Unauthorized',
|
|
72
|
+
403: 'Forbidden',
|
|
73
|
+
404: 'Not Found',
|
|
74
|
+
500: 'Internal Server Error',
|
|
75
|
+
})[code] || 'Unknown Error';
|
|
76
|
+
const error = (a = 500, b) => {
|
|
77
|
+
// handle passing an Error | StatusError directly in
|
|
78
|
+
if (a instanceof Error) {
|
|
79
|
+
const { message, ...err } = a;
|
|
80
|
+
a = a.status || 500;
|
|
81
|
+
b = {
|
|
82
|
+
error: message || getMessage(a),
|
|
83
|
+
...err,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
b = {
|
|
87
|
+
status: a,
|
|
88
|
+
...(typeof b === 'object' ? b : { error: b || getMessage(a) }),
|
|
89
|
+
};
|
|
90
|
+
return json(b, { status: a });
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
const withParams = (request) => {
|
|
94
|
+
request.proxy = new Proxy(request.proxy || request, {
|
|
95
|
+
get: (obj, prop) => obj[prop] !== undefined
|
|
96
|
+
? obj[prop]?.bind?.(request) || obj[prop]
|
|
97
|
+
: obj?.params?.[prop]
|
|
98
|
+
});
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
const AutoRouter = ({ format = json, missing = () => error(404), finally: f = [], before = [], ...options } = {}) => Router({
|
|
102
|
+
before: [
|
|
103
|
+
withParams,
|
|
104
|
+
...before
|
|
105
|
+
],
|
|
106
|
+
catch: error,
|
|
107
|
+
finally: [
|
|
108
|
+
(r, ...args) => r ?? missing(r, ...args),
|
|
109
|
+
format,
|
|
110
|
+
...f,
|
|
111
|
+
],
|
|
112
|
+
...options,
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
exports.AutoRouter = AutoRouter;
|
|
2
116
|
//# sourceMappingURL=AutoRouter.js.map
|
package/AutoRouter.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AutoRouter.js","sources":["../src/src/Router.ts","../src/src/
|
|
1
|
+
{"version":3,"file":"AutoRouter.js","sources":["../src/src/Router.ts","../src/src/createResponse.ts","../src/src/json.ts","../src/src/error.ts","../src/src/withParams.ts","../src/src/AutoRouter.ts"],"sourcesContent":[null,null,null,null,null,null],"names":[],"mappings":"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"}
|
package/AutoRouter.mjs
CHANGED
|
@@ -1,2 +1,114 @@
|
|
|
1
|
-
const
|
|
1
|
+
const Router = ({ base = '', routes = [], ...other } = {}) => ({
|
|
2
|
+
__proto__: new Proxy({}, {
|
|
3
|
+
// @ts-expect-error (we're adding an expected prop "path" to the get)
|
|
4
|
+
get: (target, prop, receiver, path) => (route, ...handlers) => routes.push([
|
|
5
|
+
prop.toUpperCase?.(),
|
|
6
|
+
RegExp(`^${(path = (base + route)
|
|
7
|
+
.replace(/\/+(\/|$)/g, '$1')) // strip double & trailing splash
|
|
8
|
+
.replace(/(\/?\.?):(\w+)\+/g, '($1(?<$2>*))') // greedy params
|
|
9
|
+
.replace(/(\/?\.?):(\w+)/g, '($1(?<$2>[^$1/]+?))') // named params and image format
|
|
10
|
+
.replace(/\./g, '\\.') // dot in path
|
|
11
|
+
.replace(/(\/?)\*/g, '($1.*)?') // wildcard
|
|
12
|
+
}/*$`),
|
|
13
|
+
// @ts-ignore
|
|
14
|
+
handlers, // embed handlers
|
|
15
|
+
path, // embed clean route path
|
|
16
|
+
]) && receiver
|
|
17
|
+
}),
|
|
18
|
+
routes,
|
|
19
|
+
...other,
|
|
20
|
+
async fetch(request, ...args) {
|
|
21
|
+
let response, match, url = new URL(request.url), query = request.query = { __proto__: null };
|
|
22
|
+
// 1. parse query params
|
|
23
|
+
for (let [k, v] of url.searchParams)
|
|
24
|
+
query[k] = query[k] ? [].concat(query[k], v) : v;
|
|
25
|
+
t: try {
|
|
26
|
+
for (let handler of other.before || [])
|
|
27
|
+
if ((response = await handler(request.proxy ?? request, ...args)) != null)
|
|
28
|
+
break t;
|
|
29
|
+
// 2. then test routes
|
|
30
|
+
outer: for (let [method, regex, handlers, path] of routes)
|
|
31
|
+
if ((method == request.method || method == 'ALL') && (match = url.pathname.match(regex))) {
|
|
32
|
+
request.params = match.groups || {}; // embed params in request
|
|
33
|
+
request.route = path; // embed route path in request
|
|
34
|
+
for (let handler of handlers)
|
|
35
|
+
if ((response = await handler(request.proxy ?? request, ...args)) != null)
|
|
36
|
+
break outer;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
catch (err) {
|
|
40
|
+
if (!other.catch)
|
|
41
|
+
throw err;
|
|
42
|
+
response = await other.catch(err, request.proxy ?? request, ...args);
|
|
43
|
+
}
|
|
44
|
+
try {
|
|
45
|
+
for (let handler of other.finally || [])
|
|
46
|
+
response = await handler(response, request.proxy ?? request, ...args) ?? response;
|
|
47
|
+
}
|
|
48
|
+
catch (err) {
|
|
49
|
+
if (!other.catch)
|
|
50
|
+
throw err;
|
|
51
|
+
response = await other.catch(err, request.proxy ?? request, ...args);
|
|
52
|
+
}
|
|
53
|
+
return response;
|
|
54
|
+
},
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
const createResponse = (format = 'text/plain; charset=utf-8', transform) => (body, { ...options } = {}) => {
|
|
58
|
+
if (body === undefined || body instanceof Response)
|
|
59
|
+
return body;
|
|
60
|
+
const response = new Response(transform?.(body) ?? body, options);
|
|
61
|
+
response.headers.set('content-type', format);
|
|
62
|
+
return response;
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
const json = createResponse('application/json; charset=utf-8', JSON.stringify);
|
|
66
|
+
|
|
67
|
+
const getMessage = (code) => ({
|
|
68
|
+
400: 'Bad Request',
|
|
69
|
+
401: 'Unauthorized',
|
|
70
|
+
403: 'Forbidden',
|
|
71
|
+
404: 'Not Found',
|
|
72
|
+
500: 'Internal Server Error',
|
|
73
|
+
})[code] || 'Unknown Error';
|
|
74
|
+
const error = (a = 500, b) => {
|
|
75
|
+
// handle passing an Error | StatusError directly in
|
|
76
|
+
if (a instanceof Error) {
|
|
77
|
+
const { message, ...err } = a;
|
|
78
|
+
a = a.status || 500;
|
|
79
|
+
b = {
|
|
80
|
+
error: message || getMessage(a),
|
|
81
|
+
...err,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
b = {
|
|
85
|
+
status: a,
|
|
86
|
+
...(typeof b === 'object' ? b : { error: b || getMessage(a) }),
|
|
87
|
+
};
|
|
88
|
+
return json(b, { status: a });
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
const withParams = (request) => {
|
|
92
|
+
request.proxy = new Proxy(request.proxy || request, {
|
|
93
|
+
get: (obj, prop) => obj[prop] !== undefined
|
|
94
|
+
? obj[prop]?.bind?.(request) || obj[prop]
|
|
95
|
+
: obj?.params?.[prop]
|
|
96
|
+
});
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
const AutoRouter = ({ format = json, missing = () => error(404), finally: f = [], before = [], ...options } = {}) => Router({
|
|
100
|
+
before: [
|
|
101
|
+
withParams,
|
|
102
|
+
...before
|
|
103
|
+
],
|
|
104
|
+
catch: error,
|
|
105
|
+
finally: [
|
|
106
|
+
(r, ...args) => r ?? missing(r, ...args),
|
|
107
|
+
format,
|
|
108
|
+
...f,
|
|
109
|
+
],
|
|
110
|
+
...options,
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
export { AutoRouter };
|
|
2
114
|
//# sourceMappingURL=AutoRouter.mjs.map
|
package/AutoRouter.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AutoRouter.mjs","sources":["../src/src/Router.ts","../src/src/
|
|
1
|
+
{"version":3,"file":"AutoRouter.mjs","sources":["../src/src/Router.ts","../src/src/createResponse.ts","../src/src/json.ts","../src/src/error.ts","../src/src/withParams.ts","../src/src/AutoRouter.ts"],"sourcesContent":[null,null,null,null,null,null],"names":[],"mappings":"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"}
|
package/IttyRouter.js
CHANGED
|
@@ -1,2 +1,42 @@
|
|
|
1
|
-
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const IttyRouter = ({ base = '', routes = [], ...other } = {}) =>
|
|
4
|
+
// @ts-ignore
|
|
5
|
+
({
|
|
6
|
+
__proto__: new Proxy({}, {
|
|
7
|
+
// @ts-expect-error (we're adding an expected prop "path" to the get)
|
|
8
|
+
get: (target, prop, receiver, path) => (route, ...handlers) => routes.push([
|
|
9
|
+
prop.toUpperCase(),
|
|
10
|
+
RegExp(`^${(path = (base + route)
|
|
11
|
+
.replace(/\/+(\/|$)/g, '$1')) // strip double & trailing splash
|
|
12
|
+
.replace(/(\/?\.?):(\w+)\+/g, '($1(?<$2>*))') // greedy params
|
|
13
|
+
.replace(/(\/?\.?):(\w+)/g, '($1(?<$2>[^$1/]+?))') // named params and image format
|
|
14
|
+
.replace(/\./g, '\\.') // dot in path
|
|
15
|
+
.replace(/(\/?)\*/g, '($1.*)?') // wildcard
|
|
16
|
+
}/*$`),
|
|
17
|
+
// @ts-ignore
|
|
18
|
+
handlers, // embed handlers
|
|
19
|
+
path, // embed clean route path
|
|
20
|
+
]) && receiver
|
|
21
|
+
}),
|
|
22
|
+
routes,
|
|
23
|
+
...other,
|
|
24
|
+
async fetch(request, ...args) {
|
|
25
|
+
let response, match, url = new URL(request.url), query = request.query = { __proto__: null };
|
|
26
|
+
// 1. parse query params
|
|
27
|
+
for (let [k, v] of url.searchParams)
|
|
28
|
+
query[k] = query[k] ? [].concat(query[k], v) : v;
|
|
29
|
+
// 2. then test routes
|
|
30
|
+
for (let [method, regex, handlers, path] of routes)
|
|
31
|
+
if ((method == request.method || method == 'ALL') && (match = url.pathname.match(regex))) {
|
|
32
|
+
request.params = match.groups || {}; // embed params in request
|
|
33
|
+
request.route = path; // embed route path in request
|
|
34
|
+
for (let handler of handlers)
|
|
35
|
+
if ((response = await handler(request.proxy ?? request, ...args)) != null)
|
|
36
|
+
return response;
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
exports.IttyRouter = IttyRouter;
|
|
2
42
|
//# sourceMappingURL=IttyRouter.js.map
|
package/IttyRouter.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IttyRouter.js","sources":["../src/src/IttyRouter.ts"],"sourcesContent":[null],"names":[
|
|
1
|
+
{"version":3,"file":"IttyRouter.js","sources":["../src/src/IttyRouter.ts"],"sourcesContent":[null],"names":[],"mappings":";;AAQa,MAAA,UAAU,GAAG,CAKxB,EAAE,IAAI,GAAG,EAAE,EAAE,MAAM,GAAG,EAAE,EAAE,GAAG,KAAK,EAAwB,GAAA,EAAE;AAC9D;AACE,CAAC;AACC,IAAA,SAAS,EAAE,IAAI,KAAK,CAAC,EAAE,EAAE;;QAEvB,GAAG,EAAE,CAAC,MAAW,EAAE,IAAY,EAAE,QAAgB,EAAE,IAAY,KAC7D,CAAC,KAAa,EAAE,GAAG,QAAmD,KACpE,MAAM,CAAC,IAAI,CACT;YACE,IAAI,CAAC,WAAW,EAAE;YAClB,MAAM,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,GAAG,KAAK;AAC7B,iBAAA,OAAO,CAAC,YAAY,EAAE,IAAI,CAAC;AAC3B,iBAAA,OAAO,CAAC,mBAAmB,EAAE,cAAc,CAAC;AAC5C,iBAAA,OAAO,CAAC,iBAAiB,EAAE,qBAAqB,CAAC;AACjD,iBAAA,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;AACrB,iBAAA,OAAO,CAAC,UAAU,EAAE,SAAS,CAAC;AACjC,aAAA,GAAA,CAAK,CAAC;;AAEN,YAAA,QAAQ;AACR,YAAA,IAAI;AACL,SAAA,CACF,IAAI,QAAQ;KAClB,CAAC;IACF,MAAM;AACN,IAAA,GAAG,KAAK;AACR,IAAA,MAAM,KAAK,CAAE,OAAoB,EAAE,GAAG,IAAI,EAAA;QACxC,IAAI,QAAQ,EACR,KAAK,EACL,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,EAC1B,KAAK,GAAwB,OAAO,CAAC,KAAK,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,CAAA;;QAGpE,KAAK,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,GAAG,CAAC,YAAY;YACjC,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAI,EAAe,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAA;;QAGhE,KAAK,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,MAAM;YAChD,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,IAAI,MAAM,IAAI,KAAK,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE;gBACxF,OAAO,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,EAAE,CAAA;AACnC,gBAAA,OAAO,CAAC,KAAK,GAAG,IAAI,CAAA;gBACpB,KAAK,IAAI,OAAO,IAAI,QAAQ;AAC1B,oBAAA,IAAI,CAAC,QAAQ,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,KAAK,IAAI,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK,IAAI;AAAE,wBAAA,OAAO,QAAQ,CAAA;aAC7F;KACJ;AACF,CAAA;;;;"}
|
package/IttyRouter.mjs
CHANGED
|
@@ -1,2 +1,40 @@
|
|
|
1
|
-
const
|
|
1
|
+
const IttyRouter = ({ base = '', routes = [], ...other } = {}) =>
|
|
2
|
+
// @ts-ignore
|
|
3
|
+
({
|
|
4
|
+
__proto__: new Proxy({}, {
|
|
5
|
+
// @ts-expect-error (we're adding an expected prop "path" to the get)
|
|
6
|
+
get: (target, prop, receiver, path) => (route, ...handlers) => routes.push([
|
|
7
|
+
prop.toUpperCase(),
|
|
8
|
+
RegExp(`^${(path = (base + route)
|
|
9
|
+
.replace(/\/+(\/|$)/g, '$1')) // strip double & trailing splash
|
|
10
|
+
.replace(/(\/?\.?):(\w+)\+/g, '($1(?<$2>*))') // greedy params
|
|
11
|
+
.replace(/(\/?\.?):(\w+)/g, '($1(?<$2>[^$1/]+?))') // named params and image format
|
|
12
|
+
.replace(/\./g, '\\.') // dot in path
|
|
13
|
+
.replace(/(\/?)\*/g, '($1.*)?') // wildcard
|
|
14
|
+
}/*$`),
|
|
15
|
+
// @ts-ignore
|
|
16
|
+
handlers, // embed handlers
|
|
17
|
+
path, // embed clean route path
|
|
18
|
+
]) && receiver
|
|
19
|
+
}),
|
|
20
|
+
routes,
|
|
21
|
+
...other,
|
|
22
|
+
async fetch(request, ...args) {
|
|
23
|
+
let response, match, url = new URL(request.url), query = request.query = { __proto__: null };
|
|
24
|
+
// 1. parse query params
|
|
25
|
+
for (let [k, v] of url.searchParams)
|
|
26
|
+
query[k] = query[k] ? [].concat(query[k], v) : v;
|
|
27
|
+
// 2. then test routes
|
|
28
|
+
for (let [method, regex, handlers, path] of routes)
|
|
29
|
+
if ((method == request.method || method == 'ALL') && (match = url.pathname.match(regex))) {
|
|
30
|
+
request.params = match.groups || {}; // embed params in request
|
|
31
|
+
request.route = path; // embed route path in request
|
|
32
|
+
for (let handler of handlers)
|
|
33
|
+
if ((response = await handler(request.proxy ?? request, ...args)) != null)
|
|
34
|
+
return response;
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
export { IttyRouter };
|
|
2
40
|
//# sourceMappingURL=IttyRouter.mjs.map
|
package/IttyRouter.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IttyRouter.mjs","sources":["../src/src/IttyRouter.ts"],"sourcesContent":[null],"names":[
|
|
1
|
+
{"version":3,"file":"IttyRouter.mjs","sources":["../src/src/IttyRouter.ts"],"sourcesContent":[null],"names":[],"mappings":"AAQa,MAAA,UAAU,GAAG,CAKxB,EAAE,IAAI,GAAG,EAAE,EAAE,MAAM,GAAG,EAAE,EAAE,GAAG,KAAK,EAAwB,GAAA,EAAE;AAC9D;AACE,CAAC;AACC,IAAA,SAAS,EAAE,IAAI,KAAK,CAAC,EAAE,EAAE;;QAEvB,GAAG,EAAE,CAAC,MAAW,EAAE,IAAY,EAAE,QAAgB,EAAE,IAAY,KAC7D,CAAC,KAAa,EAAE,GAAG,QAAmD,KACpE,MAAM,CAAC,IAAI,CACT;YACE,IAAI,CAAC,WAAW,EAAE;YAClB,MAAM,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,GAAG,KAAK;AAC7B,iBAAA,OAAO,CAAC,YAAY,EAAE,IAAI,CAAC;AAC3B,iBAAA,OAAO,CAAC,mBAAmB,EAAE,cAAc,CAAC;AAC5C,iBAAA,OAAO,CAAC,iBAAiB,EAAE,qBAAqB,CAAC;AACjD,iBAAA,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;AACrB,iBAAA,OAAO,CAAC,UAAU,EAAE,SAAS,CAAC;AACjC,aAAA,GAAA,CAAK,CAAC;;AAEN,YAAA,QAAQ;AACR,YAAA,IAAI;AACL,SAAA,CACF,IAAI,QAAQ;KAClB,CAAC;IACF,MAAM;AACN,IAAA,GAAG,KAAK;AACR,IAAA,MAAM,KAAK,CAAE,OAAoB,EAAE,GAAG,IAAI,EAAA;QACxC,IAAI,QAAQ,EACR,KAAK,EACL,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,EAC1B,KAAK,GAAwB,OAAO,CAAC,KAAK,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,CAAA;;QAGpE,KAAK,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,GAAG,CAAC,YAAY;YACjC,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAI,EAAe,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAA;;QAGhE,KAAK,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,MAAM;YAChD,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,IAAI,MAAM,IAAI,KAAK,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE;gBACxF,OAAO,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,EAAE,CAAA;AACnC,gBAAA,OAAO,CAAC,KAAK,GAAG,IAAI,CAAA;gBACpB,KAAK,IAAI,OAAO,IAAI,QAAQ;AAC1B,oBAAA,IAAI,CAAC,QAAQ,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,KAAK,IAAI,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK,IAAI;AAAE,wBAAA,OAAO,QAAQ,CAAA;aAC7F;KACJ;AACF,CAAA;;;;"}
|
package/Router.js
CHANGED
|
@@ -1,2 +1,60 @@
|
|
|
1
|
-
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const Router = ({ base = '', routes = [], ...other } = {}) => ({
|
|
4
|
+
__proto__: new Proxy({}, {
|
|
5
|
+
// @ts-expect-error (we're adding an expected prop "path" to the get)
|
|
6
|
+
get: (target, prop, receiver, path) => (route, ...handlers) => routes.push([
|
|
7
|
+
prop.toUpperCase?.(),
|
|
8
|
+
RegExp(`^${(path = (base + route)
|
|
9
|
+
.replace(/\/+(\/|$)/g, '$1')) // strip double & trailing splash
|
|
10
|
+
.replace(/(\/?\.?):(\w+)\+/g, '($1(?<$2>*))') // greedy params
|
|
11
|
+
.replace(/(\/?\.?):(\w+)/g, '($1(?<$2>[^$1/]+?))') // named params and image format
|
|
12
|
+
.replace(/\./g, '\\.') // dot in path
|
|
13
|
+
.replace(/(\/?)\*/g, '($1.*)?') // wildcard
|
|
14
|
+
}/*$`),
|
|
15
|
+
// @ts-ignore
|
|
16
|
+
handlers, // embed handlers
|
|
17
|
+
path, // embed clean route path
|
|
18
|
+
]) && receiver
|
|
19
|
+
}),
|
|
20
|
+
routes,
|
|
21
|
+
...other,
|
|
22
|
+
async fetch(request, ...args) {
|
|
23
|
+
let response, match, url = new URL(request.url), query = request.query = { __proto__: null };
|
|
24
|
+
// 1. parse query params
|
|
25
|
+
for (let [k, v] of url.searchParams)
|
|
26
|
+
query[k] = query[k] ? [].concat(query[k], v) : v;
|
|
27
|
+
t: try {
|
|
28
|
+
for (let handler of other.before || [])
|
|
29
|
+
if ((response = await handler(request.proxy ?? request, ...args)) != null)
|
|
30
|
+
break t;
|
|
31
|
+
// 2. then test routes
|
|
32
|
+
outer: for (let [method, regex, handlers, path] of routes)
|
|
33
|
+
if ((method == request.method || method == 'ALL') && (match = url.pathname.match(regex))) {
|
|
34
|
+
request.params = match.groups || {}; // embed params in request
|
|
35
|
+
request.route = path; // embed route path in request
|
|
36
|
+
for (let handler of handlers)
|
|
37
|
+
if ((response = await handler(request.proxy ?? request, ...args)) != null)
|
|
38
|
+
break outer;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
catch (err) {
|
|
42
|
+
if (!other.catch)
|
|
43
|
+
throw err;
|
|
44
|
+
response = await other.catch(err, request.proxy ?? request, ...args);
|
|
45
|
+
}
|
|
46
|
+
try {
|
|
47
|
+
for (let handler of other.finally || [])
|
|
48
|
+
response = await handler(response, request.proxy ?? request, ...args) ?? response;
|
|
49
|
+
}
|
|
50
|
+
catch (err) {
|
|
51
|
+
if (!other.catch)
|
|
52
|
+
throw err;
|
|
53
|
+
response = await other.catch(err, request.proxy ?? request, ...args);
|
|
54
|
+
}
|
|
55
|
+
return response;
|
|
56
|
+
},
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
exports.Router = Router;
|
|
2
60
|
//# sourceMappingURL=Router.js.map
|
package/Router.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Router.js","sources":["../src/src/Router.ts"],"sourcesContent":[null],"names":[
|
|
1
|
+
{"version":3,"file":"Router.js","sources":["../src/src/Router.ts"],"sourcesContent":[null],"names":[],"mappings":";;MAQa,MAAM,GAAG,CAIpB,EAAE,IAAI,GAAG,EAAE,EAAE,MAAM,GAAG,EAAE,EAAE,GAAG,KAAK,KAAoB,EAAE,MACvD;AACC,IAAA,SAAS,EAAE,IAAI,KAAK,CAAC,EAAE,EAAE;;QAEvB,GAAG,EAAE,CAAC,MAAW,EAAE,IAAY,EAAE,QAAgB,EAAE,IAAY,KAC7D,CAAC,KAAa,EAAE,GAAG,QAA6C,KAC9D,MAAM,CAAC,IAAI,CACT;YACE,IAAI,CAAC,WAAW,IAAI;YACpB,MAAM,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,GAAG,KAAK;AAC7B,iBAAA,OAAO,CAAC,YAAY,EAAE,IAAI,CAAC;AAC3B,iBAAA,OAAO,CAAC,mBAAmB,EAAE,cAAc,CAAC;AAC5C,iBAAA,OAAO,CAAC,iBAAiB,EAAE,qBAAqB,CAAC;AACjD,iBAAA,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;AACrB,iBAAA,OAAO,CAAC,UAAU,EAAE,SAAS,CAAC;AACjC,aAAA,GAAA,CAAK,CAAC;;AAEN,YAAA,QAAQ;AACR,YAAA,IAAI;AACL,SAAA,CACF,IAAI,QAAQ;KAClB,CAAC;IACF,MAAM;AACN,IAAA,GAAG,KAAK;AACR,IAAA,MAAM,KAAK,CAAE,OAAoB,EAAE,GAAG,IAAS,EAAA;QAC7C,IAAI,QAAQ,EACR,KAAK,EACL,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,EAC1B,KAAK,GAAwB,OAAO,CAAC,KAAK,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,CAAA;;QAGpE,KAAK,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,GAAG,CAAC,YAAY;YACjC,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAI,EAAe,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAA;QAEhE,CAAC,EAAE,IAAI;AACL,YAAA,KAAK,IAAI,OAAO,IAAI,KAAK,CAAC,MAAM,IAAI,EAAE;AACpC,gBAAA,IAAI,CAAC,QAAQ,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,KAAK,IAAI,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK,IAAI;AAAE,oBAAA,MAAM,CAAC,CAAA;;AAGpF,YAAA,KAAK,EAAE,KAAK,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,MAAM;gBACvD,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,IAAI,MAAM,IAAI,KAAK,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE;oBACxF,OAAO,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,EAAE,CAAA;AACnC,oBAAA,OAAO,CAAC,KAAK,GAAG,IAAI,CAAA;oBAEpB,KAAK,IAAI,OAAO,IAAI,QAAQ;AAC1B,wBAAA,IAAI,CAAC,QAAQ,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,KAAK,IAAI,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK,IAAI;AAAE,4BAAA,MAAM,KAAK,CAAA;iBACzF;SACJ;QAAC,OAAO,GAAQ,EAAE;YACjB,IAAI,CAAC,KAAK,CAAC,KAAK;AAAE,gBAAA,MAAM,GAAG,CAAA;AAC3B,YAAA,QAAQ,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC,KAAK,IAAI,OAAO,EAAE,GAAG,IAAI,CAAC,CAAA;SACrE;AAED,QAAA,IAAI;AACF,YAAA,KAAK,IAAI,OAAO,IAAI,KAAK,CAAC,OAAO,IAAI,EAAE;AACrC,gBAAA,QAAQ,GAAG,MAAM,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,KAAK,IAAI,OAAO,EAAE,GAAG,IAAI,CAAC,IAAI,QAAQ,CAAA;SACpF;QAAC,OAAM,GAAQ,EAAE;YAChB,IAAI,CAAC,KAAK,CAAC,KAAK;AAAE,gBAAA,MAAM,GAAG,CAAA;AACzB,YAAA,QAAQ,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC,KAAK,IAAI,OAAO,EAAE,GAAG,IAAI,CAAC,CAAA;SACvE;AAED,QAAA,OAAO,QAAQ,CAAA;KAChB;AACgC,CAAA;;;;"}
|
package/Router.mjs
CHANGED
|
@@ -1,2 +1,58 @@
|
|
|
1
|
-
const
|
|
1
|
+
const Router = ({ base = '', routes = [], ...other } = {}) => ({
|
|
2
|
+
__proto__: new Proxy({}, {
|
|
3
|
+
// @ts-expect-error (we're adding an expected prop "path" to the get)
|
|
4
|
+
get: (target, prop, receiver, path) => (route, ...handlers) => routes.push([
|
|
5
|
+
prop.toUpperCase?.(),
|
|
6
|
+
RegExp(`^${(path = (base + route)
|
|
7
|
+
.replace(/\/+(\/|$)/g, '$1')) // strip double & trailing splash
|
|
8
|
+
.replace(/(\/?\.?):(\w+)\+/g, '($1(?<$2>*))') // greedy params
|
|
9
|
+
.replace(/(\/?\.?):(\w+)/g, '($1(?<$2>[^$1/]+?))') // named params and image format
|
|
10
|
+
.replace(/\./g, '\\.') // dot in path
|
|
11
|
+
.replace(/(\/?)\*/g, '($1.*)?') // wildcard
|
|
12
|
+
}/*$`),
|
|
13
|
+
// @ts-ignore
|
|
14
|
+
handlers, // embed handlers
|
|
15
|
+
path, // embed clean route path
|
|
16
|
+
]) && receiver
|
|
17
|
+
}),
|
|
18
|
+
routes,
|
|
19
|
+
...other,
|
|
20
|
+
async fetch(request, ...args) {
|
|
21
|
+
let response, match, url = new URL(request.url), query = request.query = { __proto__: null };
|
|
22
|
+
// 1. parse query params
|
|
23
|
+
for (let [k, v] of url.searchParams)
|
|
24
|
+
query[k] = query[k] ? [].concat(query[k], v) : v;
|
|
25
|
+
t: try {
|
|
26
|
+
for (let handler of other.before || [])
|
|
27
|
+
if ((response = await handler(request.proxy ?? request, ...args)) != null)
|
|
28
|
+
break t;
|
|
29
|
+
// 2. then test routes
|
|
30
|
+
outer: for (let [method, regex, handlers, path] of routes)
|
|
31
|
+
if ((method == request.method || method == 'ALL') && (match = url.pathname.match(regex))) {
|
|
32
|
+
request.params = match.groups || {}; // embed params in request
|
|
33
|
+
request.route = path; // embed route path in request
|
|
34
|
+
for (let handler of handlers)
|
|
35
|
+
if ((response = await handler(request.proxy ?? request, ...args)) != null)
|
|
36
|
+
break outer;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
catch (err) {
|
|
40
|
+
if (!other.catch)
|
|
41
|
+
throw err;
|
|
42
|
+
response = await other.catch(err, request.proxy ?? request, ...args);
|
|
43
|
+
}
|
|
44
|
+
try {
|
|
45
|
+
for (let handler of other.finally || [])
|
|
46
|
+
response = await handler(response, request.proxy ?? request, ...args) ?? response;
|
|
47
|
+
}
|
|
48
|
+
catch (err) {
|
|
49
|
+
if (!other.catch)
|
|
50
|
+
throw err;
|
|
51
|
+
response = await other.catch(err, request.proxy ?? request, ...args);
|
|
52
|
+
}
|
|
53
|
+
return response;
|
|
54
|
+
},
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
export { Router };
|
|
2
58
|
//# sourceMappingURL=Router.mjs.map
|
package/Router.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Router.mjs","sources":["../src/src/Router.ts"],"sourcesContent":[null],"names":[
|
|
1
|
+
{"version":3,"file":"Router.mjs","sources":["../src/src/Router.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|