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
@@ -42,76 +42,79 @@ const createProxy = (callback, path) => {
42
42
  return proxy;
43
43
  };
44
44
  class ClientRequestImpl {
45
+ url;
46
+ method;
47
+ queryParams = void 0;
48
+ pathParams = {};
49
+ rBody;
50
+ cType = void 0;
45
51
  constructor(url, method) {
46
- this.queryParams = void 0;
47
- this.pathParams = {};
48
- this.cType = void 0;
49
- this.fetch = (args, opt) => {
50
- if (args) {
51
- if (args.query) {
52
- for (const [k, v] of Object.entries(args.query)) {
53
- if (v === void 0) {
54
- continue;
55
- }
56
- this.queryParams || (this.queryParams = new URLSearchParams());
57
- if (Array.isArray(v)) {
58
- for (const v2 of v) {
59
- this.queryParams.append(k, v2);
60
- }
61
- } else {
62
- this.queryParams.set(k, v);
63
- }
52
+ this.url = url;
53
+ this.method = method;
54
+ }
55
+ fetch = (args, opt) => {
56
+ if (args) {
57
+ if (args.query) {
58
+ for (const [k, v] of Object.entries(args.query)) {
59
+ if (v === void 0) {
60
+ continue;
64
61
  }
65
- }
66
- if (args.form) {
67
- const form = new FormData();
68
- for (const [k, v] of Object.entries(args.form)) {
69
- form.append(k, v);
62
+ this.queryParams ||= new URLSearchParams();
63
+ if (Array.isArray(v)) {
64
+ for (const v2 of v) {
65
+ this.queryParams.append(k, v2);
66
+ }
67
+ } else {
68
+ this.queryParams.set(k, v);
70
69
  }
71
- this.rBody = form;
72
- }
73
- if (args.json) {
74
- this.rBody = JSON.stringify(args.json);
75
- this.cType = "application/json";
76
- }
77
- if (args.param) {
78
- this.pathParams = args.param;
79
70
  }
80
71
  }
81
- let methodUpperCase = this.method.toUpperCase();
82
- let setBody = !(methodUpperCase === "GET" || methodUpperCase === "HEAD");
83
- const headerValues = {
84
- ...args?.header ?? {},
85
- ...opt?.headers ? opt.headers : {}
86
- };
87
- if (args?.cookie) {
88
- const cookies = [];
89
- for (const [key, value] of Object.entries(args.cookie)) {
90
- cookies.push((0, import_cookie.serialize)(key, value, { path: "/" }));
72
+ if (args.form) {
73
+ const form = new FormData();
74
+ for (const [k, v] of Object.entries(args.form)) {
75
+ form.append(k, v);
91
76
  }
92
- headerValues["Cookie"] = cookies.join(",");
77
+ this.rBody = form;
93
78
  }
94
- if (this.cType) {
95
- headerValues["Content-Type"] = this.cType;
79
+ if (args.json) {
80
+ this.rBody = JSON.stringify(args.json);
81
+ this.cType = "application/json";
96
82
  }
97
- const headers = new Headers(headerValues ?? void 0);
98
- let url = this.url;
99
- url = (0, import_utils.removeIndexString)(url);
100
- url = (0, import_utils.replaceUrlParam)(url, this.pathParams);
101
- if (this.queryParams) {
102
- url = url + "?" + this.queryParams.toString();
83
+ if (args.param) {
84
+ this.pathParams = args.param;
103
85
  }
104
- methodUpperCase = this.method.toUpperCase();
105
- setBody = !(methodUpperCase === "GET" || methodUpperCase === "HEAD");
106
- return (opt?.fetch || fetch)(url, {
107
- body: setBody ? this.rBody : void 0,
108
- method: methodUpperCase,
109
- headers
110
- });
86
+ }
87
+ let methodUpperCase = this.method.toUpperCase();
88
+ let setBody = !(methodUpperCase === "GET" || methodUpperCase === "HEAD");
89
+ const headerValues = {
90
+ ...args?.header ?? {},
91
+ ...opt?.headers ? opt.headers : {}
111
92
  };
112
- this.url = url;
113
- this.method = method;
114
- }
93
+ if (args?.cookie) {
94
+ const cookies = [];
95
+ for (const [key, value] of Object.entries(args.cookie)) {
96
+ cookies.push((0, import_cookie.serialize)(key, value, { path: "/" }));
97
+ }
98
+ headerValues["Cookie"] = cookies.join(",");
99
+ }
100
+ if (this.cType) {
101
+ headerValues["Content-Type"] = this.cType;
102
+ }
103
+ const headers = new Headers(headerValues ?? void 0);
104
+ let url = this.url;
105
+ url = (0, import_utils.removeIndexString)(url);
106
+ url = (0, import_utils.replaceUrlParam)(url, this.pathParams);
107
+ if (this.queryParams) {
108
+ url = url + "?" + this.queryParams.toString();
109
+ }
110
+ methodUpperCase = this.method.toUpperCase();
111
+ setBody = !(methodUpperCase === "GET" || methodUpperCase === "HEAD");
112
+ return (opt?.fetch || fetch)(url, {
113
+ body: setBody ? this.rBody : void 0,
114
+ method: methodUpperCase,
115
+ headers
116
+ });
117
+ };
115
118
  }
116
119
  const hc = (baseUrl, options) => createProxy((opts) => {
117
120
  const parts = [...opts.path];
@@ -130,9 +133,13 @@ const hc = (baseUrl, options) => createProxy((opts) => {
130
133
  }
131
134
  return new URL(url);
132
135
  }
136
+ if (method === "ws") {
137
+ const targetUrl = opts.args[0] && opts.args[0].param ? (0, import_utils.replaceUrlParam)(url, opts.args[0].param) : url;
138
+ return new WebSocket(targetUrl);
139
+ }
133
140
  const req = new ClientRequestImpl(url, method);
134
141
  if (method) {
135
- options ?? (options = {});
142
+ options ??= {};
136
143
  const args = (0, import_utils.deepMerge)(options, { ...opts.args[1] ?? {} });
137
144
  return req.fetch(opts.args[0], args);
138
145
  }
@@ -16,24 +16,6 @@ var __copyProps = (to, from, except, desc) => {
16
16
  return to;
17
17
  };
18
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
- var __accessCheck = (obj, member, msg) => {
20
- if (!member.has(obj))
21
- throw TypeError("Cannot " + msg);
22
- };
23
- var __privateGet = (obj, member, getter) => {
24
- __accessCheck(obj, member, "read from private field");
25
- return getter ? getter.call(obj) : member.get(obj);
26
- };
27
- var __privateAdd = (obj, member, value) => {
28
- if (member.has(obj))
29
- throw TypeError("Cannot add the same private member more than once");
30
- member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
31
- };
32
- var __privateSet = (obj, member, value, setter) => {
33
- __accessCheck(obj, member, "write to private field");
34
- setter ? setter.call(obj, value) : member.set(obj, value);
35
- return value;
36
- };
37
19
  var context_exports = {};
38
20
  __export(context_exports, {
39
21
  Context: () => Context,
@@ -41,163 +23,30 @@ __export(context_exports, {
41
23
  });
42
24
  module.exports = __toCommonJS(context_exports);
43
25
  var import_html = require("./utils/html");
44
- var _status, _executionCtx, _headers, _preparedHeaders, _res, _isFresh;
45
26
  const TEXT_PLAIN = "text/plain; charset=UTF-8";
46
27
  const setHeaders = (headers, map = {}) => {
47
28
  Object.entries(map).forEach(([key, value]) => headers.set(key, value));
48
29
  return headers;
49
30
  };
50
31
  class Context {
32
+ req;
33
+ env = {};
34
+ _var = {};
35
+ finalized = false;
36
+ error = void 0;
37
+ #status = 200;
38
+ #executionCtx;
39
+ #headers = void 0;
40
+ #preparedHeaders = void 0;
41
+ #res;
42
+ #isFresh = true;
43
+ layout = void 0;
44
+ renderer = (content) => this.html(content);
45
+ notFoundHandler = () => new Response();
51
46
  constructor(req, options) {
52
- this.env = {};
53
- this._var = {};
54
- this.finalized = false;
55
- this.error = void 0;
56
- __privateAdd(this, _status, 200);
57
- __privateAdd(this, _executionCtx, void 0);
58
- __privateAdd(this, _headers, void 0);
59
- __privateAdd(this, _preparedHeaders, void 0);
60
- __privateAdd(this, _res, void 0);
61
- __privateAdd(this, _isFresh, true);
62
- this.layout = void 0;
63
- this.renderer = (content) => this.html(content);
64
- this.notFoundHandler = () => new Response();
65
- this.render = (...args) => this.renderer(...args);
66
- this.setLayout = (layout) => this.layout = layout;
67
- this.getLayout = () => this.layout;
68
- this.setRenderer = (renderer) => {
69
- this.renderer = renderer;
70
- };
71
- this.header = (name, value, options) => {
72
- if (value === void 0) {
73
- if (__privateGet(this, _headers)) {
74
- __privateGet(this, _headers).delete(name);
75
- } else if (__privateGet(this, _preparedHeaders)) {
76
- delete __privateGet(this, _preparedHeaders)[name.toLocaleLowerCase()];
77
- }
78
- if (this.finalized) {
79
- this.res.headers.delete(name);
80
- }
81
- return;
82
- }
83
- if (options?.append) {
84
- if (!__privateGet(this, _headers)) {
85
- __privateSet(this, _isFresh, false);
86
- __privateSet(this, _headers, new Headers(__privateGet(this, _preparedHeaders)));
87
- __privateSet(this, _preparedHeaders, {});
88
- }
89
- __privateGet(this, _headers).append(name, value);
90
- } else {
91
- if (__privateGet(this, _headers)) {
92
- __privateGet(this, _headers).set(name, value);
93
- } else {
94
- __privateGet(this, _preparedHeaders) ?? __privateSet(this, _preparedHeaders, {});
95
- __privateGet(this, _preparedHeaders)[name.toLowerCase()] = value;
96
- }
97
- }
98
- if (this.finalized) {
99
- if (options?.append) {
100
- this.res.headers.append(name, value);
101
- } else {
102
- this.res.headers.set(name, value);
103
- }
104
- }
105
- };
106
- this.status = (status) => {
107
- __privateSet(this, _isFresh, false);
108
- __privateSet(this, _status, status);
109
- };
110
- this.set = (key, value) => {
111
- this._var ?? (this._var = {});
112
- this._var[key] = value;
113
- };
114
- this.get = (key) => {
115
- return this._var ? this._var[key] : void 0;
116
- };
117
- this.newResponse = (data, arg, headers) => {
118
- if (__privateGet(this, _isFresh) && !headers && !arg && __privateGet(this, _status) === 200) {
119
- return new Response(data, {
120
- headers: __privateGet(this, _preparedHeaders)
121
- });
122
- }
123
- if (arg && typeof arg !== "number") {
124
- const headers2 = setHeaders(new Headers(arg.headers), __privateGet(this, _preparedHeaders));
125
- return new Response(data, {
126
- headers: headers2,
127
- status: arg.status ?? __privateGet(this, _status)
128
- });
129
- }
130
- const status = typeof arg === "number" ? arg : __privateGet(this, _status);
131
- __privateGet(this, _preparedHeaders) ?? __privateSet(this, _preparedHeaders, {});
132
- __privateGet(this, _headers) ?? __privateSet(this, _headers, new Headers());
133
- setHeaders(__privateGet(this, _headers), __privateGet(this, _preparedHeaders));
134
- if (__privateGet(this, _res)) {
135
- __privateGet(this, _res).headers.forEach((v, k) => {
136
- __privateGet(this, _headers)?.set(k, v);
137
- });
138
- setHeaders(__privateGet(this, _headers), __privateGet(this, _preparedHeaders));
139
- }
140
- headers ?? (headers = {});
141
- for (const [k, v] of Object.entries(headers)) {
142
- if (typeof v === "string") {
143
- __privateGet(this, _headers).set(k, v);
144
- } else {
145
- __privateGet(this, _headers).delete(k);
146
- for (const v2 of v) {
147
- __privateGet(this, _headers).append(k, v2);
148
- }
149
- }
150
- }
151
- return new Response(data, {
152
- status,
153
- headers: __privateGet(this, _headers)
154
- });
155
- };
156
- this.body = (data, arg, headers) => {
157
- return typeof arg === "number" ? this.newResponse(data, arg, headers) : this.newResponse(data, arg);
158
- };
159
- this.text = (text, arg, headers) => {
160
- if (!__privateGet(this, _preparedHeaders)) {
161
- if (__privateGet(this, _isFresh) && !headers && !arg) {
162
- return new Response(text);
163
- }
164
- __privateSet(this, _preparedHeaders, {});
165
- }
166
- __privateGet(this, _preparedHeaders)["content-type"] = TEXT_PLAIN;
167
- return typeof arg === "number" ? this.newResponse(text, arg, headers) : this.newResponse(text, arg);
168
- };
169
- this.json = (object, arg, headers) => {
170
- const body = JSON.stringify(object);
171
- __privateGet(this, _preparedHeaders) ?? __privateSet(this, _preparedHeaders, {});
172
- __privateGet(this, _preparedHeaders)["content-type"] = "application/json; charset=UTF-8";
173
- return typeof arg === "number" ? this.newResponse(body, arg, headers) : this.newResponse(body, arg);
174
- };
175
- this.html = (html, arg, headers) => {
176
- __privateGet(this, _preparedHeaders) ?? __privateSet(this, _preparedHeaders, {});
177
- __privateGet(this, _preparedHeaders)["content-type"] = "text/html; charset=UTF-8";
178
- if (typeof html === "object") {
179
- if (!(html instanceof Promise)) {
180
- html = html.toString();
181
- }
182
- if (html instanceof Promise) {
183
- return html.then((html2) => (0, import_html.resolveCallback)(html2, import_html.HtmlEscapedCallbackPhase.Stringify, false, {})).then((html2) => {
184
- return typeof arg === "number" ? this.newResponse(html2, arg, headers) : this.newResponse(html2, arg);
185
- });
186
- }
187
- }
188
- return typeof arg === "number" ? this.newResponse(html, arg, headers) : this.newResponse(html, arg);
189
- };
190
- this.redirect = (location, status = 302) => {
191
- __privateGet(this, _headers) ?? __privateSet(this, _headers, new Headers());
192
- __privateGet(this, _headers).set("Location", location);
193
- return this.newResponse(null, status);
194
- };
195
- this.notFound = () => {
196
- return this.notFoundHandler(this);
197
- };
198
47
  this.req = req;
199
48
  if (options) {
200
- __privateSet(this, _executionCtx, options.executionCtx);
49
+ this.#executionCtx = options.executionCtx;
201
50
  this.env = options.env;
202
51
  if (options.notFoundHandler) {
203
52
  this.notFoundHandler = options.notFoundHandler;
@@ -205,52 +54,179 @@ class Context {
205
54
  }
206
55
  }
207
56
  get event() {
208
- if (__privateGet(this, _executionCtx) && "respondWith" in __privateGet(this, _executionCtx)) {
209
- return __privateGet(this, _executionCtx);
57
+ if (this.#executionCtx && "respondWith" in this.#executionCtx) {
58
+ return this.#executionCtx;
210
59
  } else {
211
60
  throw Error("This context has no FetchEvent");
212
61
  }
213
62
  }
214
63
  get executionCtx() {
215
- if (__privateGet(this, _executionCtx)) {
216
- return __privateGet(this, _executionCtx);
64
+ if (this.#executionCtx) {
65
+ return this.#executionCtx;
217
66
  } else {
218
67
  throw Error("This context has no ExecutionContext");
219
68
  }
220
69
  }
221
70
  get res() {
222
- __privateSet(this, _isFresh, false);
223
- return __privateGet(this, _res) || __privateSet(this, _res, new Response("404 Not Found", { status: 404 }));
71
+ this.#isFresh = false;
72
+ return this.#res ||= new Response("404 Not Found", { status: 404 });
224
73
  }
225
- set res(_res2) {
226
- __privateSet(this, _isFresh, false);
227
- if (__privateGet(this, _res) && _res2) {
228
- __privateGet(this, _res).headers.delete("content-type");
229
- for (const [k, v] of __privateGet(this, _res).headers.entries()) {
74
+ set res(_res) {
75
+ this.#isFresh = false;
76
+ if (this.#res && _res) {
77
+ this.#res.headers.delete("content-type");
78
+ for (const [k, v] of this.#res.headers.entries()) {
230
79
  if (k === "set-cookie") {
231
- const cookies = __privateGet(this, _res).headers.getSetCookie();
232
- _res2.headers.delete("set-cookie");
80
+ const cookies = this.#res.headers.getSetCookie();
81
+ _res.headers.delete("set-cookie");
233
82
  for (const cookie of cookies) {
234
- _res2.headers.append("set-cookie", cookie);
83
+ _res.headers.append("set-cookie", cookie);
235
84
  }
236
85
  } else {
237
- _res2.headers.set(k, v);
86
+ _res.headers.set(k, v);
238
87
  }
239
88
  }
240
89
  }
241
- __privateSet(this, _res, _res2);
90
+ this.#res = _res;
242
91
  this.finalized = true;
243
92
  }
93
+ render = (...args) => this.renderer(...args);
94
+ setLayout = (layout) => this.layout = layout;
95
+ getLayout = () => this.layout;
96
+ setRenderer = (renderer) => {
97
+ this.renderer = renderer;
98
+ };
99
+ header = (name, value, options) => {
100
+ if (value === void 0) {
101
+ if (this.#headers) {
102
+ this.#headers.delete(name);
103
+ } else if (this.#preparedHeaders) {
104
+ delete this.#preparedHeaders[name.toLocaleLowerCase()];
105
+ }
106
+ if (this.finalized) {
107
+ this.res.headers.delete(name);
108
+ }
109
+ return;
110
+ }
111
+ if (options?.append) {
112
+ if (!this.#headers) {
113
+ this.#isFresh = false;
114
+ this.#headers = new Headers(this.#preparedHeaders);
115
+ this.#preparedHeaders = {};
116
+ }
117
+ this.#headers.append(name, value);
118
+ } else {
119
+ if (this.#headers) {
120
+ this.#headers.set(name, value);
121
+ } else {
122
+ this.#preparedHeaders ??= {};
123
+ this.#preparedHeaders[name.toLowerCase()] = value;
124
+ }
125
+ }
126
+ if (this.finalized) {
127
+ if (options?.append) {
128
+ this.res.headers.append(name, value);
129
+ } else {
130
+ this.res.headers.set(name, value);
131
+ }
132
+ }
133
+ };
134
+ status = (status) => {
135
+ this.#isFresh = false;
136
+ this.#status = status;
137
+ };
138
+ set = (key, value) => {
139
+ this._var ??= {};
140
+ this._var[key] = value;
141
+ };
142
+ get = (key) => {
143
+ return this._var ? this._var[key] : void 0;
144
+ };
244
145
  get var() {
245
146
  return { ...this._var };
246
147
  }
148
+ newResponse = (data, arg, headers) => {
149
+ if (this.#isFresh && !headers && !arg && this.#status === 200) {
150
+ return new Response(data, {
151
+ headers: this.#preparedHeaders
152
+ });
153
+ }
154
+ if (arg && typeof arg !== "number") {
155
+ const headers2 = setHeaders(new Headers(arg.headers), this.#preparedHeaders);
156
+ return new Response(data, {
157
+ headers: headers2,
158
+ status: arg.status ?? this.#status
159
+ });
160
+ }
161
+ const status = typeof arg === "number" ? arg : this.#status;
162
+ this.#preparedHeaders ??= {};
163
+ this.#headers ??= new Headers();
164
+ setHeaders(this.#headers, this.#preparedHeaders);
165
+ if (this.#res) {
166
+ this.#res.headers.forEach((v, k) => {
167
+ this.#headers?.set(k, v);
168
+ });
169
+ setHeaders(this.#headers, this.#preparedHeaders);
170
+ }
171
+ headers ??= {};
172
+ for (const [k, v] of Object.entries(headers)) {
173
+ if (typeof v === "string") {
174
+ this.#headers.set(k, v);
175
+ } else {
176
+ this.#headers.delete(k);
177
+ for (const v2 of v) {
178
+ this.#headers.append(k, v2);
179
+ }
180
+ }
181
+ }
182
+ return new Response(data, {
183
+ status,
184
+ headers: this.#headers
185
+ });
186
+ };
187
+ body = (data, arg, headers) => {
188
+ return typeof arg === "number" ? this.newResponse(data, arg, headers) : this.newResponse(data, arg);
189
+ };
190
+ text = (text, arg, headers) => {
191
+ if (!this.#preparedHeaders) {
192
+ if (this.#isFresh && !headers && !arg) {
193
+ return new Response(text);
194
+ }
195
+ this.#preparedHeaders = {};
196
+ }
197
+ this.#preparedHeaders["content-type"] = TEXT_PLAIN;
198
+ return typeof arg === "number" ? this.newResponse(text, arg, headers) : this.newResponse(text, arg);
199
+ };
200
+ json = (object, arg, headers) => {
201
+ const body = JSON.stringify(object);
202
+ this.#preparedHeaders ??= {};
203
+ this.#preparedHeaders["content-type"] = "application/json; charset=UTF-8";
204
+ return typeof arg === "number" ? this.newResponse(body, arg, headers) : this.newResponse(body, arg);
205
+ };
206
+ html = (html, arg, headers) => {
207
+ this.#preparedHeaders ??= {};
208
+ this.#preparedHeaders["content-type"] = "text/html; charset=UTF-8";
209
+ if (typeof html === "object") {
210
+ if (!(html instanceof Promise)) {
211
+ html = html.toString();
212
+ }
213
+ if (html instanceof Promise) {
214
+ return html.then((html2) => (0, import_html.resolveCallback)(html2, import_html.HtmlEscapedCallbackPhase.Stringify, false, {})).then((html2) => {
215
+ return typeof arg === "number" ? this.newResponse(html2, arg, headers) : this.newResponse(html2, arg);
216
+ });
217
+ }
218
+ }
219
+ return typeof arg === "number" ? this.newResponse(html, arg, headers) : this.newResponse(html, arg);
220
+ };
221
+ redirect = (location, status = 302) => {
222
+ this.#headers ??= new Headers();
223
+ this.#headers.set("Location", location);
224
+ return this.newResponse(null, status);
225
+ };
226
+ notFound = () => {
227
+ return this.notFoundHandler(this);
228
+ };
247
229
  }
248
- _status = new WeakMap();
249
- _executionCtx = new WeakMap();
250
- _headers = new WeakMap();
251
- _preparedHeaders = new WeakMap();
252
- _res = new WeakMap();
253
- _isFresh = new WeakMap();
254
230
  // Annotate the CommonJS export names for ESM import in node:
255
231
  0 && (module.exports = {
256
232
  Context,
@@ -25,7 +25,7 @@ module.exports = __toCommonJS(adapter_exports);
25
25
  const env = (c, runtime) => {
26
26
  const global = globalThis;
27
27
  const globalEnv = global?.process?.env;
28
- runtime ?? (runtime = getRuntimeKey());
28
+ runtime ??= getRuntimeKey();
29
29
  const runtimeEnvHandlers = {
30
30
  bun: () => globalEnv,
31
31
  node: () => globalEnv,
@@ -26,14 +26,20 @@ __export(cookie_exports, {
26
26
  });
27
27
  module.exports = __toCommonJS(cookie_exports);
28
28
  var import_cookie = require("../../utils/cookie");
29
- const getCookie = (c, key) => {
29
+ const getCookie = (c, key, prefix) => {
30
30
  const cookie = c.req.raw.headers.get("Cookie");
31
31
  if (typeof key === "string") {
32
32
  if (!cookie) {
33
33
  return void 0;
34
34
  }
35
- const obj2 = (0, import_cookie.parse)(cookie, key);
36
- return obj2[key];
35
+ let finalKey = key;
36
+ if (prefix === "secure") {
37
+ finalKey = "__Secure-" + key;
38
+ } else if (prefix === "host") {
39
+ finalKey = "__Host-" + key;
40
+ }
41
+ const obj2 = (0, import_cookie.parse)(cookie, finalKey);
42
+ return obj2[finalKey];
37
43
  }
38
44
  if (!cookie) {
39
45
  return {};
@@ -41,14 +47,20 @@ const getCookie = (c, key) => {
41
47
  const obj = (0, import_cookie.parse)(cookie);
42
48
  return obj;
43
49
  };
44
- const getSignedCookie = async (c, secret, key) => {
50
+ const getSignedCookie = async (c, secret, key, prefix) => {
45
51
  const cookie = c.req.raw.headers.get("Cookie");
46
52
  if (typeof key === "string") {
47
53
  if (!cookie) {
48
54
  return void 0;
49
55
  }
50
- const obj2 = await (0, import_cookie.parseSigned)(cookie, secret, key);
51
- return obj2[key];
56
+ let finalKey = key;
57
+ if (prefix === "secure") {
58
+ finalKey = "__Secure-" + key;
59
+ } else if (prefix === "host") {
60
+ finalKey = "__Host-" + key;
61
+ }
62
+ const obj2 = await (0, import_cookie.parseSigned)(cookie, secret, finalKey);
63
+ return obj2[finalKey];
52
64
  }
53
65
  if (!cookie) {
54
66
  return {};
@@ -57,11 +69,39 @@ const getSignedCookie = async (c, secret, key) => {
57
69
  return obj;
58
70
  };
59
71
  const setCookie = (c, name, value, opt) => {
60
- const cookie = (0, import_cookie.serialize)(name, value, { path: "/", ...opt });
72
+ let cookie;
73
+ if (opt?.prefix === "secure") {
74
+ cookie = (0, import_cookie.serialize)("__Secure-" + name, value, { path: "/", ...opt, secure: true });
75
+ } else if (opt?.prefix === "host") {
76
+ cookie = (0, import_cookie.serialize)("__Host-" + name, value, {
77
+ ...opt,
78
+ path: "/",
79
+ secure: true,
80
+ domain: void 0
81
+ });
82
+ } else {
83
+ cookie = (0, import_cookie.serialize)(name, value, { path: "/", ...opt });
84
+ }
61
85
  c.header("set-cookie", cookie, { append: true });
62
86
  };
63
87
  const setSignedCookie = async (c, name, value, secret, opt) => {
64
- const cookie = await (0, import_cookie.serializeSigned)(name, value, secret, { path: "/", ...opt });
88
+ let cookie;
89
+ if (opt?.prefix === "secure") {
90
+ cookie = await (0, import_cookie.serializeSigned)("__Secure-" + name, value, secret, {
91
+ path: "/",
92
+ ...opt,
93
+ secure: true
94
+ });
95
+ } else if (opt?.prefix === "host") {
96
+ cookie = await (0, import_cookie.serializeSigned)("__Host-" + name, value, secret, {
97
+ ...opt,
98
+ path: "/",
99
+ secure: true,
100
+ domain: void 0
101
+ });
102
+ } else {
103
+ cookie = await (0, import_cookie.serializeSigned)(name, value, secret, { path: "/", ...opt });
104
+ }
65
105
  c.header("set-cookie", cookie, { append: true });
66
106
  };
67
107
  const deleteCookie = (c, name, opt) => {
@@ -23,6 +23,7 @@ __export(dev_exports, {
23
23
  showRoutes: () => showRoutes
24
24
  });
25
25
  module.exports = __toCommonJS(dev_exports);
26
+ var import_color = require("../../utils/color");
26
27
  var import_handler = require("../../utils/handler");
27
28
  const handlerName = (handler) => {
28
29
  return handler.name || ((0, import_handler.isMiddleware)(handler) ? "[middleware]" : "[handler]");
@@ -39,15 +40,13 @@ const inspectRoutes = (hono) => {
39
40
  });
40
41
  };
41
42
  const showRoutes = (hono, opts) => {
42
- const { process, Deno } = globalThis;
43
- const isNoColor = typeof process !== "undefined" ? "NO_COLOR" in process?.env : typeof Deno?.noColor === "boolean" ? Deno.noColor : false;
44
- const colorEnabled = opts?.colorize ?? !isNoColor;
43
+ const colorEnabled = opts?.colorize ?? (0, import_color.getColorEnabled)();
45
44
  const routeData = {};
46
45
  let maxMethodLength = 0;
47
46
  let maxPathLength = 0;
48
47
  inspectRoutes(hono).filter(({ isMiddleware: isMiddleware2 }) => opts?.verbose || !isMiddleware2).map((route) => {
49
48
  const key = `${route.method}-${route.path}`;
50
- (routeData[key] || (routeData[key] = [])).push(route);
49
+ (routeData[key] ||= []).push(route);
51
50
  if (routeData[key].length > 1) {
52
51
  return;
53
52
  }