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.
Files changed (109) hide show
  1. package/dist/adapter/aws-lambda/handler.js +1 -1
  2. package/dist/adapter/bun/index.js +2 -0
  3. package/dist/adapter/bun/websocket.js +77 -0
  4. package/dist/adapter/cloudflare-workers/index.js +3 -1
  5. package/dist/adapter/cloudflare-workers/websocket.js +57 -0
  6. package/dist/adapter/deno/index.js +3 -1
  7. package/dist/adapter/deno/websocket.js +29 -0
  8. package/dist/adapter/lambda-edge/handler.js +1 -1
  9. package/dist/cjs/adapter/aws-lambda/handler.js +1 -1
  10. package/dist/cjs/adapter/bun/index.js +3 -0
  11. package/dist/cjs/adapter/bun/websocket.js +98 -0
  12. package/dist/cjs/adapter/cloudflare-workers/index.js +5 -2
  13. package/dist/cjs/adapter/cloudflare-workers/websocket.js +80 -0
  14. package/dist/cjs/adapter/deno/index.js +5 -2
  15. package/dist/cjs/adapter/deno/websocket.js +52 -0
  16. package/dist/cjs/adapter/lambda-edge/handler.js +1 -1
  17. package/dist/cjs/client/client.js +68 -61
  18. package/dist/cjs/context.js +164 -188
  19. package/dist/cjs/helper/adapter/index.js +1 -1
  20. package/dist/cjs/helper/cookie/index.js +48 -8
  21. package/dist/cjs/helper/dev/index.js +3 -4
  22. package/dist/cjs/helper/factory/index.js +1 -3
  23. package/dist/cjs/helper/ssg/index.js +9 -159
  24. package/dist/cjs/helper/ssg/middleware.js +57 -0
  25. package/dist/cjs/helper/ssg/ssg.js +212 -0
  26. package/dist/cjs/helper/websocket/index.js +32 -0
  27. package/dist/cjs/helper.js +1 -0
  28. package/dist/cjs/hono-base.js +46 -65
  29. package/dist/cjs/http-exception.js +3 -1
  30. package/dist/cjs/jsx/base.js +7 -2
  31. package/dist/cjs/jsx/components.js +1 -1
  32. package/dist/cjs/jsx/dom/index.js +45 -3
  33. package/dist/cjs/jsx/dom/render.js +6 -6
  34. package/dist/cjs/jsx/hooks/index.js +25 -16
  35. package/dist/cjs/jsx/index.js +34 -2
  36. package/dist/cjs/middleware/body-limit/index.js +80 -0
  37. package/dist/cjs/middleware/logger/index.js +9 -7
  38. package/dist/cjs/request.js +29 -48
  39. package/dist/cjs/router/linear-router/router.js +3 -5
  40. package/dist/cjs/router/pattern-router/router.js +2 -4
  41. package/dist/cjs/router/reg-exp-router/node.js +3 -3
  42. package/dist/cjs/router/reg-exp-router/router.js +11 -12
  43. package/dist/cjs/router/reg-exp-router/trie.js +2 -4
  44. package/dist/cjs/router/smart-router/router.js +3 -3
  45. package/dist/cjs/router/trie-router/node.js +6 -2
  46. package/dist/cjs/router/trie-router/router.js +2 -1
  47. package/dist/cjs/test-utils/setup-vitest.js +2 -0
  48. package/dist/cjs/utils/color.js +32 -0
  49. package/dist/cjs/utils/concurrent.js +62 -0
  50. package/dist/cjs/utils/cookie.js +28 -1
  51. package/dist/cjs/utils/stream.js +5 -1
  52. package/dist/cjs/utils/url.js +2 -2
  53. package/dist/client/client.js +68 -61
  54. package/dist/context.js +164 -189
  55. package/dist/helper/adapter/index.js +1 -1
  56. package/dist/helper/cookie/index.js +48 -8
  57. package/dist/helper/dev/index.js +3 -4
  58. package/dist/helper/factory/index.js +1 -3
  59. package/dist/helper/ssg/index.js +3 -151
  60. package/dist/helper/ssg/middleware.js +29 -0
  61. package/dist/helper/ssg/ssg.js +187 -0
  62. package/dist/helper/websocket/index.js +9 -0
  63. package/dist/helper.js +1 -0
  64. package/dist/hono-base.js +45 -65
  65. package/dist/http-exception.js +3 -1
  66. package/dist/jsx/base.js +7 -2
  67. package/dist/jsx/components.js +1 -1
  68. package/dist/jsx/dom/index.js +44 -4
  69. package/dist/jsx/dom/render.js +6 -6
  70. package/dist/jsx/hooks/index.js +23 -16
  71. package/dist/jsx/index.js +34 -3
  72. package/dist/middleware/body-limit/index.js +57 -0
  73. package/dist/middleware/logger/index.js +9 -7
  74. package/dist/request.js +29 -49
  75. package/dist/router/linear-router/router.js +3 -5
  76. package/dist/router/pattern-router/router.js +2 -4
  77. package/dist/router/reg-exp-router/node.js +3 -3
  78. package/dist/router/reg-exp-router/router.js +11 -12
  79. package/dist/router/reg-exp-router/trie.js +2 -4
  80. package/dist/router/smart-router/router.js +3 -3
  81. package/dist/router/trie-router/node.js +6 -2
  82. package/dist/router/trie-router/router.js +2 -1
  83. package/dist/test-utils/setup-vitest.js +2 -0
  84. package/dist/types/adapter/bun/index.d.ts +1 -0
  85. package/dist/types/adapter/bun/websocket.d.ts +26 -0
  86. package/dist/types/adapter/cloudflare-workers/index.d.ts +1 -0
  87. package/dist/types/adapter/cloudflare-workers/websocket.d.ts +2 -0
  88. package/dist/types/adapter/deno/index.d.ts +1 -0
  89. package/dist/types/adapter/deno/websocket.d.ts +2 -0
  90. package/dist/types/client/types.d.ts +9 -0
  91. package/dist/types/helper/cookie/index.d.ts +3 -1
  92. package/dist/types/helper/ssg/index.d.ts +2 -105
  93. package/dist/types/helper/ssg/middleware.d.ts +38 -0
  94. package/dist/types/helper/ssg/ssg.d.ts +70 -0
  95. package/dist/types/helper/websocket/index.d.ts +34 -0
  96. package/dist/types/http-exception.d.ts +1 -0
  97. package/dist/types/jsx/dom/index.d.ts +40 -7
  98. package/dist/types/jsx/hooks/index.d.ts +2 -0
  99. package/dist/types/jsx/index.d.ts +41 -5
  100. package/dist/types/middleware/body-limit/index.d.ts +28 -0
  101. package/dist/types/utils/color.d.ts +1 -0
  102. package/dist/types/utils/concurrent.d.ts +7 -0
  103. package/dist/types/utils/cookie.d.ts +2 -0
  104. package/dist/utils/color.js +9 -0
  105. package/dist/utils/concurrent.js +39 -0
  106. package/dist/utils/cookie.js +28 -1
  107. package/dist/utils/stream.js +5 -1
  108. package/dist/utils/url.js +2 -2
  109. 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
