hono 4.0.10 → 4.1.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/dist/adapter/aws-lambda/handler.js +1 -1
- package/dist/adapter/bun/index.js +2 -0
- package/dist/adapter/bun/websocket.js +77 -0
- package/dist/adapter/cloudflare-workers/index.js +3 -1
- package/dist/adapter/cloudflare-workers/websocket.js +57 -0
- package/dist/adapter/deno/index.js +3 -1
- package/dist/adapter/deno/websocket.js +29 -0
- package/dist/adapter/lambda-edge/handler.js +1 -1
- package/dist/cjs/adapter/aws-lambda/handler.js +1 -1
- package/dist/cjs/adapter/bun/index.js +3 -0
- package/dist/cjs/adapter/bun/websocket.js +98 -0
- package/dist/cjs/adapter/cloudflare-workers/index.js +5 -2
- package/dist/cjs/adapter/cloudflare-workers/websocket.js +80 -0
- package/dist/cjs/adapter/deno/index.js +5 -2
- package/dist/cjs/adapter/deno/websocket.js +52 -0
- package/dist/cjs/adapter/lambda-edge/handler.js +1 -1
- package/dist/cjs/client/client.js +68 -61
- package/dist/cjs/context.js +164 -188
- package/dist/cjs/helper/adapter/index.js +1 -1
- package/dist/cjs/helper/cookie/index.js +48 -8
- package/dist/cjs/helper/dev/index.js +3 -4
- package/dist/cjs/helper/factory/index.js +1 -3
- package/dist/cjs/helper/ssg/index.js +9 -159
- package/dist/cjs/helper/ssg/middleware.js +57 -0
- package/dist/cjs/helper/ssg/ssg.js +212 -0
- package/dist/cjs/helper/websocket/index.js +32 -0
- package/dist/cjs/helper.js +1 -0
- package/dist/cjs/hono-base.js +46 -65
- package/dist/cjs/http-exception.js +3 -1
- package/dist/cjs/jsx/base.js +7 -2
- package/dist/cjs/jsx/components.js +1 -1
- package/dist/cjs/jsx/dom/index.js +45 -3
- package/dist/cjs/jsx/dom/render.js +6 -6
- package/dist/cjs/jsx/hooks/index.js +25 -16
- package/dist/cjs/jsx/index.js +34 -2
- package/dist/cjs/middleware/body-limit/index.js +80 -0
- package/dist/cjs/middleware/logger/index.js +9 -7
- package/dist/cjs/request.js +29 -48
- package/dist/cjs/router/linear-router/router.js +3 -5
- package/dist/cjs/router/pattern-router/router.js +2 -4
- package/dist/cjs/router/reg-exp-router/node.js +3 -3
- package/dist/cjs/router/reg-exp-router/router.js +11 -12
- package/dist/cjs/router/reg-exp-router/trie.js +2 -4
- package/dist/cjs/router/smart-router/router.js +3 -3
- package/dist/cjs/router/trie-router/node.js +6 -2
- package/dist/cjs/router/trie-router/router.js +2 -1
- package/dist/cjs/test-utils/setup-vitest.js +2 -0
- package/dist/cjs/utils/color.js +32 -0
- package/dist/cjs/utils/concurrent.js +62 -0
- package/dist/cjs/utils/cookie.js +28 -1
- package/dist/cjs/utils/stream.js +5 -1
- package/dist/cjs/utils/url.js +2 -2
- package/dist/client/client.js +68 -61
- package/dist/context.js +164 -189
- package/dist/helper/adapter/index.js +1 -1
- package/dist/helper/cookie/index.js +48 -8
- package/dist/helper/dev/index.js +3 -4
- package/dist/helper/factory/index.js +1 -3
- package/dist/helper/ssg/index.js +3 -151
- package/dist/helper/ssg/middleware.js +29 -0
- package/dist/helper/ssg/ssg.js +187 -0
- package/dist/helper/websocket/index.js +9 -0
- package/dist/helper.js +1 -0
- package/dist/hono-base.js +45 -65
- package/dist/http-exception.js +3 -1
- package/dist/jsx/base.js +7 -2
- package/dist/jsx/components.js +1 -1
- package/dist/jsx/dom/index.js +44 -4
- package/dist/jsx/dom/render.js +6 -6
- package/dist/jsx/hooks/index.js +23 -16
- package/dist/jsx/index.js +34 -3
- package/dist/middleware/body-limit/index.js +57 -0
- package/dist/middleware/logger/index.js +9 -7
- package/dist/request.js +29 -49
- package/dist/router/linear-router/router.js +3 -5
- package/dist/router/pattern-router/router.js +2 -4
- package/dist/router/reg-exp-router/node.js +3 -3
- package/dist/router/reg-exp-router/router.js +11 -12
- package/dist/router/reg-exp-router/trie.js +2 -4
- package/dist/router/smart-router/router.js +3 -3
- package/dist/router/trie-router/node.js +6 -2
- package/dist/router/trie-router/router.js +2 -1
- package/dist/test-utils/setup-vitest.js +2 -0
- package/dist/types/adapter/bun/index.d.ts +1 -0
- package/dist/types/adapter/bun/websocket.d.ts +26 -0
- package/dist/types/adapter/cloudflare-workers/index.d.ts +1 -0
- package/dist/types/adapter/cloudflare-workers/websocket.d.ts +2 -0
- package/dist/types/adapter/deno/index.d.ts +1 -0
- package/dist/types/adapter/deno/websocket.d.ts +2 -0
- package/dist/types/client/types.d.ts +9 -0
- package/dist/types/helper/cookie/index.d.ts +3 -1
- package/dist/types/helper/ssg/index.d.ts +2 -105
- package/dist/types/helper/ssg/middleware.d.ts +38 -0
- package/dist/types/helper/ssg/ssg.d.ts +70 -0
- package/dist/types/helper/websocket/index.d.ts +34 -0
- package/dist/types/http-exception.d.ts +1 -0
- package/dist/types/jsx/dom/index.d.ts +40 -7
- package/dist/types/jsx/hooks/index.d.ts +2 -0
- package/dist/types/jsx/index.d.ts +41 -5
- package/dist/types/middleware/body-limit/index.d.ts +28 -0
- package/dist/types/utils/color.d.ts +1 -0
- package/dist/types/utils/concurrent.d.ts +7 -0
- package/dist/types/utils/cookie.d.ts +2 -0
- package/dist/utils/color.js +9 -0
- package/dist/utils/concurrent.js +39 -0
- package/dist/utils/cookie.js +28 -1
- package/dist/utils/stream.js +5 -1
- package/dist/utils/url.js +2 -2
- package/package.json +18 -2
package/dist/context.js
CHANGED
|
@@ -1,22 +1,3 @@
|
|
|
1
|
-
var __accessCheck = (obj, member, msg) => {
|
|
2
|
-
if (!member.has(obj))
|
|
3
|
-
throw TypeError("Cannot " + msg);
|
|
4
|
-
};
|
|
5
|
-
var __privateGet = (obj, member, getter) => {
|
|
6
|
-
__accessCheck(obj, member, "read from private field");
|
|
7
|
-
return getter ? getter.call(obj) : member.get(obj);
|
|
8
|
-
};
|
|
9
|
-
var __privateAdd = (obj, member, value) => {
|
|
10
|
-
if (member.has(obj))
|
|
11
|
-
throw TypeError("Cannot add the same private member more than once");
|
|
12
|
-
member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
13
|
-
};
|
|
14
|
-
var __privateSet = (obj, member, value, setter) => {
|
|
15
|
-
__accessCheck(obj, member, "write to private field");
|
|
16
|
-
setter ? setter.call(obj, value) : member.set(obj, value);
|
|
17
|
-
return value;
|
|
18
|
-
};
|
|
19
|
-
|
|
20
1
|
// src/context.ts
|
|
21
2
|
import { resolveCallback, HtmlEscapedCallbackPhase } from "./utils/html.js";
|
|
22
3
|
var TEXT_PLAIN = "text/plain; charset=UTF-8";
|
|
@@ -24,158 +5,25 @@ var setHeaders = (headers, map = {}) => {
|
|
|
24
5
|
Object.entries(map).forEach(([key, value]) => headers.set(key, value));
|
|
25
6
|
return headers;
|
|
26
7
|
};
|
|
27
|
-
var _status, _executionCtx, _headers, _preparedHeaders, _res, _isFresh;
|
|
28
8
|
var Context = class {
|
|
9
|
+
req;
|
|
10
|
+
env = {};
|
|
11
|
+
_var = {};
|
|
12
|
+
finalized = false;
|
|
13
|
+
error = void 0;
|
|
14
|
+
#status = 200;
|
|
15
|
+
#executionCtx;
|
|
16
|
+
#headers = void 0;
|
|
17
|
+
#preparedHeaders = void 0;
|
|
18
|
+
#res;
|
|
19
|
+
#isFresh = true;
|
|
20
|
+
layout = void 0;
|
|
21
|
+
renderer = (content) => this.html(content);
|
|
22
|
+
notFoundHandler = () => new Response();
|
|
29
23
|
constructor(req, options) {
|
|
30
|
-
this.env = {};
|
|
31
|
-
this._var = {};
|
|
32
|
-
this.finalized = false;
|
|
33
|
-
this.error = void 0;
|
|
34
|
-
__privateAdd(this, _status, 200);
|
|
35
|
-
__privateAdd(this, _executionCtx, void 0);
|
|
36
|
-
__privateAdd(this, _headers, void 0);
|
|
37
|
-
__privateAdd(this, _preparedHeaders, void 0);
|
|
38
|
-
__privateAdd(this, _res, void 0);
|
|
39
|
-
__privateAdd(this, _isFresh, true);
|
|
40
|
-
this.layout = void 0;
|
|
41
|
-
this.renderer = (content) => this.html(content);
|
|
42
|
-
this.notFoundHandler = () => new Response();
|
|
43
|
-
this.render = (...args) => this.renderer(...args);
|
|
44
|
-
this.setLayout = (layout) => this.layout = layout;
|
|
45
|
-
this.getLayout = () => this.layout;
|
|
46
|
-
this.setRenderer = (renderer) => {
|
|
47
|
-
this.renderer = renderer;
|
|
48
|
-
};
|
|
49
|
-
this.header = (name, value, options) => {
|
|
50
|
-
if (value === void 0) {
|
|
51
|
-
if (__privateGet(this, _headers)) {
|
|
52
|
-
__privateGet(this, _headers).delete(name);
|
|
53
|
-
} else if (__privateGet(this, _preparedHeaders)) {
|
|
54
|
-
delete __privateGet(this, _preparedHeaders)[name.toLocaleLowerCase()];
|
|
55
|
-
}
|
|
56
|
-
if (this.finalized) {
|
|
57
|
-
this.res.headers.delete(name);
|
|
58
|
-
}
|
|
59
|
-
return;
|
|
60
|
-
}
|
|
61
|
-
if (options?.append) {
|
|
62
|
-
if (!__privateGet(this, _headers)) {
|
|
63
|
-
__privateSet(this, _isFresh, false);
|
|
64
|
-
__privateSet(this, _headers, new Headers(__privateGet(this, _preparedHeaders)));
|
|
65
|
-
__privateSet(this, _preparedHeaders, {});
|
|
66
|
-
}
|
|
67
|
-
__privateGet(this, _headers).append(name, value);
|
|
68
|
-
} else {
|
|
69
|
-
if (__privateGet(this, _headers)) {
|
|
70
|
-
__privateGet(this, _headers).set(name, value);
|
|
71
|
-
} else {
|
|
72
|
-
__privateGet(this, _preparedHeaders) ?? __privateSet(this, _preparedHeaders, {});
|
|
73
|
-
__privateGet(this, _preparedHeaders)[name.toLowerCase()] = value;
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
if (this.finalized) {
|
|
77
|
-
if (options?.append) {
|
|
78
|
-
this.res.headers.append(name, value);
|
|
79
|
-
} else {
|
|
80
|
-
this.res.headers.set(name, value);
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
};
|
|
84
|
-
this.status = (status) => {
|
|
85
|
-
__privateSet(this, _isFresh, false);
|
|
86
|
-
__privateSet(this, _status, status);
|
|
87
|
-
};
|
|
88
|
-
this.set = (key, value) => {
|
|
89
|
-
this._var ?? (this._var = {});
|
|
90
|
-
this._var[key] = value;
|
|
91
|
-
};
|
|
92
|
-
this.get = (key) => {
|
|
93
|
-
return this._var ? this._var[key] : void 0;
|
|
94
|
-
};
|
|
95
|
-
this.newResponse = (data, arg, headers) => {
|
|
96
|
-
if (__privateGet(this, _isFresh) && !headers && !arg && __privateGet(this, _status) === 200) {
|
|
97
|
-
return new Response(data, {
|
|
98
|
-
headers: __privateGet(this, _preparedHeaders)
|
|
99
|
-
});
|
|
100
|
-
}
|
|
101
|
-
if (arg && typeof arg !== "number") {
|
|
102
|
-
const headers2 = setHeaders(new Headers(arg.headers), __privateGet(this, _preparedHeaders));
|
|
103
|
-
return new Response(data, {
|
|
104
|
-
headers: headers2,
|
|
105
|
-
status: arg.status ?? __privateGet(this, _status)
|
|
106
|
-
});
|
|
107
|
-
}
|
|
108
|
-
const status = typeof arg === "number" ? arg : __privateGet(this, _status);
|
|
109
|
-
__privateGet(this, _preparedHeaders) ?? __privateSet(this, _preparedHeaders, {});
|
|
110
|
-
__privateGet(this, _headers) ?? __privateSet(this, _headers, new Headers());
|
|
111
|
-
setHeaders(__privateGet(this, _headers), __privateGet(this, _preparedHeaders));
|
|
112
|
-
if (__privateGet(this, _res)) {
|
|
113
|
-
__privateGet(this, _res).headers.forEach((v, k) => {
|
|
114
|
-
__privateGet(this, _headers)?.set(k, v);
|
|
115
|
-
});
|
|
116
|
-
setHeaders(__privateGet(this, _headers), __privateGet(this, _preparedHeaders));
|
|
117
|
-
}
|
|
118
|
-
headers ?? (headers = {});
|
|
119
|
-
for (const [k, v] of Object.entries(headers)) {
|
|
120
|
-
if (typeof v === "string") {
|
|
121
|
-
__privateGet(this, _headers).set(k, v);
|
|
122
|
-
} else {
|
|
123
|
-
__privateGet(this, _headers).delete(k);
|
|
124
|
-
for (const v2 of v) {
|
|
125
|
-
__privateGet(this, _headers).append(k, v2);
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
return new Response(data, {
|
|
130
|
-
status,
|
|
131
|
-
headers: __privateGet(this, _headers)
|
|
132
|
-
});
|
|
133
|
-
};
|
|
134
|
-
this.body = (data, arg, headers) => {
|
|
135
|
-
return typeof arg === "number" ? this.newResponse(data, arg, headers) : this.newResponse(data, arg);
|
|
136
|
-
};
|
|
137
|
-
this.text = (text, arg, headers) => {
|
|
138
|
-
if (!__privateGet(this, _preparedHeaders)) {
|
|
139
|
-
if (__privateGet(this, _isFresh) && !headers && !arg) {
|
|
140
|
-
return new Response(text);
|
|
141
|
-
}
|
|
142
|
-
__privateSet(this, _preparedHeaders, {});
|
|
143
|
-
}
|
|
144
|
-
__privateGet(this, _preparedHeaders)["content-type"] = TEXT_PLAIN;
|
|
145
|
-
return typeof arg === "number" ? this.newResponse(text, arg, headers) : this.newResponse(text, arg);
|
|
146
|
-
};
|
|
147
|
-
this.json = (object, arg, headers) => {
|
|
148
|
-
const body = JSON.stringify(object);
|
|
149
|
-
__privateGet(this, _preparedHeaders) ?? __privateSet(this, _preparedHeaders, {});
|
|
150
|
-
__privateGet(this, _preparedHeaders)["content-type"] = "application/json; charset=UTF-8";
|
|
151
|
-
return typeof arg === "number" ? this.newResponse(body, arg, headers) : this.newResponse(body, arg);
|
|
152
|
-
};
|
|
153
|
-
this.html = (html, arg, headers) => {
|
|
154
|
-
__privateGet(this, _preparedHeaders) ?? __privateSet(this, _preparedHeaders, {});
|
|
155
|
-
__privateGet(this, _preparedHeaders)["content-type"] = "text/html; charset=UTF-8";
|
|
156
|
-
if (typeof html === "object") {
|
|
157
|
-
if (!(html instanceof Promise)) {
|
|
158
|
-
html = html.toString();
|
|
159
|
-
}
|
|
160
|
-
if (html instanceof Promise) {
|
|
161
|
-
return html.then((html2) => resolveCallback(html2, HtmlEscapedCallbackPhase.Stringify, false, {})).then((html2) => {
|
|
162
|
-
return typeof arg === "number" ? this.newResponse(html2, arg, headers) : this.newResponse(html2, arg);
|
|
163
|
-
});
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
return typeof arg === "number" ? this.newResponse(html, arg, headers) : this.newResponse(html, arg);
|
|
167
|
-
};
|
|
168
|
-
this.redirect = (location, status = 302) => {
|
|
169
|
-
__privateGet(this, _headers) ?? __privateSet(this, _headers, new Headers());
|
|
170
|
-
__privateGet(this, _headers).set("Location", location);
|
|
171
|
-
return this.newResponse(null, status);
|
|
172
|
-
};
|
|
173
|
-
this.notFound = () => {
|
|
174
|
-
return this.notFoundHandler(this);
|
|
175
|
-
};
|
|
176
24
|
this.req = req;
|
|
177
25
|
if (options) {
|
|
178
|
-
|
|
26
|
+
this.#executionCtx = options.executionCtx;
|
|
179
27
|
this.env = options.env;
|
|
180
28
|
if (options.notFoundHandler) {
|
|
181
29
|
this.notFoundHandler = options.notFoundHandler;
|
|
@@ -183,52 +31,179 @@ var Context = class {
|
|
|
183
31
|
}
|
|
184
32
|
}
|
|
185
33
|
get event() {
|
|
186
|
-
if (
|
|
187
|
-
return
|
|
34
|
+
if (this.#executionCtx && "respondWith" in this.#executionCtx) {
|
|
35
|
+
return this.#executionCtx;
|
|
188
36
|
} else {
|
|
189
37
|
throw Error("This context has no FetchEvent");
|
|
190
38
|
}
|
|
191
39
|
}
|
|
192
40
|
get executionCtx() {
|
|
193
|
-
if (
|
|
194
|
-
return
|
|
41
|
+
if (this.#executionCtx) {
|
|
42
|
+
return this.#executionCtx;
|
|
195
43
|
} else {
|
|
196
44
|
throw Error("This context has no ExecutionContext");
|
|
197
45
|
}
|
|
198
46
|
}
|
|
199
47
|
get res() {
|
|
200
|
-
|
|
201
|
-
return
|
|
48
|
+
this.#isFresh = false;
|
|
49
|
+
return this.#res ||= new Response("404 Not Found", { status: 404 });
|
|
202
50
|
}
|
|
203
|
-
set res(
|
|
204
|
-
|
|
205
|
-
if (
|
|
206
|
-
|
|
207
|
-
for (const [k, v] of
|
|
51
|
+
set res(_res) {
|
|
52
|
+
this.#isFresh = false;
|
|
53
|
+
if (this.#res && _res) {
|
|
54
|
+
this.#res.headers.delete("content-type");
|
|
55
|
+
for (const [k, v] of this.#res.headers.entries()) {
|
|
208
56
|
if (k === "set-cookie") {
|
|
209
|
-
const cookies =
|
|
210
|
-
|
|
57
|
+
const cookies = this.#res.headers.getSetCookie();
|
|
58
|
+
_res.headers.delete("set-cookie");
|
|
211
59
|
for (const cookie of cookies) {
|
|
212
|
-
|
|
60
|
+
_res.headers.append("set-cookie", cookie);
|
|
213
61
|
}
|
|
214
62
|
} else {
|
|
215
|
-
|
|
63
|
+
_res.headers.set(k, v);
|
|
216
64
|
}
|
|
217
65
|
}
|
|
218
66
|
}
|
|
219
|
-
|
|
67
|
+
this.#res = _res;
|
|
220
68
|
this.finalized = true;
|
|
221
69
|
}
|
|
70
|
+
render = (...args) => this.renderer(...args);
|
|
71
|
+
setLayout = (layout) => this.layout = layout;
|
|
72
|
+
getLayout = () => this.layout;
|
|
73
|
+
setRenderer = (renderer) => {
|
|
74
|
+
this.renderer = renderer;
|
|
75
|
+
};
|
|
76
|
+
header = (name, value, options) => {
|
|
77
|
+
if (value === void 0) {
|
|
78
|
+
if (this.#headers) {
|
|
79
|
+
this.#headers.delete(name);
|
|
80
|
+
} else if (this.#preparedHeaders) {
|
|
81
|
+
delete this.#preparedHeaders[name.toLocaleLowerCase()];
|
|
82
|
+
}
|
|
83
|
+
if (this.finalized) {
|
|
84
|
+
this.res.headers.delete(name);
|
|
85
|
+
}
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
if (options?.append) {
|
|
89
|
+
if (!this.#headers) {
|
|
90
|
+
this.#isFresh = false;
|
|
91
|
+
this.#headers = new Headers(this.#preparedHeaders);
|
|
92
|
+
this.#preparedHeaders = {};
|
|
93
|
+
}
|
|
94
|
+
this.#headers.append(name, value);
|
|
95
|
+
} else {
|
|
96
|
+
if (this.#headers) {
|
|
97
|
+
this.#headers.set(name, value);
|
|
98
|
+
} else {
|
|
99
|
+
this.#preparedHeaders ??= {};
|
|
100
|
+
this.#preparedHeaders[name.toLowerCase()] = value;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
if (this.finalized) {
|
|
104
|
+
if (options?.append) {
|
|
105
|
+
this.res.headers.append(name, value);
|
|
106
|
+
} else {
|
|
107
|
+
this.res.headers.set(name, value);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
status = (status) => {
|
|
112
|
+
this.#isFresh = false;
|
|
113
|
+
this.#status = status;
|
|
114
|
+
};
|
|
115
|
+
set = (key, value) => {
|
|
116
|
+
this._var ??= {};
|
|
117
|
+
this._var[key] = value;
|
|
118
|
+
};
|
|
119
|
+
get = (key) => {
|
|
120
|
+
return this._var ? this._var[key] : void 0;
|
|
121
|
+
};
|
|
222
122
|
get var() {
|
|
223
123
|
return { ...this._var };
|
|
224
124
|
}
|
|
125
|
+
newResponse = (data, arg, headers) => {
|
|
126
|
+
if (this.#isFresh && !headers && !arg && this.#status === 200) {
|
|
127
|
+
return new Response(data, {
|
|
128
|
+
headers: this.#preparedHeaders
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
if (arg && typeof arg !== "number") {
|
|
132
|
+
const headers2 = setHeaders(new Headers(arg.headers), this.#preparedHeaders);
|
|
133
|
+
return new Response(data, {
|
|
134
|
+
headers: headers2,
|
|
135
|
+
status: arg.status ?? this.#status
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
const status = typeof arg === "number" ? arg : this.#status;
|
|
139
|
+
this.#preparedHeaders ??= {};
|
|
140
|
+
this.#headers ??= new Headers();
|
|
141
|
+
setHeaders(this.#headers, this.#preparedHeaders);
|
|
142
|
+
if (this.#res) {
|
|
143
|
+
this.#res.headers.forEach((v, k) => {
|
|
144
|
+
this.#headers?.set(k, v);
|
|
145
|
+
});
|
|
146
|
+
setHeaders(this.#headers, this.#preparedHeaders);
|
|
147
|
+
}
|
|
148
|
+
headers ??= {};
|
|
149
|
+
for (const [k, v] of Object.entries(headers)) {
|
|
150
|
+
if (typeof v === "string") {
|
|
151
|
+
this.#headers.set(k, v);
|
|
152
|
+
} else {
|
|
153
|
+
this.#headers.delete(k);
|
|
154
|
+
for (const v2 of v) {
|
|
155
|
+
this.#headers.append(k, v2);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
return new Response(data, {
|
|
160
|
+
status,
|
|
161
|
+
headers: this.#headers
|
|
162
|
+
});
|
|
163
|
+
};
|
|
164
|
+
body = (data, arg, headers) => {
|
|
165
|
+
return typeof arg === "number" ? this.newResponse(data, arg, headers) : this.newResponse(data, arg);
|
|
166
|
+
};
|
|
167
|
+
text = (text, arg, headers) => {
|
|
168
|
+
if (!this.#preparedHeaders) {
|
|
169
|
+
if (this.#isFresh && !headers && !arg) {
|
|
170
|
+
return new Response(text);
|
|
171
|
+
}
|
|
172
|
+
this.#preparedHeaders = {};
|
|
173
|
+
}
|
|
174
|
+
this.#preparedHeaders["content-type"] = TEXT_PLAIN;
|
|
175
|
+
return typeof arg === "number" ? this.newResponse(text, arg, headers) : this.newResponse(text, arg);
|
|
176
|
+
};
|
|
177
|
+
json = (object, arg, headers) => {
|
|
178
|
+
const body = JSON.stringify(object);
|
|
179
|
+
this.#preparedHeaders ??= {};
|
|
180
|
+
this.#preparedHeaders["content-type"] = "application/json; charset=UTF-8";
|
|
181
|
+
return typeof arg === "number" ? this.newResponse(body, arg, headers) : this.newResponse(body, arg);
|
|
182
|
+
};
|
|
183
|
+
html = (html, arg, headers) => {
|
|
184
|
+
this.#preparedHeaders ??= {};
|
|
185
|
+
this.#preparedHeaders["content-type"] = "text/html; charset=UTF-8";
|
|
186
|
+
if (typeof html === "object") {
|
|
187
|
+
if (!(html instanceof Promise)) {
|
|
188
|
+
html = html.toString();
|
|
189
|
+
}
|
|
190
|
+
if (html instanceof Promise) {
|
|
191
|
+
return html.then((html2) => resolveCallback(html2, HtmlEscapedCallbackPhase.Stringify, false, {})).then((html2) => {
|
|
192
|
+
return typeof arg === "number" ? this.newResponse(html2, arg, headers) : this.newResponse(html2, arg);
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
return typeof arg === "number" ? this.newResponse(html, arg, headers) : this.newResponse(html, arg);
|
|
197
|
+
};
|
|
198
|
+
redirect = (location, status = 302) => {
|
|
199
|
+
this.#headers ??= new Headers();
|
|
200
|
+
this.#headers.set("Location", location);
|
|
201
|
+
return this.newResponse(null, status);
|
|
202
|
+
};
|
|
203
|
+
notFound = () => {
|
|
204
|
+
return this.notFoundHandler(this);
|
|
205
|
+
};
|
|
225
206
|
};
|
|
226
|
-
_status = new WeakMap();
|
|
227
|
-
_executionCtx = new WeakMap();
|
|
228
|
-
_headers = new WeakMap();
|
|
229
|
-
_preparedHeaders = new WeakMap();
|
|
230
|
-
_res = new WeakMap();
|
|
231
|
-
_isFresh = new WeakMap();
|
|
232
207
|
export {
|
|
233
208
|
Context,
|
|
234
209
|
TEXT_PLAIN
|
|
@@ -1,13 +1,19 @@
|
|
|
1
1
|
// src/helper/cookie/index.ts
|
|
2
2
|
import { parse, parseSigned, serialize, serializeSigned } from "../../utils/cookie.js";
|
|
3
|
-
var getCookie = (c, key) => {
|
|
3
|
+
var getCookie = (c, key, prefix) => {
|
|
4
4
|
const cookie = c.req.raw.headers.get("Cookie");
|
|
5
5
|
if (typeof key === "string") {
|
|
6
6
|
if (!cookie) {
|
|
7
7
|
return void 0;
|
|
8
8
|
}
|
|
9
|
-
|
|
10
|
-
|
|
9
|
+
let finalKey = key;
|
|
10
|
+
if (prefix === "secure") {
|
|
11
|
+
finalKey = "__Secure-" + key;
|
|
12
|
+
} else if (prefix === "host") {
|
|
13
|
+
finalKey = "__Host-" + key;
|
|
14
|
+
}
|
|
15
|
+
const obj2 = parse(cookie, finalKey);
|
|
16
|
+
return obj2[finalKey];
|
|
11
17
|
}
|
|
12
18
|
if (!cookie) {
|
|
13
19
|
return {};
|
|
@@ -15,14 +21,20 @@ var getCookie = (c, key) => {
|
|
|
15
21
|
const obj = parse(cookie);
|
|
16
22
|
return obj;
|
|
17
23
|
};
|
|
18
|
-
var getSignedCookie = async (c, secret, key) => {
|
|
24
|
+
var getSignedCookie = async (c, secret, key, prefix) => {
|
|
19
25
|
const cookie = c.req.raw.headers.get("Cookie");
|
|
20
26
|
if (typeof key === "string") {
|
|
21
27
|
if (!cookie) {
|
|
22
28
|
return void 0;
|
|
23
29
|
}
|
|
24
|
-
|
|
25
|
-
|
|
30
|
+
let finalKey = key;
|
|
31
|
+
if (prefix === "secure") {
|
|
32
|
+
finalKey = "__Secure-" + key;
|
|
33
|
+
} else if (prefix === "host") {
|
|
34
|
+
finalKey = "__Host-" + key;
|
|
35
|
+
}
|
|
36
|
+
const obj2 = await parseSigned(cookie, secret, finalKey);
|
|
37
|
+
return obj2[finalKey];
|
|
26
38
|
}
|
|
27
39
|
if (!cookie) {
|
|
28
40
|
return {};
|
|
@@ -31,11 +43,39 @@ var getSignedCookie = async (c, secret, key) => {
|
|
|
31
43
|
return obj;
|
|
32
44
|
};
|
|
33
45
|
var setCookie = (c, name, value, opt) => {
|
|
34
|
-
|
|
46
|
+
let cookie;
|
|
47
|
+
if (opt?.prefix === "secure") {
|
|
48
|
+
cookie = serialize("__Secure-" + name, value, { path: "/", ...opt, secure: true });
|
|
49
|
+
} else if (opt?.prefix === "host") {
|
|
50
|
+
cookie = serialize("__Host-" + name, value, {
|
|
51
|
+
...opt,
|
|
52
|
+
path: "/",
|
|
53
|
+
secure: true,
|
|
54
|
+
domain: void 0
|
|
55
|
+
});
|
|
56
|
+
} else {
|
|
57
|
+
cookie = serialize(name, value, { path: "/", ...opt });
|
|
58
|
+
}
|
|
35
59
|
c.header("set-cookie", cookie, { append: true });
|
|
36
60
|
};
|
|
37
61
|
var setSignedCookie = async (c, name, value, secret, opt) => {
|
|
38
|
-
|
|
62
|
+
let cookie;
|
|
63
|
+
if (opt?.prefix === "secure") {
|
|
64
|
+
cookie = await serializeSigned("__Secure-" + name, value, secret, {
|
|
65
|
+
path: "/",
|
|
66
|
+
...opt,
|
|
67
|
+
secure: true
|
|
68
|
+
});
|
|
69
|
+
} else if (opt?.prefix === "host") {
|
|
70
|
+
cookie = await serializeSigned("__Host-" + name, value, secret, {
|
|
71
|
+
...opt,
|
|
72
|
+
path: "/",
|
|
73
|
+
secure: true,
|
|
74
|
+
domain: void 0
|
|
75
|
+
});
|
|
76
|
+
} else {
|
|
77
|
+
cookie = await serializeSigned(name, value, secret, { path: "/", ...opt });
|
|
78
|
+
}
|
|
39
79
|
c.header("set-cookie", cookie, { append: true });
|
|
40
80
|
};
|
|
41
81
|
var deleteCookie = (c, name, opt) => {
|
package/dist/helper/dev/index.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
// src/helper/dev/index.ts
|
|
2
|
+
import { getColorEnabled } from "../../utils/color.js";
|
|
2
3
|
import { findTargetHandler, isMiddleware } from "../../utils/handler.js";
|
|
3
4
|
var handlerName = (handler) => {
|
|
4
5
|
return handler.name || (isMiddleware(handler) ? "[middleware]" : "[handler]");
|
|
@@ -15,15 +16,13 @@ var inspectRoutes = (hono) => {
|
|
|
15
16
|
});
|
|
16
17
|
};
|
|
17
18
|
var showRoutes = (hono, opts) => {
|
|
18
|
-
const
|
|
19
|
-
const isNoColor = typeof process !== "undefined" ? "NO_COLOR" in process?.env : typeof Deno?.noColor === "boolean" ? Deno.noColor : false;
|
|
20
|
-
const colorEnabled = opts?.colorize ?? !isNoColor;
|
|
19
|
+
const colorEnabled = opts?.colorize ?? getColorEnabled();
|
|
21
20
|
const routeData = {};
|
|
22
21
|
let maxMethodLength = 0;
|
|
23
22
|
let maxPathLength = 0;
|
|
24
23
|
inspectRoutes(hono).filter(({ isMiddleware: isMiddleware2 }) => opts?.verbose || !isMiddleware2).map((route) => {
|
|
25
24
|
const key = `${route.method}-${route.path}`;
|
|
26
|
-
(routeData[key]
|
|
25
|
+
(routeData[key] ||= []).push(route);
|
|
27
26
|
if (routeData[key].length > 1) {
|
|
28
27
|
return;
|
|
29
28
|
}
|
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
// src/helper/factory/index.ts
|
|
2
2
|
var Factory = class {
|
|
3
|
-
|
|
4
|
-
this.createMiddleware = (middleware) => middleware;
|
|
5
|
-
}
|
|
3
|
+
createMiddleware = (middleware) => middleware;
|
|
6
4
|
createHandlers(...handlers) {
|
|
7
5
|
return handlers.filter((handler) => handler !== void 0);
|
|
8
6
|
}
|
package/dist/helper/ssg/index.js
CHANGED
|
@@ -1,158 +1,10 @@
|
|
|
1
1
|
// src/helper/ssg/index.ts
|
|
2
|
-
|
|
3
|
-
import {
|
|
4
|
-
import { joinPaths, dirname, filterStaticGenerateRoutes } from "./utils.js";
|
|
5
|
-
var SSG_CONTEXT = "HONO_SSG_CONTEXT";
|
|
6
|
-
var SSG_DISABLED_RESPONSE = new Response("SSG is disabled", { status: 404 });
|
|
7
|
-
var generateFilePath = (routePath, outDir, mimeType) => {
|
|
8
|
-
const extension = determineExtension(mimeType);
|
|
9
|
-
if (routePath.endsWith(`.${extension}`)) {
|
|
10
|
-
return joinPaths(outDir, routePath);
|
|
11
|
-
}
|
|
12
|
-
if (routePath === "/") {
|
|
13
|
-
return joinPaths(outDir, `index.${extension}`);
|
|
14
|
-
}
|
|
15
|
-
if (routePath.endsWith("/")) {
|
|
16
|
-
return joinPaths(outDir, routePath, `index.${extension}`);
|
|
17
|
-
}
|
|
18
|
-
return joinPaths(outDir, `${routePath}.${extension}`);
|
|
19
|
-
};
|
|
20
|
-
var parseResponseContent = async (response) => {
|
|
21
|
-
const contentType = response.headers.get("Content-Type");
|
|
22
|
-
try {
|
|
23
|
-
if (contentType?.includes("text") || contentType?.includes("json")) {
|
|
24
|
-
return await response.text();
|
|
25
|
-
} else {
|
|
26
|
-
return await response.arrayBuffer();
|
|
27
|
-
}
|
|
28
|
-
} catch (error) {
|
|
29
|
-
throw new Error(
|
|
30
|
-
`Error processing response: ${error instanceof Error ? error.message : "Unknown error"}`
|
|
31
|
-
);
|
|
32
|
-
}
|
|
33
|
-
};
|
|
34
|
-
var determineExtension = (mimeType) => {
|
|
35
|
-
switch (mimeType) {
|
|
36
|
-
case "text/html":
|
|
37
|
-
return "html";
|
|
38
|
-
case "text/xml":
|
|
39
|
-
case "application/xml":
|
|
40
|
-
return "xml";
|
|
41
|
-
default: {
|
|
42
|
-
return getExtension(mimeType) || "html";
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
};
|
|
46
|
-
var ssgParams = (params) => async (c, next) => {
|
|
47
|
-
;
|
|
48
|
-
c.req.raw.ssgParams = Array.isArray(params) ? params : await params(c);
|
|
49
|
-
await next();
|
|
50
|
-
};
|
|
51
|
-
var fetchRoutesContent = async (app, beforeRequestHook, afterResponseHook) => {
|
|
52
|
-
const htmlMap = /* @__PURE__ */ new Map();
|
|
53
|
-
const baseURL = "http://localhost";
|
|
54
|
-
for (const route of filterStaticGenerateRoutes(app)) {
|
|
55
|
-
const thisRouteBaseURL = new URL(route.path, baseURL).toString();
|
|
56
|
-
let forGetInfoURLRequest = new Request(thisRouteBaseURL);
|
|
57
|
-
if (beforeRequestHook) {
|
|
58
|
-
const maybeRequest = beforeRequestHook(forGetInfoURLRequest);
|
|
59
|
-
if (!maybeRequest) {
|
|
60
|
-
continue;
|
|
61
|
-
}
|
|
62
|
-
forGetInfoURLRequest = maybeRequest;
|
|
63
|
-
}
|
|
64
|
-
await app.fetch(forGetInfoURLRequest);
|
|
65
|
-
if (!forGetInfoURLRequest.ssgParams) {
|
|
66
|
-
if (isDynamicRoute(route.path)) {
|
|
67
|
-
continue;
|
|
68
|
-
}
|
|
69
|
-
forGetInfoURLRequest.ssgParams = [{}];
|
|
70
|
-
}
|
|
71
|
-
const requestInit = {
|
|
72
|
-
method: forGetInfoURLRequest.method,
|
|
73
|
-
headers: forGetInfoURLRequest.headers
|
|
74
|
-
};
|
|
75
|
-
for (const param of forGetInfoURLRequest.ssgParams) {
|
|
76
|
-
const replacedUrlParam = replaceUrlParam(route.path, param);
|
|
77
|
-
let response = await app.request(replacedUrlParam, requestInit, {
|
|
78
|
-
[SSG_CONTEXT]: true
|
|
79
|
-
});
|
|
80
|
-
if (response === SSG_DISABLED_RESPONSE) {
|
|
81
|
-
continue;
|
|
82
|
-
}
|
|
83
|
-
if (afterResponseHook) {
|
|
84
|
-
const maybeResponse = afterResponseHook(response);
|
|
85
|
-
if (!maybeResponse) {
|
|
86
|
-
continue;
|
|
87
|
-
}
|
|
88
|
-
response = maybeResponse;
|
|
89
|
-
}
|
|
90
|
-
const mimeType = response.headers.get("Content-Type")?.split(";")[0] || "text/plain";
|
|
91
|
-
const content = await parseResponseContent(response);
|
|
92
|
-
htmlMap.set(replacedUrlParam, {
|
|
93
|
-
mimeType,
|
|
94
|
-
content
|
|
95
|
-
});
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
return htmlMap;
|
|
99
|
-
};
|
|
100
|
-
var isDynamicRoute = (path) => {
|
|
101
|
-
return path.split("/").some((segment) => segment.startsWith(":") || segment.includes("*"));
|
|
102
|
-
};
|
|
103
|
-
var saveContentToFiles = async (htmlMap, fsModule, outDir) => {
|
|
104
|
-
const files = [];
|
|
105
|
-
for (const [routePath, { content, mimeType }] of htmlMap) {
|
|
106
|
-
const filePath = generateFilePath(routePath, outDir, mimeType);
|
|
107
|
-
const dirPath = dirname(filePath);
|
|
108
|
-
await fsModule.mkdir(dirPath, { recursive: true });
|
|
109
|
-
if (typeof content === "string") {
|
|
110
|
-
await fsModule.writeFile(filePath, content);
|
|
111
|
-
} else if (content instanceof ArrayBuffer) {
|
|
112
|
-
await fsModule.writeFile(filePath, new Uint8Array(content));
|
|
113
|
-
}
|
|
114
|
-
files.push(filePath);
|
|
115
|
-
}
|
|
116
|
-
return files;
|
|
117
|
-
};
|
|
118
|
-
var toSSG = async (app, fs, options) => {
|
|
119
|
-
let result = void 0;
|
|
120
|
-
try {
|
|
121
|
-
const outputDir = options?.dir ?? "./static";
|
|
122
|
-
const maps = await fetchRoutesContent(
|
|
123
|
-
app,
|
|
124
|
-
options?.beforeRequestHook,
|
|
125
|
-
options?.afterResponseHook
|
|
126
|
-
);
|
|
127
|
-
const files = await saveContentToFiles(maps, fs, outputDir);
|
|
128
|
-
result = { success: true, files };
|
|
129
|
-
} catch (error) {
|
|
130
|
-
const errorObj = error instanceof Error ? error : new Error(String(error));
|
|
131
|
-
result = { success: false, files: [], error: errorObj };
|
|
132
|
-
}
|
|
133
|
-
await options?.afterGenerateHook?.(result);
|
|
134
|
-
return result;
|
|
135
|
-
};
|
|
136
|
-
var isSSGContext = (c) => !!c.env?.[SSG_CONTEXT];
|
|
137
|
-
var disableSSG = () => async function disableSSG2(c, next) {
|
|
138
|
-
if (isSSGContext(c)) {
|
|
139
|
-
return SSG_DISABLED_RESPONSE;
|
|
140
|
-
}
|
|
141
|
-
await next();
|
|
142
|
-
};
|
|
143
|
-
var onlySSG = () => async function onlySSG2(c, next) {
|
|
144
|
-
if (!isSSGContext(c)) {
|
|
145
|
-
return c.notFound();
|
|
146
|
-
}
|
|
147
|
-
await next();
|
|
148
|
-
};
|
|
2
|
+
export * from "./ssg.js";
|
|
3
|
+
import { SSG_DISABLED_RESPONSE, ssgParams, isSSGContext, disableSSG, onlySSG } from "./middleware.js";
|
|
149
4
|
export {
|
|
150
5
|
SSG_DISABLED_RESPONSE,
|
|
151
6
|
disableSSG,
|
|
152
|
-
fetchRoutesContent,
|
|
153
7
|
isSSGContext,
|
|
154
8
|
onlySSG,
|
|
155
|
-
|
|
156
|
-
ssgParams,
|
|
157
|
-
toSSG
|
|
9
|
+
ssgParams
|
|
158
10
|
};
|