@depup/hono 4.12.12-depup.0 → 4.12.32-depup.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 (134) hide show
  1. package/README.md +2 -2
  2. package/changes.json +1 -1
  3. package/dist/adapter/aws-lambda/handler.js +25 -27
  4. package/dist/adapter/bun/serve-static.js +1 -1
  5. package/dist/adapter/bun/websocket.js +3 -1
  6. package/dist/adapter/cloudflare-workers/serve-static.js +1 -1
  7. package/dist/adapter/deno/serve-static.js +1 -1
  8. package/dist/adapter/deno/websocket.js +5 -1
  9. package/dist/adapter/lambda-edge/handler.js +20 -4
  10. package/dist/cjs/adapter/aws-lambda/handler.js +25 -27
  11. package/dist/cjs/adapter/bun/serve-static.js +1 -1
  12. package/dist/cjs/adapter/bun/websocket.js +3 -1
  13. package/dist/cjs/adapter/cloudflare-workers/serve-static.js +1 -1
  14. package/dist/cjs/adapter/deno/serve-static.js +1 -1
  15. package/dist/cjs/adapter/deno/websocket.js +5 -1
  16. package/dist/cjs/adapter/lambda-edge/handler.js +20 -4
  17. package/dist/cjs/client/client.js +10 -1
  18. package/dist/cjs/client/utils.js +1 -1
  19. package/dist/cjs/helper/css/common.js +3 -1
  20. package/dist/cjs/helper/css/index.js +9 -1
  21. package/dist/cjs/helper/ssg/ssg.js +2 -0
  22. package/dist/cjs/helper/streaming/sse.js +5 -4
  23. package/dist/cjs/hono-base.js +9 -4
  24. package/dist/cjs/index.js +3 -0
  25. package/dist/cjs/jsx/base.js +15 -15
  26. package/dist/cjs/jsx/components.js +41 -21
  27. package/dist/cjs/jsx/context.js +131 -5
  28. package/dist/cjs/jsx/dom/render.js +22 -9
  29. package/dist/cjs/jsx/jsx-runtime.js +3 -0
  30. package/dist/cjs/jsx/streaming.js +9 -7
  31. package/dist/cjs/jsx/utils.js +155 -5
  32. package/dist/cjs/middleware/bearer-auth/index.js +1 -1
  33. package/dist/cjs/middleware/body-limit/index.js +21 -30
  34. package/dist/cjs/middleware/cache/index.js +41 -28
  35. package/dist/cjs/middleware/compress/index.js +33 -6
  36. package/dist/cjs/middleware/cors/index.js +4 -10
  37. package/dist/cjs/middleware/etag/index.js +2 -1
  38. package/dist/cjs/middleware/ip-restriction/index.js +58 -28
  39. package/dist/cjs/middleware/jwk/jwk.js +1 -1
  40. package/dist/cjs/middleware/jwt/jwt.js +1 -1
  41. package/dist/cjs/middleware/language/language.js +10 -32
  42. package/dist/cjs/middleware/method-override/index.js +6 -4
  43. package/dist/cjs/middleware/secure-headers/secure-headers.js +10 -4
  44. package/dist/cjs/middleware/serve-static/index.js +2 -2
  45. package/dist/cjs/middleware/timing/timing.js +3 -1
  46. package/dist/cjs/middleware/trailing-slash/index.js +2 -2
  47. package/dist/cjs/request.js +23 -3
  48. package/dist/cjs/router/trie-router/node.js +9 -0
  49. package/dist/cjs/utils/accept.js +1 -1
  50. package/dist/cjs/utils/body.js +18 -4
  51. package/dist/cjs/utils/buffer.js +2 -1
  52. package/dist/cjs/utils/compress.js +1 -1
  53. package/dist/cjs/utils/cookie.js +4 -4
  54. package/dist/cjs/utils/filepath.js +1 -1
  55. package/dist/cjs/utils/ipaddr.js +193 -10
  56. package/dist/cjs/utils/jwt/jws.js +1 -1
  57. package/dist/cjs/utils/jwt/jwt.js +12 -6
  58. package/dist/cjs/utils/mime.js +15 -17
  59. package/dist/cjs/utils/stream.js +4 -2
  60. package/dist/cjs/utils/url.js +1 -1
  61. package/dist/cjs/validator/validator.js +3 -3
  62. package/dist/client/client.js +10 -1
  63. package/dist/client/utils.js +1 -1
  64. package/dist/helper/css/common.js +3 -1
  65. package/dist/helper/css/index.js +9 -1
  66. package/dist/helper/ssg/ssg.js +2 -0
  67. package/dist/helper/streaming/sse.js +5 -4
  68. package/dist/hono-base.js +9 -4
  69. package/dist/index.js +2 -0
  70. package/dist/jsx/base.js +28 -17
  71. package/dist/jsx/components.js +42 -22
  72. package/dist/jsx/context.js +129 -5
  73. package/dist/jsx/dom/render.js +22 -9
  74. package/dist/jsx/jsx-runtime.js +4 -1
  75. package/dist/jsx/streaming.js +10 -8
  76. package/dist/jsx/utils.js +153 -5
  77. package/dist/middleware/bearer-auth/index.js +1 -1
  78. package/dist/middleware/body-limit/index.js +21 -30
  79. package/dist/middleware/cache/index.js +41 -28
  80. package/dist/middleware/compress/index.js +32 -6
  81. package/dist/middleware/cors/index.js +4 -10
  82. package/dist/middleware/etag/index.js +2 -1
  83. package/dist/middleware/ip-restriction/index.js +60 -29
  84. package/dist/middleware/jwk/jwk.js +1 -1
  85. package/dist/middleware/jwt/jwt.js +1 -1
  86. package/dist/middleware/language/language.js +10 -32
  87. package/dist/middleware/method-override/index.js +6 -4
  88. package/dist/middleware/secure-headers/secure-headers.js +10 -4
  89. package/dist/middleware/serve-static/index.js +2 -2
  90. package/dist/middleware/timing/timing.js +3 -1
  91. package/dist/middleware/trailing-slash/index.js +2 -2
  92. package/dist/request.js +23 -3
  93. package/dist/router/trie-router/node.js +9 -0
  94. package/dist/types/adapter/aws-lambda/handler.d.ts +1 -1
  95. package/dist/types/adapter/aws-lambda/types.d.ts +9 -0
  96. package/dist/types/adapter/bun/serve-static.d.ts +1 -1
  97. package/dist/types/adapter/cloudflare-workers/serve-static.d.ts +2 -2
  98. package/dist/types/adapter/deno/serve-static.d.ts +1 -1
  99. package/dist/types/adapter/lambda-edge/handler.d.ts +1 -1
  100. package/dist/types/helper/websocket/index.d.ts +1 -1
  101. package/dist/types/index.d.ts +2 -1
  102. package/dist/types/jsx/base.d.ts +3 -5
  103. package/dist/types/jsx/context.d.ts +39 -0
  104. package/dist/types/jsx/index.d.ts +1 -1
  105. package/dist/types/jsx/utils.d.ts +3 -1
  106. package/dist/types/middleware/bearer-auth/index.d.ts +6 -5
  107. package/dist/types/middleware/cache/index.d.ts +3 -1
  108. package/dist/types/middleware/combine/index.d.ts +1 -1
  109. package/dist/types/middleware/compress/index.d.ts +13 -2
  110. package/dist/types/middleware/context-storage/index.d.ts +2 -2
  111. package/dist/types/middleware/cors/index.d.ts +1 -1
  112. package/dist/types/middleware/language/language.d.ts +18 -0
  113. package/dist/types/middleware/trailing-slash/index.d.ts +16 -0
  114. package/dist/types/request.d.ts +13 -0
  115. package/dist/types/types.d.ts +116 -116
  116. package/dist/types/utils/body.d.ts +1 -1
  117. package/dist/types/utils/ipaddr.d.ts +4 -0
  118. package/dist/types/utils/mime.d.ts +11 -11
  119. package/dist/types/utils/types.d.ts +1 -1
  120. package/dist/utils/accept.js +1 -1
  121. package/dist/utils/body.js +18 -4
  122. package/dist/utils/buffer.js +2 -1
  123. package/dist/utils/compress.js +1 -1
  124. package/dist/utils/cookie.js +4 -4
  125. package/dist/utils/filepath.js +1 -1
  126. package/dist/utils/ipaddr.js +192 -10
  127. package/dist/utils/jwt/jws.js +1 -1
  128. package/dist/utils/jwt/jwt.js +12 -6
  129. package/dist/utils/mime.js +15 -17
  130. package/dist/utils/stream.js +4 -2
  131. package/dist/utils/url.js +1 -1
  132. package/dist/validator/validator.js +3 -3
  133. package/package.json +32 -25
  134. package/dist/tsconfig.build.tsbuildinfo +0 -1