- __privateSet(this, _executionCtx, options.executionCtx);
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 (__privateGet(this, _executionCtx) && "respondWith" in __privateGet(this, _executionCtx)) {
187
- return __privateGet(this, _executionCtx);
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 (__privateGet(this, _executionCtx)) {
194
- return __privateGet(this, _executionCtx);
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
- __privateSet(this, _isFresh, false);
201
- return __privateGet(this, _res) || __privateSet(this, _res, new Response("404 Not Found", { status: 404 }));
48
+ this.#isFresh = false;
49
+ return this.#res ||= new Response("404 Not Found", { status: 404 });
202
50
  }
203
- set res(_res2) {
204
- __privateSet(this, _isFresh, false);
205
- if (__privateGet(this, _res) && _res2) {
206
- __privateGet(this, _res).headers.delete("content-type");
207
- for (const [k, v] of __privateGet(this, _res).headers.entries()) {
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 = __privateGet(this, _res).headers.getSetCookie();
210
- _res2.headers.delete("set-cookie");
57
+ const cookies = this.#res.headers.getSetCookie();
58
+ _res.headers.delete("set-cookie");
211
59
  for (const cookie of cookies) {
212
- _res2.headers.append("set-cookie", cookie);
60
+ _res.headers.append("set-cookie", cookie);
213
61
  }
214
62
  } else {
215
- _res2.headers.set(k, v);
63
+ _res.headers.set(k, v);
216
64
  }
217
65
  }
218
66
  }
219
- __privateSet(this, _res, _res2);
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
@@ -2,7 +2,7 @@
2
2
  var env = (c, runtime) => {
3
3
  const global = globalThis;
4
4
  const globalEnv = global?.process?.env;
5
- runtime ?? (runtime = getRuntimeKey());
5
+ runtime ??= getRuntimeKey();
6
6
  const runtimeEnvHandlers = {
7
7
  bun: () => globalEnv,
8
8
  node: () => globalEnv,
@@ -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
- const obj2 = parse(cookie, key);
10
- return obj2[key];
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
- const obj2 = await parseSigned(cookie, secret, key);
25
- return obj2[key];
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
- const cookie = serialize(name, value, { path: "/", ...opt });
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
- const cookie = await serializeSigned(name, value, secret, { path: "/", ...opt });
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) => {
@@ -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 { process, Deno } = globalThis;
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] || (routeData[key] = [])).push(route);
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
- constructor() {
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
  }
@@ -1,158 +1,10 @@
1
1
  // src/helper/ssg/index.ts
2
- import { replaceUrlParam } from "../../client/utils.js";
3
- import { getExtension } from "../../utils/mime.js";
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
- saveContentToFiles,
156
- ssgParams,
157
- toSSG
9
+ ssgParams
158
10
  };