hono 2.1.3 → 2.2.0
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 +13 -14
- package/dist/cjs/compose.js +48 -0
- package/dist/cjs/context.js +148 -0
- package/dist/cjs/hono.js +154 -0
- package/dist/cjs/index.js +13 -0
- package/dist/cjs/middleware/basic-auth/index.js +48 -0
- package/dist/cjs/middleware/bearer-auth/index.js +57 -0
- package/dist/cjs/middleware/cache/index.js +32 -0
- package/dist/cjs/middleware/compress/index.js +19 -0
- package/dist/cjs/middleware/cors/index.js +75 -0
- package/dist/cjs/middleware/etag/index.js +27 -0
- package/dist/cjs/middleware/html/index.js +36 -0
- package/dist/cjs/middleware/jsx/index.js +193 -0
- package/dist/cjs/middleware/jsx/jsx-dev-runtime.js +10 -0
- package/dist/cjs/middleware/jsx/jsx-runtime.js +7 -0
- package/dist/cjs/middleware/jwt/index.js +63 -0
- package/dist/cjs/middleware/logger/index.js +49 -0
- package/dist/cjs/middleware/powered-by/index.js +10 -0
- package/dist/cjs/middleware/pretty-json/index.js +11 -0
- package/dist/cjs/middleware/serve-static/bun.js +41 -0
- package/dist/cjs/middleware/serve-static/index.js +5 -0
- package/dist/cjs/middleware/serve-static/serve-static.js +40 -0
- package/dist/cjs/middleware/validator/index.js +5 -0
- package/dist/cjs/middleware/validator/middleware.js +56 -0
- package/dist/cjs/middleware/validator/rule.js +66 -0
- package/dist/cjs/middleware/validator/sanitizer.js +6 -0
- package/dist/cjs/middleware/validator/validator.js +195 -0
- package/dist/cjs/request.js +120 -0
- package/dist/cjs/router/reg-exp-router/index.js +5 -0
- package/dist/cjs/router/reg-exp-router/node.js +108 -0
- package/dist/cjs/router/reg-exp-router/router.js +161 -0
- package/dist/cjs/router/reg-exp-router/trie.js +42 -0
- package/dist/cjs/router/smart-router/index.js +5 -0
- package/dist/cjs/router/smart-router/router.js +57 -0
- package/dist/cjs/router/static-router/index.js +5 -0
- package/dist/cjs/router/static-router/router.js +72 -0
- package/dist/cjs/router/trie-router/index.js +5 -0
- package/dist/cjs/router/trie-router/node.js +175 -0
- package/dist/cjs/router/trie-router/router.js +24 -0
- package/dist/cjs/router.js +9 -0
- package/dist/cjs/utils/body.js +18 -0
- package/dist/cjs/utils/buffer.js +39 -0
- package/dist/cjs/utils/cloudflare.js +39 -0
- package/dist/cjs/utils/cookie.js +40 -0
- package/dist/cjs/utils/crypto.js +53 -0
- package/dist/cjs/utils/encode.js +80 -0
- package/dist/cjs/utils/filepath.js +25 -0
- package/dist/cjs/utils/html.js +38 -0
- package/dist/cjs/utils/http-status.js +50 -0
- package/dist/cjs/utils/json.js +22 -0
- package/dist/cjs/utils/jwt/index.js +27 -0
- package/dist/cjs/utils/jwt/jwt.js +101 -0
- package/dist/cjs/utils/jwt/types.js +49 -0
- package/dist/cjs/utils/mime.js +92 -0
- package/dist/cjs/utils/url.js +94 -0
- package/dist/compose.d.ts +7 -2
- package/dist/compose.js +24 -14
- package/dist/context.d.ts +14 -9
- package/dist/context.js +56 -24
- package/dist/hono.d.ts +29 -26
- package/dist/hono.js +44 -22
- package/dist/index.js +3 -6
- package/dist/middleware/basic-auth/index.d.ts +2 -3
- package/dist/middleware/basic-auth/index.js +7 -11
- package/dist/middleware/bearer-auth/index.d.ts +2 -3
- package/dist/middleware/bearer-auth/index.js +4 -12
- package/dist/middleware/cache/index.d.ts +2 -3
- package/dist/middleware/cache/index.js +1 -5
- package/dist/middleware/compress/index.d.ts +2 -3
- package/dist/middleware/compress/index.js +1 -5
- package/dist/middleware/cors/index.d.ts +3 -4
- package/dist/middleware/cors/index.js +16 -6
- package/dist/middleware/etag/index.d.ts +2 -3
- package/dist/middleware/etag/index.js +3 -7
- package/dist/middleware/html/index.js +6 -11
- package/dist/middleware/jsx/index.js +9 -15
- package/dist/middleware/jsx/jsx-dev-runtime.js +3 -7
- package/dist/middleware/jsx/jsx-runtime.js +2 -7
- package/dist/middleware/jwt/index.d.ts +2 -3
- package/dist/middleware/jwt/index.js +3 -7
- package/dist/middleware/logger/index.d.ts +2 -3
- package/dist/middleware/logger/index.js +3 -7
- package/dist/middleware/powered-by/index.d.ts +2 -3
- package/dist/middleware/powered-by/index.js +1 -5
- package/dist/middleware/pretty-json/index.d.ts +2 -3
- package/dist/middleware/pretty-json/index.js +1 -5
- package/dist/middleware/serve-static/bun.d.ts +2 -3
- package/dist/middleware/serve-static/bun.js +18 -19
- package/dist/middleware/serve-static/index.js +1 -5
- package/dist/middleware/serve-static/module.d.mts +1 -1
- package/dist/middleware/serve-static/serve-static.d.ts +2 -3
- package/dist/middleware/serve-static/serve-static.js +8 -12
- package/dist/middleware/validator/index.d.ts +2 -0
- package/dist/middleware/validator/index.js +2 -0
- package/dist/middleware/validator/middleware.d.ts +21 -0
- package/dist/middleware/validator/middleware.js +52 -0
- package/dist/middleware/validator/rule.d.ts +21 -0
- package/dist/middleware/validator/rule.js +63 -0
- package/dist/middleware/validator/sanitizer.d.ts +3 -0
- package/dist/middleware/validator/sanitizer.js +3 -0
- package/dist/middleware/validator/validator.d.ts +75 -0
- package/dist/middleware/validator/validator.js +186 -0
- package/dist/request.d.ts +15 -5
- package/dist/request.js +63 -30
- package/dist/router/reg-exp-router/index.js +1 -5
- package/dist/router/reg-exp-router/node.d.ts +1 -3
- package/dist/router/reg-exp-router/node.js +21 -17
- package/dist/router/reg-exp-router/router.d.ts +3 -27
- package/dist/router/reg-exp-router/router.js +104 -307
- package/dist/router/reg-exp-router/trie.d.ts +0 -4
- package/dist/router/reg-exp-router/trie.js +4 -8
- package/dist/router/smart-router/index.d.ts +1 -0
- package/dist/router/smart-router/index.js +1 -0
- package/dist/router/smart-router/router.d.ts +9 -0
- package/dist/router/smart-router/router.js +53 -0
- package/dist/router/static-router/index.d.ts +1 -0
- package/dist/router/static-router/index.js +1 -0
- package/dist/router/static-router/router.d.ts +8 -0
- package/dist/router/static-router/router.js +68 -0
- package/dist/router/trie-router/index.js +1 -5
- package/dist/router/trie-router/node.js +7 -11
- package/dist/router/trie-router/router.js +11 -7
- package/dist/router.d.ts +3 -0
- package/dist/router.js +5 -5
- package/dist/utils/body.d.ts +2 -1
- package/dist/utils/body.js +1 -5
- package/dist/utils/buffer.d.ts +1 -1
- package/dist/utils/buffer.js +5 -11
- package/dist/utils/cloudflare.d.ts +1 -1
- package/dist/utils/cloudflare.js +1 -5
- package/dist/utils/cookie.js +2 -7
- package/dist/utils/crypto.js +8 -15
- package/dist/utils/encode.js +10 -20
- package/dist/utils/filepath.js +1 -5
- package/dist/utils/html.js +1 -5
- package/dist/utils/http-status.js +1 -5
- package/dist/utils/json.d.ts +1 -0
- package/dist/utils/json.js +18 -0
- package/dist/utils/jwt/index.js +1 -27
- package/dist/utils/jwt/jwt.js +22 -28
- package/dist/utils/jwt/types.js +8 -16
- package/dist/utils/mime.js +1 -5
- package/dist/utils/url.d.ts +2 -1
- package/dist/utils/url.js +21 -19
- package/package.json +122 -35
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.StaticRouter = void 0;
|
|
4
|
+
var router_1 = require("./router");
|
|
5
|
+
Object.defineProperty(exports, "StaticRouter", { enumerable: true, get: function () { return router_1.StaticRouter; } });
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.StaticRouter = void 0;
|
|
4
|
+
const router_1 = require("../../router");
|
|
5
|
+
class StaticRouter {
|
|
6
|
+
constructor() {
|
|
7
|
+
this.middleware = {};
|
|
8
|
+
this.routes = {};
|
|
9
|
+
[router_1.METHOD_NAME_ALL, ...router_1.METHODS].forEach((method) => {
|
|
10
|
+
this.routes[method.toUpperCase()] = {};
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
add(method, path, handler) {
|
|
14
|
+
var _a;
|
|
15
|
+
const { middleware, routes } = this;
|
|
16
|
+
if (path === '/*') {
|
|
17
|
+
path = '*';
|
|
18
|
+
}
|
|
19
|
+
if (path === '*') {
|
|
20
|
+
if (method === router_1.METHOD_NAME_ALL) {
|
|
21
|
+
middleware[router_1.METHOD_NAME_ALL] || (middleware[router_1.METHOD_NAME_ALL] = { handlers: [], params: {} });
|
|
22
|
+
Object.keys(middleware).forEach((m) => {
|
|
23
|
+
middleware[m].handlers.push(handler);
|
|
24
|
+
});
|
|
25
|
+
Object.keys(routes).forEach((m) => {
|
|
26
|
+
Object.values(routes[m]).forEach((matchRes) => matchRes.handlers.push(handler));
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
middleware[method] || (middleware[method] = {
|
|
31
|
+
handlers: [...(middleware[router_1.METHOD_NAME_ALL]?.handlers || [])],
|
|
32
|
+
params: {},
|
|
33
|
+
});
|
|
34
|
+
middleware[method].handlers.push(handler);
|
|
35
|
+
if (routes[method]) {
|
|
36
|
+
Object.values(routes[method]).forEach((matchRes) => matchRes.handlers.push(handler));
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
if (/\*|\/:/.test(path)) {
|
|
42
|
+
throw new router_1.UnsupportedPathError(path);
|
|
43
|
+
}
|
|
44
|
+
(_a = routes[method])[path] || (_a[path] = {
|
|
45
|
+
handlers: [
|
|
46
|
+
...(routes[router_1.METHOD_NAME_ALL][path]?.handlers ||
|
|
47
|
+
middleware[method]?.handlers ||
|
|
48
|
+
middleware[router_1.METHOD_NAME_ALL]?.handlers ||
|
|
49
|
+
[]),
|
|
50
|
+
],
|
|
51
|
+
params: {},
|
|
52
|
+
});
|
|
53
|
+
if (method === router_1.METHOD_NAME_ALL) {
|
|
54
|
+
Object.keys(routes).forEach((m) => {
|
|
55
|
+
routes[m][path]?.handlers?.push(handler);
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
routes[method][path].handlers.push(handler);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
match(method, path) {
|
|
63
|
+
const { routes, middleware } = this;
|
|
64
|
+
this.match = (method, path) => routes[method][path] ||
|
|
65
|
+
routes[router_1.METHOD_NAME_ALL][path] ||
|
|
66
|
+
middleware[method] ||
|
|
67
|
+
middleware[router_1.METHOD_NAME_ALL] ||
|
|
68
|
+
null;
|
|
69
|
+
return this.match(method, path);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
exports.StaticRouter = StaticRouter;
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Node = void 0;
|
|
4
|
+
const router_1 = require("../../router");
|
|
5
|
+
const url_1 = require("../../utils/url");
|
|
6
|
+
function findParam(node, name) {
|
|
7
|
+
for (let i = 0, len = node.patterns.length; i < len; i++) {
|
|
8
|
+
if (typeof node.patterns[i] === 'object' && node.patterns[i][1] === name) {
|
|
9
|
+
return true;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
const nodes = Object.values(node.children);
|
|
13
|
+
for (let i = 0, len = nodes.length; i < len; i++) {
|
|
14
|
+
if (findParam(nodes[i], name)) {
|
|
15
|
+
return true;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
class Node {
|
|
21
|
+
constructor(method, handler, children) {
|
|
22
|
+
this.order = 0;
|
|
23
|
+
this.children = children || {};
|
|
24
|
+
this.methods = [];
|
|
25
|
+
this.name = '';
|
|
26
|
+
if (method && handler) {
|
|
27
|
+
const m = {};
|
|
28
|
+
m[method] = { handler: handler, score: 0, name: this.name };
|
|
29
|
+
this.methods = [m];
|
|
30
|
+
}
|
|
31
|
+
this.patterns = [];
|
|
32
|
+
this.handlerSetCache = {};
|
|
33
|
+
}
|
|
34
|
+
insert(method, path, handler) {
|
|
35
|
+
this.name = `${method} ${path}`;
|
|
36
|
+
this.order = ++this.order;
|
|
37
|
+
// eslint-disable-next-line @typescript-eslint/no-this-alias
|
|
38
|
+
let curNode = this;
|
|
39
|
+
const parts = (0, url_1.splitPath)(path);
|
|
40
|
+
const parentPatterns = [];
|
|
41
|
+
const errorMessage = (name) => {
|
|
42
|
+
return `Duplicate param name, use another name instead of '${name}' - ${method} ${path} <--- '${name}'`;
|
|
43
|
+
};
|
|
44
|
+
for (let i = 0, len = parts.length; i < len; i++) {
|
|
45
|
+
const p = parts[i];
|
|
46
|
+
if (Object.keys(curNode.children).includes(p)) {
|
|
47
|
+
parentPatterns.push(...curNode.patterns);
|
|
48
|
+
curNode = curNode.children[p];
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
curNode.children[p] = new Node();
|
|
52
|
+
const pattern = (0, url_1.getPattern)(p);
|
|
53
|
+
if (pattern) {
|
|
54
|
+
if (typeof pattern === 'object') {
|
|
55
|
+
for (let j = 0, len = parentPatterns.length; j < len; j++) {
|
|
56
|
+
if (typeof parentPatterns[j] === 'object' && parentPatterns[j][1] === pattern[1]) {
|
|
57
|
+
throw new Error(errorMessage(pattern[1]));
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
if (Object.values(curNode.children).some((n) => findParam(n, pattern[1]))) {
|
|
61
|
+
throw new Error(errorMessage(pattern[1]));
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
curNode.patterns.push(pattern);
|
|
65
|
+
parentPatterns.push(...curNode.patterns);
|
|
66
|
+
}
|
|
67
|
+
parentPatterns.push(...curNode.patterns);
|
|
68
|
+
curNode = curNode.children[p];
|
|
69
|
+
}
|
|
70
|
+
if (!curNode.methods.length) {
|
|
71
|
+
curNode.methods = [];
|
|
72
|
+
}
|
|
73
|
+
const m = {};
|
|
74
|
+
const handlerSet = { handler: handler, name: this.name, score: this.order };
|
|
75
|
+
m[method] = handlerSet;
|
|
76
|
+
curNode.methods.push(m);
|
|
77
|
+
return curNode;
|
|
78
|
+
}
|
|
79
|
+
getHandlerSets(node, method, wildcard) {
|
|
80
|
+
var _a, _b;
|
|
81
|
+
return ((_a = node.handlerSetCache)[_b = `${method}:${wildcard ? '1' : '0'}`] || (_a[_b] = (() => {
|
|
82
|
+
const handlerSets = [];
|
|
83
|
+
for (let i = 0, len = node.methods.length; i < len; i++) {
|
|
84
|
+
const m = node.methods[i];
|
|
85
|
+
const handlerSet = m[method] || m[router_1.METHOD_NAME_ALL];
|
|
86
|
+
if (handlerSet !== undefined) {
|
|
87
|
+
handlerSets.push(handlerSet);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return handlerSets;
|
|
91
|
+
})()));
|
|
92
|
+
}
|
|
93
|
+
search(method, path) {
|
|
94
|
+
const handlerSets = [];
|
|
95
|
+
const params = {};
|
|
96
|
+
// eslint-disable-next-line @typescript-eslint/no-this-alias
|
|
97
|
+
const curNode = this;
|
|
98
|
+
let curNodes = [curNode];
|
|
99
|
+
const parts = (0, url_1.splitPath)(path);
|
|
100
|
+
for (let i = 0, len = parts.length; i < len; i++) {
|
|
101
|
+
const part = parts[i];
|
|
102
|
+
const isLast = i === len - 1;
|
|
103
|
+
const tempNodes = [];
|
|
104
|
+
let matched = false;
|
|
105
|
+
for (let j = 0, len2 = curNodes.length; j < len2; j++) {
|
|
106
|
+
const node = curNodes[j];
|
|
107
|
+
const nextNode = node.children[part];
|
|
108
|
+
if (nextNode) {
|
|
109
|
+
if (isLast === true) {
|
|
110
|
+
// '/hello/*' => match '/hello'
|
|
111
|
+
if (nextNode.children['*']) {
|
|
112
|
+
handlerSets.push(...this.getHandlerSets(nextNode.children['*'], method, true));
|
|
113
|
+
}
|
|
114
|
+
handlerSets.push(...this.getHandlerSets(nextNode, method));
|
|
115
|
+
matched = true;
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
tempNodes.push(nextNode);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
for (let k = 0, len3 = node.patterns.length; k < len3; k++) {
|
|
122
|
+
const pattern = node.patterns[k];
|
|
123
|
+
// Wildcard
|
|
124
|
+
// '/hello/*/foo' => match /hello/bar/foo
|
|
125
|
+
if (pattern === '*') {
|
|
126
|
+
const astNode = node.children['*'];
|
|
127
|
+
if (astNode) {
|
|
128
|
+
handlerSets.push(...this.getHandlerSets(astNode, method));
|
|
129
|
+
tempNodes.push(astNode);
|
|
130
|
+
}
|
|
131
|
+
continue;
|
|
132
|
+
}
|
|
133
|
+
if (part === '')
|
|
134
|
+
continue;
|
|
135
|
+
// Named match
|
|
136
|
+
// `/posts/:id` => match /posts/123
|
|
137
|
+
const [key, name, matcher] = pattern;
|
|
138
|
+
if (matcher === true || (matcher instanceof RegExp && matcher.test(part))) {
|
|
139
|
+
if (typeof key === 'string') {
|
|
140
|
+
if (isLast === true) {
|
|
141
|
+
handlerSets.push(...this.getHandlerSets(node.children[key], method));
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
tempNodes.push(node.children[key]);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
// '/book/a' => not-slug
|
|
148
|
+
// '/book/:slug' => slug
|
|
149
|
+
// GET /book/a ~> no-slug, param['slug'] => undefined
|
|
150
|
+
// GET /book/foo ~> slug, param['slug'] => foo
|
|
151
|
+
if (typeof name === 'string' && !matched) {
|
|
152
|
+
params[name] = part;
|
|
153
|
+
}
|
|
154
|
+
break;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
curNodes = tempNodes;
|
|
159
|
+
}
|
|
160
|
+
const len = handlerSets.length;
|
|
161
|
+
if (len === 0)
|
|
162
|
+
return null;
|
|
163
|
+
if (len === 1)
|
|
164
|
+
return { handlers: [handlerSets[0].handler], params };
|
|
165
|
+
const handlers = handlerSets
|
|
166
|
+
.sort((a, b) => {
|
|
167
|
+
return a.score - b.score;
|
|
168
|
+
})
|
|
169
|
+
.map((s) => {
|
|
170
|
+
return s.handler;
|
|
171
|
+
});
|
|
172
|
+
return { handlers, params };
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
exports.Node = Node;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TrieRouter = void 0;
|
|
4
|
+
const url_1 = require("../../utils/url");
|
|
5
|
+
const node_1 = require("./node");
|
|
6
|
+
class TrieRouter {
|
|
7
|
+
constructor() {
|
|
8
|
+
this.node = new node_1.Node();
|
|
9
|
+
}
|
|
10
|
+
add(method, path, handler) {
|
|
11
|
+
const results = (0, url_1.checkOptionalParameter)(path);
|
|
12
|
+
if (results) {
|
|
13
|
+
for (const p of results) {
|
|
14
|
+
this.node.insert(method, p, handler);
|
|
15
|
+
}
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
this.node.insert(method, path, handler);
|
|
19
|
+
}
|
|
20
|
+
match(method, path) {
|
|
21
|
+
return this.node.search(method, path);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
exports.TrieRouter = TrieRouter;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.UnsupportedPathError = exports.METHODS = exports.METHOD_NAME_ALL_LOWERCASE = exports.METHOD_NAME_ALL = void 0;
|
|
4
|
+
exports.METHOD_NAME_ALL = 'ALL';
|
|
5
|
+
exports.METHOD_NAME_ALL_LOWERCASE = 'all';
|
|
6
|
+
exports.METHODS = ['get', 'post', 'put', 'delete', 'head', 'options', 'patch'];
|
|
7
|
+
class UnsupportedPathError extends Error {
|
|
8
|
+
}
|
|
9
|
+
exports.UnsupportedPathError = UnsupportedPathError;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseBody = void 0;
|
|
4
|
+
async function parseBody(r) {
|
|
5
|
+
let body = {};
|
|
6
|
+
const contentType = r.headers.get('Content-Type');
|
|
7
|
+
if (contentType &&
|
|
8
|
+
(contentType.startsWith('multipart/form-data') ||
|
|
9
|
+
contentType === 'application/x-www-form-urlencoded')) {
|
|
10
|
+
const form = {};
|
|
11
|
+
body = [...(await r.formData())].reduce((acc, cur) => {
|
|
12
|
+
acc[cur[0]] = cur[1];
|
|
13
|
+
return acc;
|
|
14
|
+
}, form);
|
|
15
|
+
}
|
|
16
|
+
return body;
|
|
17
|
+
}
|
|
18
|
+
exports.parseBody = parseBody;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.bufferToString = exports.timingSafeEqual = exports.equal = void 0;
|
|
4
|
+
const crypto_1 = require("./crypto");
|
|
5
|
+
const equal = (a, b) => {
|
|
6
|
+
if (a === b) {
|
|
7
|
+
return true;
|
|
8
|
+
}
|
|
9
|
+
if (a.byteLength !== b.byteLength) {
|
|
10
|
+
return false;
|
|
11
|
+
}
|
|
12
|
+
const va = new DataView(a);
|
|
13
|
+
const vb = new DataView(b);
|
|
14
|
+
let i = va.byteLength;
|
|
15
|
+
while (i--) {
|
|
16
|
+
if (va.getUint8(i) !== vb.getUint8(i)) {
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return true;
|
|
21
|
+
};
|
|
22
|
+
exports.equal = equal;
|
|
23
|
+
const timingSafeEqual = async (a, b, hashFunction) => {
|
|
24
|
+
if (!hashFunction) {
|
|
25
|
+
hashFunction = crypto_1.sha256;
|
|
26
|
+
}
|
|
27
|
+
const sa = await hashFunction(a);
|
|
28
|
+
const sb = await hashFunction(b);
|
|
29
|
+
return sa === sb && a === b;
|
|
30
|
+
};
|
|
31
|
+
exports.timingSafeEqual = timingSafeEqual;
|
|
32
|
+
const bufferToString = (buffer) => {
|
|
33
|
+
if (buffer instanceof ArrayBuffer) {
|
|
34
|
+
const enc = new TextDecoder('utf-8');
|
|
35
|
+
return enc.decode(buffer);
|
|
36
|
+
}
|
|
37
|
+
return buffer;
|
|
38
|
+
};
|
|
39
|
+
exports.bufferToString = bufferToString;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getContentFromKVAsset = void 0;
|
|
4
|
+
const getContentFromKVAsset = async (path, options) => {
|
|
5
|
+
let ASSET_MANIFEST = {};
|
|
6
|
+
if (options && options.manifest) {
|
|
7
|
+
if (typeof options.manifest === 'string') {
|
|
8
|
+
ASSET_MANIFEST = JSON.parse(options.manifest);
|
|
9
|
+
}
|
|
10
|
+
else {
|
|
11
|
+
ASSET_MANIFEST = options.manifest;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
else {
|
|
15
|
+
if (typeof __STATIC_CONTENT_MANIFEST === 'string') {
|
|
16
|
+
ASSET_MANIFEST = JSON.parse(__STATIC_CONTENT_MANIFEST);
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
ASSET_MANIFEST = __STATIC_CONTENT_MANIFEST;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
let ASSET_NAMESPACE;
|
|
23
|
+
if (options && options.namespace) {
|
|
24
|
+
ASSET_NAMESPACE = options.namespace;
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
ASSET_NAMESPACE = __STATIC_CONTENT;
|
|
28
|
+
}
|
|
29
|
+
const key = ASSET_MANIFEST[path] || path;
|
|
30
|
+
if (!key) {
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
let content = await ASSET_NAMESPACE.get(key, { type: 'arrayBuffer' });
|
|
34
|
+
if (content) {
|
|
35
|
+
content = content;
|
|
36
|
+
}
|
|
37
|
+
return content;
|
|
38
|
+
};
|
|
39
|
+
exports.getContentFromKVAsset = getContentFromKVAsset;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.serialize = exports.parse = void 0;
|
|
4
|
+
const parse = (cookie) => {
|
|
5
|
+
const pairs = cookie.split(/;\s*/g);
|
|
6
|
+
const parsedCookie = {};
|
|
7
|
+
for (let i = 0, len = pairs.length; i < len; i++) {
|
|
8
|
+
const pair = pairs[i].split(/\s*=\s*([^\s]+)/);
|
|
9
|
+
parsedCookie[pair[0]] = decodeURIComponent(pair[1]);
|
|
10
|
+
}
|
|
11
|
+
return parsedCookie;
|
|
12
|
+
};
|
|
13
|
+
exports.parse = parse;
|
|
14
|
+
const serialize = (name, value, opt = {}) => {
|
|
15
|
+
value = encodeURIComponent(value);
|
|
16
|
+
let cookie = `${name}=${value}`;
|
|
17
|
+
if (opt.maxAge) {
|
|
18
|
+
cookie += `; Max-Age=${Math.floor(opt.maxAge)}`;
|
|
19
|
+
}
|
|
20
|
+
if (opt.domain) {
|
|
21
|
+
cookie += '; Domain=' + opt.domain;
|
|
22
|
+
}
|
|
23
|
+
if (opt.path) {
|
|
24
|
+
cookie += '; Path=' + opt.path;
|
|
25
|
+
}
|
|
26
|
+
if (opt.expires) {
|
|
27
|
+
cookie += '; Expires=' + opt.expires.toUTCString();
|
|
28
|
+
}
|
|
29
|
+
if (opt.httpOnly) {
|
|
30
|
+
cookie += '; HttpOnly';
|
|
31
|
+
}
|
|
32
|
+
if (opt.secure) {
|
|
33
|
+
cookie += '; Secure';
|
|
34
|
+
}
|
|
35
|
+
if (opt.sameSite) {
|
|
36
|
+
cookie += `; SameSite=${opt.sameSite}`;
|
|
37
|
+
}
|
|
38
|
+
return cookie;
|
|
39
|
+
};
|
|
40
|
+
exports.serialize = serialize;
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createHash = exports.md5 = exports.sha1 = exports.sha256 = void 0;
|
|
4
|
+
const sha256 = async (data) => {
|
|
5
|
+
const algorithm = { name: 'SHA-256', alias: 'sha256' };
|
|
6
|
+
const hash = await (0, exports.createHash)(data, algorithm);
|
|
7
|
+
return hash;
|
|
8
|
+
};
|
|
9
|
+
exports.sha256 = sha256;
|
|
10
|
+
const sha1 = async (data) => {
|
|
11
|
+
const algorithm = { name: 'SHA-1', alias: 'sha1' };
|
|
12
|
+
const hash = await (0, exports.createHash)(data, algorithm);
|
|
13
|
+
return hash;
|
|
14
|
+
};
|
|
15
|
+
exports.sha1 = sha1;
|
|
16
|
+
const md5 = async (data) => {
|
|
17
|
+
const algorithm = { name: 'MD5', alias: 'md5' };
|
|
18
|
+
const hash = await (0, exports.createHash)(data, algorithm);
|
|
19
|
+
return hash;
|
|
20
|
+
};
|
|
21
|
+
exports.md5 = md5;
|
|
22
|
+
const createHash = async (data, algorithm) => {
|
|
23
|
+
let sourceBuffer;
|
|
24
|
+
if (data instanceof ReadableStream) {
|
|
25
|
+
let body = '';
|
|
26
|
+
const reader = data.getReader();
|
|
27
|
+
await reader?.read().then(async (chuck) => {
|
|
28
|
+
const value = await (0, exports.createHash)(chuck.value || '', algorithm);
|
|
29
|
+
body += value;
|
|
30
|
+
});
|
|
31
|
+
return body;
|
|
32
|
+
}
|
|
33
|
+
if (ArrayBuffer.isView(data) || data instanceof ArrayBuffer) {
|
|
34
|
+
sourceBuffer = data;
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
if (typeof data === 'object') {
|
|
38
|
+
data = JSON.stringify(data);
|
|
39
|
+
}
|
|
40
|
+
sourceBuffer = new TextEncoder().encode(String(data));
|
|
41
|
+
}
|
|
42
|
+
if (crypto && crypto.subtle) {
|
|
43
|
+
const buffer = await crypto.subtle.digest({
|
|
44
|
+
name: algorithm.name,
|
|
45
|
+
}, sourceBuffer);
|
|
46
|
+
const hash = Array.prototype.map
|
|
47
|
+
.call(new Uint8Array(buffer), (x) => ('00' + x.toString(16)).slice(-2))
|
|
48
|
+
.join('');
|
|
49
|
+
return hash;
|
|
50
|
+
}
|
|
51
|
+
return null;
|
|
52
|
+
};
|
|
53
|
+
exports.createHash = createHash;
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.arrayBufferToBase64URL = exports.arrayBufferToBase64 = exports.utf8ToUint8Array = exports.decodeBase64URL = exports.encodeBase64URL = exports.decodeBase64 = exports.encodeBase64 = void 0;
|
|
4
|
+
const encodeBase64 = (str) => {
|
|
5
|
+
if (str === null) {
|
|
6
|
+
throw new TypeError('1st argument of "encodeBase64" should not be null.');
|
|
7
|
+
}
|
|
8
|
+
try {
|
|
9
|
+
const encoder = new TextEncoder();
|
|
10
|
+
const bytes = encoder.encode(str);
|
|
11
|
+
return btoa(String.fromCharCode(...bytes));
|
|
12
|
+
}
|
|
13
|
+
catch { }
|
|
14
|
+
try {
|
|
15
|
+
return Buffer.from(str).toString('base64');
|
|
16
|
+
}
|
|
17
|
+
catch (e) {
|
|
18
|
+
console.error('If you want to do "encodeBase64", polyfill "buffer" module.');
|
|
19
|
+
throw e;
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
exports.encodeBase64 = encodeBase64;
|
|
23
|
+
const decodeBase64 = (str) => {
|
|
24
|
+
if (str === null) {
|
|
25
|
+
throw new TypeError('1st argument of "decodeBase64" should not be null.');
|
|
26
|
+
}
|
|
27
|
+
try {
|
|
28
|
+
const text = atob(str);
|
|
29
|
+
const bytes = new Uint8Array(text.split('').map((c) => c.charCodeAt(0)));
|
|
30
|
+
const decoder = new TextDecoder();
|
|
31
|
+
return decoder.decode(bytes);
|
|
32
|
+
}
|
|
33
|
+
catch { }
|
|
34
|
+
try {
|
|
35
|
+
return Buffer.from(str, 'base64').toString();
|
|
36
|
+
}
|
|
37
|
+
catch (e) {
|
|
38
|
+
console.error('If you want to do "decodeBase64", polyfill "buffer" module.');
|
|
39
|
+
throw e;
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
exports.decodeBase64 = decodeBase64;
|
|
43
|
+
const encodeBase64URL = (str) => {
|
|
44
|
+
return (0, exports.encodeBase64)(str).replace(/=/g, '').replace(/\+/g, '-').replace(/\//g, '_');
|
|
45
|
+
};
|
|
46
|
+
exports.encodeBase64URL = encodeBase64URL;
|
|
47
|
+
const decodeBase64URL = (str) => {
|
|
48
|
+
const pad = (s) => {
|
|
49
|
+
const diff = s.length % 4;
|
|
50
|
+
if (diff === 2) {
|
|
51
|
+
return `${s}==`;
|
|
52
|
+
}
|
|
53
|
+
if (diff === 3) {
|
|
54
|
+
return `${s}=`;
|
|
55
|
+
}
|
|
56
|
+
return s;
|
|
57
|
+
};
|
|
58
|
+
return (0, exports.decodeBase64)(pad(str).replace(/-/g, '+').replace('_', '/'));
|
|
59
|
+
};
|
|
60
|
+
exports.decodeBase64URL = decodeBase64URL;
|
|
61
|
+
const utf8ToUint8Array = (str) => {
|
|
62
|
+
const encoder = new TextEncoder();
|
|
63
|
+
return encoder.encode(str);
|
|
64
|
+
};
|
|
65
|
+
exports.utf8ToUint8Array = utf8ToUint8Array;
|
|
66
|
+
const arrayBufferToBase64 = async (buf) => {
|
|
67
|
+
if (typeof btoa === 'function') {
|
|
68
|
+
return btoa(String.fromCharCode(...new Uint8Array(buf)));
|
|
69
|
+
}
|
|
70
|
+
try {
|
|
71
|
+
return Buffer.from(String.fromCharCode(...new Uint8Array(buf))).toString('base64');
|
|
72
|
+
}
|
|
73
|
+
catch (e) { }
|
|
74
|
+
return '';
|
|
75
|
+
};
|
|
76
|
+
exports.arrayBufferToBase64 = arrayBufferToBase64;
|
|
77
|
+
const arrayBufferToBase64URL = async (buf) => {
|
|
78
|
+
return (await (0, exports.arrayBufferToBase64)(buf)).replace(/=/g, '').replace(/\+/g, '-').replace(/\//g, '_');
|
|
79
|
+
};
|
|
80
|
+
exports.arrayBufferToBase64URL = arrayBufferToBase64URL;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getFilePath = void 0;
|
|
4
|
+
const getFilePath = (options) => {
|
|
5
|
+
let filename = options.filename;
|
|
6
|
+
let root = options.root || '';
|
|
7
|
+
const defaultDocument = options.defaultDocument || 'index.html';
|
|
8
|
+
if (filename.endsWith('/')) {
|
|
9
|
+
// /top/ => /top/index.html
|
|
10
|
+
filename = filename.concat(defaultDocument);
|
|
11
|
+
}
|
|
12
|
+
else if (!filename.match(/\.[a-zA-Z0-9]+$/)) {
|
|
13
|
+
// /top => /top/index.html
|
|
14
|
+
filename = filename.concat('/' + defaultDocument);
|
|
15
|
+
}
|
|
16
|
+
// /foo.html => foo.html
|
|
17
|
+
filename = filename.replace(/^\.?\//, '');
|
|
18
|
+
// assets/ => assets
|
|
19
|
+
root = root.replace(/\/$/, '');
|
|
20
|
+
// ./assets/foo.html => assets/foo.html
|
|
21
|
+
let path = root ? root + '/' + filename : filename;
|
|
22
|
+
path = path.replace(/^\.?\//, '');
|
|
23
|
+
return path;
|
|
24
|
+
};
|
|
25
|
+
exports.getFilePath = getFilePath;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.escapeToBuffer = void 0;
|
|
4
|
+
// The `escapeToBuffer` implementation is based on code from the MIT licensed `react-dom` package.
|
|
5
|
+
// https://github.com/facebook/react/blob/main/packages/react-dom/src/server/escapeTextForBrowser.js
|
|
6
|
+
const escapeRe = /[&<>"]/;
|
|
7
|
+
const escapeToBuffer = (str, buffer) => {
|
|
8
|
+
const match = str.search(escapeRe);
|
|
9
|
+
if (match === -1) {
|
|
10
|
+
buffer[0] += str;
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
let escape;
|
|
14
|
+
let index;
|
|
15
|
+
let lastIndex = 0;
|
|
16
|
+
for (index = match; index < str.length; index++) {
|
|
17
|
+
switch (str.charCodeAt(index)) {
|
|
18
|
+
case 34: // "
|
|
19
|
+
escape = '"';
|
|
20
|
+
break;
|
|
21
|
+
case 38: // &
|
|
22
|
+
escape = '&';
|
|
23
|
+
break;
|
|
24
|
+
case 60: // <
|
|
25
|
+
escape = '<';
|
|
26
|
+
break;
|
|
27
|
+
case 62: // >
|
|
28
|
+
escape = '>';
|
|
29
|
+
break;
|
|
30
|
+
default:
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
buffer[0] += str.substring(lastIndex, index) + escape;
|
|
34
|
+
lastIndex = index + 1;
|
|
35
|
+
}
|
|
36
|
+
buffer[0] += str.substring(lastIndex, index);
|
|
37
|
+
};
|
|
38
|
+
exports.escapeToBuffer = escapeToBuffer;
|