package/README.md CHANGED
@@ -13,8 +13,8 @@ npm install @depup/hono
13
13
 
14
14
  | Field | Value |
15
15
  |-------|-------|
16
- | Original | [hono](https://www.npmjs.com/package/hono) @ 4.12.12 |
17
- | Processed | 2026-04-07 |
16
+ | Original | [hono](https://www.npmjs.com/package/hono) @ 4.12.32 |
17
+ | Processed | 2026-07-24 |
18
18
  | Smoke test | passed |
19
19
  | Deps updated | 0 |
20
20
 
package/changes.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "bumped": {},
3
- "timestamp": "2026-04-07T04:52:34.791Z",
3
+ "timestamp": "2026-07-24T16:34:46.993Z",
4
4
  "totalUpdated": 0
5
5
  }
@@ -62,8 +62,15 @@ var streamHandle = (app) => {
62
62
  var handle = (app, { isContentTypeBinary } = { isContentTypeBinary: void 0 }) => {
63
63
  return async (event, lambdaContext) => {
64
64
  const processor = getProcessor(event);
65
- const req = processor.createRequest(event);
66
- const requestContext = getRequestContext(event);
65
+ let req, requestContext;
66
+ try {
67
+ req = processor.createRequest(event);
68
+ requestContext = getRequestContext(event);
69
+ } catch (error) {
70
+ console.error("Error processing request:", error);
71
+ const errorResponse = error instanceof TypeError ? new Response("Invalid request", { status: 400 }) : new Response("Internal Server Error", { status: 500 });
72
+ return processor.createResult(event, errorResponse, { isContentTypeBinary });
73
+ }
67
74
  const res = await app.fetch(req, {
68
75
  event,
69
76
  requestContext,
@@ -102,7 +109,9 @@ var EventProcessor = class {
102
109
  method
103
110
  };
104
111
  if (event.body) {
105
- requestInit.body = event.isBase64Encoded ? decodeBase64(event.body) : event.body;
112
+ const body = event.isBase64Encoded ? decodeBase64(event.body) : new TextEncoder().encode(event.body);
113
+ requestInit.body = body;
114
+ headers.set("content-length", body.length.toString());
106
115
  }
107
116
  return new Request(url, requestInit);
108
117
  }
@@ -200,21 +209,17 @@ var EventV1Processor = class extends EventProcessor {
200
209
  getHeaders(event) {
201
210
  const headers = new Headers();
202
211
  this.getCookies(event, headers);
203
- if (event.headers) {
204
- for (const [k, v] of Object.entries(event.headers)) {
205
- if (v) {
206
- headers.set(k, sanitizeHeaderValue(v));
207
- }
208
- }
209
- }
210
212
  if (event.multiValueHeaders) {
211
213
  for (const [k, values] of Object.entries(event.multiValueHeaders)) {
212
214
  if (values) {
213
- const foundK = headers.get(k);
214
- values.forEach((v) => {
215
- const sanitizedValue = sanitizeHeaderValue(v);
216
- return (!foundK || !foundK.includes(sanitizedValue)) && headers.append(k, sanitizedValue);
217
- });
215
+ values.forEach((v) => headers.append(k, sanitizeHeaderValue(v)));
216
+ }
217
+ }
218
+ }
219
+ if (event.headers) {
220
+ for (const [k, v] of Object.entries(event.headers)) {
221
+ if (v && !headers.has(k)) {
222
+ headers.set(k, sanitizeHeaderValue(v));
218
223
  }
219
224
  }
220
225
  }
@@ -274,7 +279,7 @@ var ALBProcessor = class extends EventProcessor {
274
279
  if (result.multiValueHeaders) {
275
280
  result.multiValueHeaders["set-cookie"] = cookies;
276
281
  } else {
277
- result.headers["set-cookie"] = cookies.join(", ");
282
+ result.headers["set-cookie"] = cookies[0];
278
283
  }
279
284
  }
280
285
  };
@@ -294,11 +299,7 @@ var LatticeV2Processor = class extends EventProcessor {
294
299
  if (event.headers) {
295
300
  for (const [k, values] of Object.entries(event.headers)) {
296
301
  if (values) {
297
- const foundK = headers.get(k);
298
- values.forEach((v) => {
299
- const sanitizedValue = sanitizeHeaderValue(v);
300
- return (!foundK || !foundK.includes(sanitizedValue)) && headers.append(k, sanitizedValue);
301
- });
302
+ values.forEach((v) => headers.append(k, sanitizeHeaderValue(v)));
302
303
  }
303
304
  }
304
305
  }
@@ -309,7 +310,7 @@ var LatticeV2Processor = class extends EventProcessor {
309
310
  setCookiesToResult(result, cookies) {
310
311
  result.headers = {
311
312
  ...result.headers,
312
- "set-cookie": cookies.join(", ")
313
+ "set-cookie": cookies
313
314
  };
314
315
  }
315
316
  };
@@ -333,7 +334,7 @@ var isProxyEventALB = (event) => {
333
334
  return false;
334
335
  };
335
336
  var isProxyEventV2 = (event) => {
336
- return Object.hasOwn(event, "rawPath");
337
+ return Object.hasOwn(event, "rawPath") && Object.hasOwn(event.requestContext ?? {}, "http");
337
338
  };
338
339
  var isLatticeEventV2 = (event) => {
339
340
  if (event.requestContext) {
@@ -347,10 +348,7 @@ var defaultIsContentTypeBinary = (contentType) => {
347
348
  );
348
349
  };
349
350
  var isContentEncodingBinary = (contentEncoding) => {
350
- if (contentEncoding === null) {
351
- return false;
352
- }
353
- return /^(gzip|deflate|compress|br)/.test(contentEncoding);
351
+ return !!contentEncoding && !/^identity$/i.test(contentEncoding);
354
352
  };
355
353
  export {
356
354
  ALBProcessor,
@@ -2,7 +2,7 @@
2
2
  import { stat } from "node:fs/promises";
3
3
  import { join } from "node:path";
4
4
  import { serveStatic as baseServeStatic } from "../../middleware/serve-static/index.js";
5
- var serveStatic = (options) => {
5
+ var serveStatic = (options = {}) => {
6
6
  return async function serveStatic2(c, next) {
7
7
  const getContent = async (path) => {
8
8
  const file = Bun.file(path);
@@ -24,7 +24,9 @@ var upgradeWebSocket = defineWebSocketHelper((c, events) => {
24
24
  data: {
25
25
  events,
26
26
  url: new URL(c.req.url),
27
- protocol: c.req.url
27
+ // The first requested subprotocol, exposed via WSContext.protocol to
28
+ // match the deno and cloudflare adapters.
29
+ protocol: c.req.header("sec-websocket-protocol")?.split(",")[0]?.trim() ?? ""
28
30
  }
29
31
  });
30
32
  if (upgradeResult) {
@@ -1,7 +1,7 @@
1
1
  // src/adapter/cloudflare-workers/serve-static.ts
2
2
  import { serveStatic as baseServeStatic } from "../../middleware/serve-static/index.js";
3
3
  import { getContentFromKVAsset } from "./utils.js";
4
- var serveStatic = (options) => {
4
+ var serveStatic = (options = {}) => {
5
5
  return async function serveStatic2(c, next) {
6
6
  const getContent = async (path) => {
7
7
  return getContentFromKVAsset(path, {
@@ -2,7 +2,7 @@
2
2
  import { join } from "node:path";
3
3
  import { serveStatic as baseServeStatic } from "../../middleware/serve-static/index.js";
4
4
  var { open, lstatSync, errors } = Deno;
5
- var serveStatic = (options) => {
5
+ var serveStatic = (options = {}) => {
6
6
  return async function serveStatic2(c, next) {
7
7
  const getContent = async (path) => {
8
8
  try {
@@ -4,7 +4,11 @@ var upgradeWebSocket = defineWebSocketHelper(async (c, events, options) => {
4
4
  if (c.req.header("upgrade") !== "websocket") {
5
5
  return;
6
6
  }
7
- const { response, socket } = Deno.upgradeWebSocket(c.req.raw, options ?? {});
7
+ const subprotocol = c.req.header("sec-websocket-protocol")?.split(",")[0]?.trim();
8
+ const { response, socket } = Deno.upgradeWebSocket(c.req.raw, {
9
+ ...subprotocol ? { protocol: subprotocol } : {},
10
+ ...options
11
+ });
8
12
  const wsContext = new WSContext({
9
13
  close: (code, reason) => socket.close(code, reason),
10
14
  get protocol() {
@@ -15,21 +15,31 @@ var convertHeaders = (headers) => {
15
15
  var handle = (app) => {
16
16
  return async (event, ...args) => {
17
17
  const [context, callback] = args;
18
+ let callbackError = null;
19
+ let callbackResult;
18
20
  const res = await app.fetch(createRequest(event), {
19
21
  event,
20
22
  context,
21
23
  callback: (err, result) => {
24
+ if (!callbackError && !callbackResult) {
25
+ callbackError = err;
26
+ callbackResult = result;
27
+ }
22
28
  callback?.(err, result);
23
29
  },
24
30
  config: event.Records[0].cf.config,
25
31
  request: event.Records[0].cf.request,
26
32
  response: event.Records[0].cf.response
27
33
  });
28
- return createResult(res);
34
+ if (callbackError) {
35
+ throw callbackError;
36
+ }
37
+ return callbackResult ?? createResult(res);
29
38
  };
30
39
  };
31
40
  var createResult = async (res) => {
32
- const isBase64Encoded = isContentTypeBinary(res.headers.get("content-type") || "");
41
+ const contentEncoding = res.headers.get("content-encoding");
42
+ const isBase64Encoded = isContentTypeBinary(res.headers.get("content-type") || "") || !!contentEncoding && !/^identity$/i.test(contentEncoding);
33
43
  const body = isBase64Encoded ? encodeBase64(await res.arrayBuffer()) : await res.text();
34
44
  return {
35
45
  status: res.status.toString(),
@@ -45,11 +55,17 @@ var createRequest = (event) => {
45
55
  const url = queryString ? `${urlPath}?${queryString}` : urlPath;
46
56
  const headers = new Headers();
47
57
  Object.entries(event.Records[0].cf.request.headers).forEach(([k, v]) => {
48
- v.forEach((header) => headers.set(k, header.value));
58
+ v.forEach((header) => headers.append(k, header.value));
49
59
  });
50
60
  const requestBody = event.Records[0].cf.request.body;
51
61
  const method = event.Records[0].cf.request.method;
52
- const body = createBody(method, requestBody);
62
+ const rawBody = createBody(method, requestBody);
63
+ let body = rawBody;
64
+ if (rawBody !== void 0) {
65
+ const bytes = typeof rawBody === "string" ? new TextEncoder().encode(rawBody) : rawBody;
66
+ body = bytes;
67
+ headers.set("content-length", bytes.length.toString());
68
+ }
53
69
  return new Request(url, {
54
70
  headers,
55
71
  method,
@@ -92,8 +92,15 @@ const streamHandle = (app) => {
92
92
  const handle = (app, { isContentTypeBinary } = { isContentTypeBinary: void 0 }) => {
93
93
  return async (event, lambdaContext) => {
94
94
  const processor = getProcessor(event);
95
- const req = processor.createRequest(event);
96
- const requestContext = getRequestContext(event);
95
+ let req, requestContext;
96
+ try {
97
+ req = processor.createRequest(event);
98
+ requestContext = getRequestContext(event);
99
+ } catch (error) {
100
+ console.error("Error processing request:", error);
101
+ const errorResponse = error instanceof TypeError ? new Response("Invalid request", { status: 400 }) : new Response("Internal Server Error", { status: 500 });
102
+ return processor.createResult(event, errorResponse, { isContentTypeBinary });
103
+ }
97
104
  const res = await app.fetch(req, {
98
105
  event,
99
106
  requestContext,
@@ -132,7 +139,9 @@ class EventProcessor {
132
139
  method
133
140
  };
134
141
  if (event.body) {
135
- requestInit.body = event.isBase64Encoded ? (0, import_encode.decodeBase64)(event.body) : event.body;
142
+ const body = event.isBase64Encoded ? (0, import_encode.decodeBase64)(event.body) : new TextEncoder().encode(event.body);
143
+ requestInit.body = body;
144
+ headers.set("content-length", body.length.toString());
136
145
  }
137
146
  return new Request(url, requestInit);
138
147
  }
@@ -230,21 +239,17 @@ class EventV1Processor extends EventProcessor {
230
239
  getHeaders(event) {
231
240
  const headers = new Headers();
232
241
  this.getCookies(event, headers);
233
- if (event.headers) {
234
- for (const [k, v] of Object.entries(event.headers)) {
235
- if (v) {
236
- headers.set(k, sanitizeHeaderValue(v));
237
- }
238
- }
239
- }
240
242
  if (event.multiValueHeaders) {
241
243
  for (const [k, values] of Object.entries(event.multiValueHeaders)) {
242
244
  if (values) {
243
- const foundK = headers.get(k);
244
- values.forEach((v) => {
245
- const sanitizedValue = sanitizeHeaderValue(v);
246
- return (!foundK || !foundK.includes(sanitizedValue)) && headers.append(k, sanitizedValue);
247
- });
245
+ values.forEach((v) => headers.append(k, sanitizeHeaderValue(v)));
246
+ }
247
+ }
248
+ }
249
+ if (event.headers) {
250
+ for (const [k, v] of Object.entries(event.headers)) {
251
+ if (v && !headers.has(k)) {
252
+ headers.set(k, sanitizeHeaderValue(v));
248
253
  }
249
254
  }
250
255
  }
@@ -304,7 +309,7 @@ class ALBProcessor extends EventProcessor {
304
309
  if (result.multiValueHeaders) {
305
310
  result.multiValueHeaders["set-cookie"] = cookies;
306
311
  } else {
307
- result.headers["set-cookie"] = cookies.join(", ");
312
+ result.headers["set-cookie"] = cookies[0];
308
313
  }
309
314
  }
310
315
  }
@@ -324,11 +329,7 @@ class LatticeV2Processor extends EventProcessor {
324
329
  if (event.headers) {
325
330
  for (const [k, values] of Object.entries(event.headers)) {
326
331
  if (values) {
327
- const foundK = headers.get(k);
328
- values.forEach((v) => {
329
- const sanitizedValue = sanitizeHeaderValue(v);
330
- return (!foundK || !foundK.includes(sanitizedValue)) && headers.append(k, sanitizedValue);
331
- });
332
+ values.forEach((v) => headers.append(k, sanitizeHeaderValue(v)));
332
333
  }
333
334
  }
334
335
  }
@@ -339,7 +340,7 @@ class LatticeV2Processor extends EventProcessor {
339
340
  setCookiesToResult(result, cookies) {
340
341
  result.headers = {
341
342
  ...result.headers,
342
- "set-cookie": cookies.join(", ")
343
+ "set-cookie": cookies
343
344
  };
344
345
  }
345
346
  }
@@ -363,7 +364,7 @@ const isProxyEventALB = (event) => {
363
364
  return false;
364
365
  };
365
366
  const isProxyEventV2 = (event) => {
366
- return Object.hasOwn(event, "rawPath");
367
+ return Object.hasOwn(event, "rawPath") && Object.hasOwn(event.requestContext ?? {}, "http");
367
368
  };
368
369
  const isLatticeEventV2 = (event) => {
369
370
  if (event.requestContext) {
@@ -377,10 +378,7 @@ const defaultIsContentTypeBinary = (contentType) => {
377
378
  );
378
379
  };
379
380
  const isContentEncodingBinary = (contentEncoding) => {
380
- if (contentEncoding === null) {
381
- return false;
382
- }
383
- return /^(gzip|deflate|compress|br)/.test(contentEncoding);
381
+ return !!contentEncoding && !/^identity$/i.test(contentEncoding);
384
382
  };
385
383
  // Annotate the CommonJS export names for ESM import in node:
386
384
  0 && (module.exports = {
@@ -23,7 +23,7 @@ module.exports = __toCommonJS(serve_static_exports);
23
23
  var import_promises = require("node:fs/promises");
24
24
  var import_node_path = require("node:path");
25
25
  var import_serve_static = require("../../middleware/serve-static");
26
- const serveStatic = (options) => {
26
+ const serveStatic = (options = {}) => {
27
27
  return async function serveStatic2(c, next) {
28
28
  const getContent = async (path) => {
29
29
  const file = Bun.file(path);
@@ -48,7 +48,9 @@ const upgradeWebSocket = (0, import_websocket.defineWebSocketHelper)((c, events)
48
48
  data: {
49
49
  events,
50
50
  url: new URL(c.req.url),
51
- protocol: c.req.url
51
+ // The first requested subprotocol, exposed via WSContext.protocol to
52
+ // match the deno and cloudflare adapters.
53
+ protocol: c.req.header("sec-websocket-protocol")?.split(",")[0]?.trim() ?? ""
52
54
  }
53
55
  });
54
56
  if (upgradeResult) {
@@ -22,7 +22,7 @@ __export(serve_static_exports, {
22
22
  module.exports = __toCommonJS(serve_static_exports);
23
23
  var import_serve_static = require("../../middleware/serve-static");
24
24
  var import_utils = require("./utils");
25
- const serveStatic = (options) => {
25
+ const serveStatic = (options = {}) => {
26
26
  return async function serveStatic2(c, next) {
27
27
  const getContent = async (path) => {
28
28
  return (0, import_utils.getContentFromKVAsset)(path, {
@@ -23,7 +23,7 @@ module.exports = __toCommonJS(serve_static_exports);
23
23
  var import_node_path = require("node:path");
24
24
  var import_serve_static = require("../../middleware/serve-static");
25
25
  const { open, lstatSync, errors } = Deno;
26
- const serveStatic = (options) => {
26
+ const serveStatic = (options = {}) => {
27
27
  return async function serveStatic2(c, next) {
28
28
  const getContent = async (path) => {
29
29
  try {
@@ -25,7 +25,11 @@ const upgradeWebSocket = (0, import_websocket.defineWebSocketHelper)(async (c, e
25
25
  if (c.req.header("upgrade") !== "websocket") {
26
26
  return;
27
27
  }
28
- const { response, socket } = Deno.upgradeWebSocket(c.req.raw, options ?? {});
28
+ const subprotocol = c.req.header("sec-websocket-protocol")?.split(",")[0]?.trim();
29
+ const { response, socket } = Deno.upgradeWebSocket(c.req.raw, {
30
+ ...subprotocol ? { protocol: subprotocol } : {},
31
+ ...options
32
+ });
29
33
  const wsContext = new import_websocket.WSContext({
30
34
  close: (code, reason) => socket.close(code, reason),
31
35
  get protocol() {
@@ -48,21 +48,31 @@ const convertHeaders = (headers) => {
48
48
  const handle = (app) => {
49
49
  return async (event, ...args) => {
50
50
  const [context, callback] = args;
51
+ let callbackError = null;
52
+ let callbackResult;
51
53
  const res = await app.fetch(createRequest(event), {
52
54
  event,
53
55
  context,
54
56
  callback: (err, result) => {
57
+ if (!callbackError && !callbackResult) {
58
+ callbackError = err;
59
+ callbackResult = result;
60
+ }
55
61
  callback?.(err, result);
56
62
  },
57
63
  config: event.Records[0].cf.config,
58
64
  request: event.Records[0].cf.request,
59
65
  response: event.Records[0].cf.response
60
66
  });
61
- return createResult(res);
67
+ if (callbackError) {
68
+ throw callbackError;
69
+ }
70
+ return callbackResult ?? createResult(res);
62
71
  };
63
72
  };
64
73
  const createResult = async (res) => {
65
- const isBase64Encoded = isContentTypeBinary(res.headers.get("content-type") || "");
74
+ const contentEncoding = res.headers.get("content-encoding");
75
+ const isBase64Encoded = isContentTypeBinary(res.headers.get("content-type") || "") || !!contentEncoding && !/^identity$/i.test(contentEncoding);
66
76
  const body = isBase64Encoded ? (0, import_encode.encodeBase64)(await res.arrayBuffer()) : await res.text();
67
77
  return {
68
78
  status: res.status.toString(),
@@ -78,11 +88,17 @@ const createRequest = (event) => {
78
88
  const url = queryString ? `${urlPath}?${queryString}` : urlPath;
79
89
  const headers = new Headers();
80
90
  Object.entries(event.Records[0].cf.request.headers).forEach(([k, v]) => {
81
- v.forEach((header) => headers.set(k, header.value));
91
+ v.forEach((header) => headers.append(k, header.value));
82
92
  });
83
93
  const requestBody = event.Records[0].cf.request.body;
84
94
  const method = event.Records[0].cf.request.method;
85
- const body = createBody(method, requestBody);
95
+ const rawBody = createBody(method, requestBody);
96
+ let body = rawBody;
97
+ if (rawBody !== void 0) {
98
+ const bytes = typeof rawBody === "string" ? new TextEncoder().encode(rawBody) : rawBody;
99
+ body = bytes;
100
+ headers.set("content-length", bytes.length.toString());
101
+ }
86
102
  return new Request(url, {
87
103
  headers,
88
104
  method,
@@ -184,7 +184,16 @@ const hc = (baseUrl, options) => createProxy(function proxyCallback(opts) {
184
184
  });
185
185
  if (method) {
186
186
  options ??= {};
187
- const args = (0, import_utils.deepMerge)(options, { ...opts.args[1] });
187
+ const reqOptions = { ...opts.args[1] };
188
+ const baseHeaders = options.headers;
189
+ const reqHeaders = reqOptions.headers;
190
+ if (baseHeaders && reqHeaders) {
191
+ reqOptions.headers = async () => ({
192
+ ...typeof baseHeaders === "function" ? await baseHeaders() : baseHeaders,
193
+ ...typeof reqHeaders === "function" ? await reqHeaders() : reqHeaders
194
+ });
195
+ }
196
+ const args = (0, import_utils.deepMerge)(options, reqOptions);
188
197
  return req.fetch(opts.args[0], args);
189
198
  }
190
199
  return req;
@@ -36,7 +36,7 @@ const mergePath = (base, path) => {
36
36
  };
37
37
  const replaceUrlParam = (urlString, params) => {
38
38
  for (const [k, v] of Object.entries(params)) {
39
- const reg = new RegExp("/:" + k + "(?:{[^/]+})?\\??");
39
+ const reg = new RegExp("/:" + k + "(?:{[^/]+})?\\??(?=/|$)");
40
40
  urlString = urlString.replace(reg, v ? `/${v}` : "");
41
41
  }
42
42
  return urlString;
@@ -61,6 +61,7 @@ const normalizeLabel = (label) => {
61
61
  return label.trim().replace(/\s+/g, "-");
62
62
  };
63
63
  const isValidClassName = (name) => /^-?[_a-zA-Z][_a-zA-Z0-9-]*$/.test(name);
64
+ const hasUnsafeSelectorChar = (name) => /[<{}]/.test(name);
64
65
  const RESERVED_KEYFRAME_NAMES = /* @__PURE__ */ new Set([
65
66
  "default",
66
67
  "inherit",
@@ -198,7 +199,8 @@ const cxCommon = (args) => {
198
199
  [CLASS_NAME]: "",
199
200
  [STYLE_STRING]: "",
200
201
  [SELECTORS]: [],
201
- [EXTERNAL_CLASS_NAMES]: [arg]
202
+ // drop names that are unsafe to emit as a selector
203
+ [EXTERNAL_CLASS_NAMES]: hasUnsafeSelectorChar(arg) ? [] : [arg]
202
204
  };
203
205
  }
204
206
  }
@@ -29,6 +29,7 @@ module.exports = __toCommonJS(css_exports);
29
29
  var import_html = require("../../helper/html");
30
30
  var import_constants = require("../../jsx/constants");
31
31
  var import_css = require("../../jsx/dom/css");
32
+ var import_html2 = require("../../utils/html");
32
33
  var import_common = require("./common");
33
34
  var import_common2 = require("./common");
34
35
  const createCssContext = ({
@@ -88,7 +89,14 @@ const createCssContext = ({
88
89
  }
89
90
  return Promise.resolve((0, import_html.raw)("", [appendStyle]));
90
91
  };
91
- const className = new String(cssClassName[import_common.CLASS_NAME]);
92
+ const rawClassName = cssClassName[import_common.CLASS_NAME];
93
+ let escapedClassName = rawClassName;
94
+ if (/[&<>'"]/.test(rawClassName)) {
95
+ const escapedBuffer = [""];
96
+ (0, import_html2.escapeToBuffer)(rawClassName, escapedBuffer);
97
+ escapedClassName = escapedBuffer[0];
98
+ }
99
+ const className = new String(escapedClassName);
92
100
  Object.assign(className, cssClassName);
93
101
  className.isEscaped = true;
94
102
  className.callbacks = [addClassNameToContext];
@@ -69,6 +69,8 @@ const defaultExtensionMap = {
69
69
  "text/html": "html",
70
70
  "text/xml": "xml",
71
71
  "application/xml": "xml",
72
+ "application/atom+xml": "xml",
73
+ "application/rss+xml": "xml",
72
74
  "application/yaml": "yaml"
73
75
  };
74
76
  const determineExtension = (mimeType, userExtensionMap) => {
@@ -33,16 +33,17 @@ class SSEStreamingApi extends import_stream.StreamingApi {
33
33
  const dataLines = data.split(/\r\n|\r|\n/).map((line) => {
34
34
  return `data: ${line}`;
35
35
  }).join("\n");
36
- for (const key of ["event", "id", "retry"]) {
37
- if (message[key] && /[\r\n]/.test(message[key])) {
36
+ for (const key of ["event", "id"]) {
37
+ const value = message[key];
38
+ if (value && /[\r\n]/.test(value)) {
38
39
  throw new Error(`${key} must not contain "\\r" or "\\n"`);
39
40
  }
40
41
  }
41
42
  const sseData = [
42
43
  message.event && `event: ${message.event}`,
43
44
  dataLines,
44
- message.id && `id: ${message.id}`,
45
- message.retry && `retry: ${message.retry}`
45
+ message.id !== void 0 && `id: ${message.id}`,
46
+ message.retry !== void 0 && `retry: ${message.retry}`
46
47
  ].filter(Boolean).join("\n") + "\n\n";
47
48
  await this.write(sseData);
48
49
  }
@@ -139,7 +139,7 @@ class Hono {
139
139
  handler = async (c, next) => (await (0, import_compose.compose)([], app.errorHandler)(c, () => r.handler(c, next))).res;
140
140
  handler[import_constants.COMPOSED_HANDLER] = r.handler;
141
141
  }
142
- subApp.#addRoute(r.method, r.path, handler);
142
+ subApp.#addRoute(r.method, r.path, handler, r.basePath);
143
143
  });
144
144
  return this;
145
145
  }
@@ -263,7 +263,7 @@ class Hono {
263
263
  const pathPrefixLength = mergedPath === "/" ? 0 : mergedPath.length;
264
264
  return (request) => {
265
265
  const url = new URL(request.url);
266
- url.pathname = url.pathname.slice(pathPrefixLength) || "/";
266
+ url.pathname = this.getPath(request).slice(pathPrefixLength) || "/";
267
267
  return new Request(url, request);
268
268
  };
269
269
  })();
@@ -277,10 +277,15 @@ class Hono {
277
277
  this.#addRoute(import_router.METHOD_NAME_ALL, (0, import_url.mergePath)(path, "*"), handler);
278
278
  return this;
279
279
  }
280
- #addRoute(method, path, handler) {
280
+ #addRoute(method, path, handler, baseRoutePath) {
281
281
  method = method.toUpperCase();
282
282
  path = (0, import_url.mergePath)(this._basePath, path);
283
- const r = { basePath: this._basePath, path, method, handler };
283
+ const r = {
284
+ basePath: baseRoutePath !== void 0 ? (0, import_url.mergePath)(this._basePath, baseRoutePath) : this._basePath,
285
+ path,
286
+ method,
287
+ handler
288
+ };
284
289
  this.router.add(method, path, [handler, r]);
285
290
  this.routes.push(r);
286
291
  }
package/dist/cjs/index.js CHANGED
@@ -17,11 +17,14 @@ var __copyProps = (to, from, except, desc) => {
17
17
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
18
18
  var index_exports = {};
19
19
  __export(index_exports, {
20
+ Context: () => import_context.Context,
20
21
  Hono: () => import_hono.Hono
21
22
  });
22
23
  module.exports = __toCommonJS(index_exports);
23
24
  var import_hono = require("./hono");
25
+ var import_context = require("./context");
24
26
  // Annotate the CommonJS export names for ESM import in node:
25
27
  0 && (module.exports = {
28
+ Context,
26
29
  Hono
27
30
  });