hono 4.6.8 → 4.6.9

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 (77) hide show
  1. package/dist/adapter/cloudflare-workers/websocket.js +34 -39
  2. package/dist/adapter/deno/serve-static.js +2 -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 +2 -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 +29 -32
  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/etag/digest.js +59 -0
  19. package/dist/cjs/middleware/etag/index.js +5 -2
  20. package/dist/cjs/middleware/ip-restriction/index.js +3 -3
  21. package/dist/cjs/middleware/jsx-renderer/index.js +2 -1
  22. package/dist/cjs/middleware/logger/index.js +13 -11
  23. package/dist/cjs/middleware/timing/timing.js +5 -7
  24. package/dist/cjs/request.js +15 -14
  25. package/dist/cjs/router/pattern-router/router.js +4 -4
  26. package/dist/cjs/router/reg-exp-router/router.js +5 -5
  27. package/dist/cjs/router/reg-exp-router/trie.js +2 -2
  28. package/dist/cjs/router/trie-router/node.js +9 -7
  29. package/dist/cjs/utils/color.js +1 -1
  30. package/dist/cjs/utils/cookie.js +13 -6
  31. package/dist/cjs/utils/crypto.js +0 -9
  32. package/dist/cjs/utils/jwt/jwt.js +1 -1
  33. package/dist/cjs/utils/mime.js +2 -1
  34. package/dist/cjs/utils/url.js +9 -6
  35. package/dist/client/client.js +3 -3
  36. package/dist/compose.js +4 -3
  37. package/dist/context.js +12 -9
  38. package/dist/helper/html/index.js +1 -1
  39. package/dist/helper/ssg/ssg.js +2 -2
  40. package/dist/helper/ssg/utils.js +2 -2
  41. package/dist/hono-base.js +29 -32
  42. package/dist/jsx/base.js +7 -3
  43. package/dist/jsx/constants.js +2 -0
  44. package/dist/jsx/dom/index.js +7 -1
  45. package/dist/jsx/dom/render.js +22 -13
  46. package/dist/middleware/etag/digest.js +36 -0
  47. package/dist/middleware/etag/index.js +5 -2
  48. package/dist/middleware/ip-restriction/index.js +3 -3
  49. package/dist/middleware/jsx-renderer/index.js +2 -1
  50. package/dist/middleware/logger/index.js +13 -11
  51. package/dist/middleware/timing/timing.js +5 -7
  52. package/dist/request.js +16 -15
  53. package/dist/router/pattern-router/router.js +4 -4
  54. package/dist/router/reg-exp-router/router.js +5 -5
  55. package/dist/router/reg-exp-router/trie.js +2 -2
  56. package/dist/router/trie-router/node.js +9 -7
  57. package/dist/types/adapter/cloudflare-workers/websocket.d.ts +2 -2
  58. package/dist/types/adapter/deno/websocket.d.ts +1 -20
  59. package/dist/types/context.d.ts +1 -1
  60. package/dist/types/helper/websocket/index.d.ts +1 -1
  61. package/dist/types/hono-base.d.ts +1 -1
  62. package/dist/types/jsx/base.d.ts +5 -0
  63. package/dist/types/jsx/constants.d.ts +1 -0
  64. package/dist/types/jsx/dom/index.d.ts +6 -5
  65. package/dist/types/jsx/dom/render.d.ts +1 -0
  66. package/dist/types/middleware/etag/digest.d.ts +1 -0
  67. package/dist/types/utils/body.d.ts +2 -2
  68. package/dist/types/utils/crypto.d.ts +2 -1
  69. package/dist/types/utils/mime.d.ts +58 -1
  70. package/dist/types/utils/url.d.ts +3 -0
  71. package/dist/utils/color.js +1 -1
  72. package/dist/utils/cookie.js +13 -6
  73. package/dist/utils/crypto.js +0 -9
  74. package/dist/utils/jwt/jwt.js +1 -1
  75. package/dist/utils/mime.js +2 -1
  76. package/dist/utils/url.js +7 -5
  77. package/package.json +1 -1
