hono 4.6.8 → 4.6.10

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 (96) hide show
  1. package/dist/adapter/cloudflare-workers/websocket.js +34 -39
  2. package/dist/adapter/deno/serve-static.js +5 -1
  3. package/dist/adapter/lambda-edge/handler.js +1 -1
  4. package/dist/cjs/adapter/cloudflare-workers/websocket.js +34 -39
  5. package/dist/cjs/adapter/deno/serve-static.js +5 -1
  6. package/dist/cjs/adapter/lambda-edge/handler.js +1 -1
  7. package/dist/cjs/client/client.js +3 -3
  8. package/dist/cjs/compose.js +4 -3
  9. package/dist/cjs/context.js +12 -9
  10. package/dist/cjs/helper/html/index.js +1 -1
  11. package/dist/cjs/helper/ssg/ssg.js +2 -2
  12. package/dist/cjs/helper/ssg/utils.js +2 -2
  13. package/dist/cjs/hono-base.js +38 -41
  14. package/dist/cjs/jsx/base.js +8 -3
  15. package/dist/cjs/jsx/constants.js +3 -0
  16. package/dist/cjs/jsx/dom/index.js +8 -2
  17. package/dist/cjs/jsx/dom/render.js +15 -12
  18. package/dist/cjs/middleware/combine/index.js +15 -9
  19. package/dist/cjs/middleware/etag/digest.js +59 -0
  20. package/dist/cjs/middleware/etag/index.js +5 -2
  21. package/dist/cjs/middleware/ip-restriction/index.js +3 -3
  22. package/dist/cjs/middleware/jsx-renderer/index.js +2 -1
  23. package/dist/cjs/middleware/logger/index.js +13 -11
  24. package/dist/cjs/middleware/timing/timing.js +5 -7
  25. package/dist/cjs/request.js +15 -14
  26. package/dist/cjs/router/linear-router/router.js +4 -4
  27. package/dist/cjs/router/pattern-router/router.js +4 -4
  28. package/dist/cjs/router/reg-exp-router/node.js +18 -18
  29. package/dist/cjs/router/reg-exp-router/router.js +13 -12
  30. package/dist/cjs/router/reg-exp-router/trie.js +6 -6
  31. package/dist/cjs/router/smart-router/router.js +12 -11
  32. package/dist/cjs/router/trie-router/node.js +53 -47
  33. package/dist/cjs/router/trie-router/router.js +5 -5
  34. package/dist/cjs/utils/color.js +1 -1
  35. package/dist/cjs/utils/cookie.js +13 -6
  36. package/dist/cjs/utils/crypto.js +0 -9
  37. package/dist/cjs/utils/jwt/jwt.js +1 -1
  38. package/dist/cjs/utils/mime.js +2 -1
  39. package/dist/cjs/utils/url.js +9 -6
  40. package/dist/client/client.js +3 -3
  41. package/dist/compose.js +4 -3
  42. package/dist/context.js +12 -9
  43. package/dist/helper/html/index.js +1 -1
  44. package/dist/helper/ssg/ssg.js +2 -2
  45. package/dist/helper/ssg/utils.js +2 -2
  46. package/dist/hono-base.js +38 -41
  47. package/dist/jsx/base.js +7 -3
  48. package/dist/jsx/constants.js +2 -0
  49. package/dist/jsx/dom/index.js +7 -1
  50. package/dist/jsx/dom/render.js +22 -13
  51. package/dist/middleware/combine/index.js +15 -9
  52. package/dist/middleware/etag/digest.js +36 -0
  53. package/dist/middleware/etag/index.js +5 -2
  54. package/dist/middleware/ip-restriction/index.js +3 -3
  55. package/dist/middleware/jsx-renderer/index.js +2 -1
  56. package/dist/middleware/logger/index.js +13 -11
  57. package/dist/middleware/timing/timing.js +5 -7
  58. package/dist/request.js +16 -15
  59. package/dist/router/linear-router/router.js +4 -4
  60. package/dist/router/pattern-router/router.js +4 -4
  61. package/dist/router/reg-exp-router/node.js +18 -18
  62. package/dist/router/reg-exp-router/router.js +13 -12
  63. package/dist/router/reg-exp-router/trie.js +6 -6
  64. package/dist/router/smart-router/router.js +12 -11
  65. package/dist/router/trie-router/node.js +53 -47
  66. package/dist/router/trie-router/router.js +5 -5
  67. package/dist/types/adapter/cloudflare-workers/websocket.d.ts +2 -2
  68. package/dist/types/adapter/deno/websocket.d.ts +1 -20
  69. package/dist/types/adapter/service-worker/index.d.ts +1 -1
  70. package/dist/types/compose.d.ts +5 -2
  71. package/dist/types/context.d.ts +1 -1
  72. package/dist/types/helper/websocket/index.d.ts +1 -1
  73. package/dist/types/hono-base.d.ts +1 -1
  74. package/dist/types/jsx/base.d.ts +5 -0
  75. package/dist/types/jsx/constants.d.ts +1 -0
  76. package/dist/types/jsx/dom/index.d.ts +6 -5
  77. package/dist/types/jsx/dom/render.d.ts +1 -0
  78. package/dist/types/middleware/etag/digest.d.ts +1 -0
  79. package/dist/types/router/linear-router/router.d.ts +0 -5
  80. package/dist/types/router/reg-exp-router/node.d.ts +0 -3
  81. package/dist/types/router/reg-exp-router/router.d.ts +0 -7
  82. package/dist/types/router/reg-exp-router/trie.d.ts +1 -4
  83. package/dist/types/router/smart-router/router.d.ts +3 -7
  84. package/dist/types/router/trie-router/node.d.ts +0 -12
  85. package/dist/types/router/trie-router/router.d.ts +0 -2
  86. package/dist/types/utils/body.d.ts +2 -2
  87. package/dist/types/utils/crypto.d.ts +2 -1
  88. package/dist/types/utils/mime.d.ts +58 -1
  89. package/dist/types/utils/url.d.ts +3 -0
  90. package/dist/utils/color.js +1 -1
  91. package/dist/utils/cookie.js +13 -6
  92. package/dist/utils/crypto.js +0 -9
  93. package/dist/utils/jwt/jwt.js +1 -1
  94. package/dist/utils/mime.js +2 -1
  95. package/dist/utils/url.js +7 -5
  96. package/package.json +20 -12
