hono 4.12.30 → 4.12.31

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.
@@ -33,8 +33,9 @@ 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
  }
@@ -42,7 +43,7 @@ class SSEStreamingApi extends import_stream.StreamingApi {
42
43
  message.event && `event: ${message.event}`,
43
44
  dataLines,
44
45
  message.id && `id: ${message.id}`,
45
- message.retry && `retry: ${message.retry}`
46
+ message.retry !== void 0 && `retry: ${message.retry}`
46
47
  ].filter(Boolean).join("\n") + "\n\n";
47
48
  await this.write(sseData);
48
49
  }
@@ -316,11 +316,16 @@ const cloneRawRequest = async (req) => {
316
316
  message: "Cannot clone request: body was already consumed and not cached. Please use HonoRequest methods (e.g., req.json(), req.text()) instead of consuming req.raw directly."
317
317
  });
318
318
  }
319
+ const body = await req[cacheKey]();
320
+ const headers = req.header();
321
+ if (body instanceof FormData) {
322
+ delete headers["content-type"];
323
+ }
319
324
  const requestInit = {
320
- body: await req[cacheKey](),
325
+ body,
321
326
  cache: req.raw.cache,
322
327
  credentials: req.raw.credentials,
323
- headers: req.header(),
328
+ headers,
324
329
  integrity: req.raw.integrity,
325
330
  keepalive: req.raw.keepalive,
326
331
  method: req.method,
@@ -33,6 +33,12 @@ const parseBody = async (request, options = /* @__PURE__ */ Object.create(null))
33
33
  return {};
34
34
  };
35
35
  async function parseFormData(request, options) {
36
+ if (!isRawRequest(request) && request.bodyCache.formData) {
37
+ return convertFormDataToBodyData(
38
+ await request.bodyCache.formData,
39
+ options
40
+ );
41
+ }
36
42
  const headers = isRawRequest(request) ? request.headers : request.raw.headers;
37
43
  const arrayBuffer = await request.arrayBuffer();
38
44
  const formDataPromise = (0, import_buffer.bufferToFormData)(arrayBuffer, headers.get("Content-Type") || "");
@@ -11,8 +11,9 @@ var SSEStreamingApi = class extends StreamingApi {
11
11
  const dataLines = data.split(/\r\n|\r|\n/).map((line) => {
12
12
  return `data: ${line}`;
13
13
  }).join("\n");
14
- for (const key of ["event", "id", "retry"]) {
15
- if (message[key] && /[\r\n]/.test(message[key])) {
14
+ for (const key of ["event", "id"]) {
15
+ const value = message[key];
16
+ if (value && /[\r\n]/.test(value)) {
16
17
  throw new Error(`${key} must not contain "\\r" or "\\n"`);
17
18
  }
18
19
  }
@@ -20,7 +21,7 @@ var SSEStreamingApi = class extends StreamingApi {
20
21
  message.event && `event: ${message.event}`,
21
22
  dataLines,
22
23
  message.id && `id: ${message.id}`,
23
- message.retry && `retry: ${message.retry}`
24
+ message.retry !== void 0 && `retry: ${message.retry}`
24
25
  ].filter(Boolean).join("\n") + "\n\n";
25
26
  await this.write(sseData);
26
27
  }
package/dist/request.js CHANGED
@@ -294,11 +294,16 @@ var cloneRawRequest = async (req) => {
294
294
  message: "Cannot clone request: body was already consumed and not cached. Please use HonoRequest methods (e.g., req.json(), req.text()) instead of consuming req.raw directly."
295
295
  });
296
296
  }
297
+ const body = await req[cacheKey]();
298
+ const headers = req.header();
299
+ if (body instanceof FormData) {
300
+ delete headers["content-type"];
301
+ }
297
302
  const requestInit = {
298
- body: await req[cacheKey](),
303
+ body,
299
304
  cache: req.raw.cache,
300
305
  credentials: req.raw.credentials,
301
- headers: req.header(),
306
+ headers,
302
307
  integrity: req.raw.integrity,
303
308
  keepalive: req.raw.keepalive,
304
309
  method: req.method,
@@ -71,7 +71,7 @@ export declare const every: (...middleware: (MiddlewareHandler | Condition)[]) =
71
71
  * @example
72
72
  * ```ts
73
73
  * import { except } from 'hono/combine'
74
- * import { bearerAuth } from 'hono/bearer-auth
74
+ * import { bearerAuth } from 'hono/bearer-auth'
75
75
  *
76
76
  * // If client is accessing public API, then skip authentication.
77
77
  * // Otherwise, require a valid token.
@@ -12,6 +12,12 @@ var parseBody = async (request, options = /* @__PURE__ */ Object.create(null)) =
12
12
  return {};
13
13
  };
14
14
  async function parseFormData(request, options) {
15
+ if (!isRawRequest(request) && request.bodyCache.formData) {
16
+ return convertFormDataToBodyData(
17
+ await request.bodyCache.formData,
18
+ options
19
+ );
20
+ }
15
21
  const headers = isRawRequest(request) ? request.headers : request.raw.headers;
16
22
  const arrayBuffer = await request.arrayBuffer();
17
23
  const formDataPromise = bufferToFormData(arrayBuffer, headers.get("Content-Type") || "");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hono",
3
- "version": "4.12.30",
3
+ "version": "4.12.31",
4
4
  "description": "Web framework built on Web Standards",
5
5
  "main": "dist/cjs/index.js",
6
6
  "type": "module",