@@ -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
  };
@@ -6,11 +6,12 @@ var serveStatic = (options) => {
6
6
  const getContent = async (path) => {
7
7
  try {
8
8
  const file = await open(path);
9
- return file ? file.readable : null;
9
+ return file.readable;
10
10
  } catch (e) {
11
11
  if (!(e instanceof errors.NotFound)) {
12
12
  console.warn(`${e}`);
13
13
  }
14
+ return null;
14
15
  }
15
16
  };
16
17
  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
@@ -28,11 +28,12 @@ const serveStatic = (options) => {
28
28
  const getContent = async (path) => {
29
29
  try {
30
30
  const file = await open(path);
31
- return file ? file.readable : null;
31
+ return file.readable;
32
32
  } catch (e) {
33
33
  if (!(e instanceof errors.NotFound)) {
34
34
  console.warn(`${e}`);
35
35
  }
36
+ return null;
36
37
  }
37
38
  };
38
39
  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,11 +59,11 @@ 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
65
  if (typeof handler !== "string") {
66
- this.addRoute(method, this.#path, handler);
66
+ this.#addRoute(method, this.#path, handler);
67
67
  }
68
68
  });
69
69
  return this;
@@ -74,7 +74,7 @@ class Hono {
74
74
  this.#path = p;
75
75
  for (const m of [method].flat()) {
76
76
  handlers.map((handler) => {
77
- this.addRoute(m.toUpperCase(), this.#path, handler);
77
+ this.#addRoute(m.toUpperCase(), this.#path, handler);
78
78
  });
79
79
  }
80
80
  }
@@ -88,7 +88,7 @@ class Hono {
88
88
  handlers.unshift(arg1);
89
89
  }
90
90
  handlers.forEach((handler) => {
91
- this.addRoute(import_router.METHOD_NAME_ALL, this.#path, handler);
91
+ this.#addRoute(import_router.METHOD_NAME_ALL, this.#path, handler);
92
92
  });
93
93
  return this;
94
94
  };
@@ -97,7 +97,7 @@ class Hono {
97
97
  Object.assign(this, options);
98
98
  this.getPath = strict ? options.getPath ?? import_url.getPath : import_url.getPathNoStrict;
99
99
  }
100
- clone() {
100
+ #clone() {
101
101
  const clone = new Hono({
102
102
  router: this.router,
103
103
  getPath: this.getPath
@@ -105,33 +105,33 @@ class Hono {
105
105
  clone.routes = this.routes;
106
106
  return clone;
107
107
  }
108
- notFoundHandler = notFoundHandler;
109
- errorHandler = errorHandler;
108
+ #notFoundHandler = notFoundHandler;
109
+ #errorHandler = errorHandler;
110
110
  route(path, app) {
111
111
  const subApp = this.basePath(path);
112
112
  app.routes.map((r) => {
113
113
  let handler;
114
- if (app.errorHandler === errorHandler) {
114
+ if (app.#errorHandler === errorHandler) {
115
115
  handler = r.handler;
116
116
  } else {
117
- handler = async (c, next) => (await (0, import_compose.compose)([], app.errorHandler)(c, () => r.handler(c, next))).res;
117
+ handler = async (c, next) => (await (0, import_compose.compose)([], app.#errorHandler)(c, () => r.handler(c, next))).res;
118
118
  handler[COMPOSED_HANDLER] = r.handler;
119
119
  }
120
- subApp.addRoute(r.method, r.path, handler);
120
+ subApp.#addRoute(r.method, r.path, handler);
121
121
  });
122
122
  return this;
123
123
  }
124
124
  basePath(path) {
125
- const subApp = this.clone();
125
+ const subApp = this.#clone();
126
126
  subApp._basePath = (0, import_url.mergePath)(this._basePath, path);
127
127
  return subApp;
128
128
  }
129
129
  onError = (handler) => {
130
- this.errorHandler = handler;
130
+ this.#errorHandler = handler;
131
131
  return this;
132
132
  };
133
133
  notFound = (handler) => {
134
- this.notFoundHandler = handler;
134
+ this.#notFoundHandler = handler;
135
135
  return this;
136
136
  };
137
137
  mount(path, applicationHandler, options) {
@@ -172,52 +172,49 @@ class Hono {
172
172
  }
173
173
  await next();
174
174
  };
175
- this.addRoute(import_router.METHOD_NAME_ALL, (0, import_url.mergePath)(path, "*"), handler);
175
+ this.#addRoute(import_router.METHOD_NAME_ALL, (0, import_url.mergePath)(path, "*"), handler);
176
176
  return this;
177
177
  }
178
- addRoute(method, path, handler) {
178
+ #addRoute(method, path, handler) {
179
179
  method = method.toUpperCase();
180
180
  path = (0, import_url.mergePath)(this._basePath, path);
181
181
  const r = { path, method, handler };
182
182
  this.router.add(method, path, [handler, r]);
183
183
  this.routes.push(r);
184
184
  }
185
- matchRoute(method, path) {
186
- return this.router.match(method, path);
187
- }
188
- handleError(err, c) {
185
+ #handleError(err, c) {
189
186
  if (err instanceof Error) {
190
- return this.errorHandler(err, c);
187
+ return this.#errorHandler(err, c);
191
188
  }
192
189
  throw err;
193
190
  }
194
- dispatch(request, executionCtx, env, method) {
191
+ #dispatch(request, executionCtx, env, method) {
195
192
  if (method === "HEAD") {
196
- return (async () => new Response(null, await this.dispatch(request, executionCtx, env, "GET")))();
193
+ return (async () => new Response(null, await this.#dispatch(request, executionCtx, env, "GET")))();
197
194
  }
198
195
  const path = this.getPath(request, { env });
199
- const matchResult = this.matchRoute(method, path);
196
+ const matchResult = this.router.match(method, path);
200
197
  const c = new import_context.Context(request, {
201
198
  path,
202
199
  matchResult,
203
200
  env,
204
201
  executionCtx,
205
- notFoundHandler: this.notFoundHandler
202
+ notFoundHandler: this.#notFoundHandler
206
203
  });
207
204
  if (matchResult[0].length === 1) {
208
205
  let res;
209
206
  try {
210
207
  res = matchResult[0][0][0][0](c, async () => {
211
- c.res = await this.notFoundHandler(c);
208
+ c.res = await this.#notFoundHandler(c);
212
209
  });
213
210
  } catch (err) {
214
- return this.handleError(err, c);
211
+ return this.#handleError(err, c);
215
212
  }
216
213
  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);
214
+ (resolved) => resolved || (c.finalized ? c.res : this.#notFoundHandler(c))
215
+ ).catch((err) => this.#handleError(err, c)) : res ?? this.#notFoundHandler(c);
219
216
  }
220
- const composed = (0, import_compose.compose)(matchResult[0], this.errorHandler, this.notFoundHandler);
217
+ const composed = (0, import_compose.compose)(matchResult[0], this.#errorHandler, this.#notFoundHandler);
221
218
  return (async () => {
222
219
  try {
223
220
  const context = await composed(c);
@@ -228,12 +225,12 @@ class Hono {
228
225
  }
229
226
  return context.res;
230
227
  } catch (err) {
231
- return this.handleError(err, c);
228
+ return this.#handleError(err, c);
232
229
  }
233
230
  })();
234
231
  }
235
232
  fetch = (request, ...rest) => {
236
- return this.dispatch(request, rest[1], rest[0], request.method);
233
+ return this.#dispatch(request, rest[1], rest[0], request.method);
237
234
  };
238
235
  request = (input, requestInit, Env, executionCtx) => {
239
236
  if (input instanceof Request) {
@@ -249,7 +246,7 @@ class Hono {
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,