@@ -1,45 +1,40 @@
1
1
  // src/adapter/cloudflare-workers/websocket.ts
2
2
  import { WSContext, defineWebSocketHelper } from "../../helper/websocket/index.js";
3
- var upgradeWebSocket = defineWebSocketHelper(
4
- async (c, events) => {
5
- const upgradeHeader = c.req.header("Upgrade");
6
- if (upgradeHeader !== "websocket") {
7
- return;
8
- }
9
- const webSocketPair = new WebSocketPair();
10
- const client = webSocketPair[0];
11
- const server = webSocketPair[1];
12
- const wsContext = new WSContext({
13
- close: (code, reason) => server.close(code, reason),
14
- get protocol() {
15
- return server.protocol;
16
- },
17
- raw: server,
18
- get readyState() {
19
- return server.readyState;
20
- },
21
- url: server.url ? new URL(server.url) : null,
22
- send: (source) => server.send(source)
23
- });
24
- if (events.onOpen) {
25
- server.addEventListener("open", (evt) => events.onOpen?.(evt, wsContext));
26
- }
27
- if (events.onClose) {
28
- server.addEventListener("close", (evt) => events.onClose?.(evt, wsContext));
29
- }
30
- if (events.onMessage) {
31
- server.addEventListener("message", (evt) => events.onMessage?.(evt, wsContext));
32
- }
33
- if (events.onError) {
34
- server.addEventListener("error", (evt) => events.onError?.(evt, wsContext));
35
- }
36
- server.accept?.();
37
- return new Response(null, {
38
- status: 101,
39
- webSocket: client
40
- });
3
+ var upgradeWebSocket = defineWebSocketHelper(async (c, events) => {
4
+ const upgradeHeader = c.req.header("Upgrade");
5
+ if (upgradeHeader !== "websocket") {
6
+ return;
41
7
  }
42
- );
8
+ const webSocketPair = new WebSocketPair();
9
+ const client = webSocketPair[0];
10
+ const server = webSocketPair[1];
11
+ const wsContext = new WSContext({
12
+ close: (code, reason) => server.close(code, reason),
13
+ get protocol() {
14
+ return server.protocol;
15
+ },
16
+ raw: server,
17
+ get readyState() {
18
+ return server.readyState;
19
+ },
20
+ url: server.url ? new URL(server.url) : null,
21
+ send: (source) => server.send(source)
22
+ });
23
+ if (events.onClose) {
24
+ server.addEventListener("close", (evt) => events.onClose?.(evt, wsContext));
25
+ }
26
+ if (events.onMessage) {
27
+ server.addEventListener("message", (evt) => events.onMessage?.(evt, wsContext));
28
+ }
29
+ if (events.onError) {
30
+ server.addEventListener("error", (evt) => events.onError?.(evt, wsContext));
31
+ }
32
+ server.accept?.();
33
+ return new Response(null, {
34
+ status: 101,
35
+ webSocket: client
36
+ });
37
+ });
43
38
  export {
44
39
  upgradeWebSocket
45
40
  };
@@ -5,12 +5,16 @@ var serveStatic = (options) => {
5
5
  return async function serveStatic2(c, next) {
6
6
  const getContent = async (path) => {
7
7
  try {
8
+ if (isDir(path)) {
9
+ return null;
10
+ }
8
11
  const file = await open(path);
9
- return file ? file.readable : null;
12
+ return file.readable;
10
13
  } catch (e) {
11
14
  if (!(e instanceof errors.NotFound)) {
12
15
  console.warn(`${e}`);
13
16
  }
17
+ return null;
14
18
  }
15
19
  };
16
20
  const pathResolve = (path) => {
@@ -31,7 +31,7 @@ var createResult = async (res) => {
31
31
  status: res.status.toString(),
32
32
  headers: convertHeaders(res.headers),
33
33
  body,
34
- ...isBase64Encoded ? { bodyEncoding: "base64" } : {}
34
+ ...isBase64Encoded && { bodyEncoding: "base64" }
35
35
  };
36
36
  };
37
37
  var createRequest = (event) => {
@@ -22,46 +22,41 @@ __export(websocket_exports, {
22
22
  });
23
23
  module.exports = __toCommonJS(websocket_exports);
24
24
  var import_websocket = require("../../helper/websocket");
25
- const upgradeWebSocket = (0, import_websocket.defineWebSocketHelper)(
26
- async (c, events) => {
27
- const upgradeHeader = c.req.header("Upgrade");
28
- if (upgradeHeader !== "websocket") {
29
- return;
30
- }
31
- const webSocketPair = new WebSocketPair();
32
- const client = webSocketPair[0];
33
- const server = webSocketPair[1];
34
- const wsContext = new import_websocket.WSContext({
35
- close: (code, reason) => server.close(code, reason),
36
- get protocol() {
37
- return server.protocol;
38
- },
39
- raw: server,
40
- get readyState() {
41
- return server.readyState;
42
- },
43
- url: server.url ? new URL(server.url) : null,
44
- send: (source) => server.send(source)
45
- });
46
- if (events.onOpen) {
47
- server.addEventListener("open", (evt) => events.onOpen?.(evt, wsContext));
48
- }
49
- if (events.onClose) {
50
- server.addEventListener("close", (evt) => events.onClose?.(evt, wsContext));
51
- }
52
- if (events.onMessage) {
53
- server.addEventListener("message", (evt) => events.onMessage?.(evt, wsContext));
54
- }
55
- if (events.onError) {
56
- server.addEventListener("error", (evt) => events.onError?.(evt, wsContext));
57
- }
58
- server.accept?.();
59
- return new Response(null, {
60
- status: 101,
61
- webSocket: client
62
- });
25
+ const upgradeWebSocket = (0, import_websocket.defineWebSocketHelper)(async (c, events) => {
26
+ const upgradeHeader = c.req.header("Upgrade");
27
+ if (upgradeHeader !== "websocket") {
28
+ return;
63
29
  }
64
- );
30
+ const webSocketPair = new WebSocketPair();
31
+ const client = webSocketPair[0];
32
+ const server = webSocketPair[1];
33
+ const wsContext = new import_websocket.WSContext({
34
+ close: (code, reason) => server.close(code, reason),
35
+ get protocol() {
36
+ return server.protocol;
37
+ },
38
+ raw: server,
39
+ get readyState() {
40
+ return server.readyState;
41
+ },
42
+ url: server.url ? new URL(server.url) : null,
43
+ send: (source) => server.send(source)
44
+ });
45
+ if (events.onClose) {
46
+ server.addEventListener("close", (evt) => events.onClose?.(evt, wsContext));
47
+ }
48
+ if (events.onMessage) {
49
+ server.addEventListener("message", (evt) => events.onMessage?.(evt, wsContext));
50
+ }
51
+ if (events.onError) {
52
+ server.addEventListener("error", (evt) => events.onError?.(evt, wsContext));
53
+ }
54
+ server.accept?.();
55
+ return new Response(null, {
56
+ status: 101,
57
+ webSocket: client
58
+ });
59
+ });
65
60
  // Annotate the CommonJS export names for ESM import in node:
66
61
  0 && (module.exports = {
67
62
  upgradeWebSocket
@@ -27,12 +27,16 @@ const serveStatic = (options) => {
27
27
  return async function serveStatic2(c, next) {
28
28
  const getContent = async (path) => {
29
29
  try {
30
+ if (isDir(path)) {
31
+ return null;
32
+ }
30
33
  const file = await open(path);
31
- return file ? file.readable : null;
34
+ return file.readable;
32
35
  } catch (e) {
33
36
  if (!(e instanceof errors.NotFound)) {
34
37
  console.warn(`${e}`);
35
38
  }
39
+ return null;
36
40
  }
37
41
  };
38
42
  const pathResolve = (path) => {
@@ -61,7 +61,7 @@ const createResult = async (res) => {
61
61
  status: res.status.toString(),
62
62
  headers: convertHeaders(res.headers),
63
63
  body,
64
- ...isBase64Encoded ? { bodyEncoding: "base64" } : {}
64
+ ...isBase64Encoded && { bodyEncoding: "base64" }
65
65
  };
66
66
  };
67
67
  const createRequest = (event) => {
@@ -80,8 +80,8 @@ class ClientRequestImpl {
80
80
  }
81
81
  let methodUpperCase = this.method.toUpperCase();
82
82
  const headerValues = {
83
- ...args?.header ?? {},
84
- ...typeof opt?.headers === "function" ? await opt.headers() : opt?.headers ? opt.headers : {}
83
+ ...args?.header,
84
+ ...typeof opt?.headers === "function" ? await opt.headers() : opt?.headers
85
85
  };
86
86
  if (args?.cookie) {
87
87
  const cookies = [];
@@ -172,7 +172,7 @@ const hc = (baseUrl, options) => createProxy(function proxyCallback(opts) {
172
172
  const req = new ClientRequestImpl(url, method);
173
173
  if (method) {
174
174
  options ??= {};
175
- const args = (0, import_utils.deepMerge)(options, { ...opts.args[1] ?? {} });
175
+ const args = (0, import_utils.deepMerge)(options, { ...opts.args[1] });
176
176
  return req.fetch(opts.args[0], args);
177
177
  }
178
178
  return req;
@@ -25,6 +25,7 @@ var import_context = require("./context");
25
25
  const compose = (middleware, onError, onNotFound) => {
26
26
  return (context, next) => {
27
27
  let index = -1;
28
+ const isContext = context instanceof import_context.Context;
28
29
  return dispatch(0);
29
30
  async function dispatch(i) {
30
31
  if (i <= index) {
@@ -36,14 +37,14 @@ const compose = (middleware, onError, onNotFound) => {
36
37
  let handler;
37
38
  if (middleware[i]) {
38
39
  handler = middleware[i][0][0];
39
- if (context instanceof import_context.Context) {
40
+ if (isContext) {
40
41
  context.req.routeIndex = i;
41
42
  }
42
43
  } else {
43
44
  handler = i === middleware.length && next || void 0;
44
45
  }
45
46
  if (!handler) {
46
- if (context instanceof import_context.Context && context.finalized === false && onNotFound) {
47
+ if (isContext && context.finalized === false && onNotFound) {
47
48
  res = await onNotFound(context);
48
49
  }
49
50
  } else {
@@ -52,7 +53,7 @@ const compose = (middleware, onError, onNotFound) => {
52
53
  return dispatch(i + 1);
53
54
  });
54
55
  } catch (err) {
55
- if (err instanceof Error && context instanceof import_context.Context && onError) {
56
+ if (err instanceof Error && isContext && onError) {
56
57
  context.error = err;
57
58
  res = await onError(err, context);
58
59
  isError = true;
@@ -26,7 +26,9 @@ var import_request = require("./request");
26
26
  var import_html = require("./utils/html");
27
27
  const TEXT_PLAIN = "text/plain; charset=UTF-8";
28
28
  const setHeaders = (headers, map = {}) => {
29
- Object.entries(map).forEach(([key, value]) => headers.set(key, value));
29
+ for (const key of Object.keys(map)) {
30
+ headers.set(key, map[key]);
31
+ }
30
32
  return headers;
31
33
  };
32
34
  class Context {
@@ -173,7 +175,7 @@ class Context {
173
175
  }
174
176
  return Object.fromEntries(this.#var);
175
177
  }
176
- newResponse = (data, arg, headers) => {
178
+ #newResponse(data, arg, headers) {
177
179
  if (this.#isFresh && !headers && !arg && this.#status === 200) {
178
180
  return new Response(data, {
179
181
  headers: this.#preparedHeaders
@@ -225,9 +227,10 @@ class Context {
225
227
  status,
226
228
  headers: this.#headers
227
229
  });
228
- };
230
+ }
231
+ newResponse = (...args) => this.#newResponse(...args);
229
232
  body = (data, arg, headers) => {
230
- return typeof arg === "number" ? this.newResponse(data, arg, headers) : this.newResponse(data, arg);
233
+ return typeof arg === "number" ? this.#newResponse(data, arg, headers) : this.#newResponse(data, arg);
231
234
  };
232
235
  text = (text, arg, headers) => {
233
236
  if (!this.#preparedHeaders) {
@@ -237,27 +240,27 @@ class Context {
237
240
  this.#preparedHeaders = {};
238
241
  }
239
242
  this.#preparedHeaders["content-type"] = TEXT_PLAIN;
240
- return typeof arg === "number" ? this.newResponse(text, arg, headers) : this.newResponse(text, arg);
243
+ return typeof arg === "number" ? this.#newResponse(text, arg, headers) : this.#newResponse(text, arg);
241
244
  };
242
245
  json = (object, arg, headers) => {
243
246
  const body = JSON.stringify(object);
244
247
  this.#preparedHeaders ??= {};
245
248
  this.#preparedHeaders["content-type"] = "application/json; charset=UTF-8";
246
- return typeof arg === "number" ? this.newResponse(body, arg, headers) : this.newResponse(body, arg);
249
+ return typeof arg === "number" ? this.#newResponse(body, arg, headers) : this.#newResponse(body, arg);
247
250
  };
248
251
  html = (html, arg, headers) => {
249
252
  this.#preparedHeaders ??= {};
250
253
  this.#preparedHeaders["content-type"] = "text/html; charset=UTF-8";
251
254
  if (typeof html === "object") {
252
255
  return (0, import_html.resolveCallback)(html, import_html.HtmlEscapedCallbackPhase.Stringify, false, {}).then((html2) => {
253
- return typeof arg === "number" ? this.newResponse(html2, arg, headers) : this.newResponse(html2, arg);
256
+ return typeof arg === "number" ? this.#newResponse(html2, arg, headers) : this.#newResponse(html2, arg);
254
257
  });
255
258
  }
256
- return typeof arg === "number" ? this.newResponse(html, arg, headers) : this.newResponse(html, arg);
259
+ return typeof arg === "number" ? this.#newResponse(html, arg, headers) : this.#newResponse(html, arg);
257
260
  };
258
261
  redirect = (location, status) => {
259
262
  this.#headers ??= new Headers();
260
- this.#headers.set("Location", location);
263
+ this.#headers.set("Location", String(location));
261
264
  return this.newResponse(null, status ?? 302);
262
265
  };
263
266
  notFound = () => {
@@ -27,7 +27,7 @@ const html = (strings, ...values) => {
27
27
  const buffer = [""];
28
28
  for (let i = 0, len = strings.length - 1; i < len; i++) {
29
29
  buffer[0] += strings[i];
30
- const children = values[i] instanceof Array ? values[i].flat(Infinity) : [values[i]];
30
+ const children = Array.isArray(values[i]) ? values[i].flat(Infinity) : [values[i]];
31
31
  for (let i2 = 0, len2 = children.length; i2 < len2; i2++) {
32
32
  const child = children[i2];
33
33
  if (typeof child === "string") {
@@ -261,8 +261,8 @@ const toSSG = async (app, fs, options) => {
261
261
  result = { success: false, files: [], error: errorObj };
262
262
  }
263
263
  if (options?.afterGenerateHook) {
264
- const conbinedAfterGenerateHooks = combineAfterGenerateHooks(options?.afterGenerateHook);
265
- await conbinedAfterGenerateHooks(result);
264
+ const combinedAfterGenerateHooks = combineAfterGenerateHooks(options?.afterGenerateHook);
265
+ await combinedAfterGenerateHooks(result);
266
266
  }
267
267
  return result;
268
268
  };
@@ -26,8 +26,8 @@ module.exports = __toCommonJS(utils_exports);
26
26
  var import_router = require("../../router");
27
27
  var import_handler = require("../../utils/handler");
28
28
  const dirname = (path) => {
29
- const splittedPath = path.split(/[\/\\]/);
30
- return splittedPath.slice(0, -1).join("/");
29
+ const separatedPath = path.split(/[\/\\]/);
30
+ return separatedPath.slice(0, -1).join("/");
31
31
  };
32
32
  const normalizePath = (path) => {
33
33
  return path.replace(/(\\)/g, "/").replace(/\/$/g, "");
@@ -59,12 +59,10 @@ class Hono {
59
59
  if (typeof args1 === "string") {
60
60
  this.#path = args1;
61
61
  } else {
62
- this.addRoute(method, this.#path, args1);
62
+ this.#addRoute(method, this.#path, args1);
63
63
  }
64
64
  args.forEach((handler) => {
65
- if (typeof handler !== "string") {
66
- this.addRoute(method, this.#path, handler);
67
- }
65
+ this.#addRoute(method, this.#path, handler);
68
66
  });
69
67
  return this;
70
68
  };
@@ -74,7 +72,7 @@ class Hono {
74
72
  this.#path = p;
75
73
  for (const m of [method].flat()) {
76
74
  handlers.map((handler) => {
77
- this.addRoute(m.toUpperCase(), this.#path, handler);
75
+ this.#addRoute(m.toUpperCase(), this.#path, handler);
78
76
  });
79
77
  }
80
78
  }
@@ -88,7 +86,7 @@ class Hono {
88
86
  handlers.unshift(arg1);
89
87
  }
90
88
  handlers.forEach((handler) => {
91
- this.addRoute(import_router.METHOD_NAME_ALL, this.#path, handler);
89
+ this.#addRoute(import_router.METHOD_NAME_ALL, this.#path, handler);
92
90
  });
93
91
  return this;
94
92
  };
@@ -97,7 +95,7 @@ class Hono {
97
95
  Object.assign(this, options);
98
96
  this.getPath = strict ? options.getPath ?? import_url.getPath : import_url.getPathNoStrict;
99
97
  }
100
- clone() {
98
+ #clone() {
101
99
  const clone = new Hono({
102
100
  router: this.router,
103
101
  getPath: this.getPath
@@ -105,33 +103,33 @@ class Hono {
105
103
  clone.routes = this.routes;
106
104
  return clone;
107
105
  }
108
- notFoundHandler = notFoundHandler;
109
- errorHandler = errorHandler;
106
+ #notFoundHandler = notFoundHandler;
107
+ #errorHandler = errorHandler;
110
108
  route(path, app) {
111
109
  const subApp = this.basePath(path);
112
110
  app.routes.map((r) => {
113
111
  let handler;
114
- if (app.errorHandler === errorHandler) {
112
+ if (app.#errorHandler === errorHandler) {
115
113
  handler = r.handler;
116
114
  } else {
117
- handler = async (c, next) => (await (0, import_compose.compose)([], app.errorHandler)(c, () => r.handler(c, next))).res;
115
+ handler = async (c, next) => (await (0, import_compose.compose)([], app.#errorHandler)(c, () => r.handler(c, next))).res;
118
116
  handler[COMPOSED_HANDLER] = r.handler;
119
117
  }
120
- subApp.addRoute(r.method, r.path, handler);
118
+ subApp.#addRoute(r.method, r.path, handler);
121
119
  });
122
120
  return this;
123
121
  }
124
122
  basePath(path) {
125
- const subApp = this.clone();
123
+ const subApp = this.#clone();
126
124
  subApp._basePath = (0, import_url.mergePath)(this._basePath, path);
127
125
  return subApp;
128
126
  }
129
127
  onError = (handler) => {
130
- this.errorHandler = handler;
128
+ this.#errorHandler = handler;
131
129
  return this;
132
130
  };
133
131
  notFound = (handler) => {
134
- this.notFoundHandler = handler;
132
+ this.#notFoundHandler = handler;
135
133
  return this;
136
134
  };
137
135
  mount(path, applicationHandler, options) {
@@ -172,52 +170,49 @@ class Hono {
172
170
  }
173
171
  await next();
174
172
  };
175
- this.addRoute(import_router.METHOD_NAME_ALL, (0, import_url.mergePath)(path, "*"), handler);
173
+ this.#addRoute(import_router.METHOD_NAME_ALL, (0, import_url.mergePath)(path, "*"), handler);
176
174
  return this;
177
175
  }
178
- addRoute(method, path, handler) {
176
+ #addRoute(method, path, handler) {
179
177
  method = method.toUpperCase();
180
178
  path = (0, import_url.mergePath)(this._basePath, path);
181
179
  const r = { path, method, handler };
182
180
  this.router.add(method, path, [handler, r]);
183
181
  this.routes.push(r);
184
182
  }
185
- matchRoute(method, path) {
186
- return this.router.match(method, path);
187
- }
188
- handleError(err, c) {
183
+ #handleError(err, c) {
189
184
  if (err instanceof Error) {
190
- return this.errorHandler(err, c);
185
+ return this.#errorHandler(err, c);
191
186
  }
192
187
  throw err;
193
188
  }
194
- dispatch(request, executionCtx, env, method) {
189
+ #dispatch(request, executionCtx, env, method) {
195
190
  if (method === "HEAD") {
196
- return (async () => new Response(null, await this.dispatch(request, executionCtx, env, "GET")))();
191
+ return (async () => new Response(null, await this.#dispatch(request, executionCtx, env, "GET")))();
197
192
  }
198
193
  const path = this.getPath(request, { env });
199
- const matchResult = this.matchRoute(method, path);
194
+ const matchResult = this.router.match(method, path);
200
195
  const c = new import_context.Context(request, {
201
196
  path,
202
197
  matchResult,
203
198
  env,
204
199
  executionCtx,
205
- notFoundHandler: this.notFoundHandler
200
+ notFoundHandler: this.#notFoundHandler
206
201
  });
207
202
  if (matchResult[0].length === 1) {
208
203
  let res;
209
204
  try {
210
205
  res = matchResult[0][0][0][0](c, async () => {
211
- c.res = await this.notFoundHandler(c);
206
+ c.res = await this.#notFoundHandler(c);
212
207
  });
213
208
  } catch (err) {
214
- return this.handleError(err, c);
209
+ return this.#handleError(err, c);
215
210
  }
216
211
  return res instanceof Promise ? res.then(
217
- (resolved) => resolved || (c.finalized ? c.res : this.notFoundHandler(c))
218
- ).catch((err) => this.handleError(err, c)) : res ?? this.notFoundHandler(c);
212
+ (resolved) => resolved || (c.finalized ? c.res : this.#notFoundHandler(c))
213
+ ).catch((err) => this.#handleError(err, c)) : res ?? this.#notFoundHandler(c);
219
214
  }
220
- const composed = (0, import_compose.compose)(matchResult[0], this.errorHandler, this.notFoundHandler);
215
+ const composed = (0, import_compose.compose)(matchResult[0], this.#errorHandler, this.#notFoundHandler);
221
216
  return (async () => {
222
217
  try {
223
218
  const context = await composed(c);
@@ -228,28 +223,30 @@ class Hono {
228
223
  }
229
224
  return context.res;
230
225
  } catch (err) {
231
- return this.handleError(err, c);
226
+ return this.#handleError(err, c);
232
227
  }
233
228
  })();
234
229
  }
235
230
  fetch = (request, ...rest) => {
236
- return this.dispatch(request, rest[1], rest[0], request.method);
231
+ return this.#dispatch(request, rest[1], rest[0], request.method);
237
232
  };
238
233
  request = (input, requestInit, Env, executionCtx) => {
239
234
  if (input instanceof Request) {
240
- if (requestInit !== void 0) {
241
- input = new Request(input, requestInit);
242
- }
243
- return this.fetch(input, Env, executionCtx);
235
+ return this.fetch(requestInit ? new Request(input, requestInit) : input, Env, executionCtx);
244
236
  }
245
237
  input = input.toString();
246
- const path = /^https?:\/\//.test(input) ? input : `http://localhost${(0, import_url.mergePath)("/", input)}`;
247
- const req = new Request(path, requestInit);
248
- return this.fetch(req, Env, executionCtx);
238
+ return this.fetch(
239
+ new Request(
240
+ /^https?:\/\//.test(input) ? input : `http://localhost${(0, import_url.mergePath)("/", input)}`,
241
+ requestInit
242
+ ),
243
+ Env,
244
+ executionCtx
245
+ );
249
246
  };
250
247
  fire = () => {
251
248
  addEventListener("fetch", (event) => {
252
- event.respondWith(this.dispatch(event.request, event, void 0, event.request.method));
249
+ event.respondWith(this.#dispatch(event.request, event, void 0, event.request.method));
253
250
  });
254
251
  };
255
252
  }
@@ -34,7 +34,8 @@ __export(base_exports, {
34
34
  jsx: () => jsx,
35
35
  jsxFn: () => jsxFn,
36
36
  memo: () => memo,
37
- reactAPICompatVersion: () => reactAPICompatVersion
37
+ reactAPICompatVersion: () => reactAPICompatVersion,
38
+ shallowEqual: () => shallowEqual
38
39
  });
39
40
  module.exports = __toCommonJS(base_exports);
40
41
  var import_html = require("../helper/html");
@@ -308,13 +309,16 @@ const shallowEqual = (a, b) => {
308
309
  const memo = (component, propsAreEqual = shallowEqual) => {
309
310
  let computed = null;
310
311
  let prevProps = void 0;
311
- return (props) => {
312
+ const wrapper = (props) => {
312
313
  if (prevProps && !propsAreEqual(prevProps, props)) {
313
314
  computed = null;
314
315
  }
315
316
  prevProps = props;
316
317
  return computed ||= component(props);
317
318
  };
319
+ wrapper[import_constants.DOM_MEMO] = propsAreEqual;
320
+ wrapper[import_constants.DOM_RENDERER] = component;
321
+ return wrapper;
318
322
  };
319
323
  const Fragment = ({
320
324
  children
@@ -350,5 +354,6 @@ const reactAPICompatVersion = "19.0.0-hono-jsx";
350
354
  jsx,
351
355
  jsxFn,
352
356
  memo,
353
- reactAPICompatVersion
357
+ reactAPICompatVersion,
358
+ shallowEqual
354
359
  });
@@ -20,6 +20,7 @@ var constants_exports = {};
20
20
  __export(constants_exports, {
21
21
  DOM_ERROR_HANDLER: () => DOM_ERROR_HANDLER,
22
22
  DOM_INTERNAL_TAG: () => DOM_INTERNAL_TAG,
23
+ DOM_MEMO: () => DOM_MEMO,
23
24
  DOM_RENDERER: () => DOM_RENDERER,
24
25
  DOM_STASH: () => DOM_STASH,
25
26
  PERMALINK: () => PERMALINK
@@ -29,11 +30,13 @@ const DOM_RENDERER = Symbol("RENDERER");
29
30
  const DOM_ERROR_HANDLER = Symbol("ERROR_HANDLER");
30
31
  const DOM_STASH = Symbol("STASH");
31
32
  const DOM_INTERNAL_TAG = Symbol("INTERNAL");
33
+ const DOM_MEMO = Symbol("MEMO");
32
34
  const PERMALINK = Symbol("PERMALINK");
33
35
  // Annotate the CommonJS export names for ESM import in node:
34
36
  0 && (module.exports = {
35
37
  DOM_ERROR_HANDLER,
36
38
  DOM_INTERNAL_TAG,
39
+ DOM_MEMO,
37
40
  DOM_RENDERER,
38
41
  DOM_STASH,
39
42
  PERMALINK
@@ -33,7 +33,7 @@ __export(dom_exports, {
33
33
  forwardRef: () => import_hooks.forwardRef,
34
34
  isValidElement: () => import_base.isValidElement,
35
35
  jsx: () => createElement,
36
- memo: () => import_base.memo,
36
+ memo: () => memo,
37
37
  render: () => import_render2.render,
38
38
  startTransition: () => import_hooks.startTransition,
39
39
  startViewTransition: () => import_hooks.startViewTransition,
@@ -62,6 +62,7 @@ __export(dom_exports, {
62
62
  module.exports = __toCommonJS(dom_exports);
63
63
  var import_base = require("../base");
64
64
  var import_children = require("../children");
65
+ var import_constants = require("../constants");
65
66
  var import_context = require("../context");
66
67
  var import_hooks = require("../hooks");
67
68
  var import_components = require("./components");
@@ -93,6 +94,11 @@ const cloneElement = (element, props, ...children) => {
93
94
  element.key
94
95
  );
95
96
  };
97
+ const memo = (component, propsAreEqual = import_base.shallowEqual) => {
98
+ const wrapper = (props) => component(props);
99
+ wrapper[import_constants.DOM_MEMO] = propsAreEqual;
100
+ return wrapper;
101
+ };
96
102
  var dom_default = {
97
103
  version: import_base.reactAPICompatVersion,
98
104
  useState: import_hooks.useState,
@@ -122,7 +128,7 @@ var dom_default = {
122
128
  ErrorBoundary: import_components.ErrorBoundary,
123
129
  createContext: import_context2.createContext,
124
130
  useContext: import_context.useContext,
125
- memo: import_base.memo,
131
+ memo,
126
132
  isValidElement: import_base.isValidElement,
127
133
  createElement,
128
134
  cloneElement,