hono 4.3.2 → 4.3.4

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.
@@ -76,7 +76,8 @@ var EventProcessor = class {
76
76
  if (event.multiValueHeaders) {
77
77
  for (const [k, values] of Object.entries(event.multiValueHeaders)) {
78
78
  if (values) {
79
- values.forEach((v) => headers.append(k, v));
79
+ const foundK = headers.get(k);
80
+ values.forEach((v) => (!foundK || !foundK.includes(v)) && headers.append(k, v));
80
81
  }
81
82
  }
82
83
  }
@@ -179,6 +180,7 @@ var isContentEncodingBinary = (contentEncoding) => {
179
180
  return /^(gzip|deflate|compress|br)/.test(contentEncoding);
180
181
  };
181
182
  export {
183
+ getProcessor,
182
184
  handle,
183
185
  isContentEncodingBinary,
184
186
  isContentTypeBinary,
@@ -24,6 +24,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
24
24
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
25
25
  var handler_exports = {};
26
26
  __export(handler_exports, {
27
+ getProcessor: () => getProcessor,
27
28
  handle: () => handle,
28
29
  isContentEncodingBinary: () => isContentEncodingBinary,
29
30
  isContentTypeBinary: () => isContentTypeBinary,
@@ -107,7 +108,8 @@ class EventProcessor {
107
108
  if (event.multiValueHeaders) {
108
109
  for (const [k, values] of Object.entries(event.multiValueHeaders)) {
109
110
  if (values) {
110
- values.forEach((v) => headers.append(k, v));
111
+ const foundK = headers.get(k);
112
+ values.forEach((v) => (!foundK || !foundK.includes(v)) && headers.append(k, v));
111
113
  }
112
114
  }
113
115
  }
@@ -211,6 +213,7 @@ const isContentEncodingBinary = (contentEncoding) => {
211
213
  };
212
214
  // Annotate the CommonJS export names for ESM import in node:
213
215
  0 && (module.exports = {
216
+ getProcessor,
214
217
  handle,
215
218
  isContentEncodingBinary,
216
219
  isContentTypeBinary,
@@ -37,9 +37,9 @@ class Factory {
37
37
  return app;
38
38
  };
39
39
  createMiddleware = (middleware) => middleware;
40
- createHandlers(...handlers) {
40
+ createHandlers = (...handlers) => {
41
41
  return handlers.filter((handler) => handler !== void 0);
42
- }
42
+ };
43
43
  }
44
44
  const createFactory = (init) => new Factory(init);
45
45
  const createMiddleware = (middleware) => createFactory().createMiddleware(middleware);
@@ -446,7 +446,10 @@ const update = async (context, node) => {
446
446
  };
447
447
  const render = (jsxNode, container) => {
448
448
  const node = buildNode({ tag: "", props: { children: jsxNode } });
449
- build([], node, void 0);
449
+ const context = [];
450
+ context[4] = true;
451
+ build(context, node, void 0);
452
+ context[4] = false;
450
453
  const fragment = document.createDocumentFragment();
451
454
  apply(node, fragment);
452
455
  replaceContainer(node, fragment, container);
@@ -320,19 +320,26 @@ const useImperativeHandle = (ref, createHandle, deps) => {
320
320
  };
321
321
  }, deps);
322
322
  };
323
- let useSyncExternalStoreGetServerSnapshotNotified = false;
324
323
  const useSyncExternalStore = (subscribe, getSnapshot, getServerSnapshot) => {
325
- const [state, setState] = useState(getSnapshot());
326
- useEffect(
327
- () => subscribe(() => {
328
- setState(getSnapshot());
329
- }),
330
- []
331
- );
332
- if (getServerSnapshot && !useSyncExternalStoreGetServerSnapshotNotified) {
333
- useSyncExternalStoreGetServerSnapshotNotified = true;
334
- console.info("`getServerSnapshot` is not supported yet.");
324
+ const buildData = import_render.buildDataStack.at(-1);
325
+ if (!buildData) {
326
+ if (!getServerSnapshot) {
327
+ throw new Error("getServerSnapshot is required for server side rendering");
328
+ }
329
+ return getServerSnapshot();
335
330
  }
331
+ const [serverSnapshotIsUsed] = useState(!!(buildData[0][4] && getServerSnapshot));
332
+ const [state, setState] = useState(
333
+ () => serverSnapshotIsUsed ? getServerSnapshot() : getSnapshot()
334
+ );
335
+ useEffect(() => {
336
+ if (serverSnapshotIsUsed) {
337
+ setState(getSnapshot());
338
+ }
339
+ return subscribe(() => {
340
+ setState(getSnapshot());
341
+ });
342
+ }, []);
336
343
  return state;
337
344
  };
338
345
  // Annotate the CommonJS export names for ESM import in node:
@@ -25,17 +25,11 @@ var import_request = require("../request");
25
25
  const parseBody = async (request, options = { all: false }) => {
26
26
  const headers = request instanceof import_request.HonoRequest ? request.raw.headers : request.headers;
27
27
  const contentType = headers.get("Content-Type");
28
- if (isFormDataContent(contentType)) {
28
+ if (contentType !== null && contentType.startsWith("multipart/form-data") || contentType !== null && contentType.startsWith("application/x-www-form-urlencoded")) {
29
29
  return parseFormData(request, options);
30
30
  }
31
31
  return {};
32
32
  };
33
- function isFormDataContent(contentType) {
34
- if (contentType === null) {
35
- return false;
36
- }
37
- return contentType.startsWith("multipart/form-data") || contentType.startsWith("application/x-www-form-urlencoded");
38
- }
39
33
  async function parseFormData(request, options) {
40
34
  const formData = await request.formData();
41
35
  if (formData) {
@@ -56,23 +50,16 @@ function convertFormDataToBodyData(formData, options) {
56
50
  return form;
57
51
  }
58
52
  const handleParsingAllValues = (form, key, value) => {
59
- if (form[key] && isArrayField(form[key])) {
60
- appendToExistingArray(form[key], value);
53
+ const formKey = form[key];
54
+ if (form[key] && Array.isArray(form[key])) {
55
+ formKey.push(value);
61
56
  } else if (form[key]) {
62
- convertToNewArray(form, key, value);
57
+ const parsedKey = [...formKey].join("").replace(",", "");
58
+ form[key] = [parsedKey, value];
63
59
  } else {
64
60
  form[key] = value;
65
61
  }
66
62
  };
67
- function isArrayField(field) {
68
- return Array.isArray(field);
69
- }
70
- const appendToExistingArray = (arr, value) => {
71
- arr.push(value);
72
- };
73
- const convertToNewArray = (form, key, value) => {
74
- form[key] = [form[key], value];
75
- };
76
63
  // Annotate the CommonJS export names for ESM import in node:
77
64
  0 && (module.exports = {
78
65
  parseBody
@@ -30,7 +30,7 @@ const validator = (target, validationFunc) => {
30
30
  const contentType = c.req.header("Content-Type");
31
31
  switch (target) {
32
32
  case "json":
33
- if (!contentType || !contentType.startsWith("application/json")) {
33
+ if (!contentType || !/^application\/([a-z-]+\+)?json/.test(contentType)) {
34
34
  const message = `Invalid HTTP header: Content-Type=${contentType}`;
35
35
  throw new import_http_exception.HTTPException(400, { message });
36
36
  }
@@ -54,7 +54,16 @@ const validator = (target, validationFunc) => {
54
54
  const formData = await (0, import_buffer.bufferToFormData)(arrayBuffer, contentType);
55
55
  const form = {};
56
56
  formData.forEach((value2, key) => {
57
- form[key] = value2;
57
+ if (key.endsWith("[]")) {
58
+ if (form[key] === void 0) {
59
+ form[key] = [value2];
60
+ } else if (Array.isArray(form[key])) {
61
+ ;
62
+ form[key].push(value2);
63
+ }
64
+ } else {
65
+ form[key] = value2;
66
+ }
58
67
  });
59
68
  value = form;
60
69
  c.req.bodyCache.formData = formData;
@@ -13,9 +13,9 @@ var Factory = class {
13
13
  return app;
14
14
  };
15
15
  createMiddleware = (middleware) => middleware;
16
- createHandlers(...handlers) {
16
+ createHandlers = (...handlers) => {
17
17
  return handlers.filter((handler) => handler !== void 0);
18
- }
18
+ };
19
19
  };
20
20
  var createFactory = (init) => new Factory(init);
21
21
  var createMiddleware = (middleware) => createFactory().createMiddleware(middleware);
@@ -419,7 +419,10 @@ var update = async (context, node) => {
419
419
  };
420
420
  var render = (jsxNode, container) => {
421
421
  const node = buildNode({ tag: "", props: { children: jsxNode } });
422
- build([], node, void 0);
422
+ const context = [];
423
+ context[4] = true;
424
+ build(context, node, void 0);
425
+ context[4] = false;
423
426
  const fragment = document.createDocumentFragment();
424
427
  apply(node, fragment);
425
428
  replaceContainer(node, fragment, container);
@@ -279,19 +279,26 @@ var useImperativeHandle = (ref, createHandle, deps) => {
279
279
  };
280
280
  }, deps);
281
281
  };
282
- var useSyncExternalStoreGetServerSnapshotNotified = false;
283
282
  var useSyncExternalStore = (subscribe, getSnapshot, getServerSnapshot) => {
284
- const [state, setState] = useState(getSnapshot());
285
- useEffect(
286
- () => subscribe(() => {
287
- setState(getSnapshot());
288
- }),
289
- []
290
- );
291
- if (getServerSnapshot && !useSyncExternalStoreGetServerSnapshotNotified) {
292
- useSyncExternalStoreGetServerSnapshotNotified = true;
293
- console.info("`getServerSnapshot` is not supported yet.");
283
+ const buildData = buildDataStack.at(-1);
284
+ if (!buildData) {
285
+ if (!getServerSnapshot) {
286
+ throw new Error("getServerSnapshot is required for server side rendering");
287
+ }
288
+ return getServerSnapshot();
294
289
  }
290
+ const [serverSnapshotIsUsed] = useState(!!(buildData[0][4] && getServerSnapshot));
291
+ const [state, setState] = useState(
292
+ () => serverSnapshotIsUsed ? getServerSnapshot() : getSnapshot()
293
+ );
294
+ useEffect(() => {
295
+ if (serverSnapshotIsUsed) {
296
+ setState(getSnapshot());
297
+ }
298
+ return subscribe(() => {
299
+ setState(getSnapshot());
300
+ });
301
+ }, []);
295
302
  return state;
296
303
  };
297
304
  export {
@@ -69,5 +69,17 @@ export declare const streamHandle: <E extends Env = Env, S extends Schema = {},
69
69
  * Accepts events from API Gateway/ELB(`APIGatewayProxyEvent`) and directly through Function Url(`APIGatewayProxyEventV2`)
70
70
  */
71
71
  export declare const handle: <E extends Env = Env, S extends Schema = {}, BasePath extends string = "/">(app: Hono<E, S, BasePath>) => (event: LambdaEvent, lambdaContext?: LambdaContext) => Promise<APIGatewayProxyResult>;
72
+ declare abstract class EventProcessor<E extends LambdaEvent> {
73
+ protected abstract getPath(event: E): string;
74
+ protected abstract getMethod(event: E): string;
75
+ protected abstract getQueryString(event: E): string;
76
+ protected abstract getCookies(event: E, headers: Headers): void;
77
+ protected abstract setCookiesToResult(result: APIGatewayProxyResult, cookies: string[]): void;
78
+ createRequest(event: E): Request;
79
+ createResult(event: E, res: Response): Promise<APIGatewayProxyResult>;
80
+ setCookies: (event: LambdaEvent, res: Response, result: APIGatewayProxyResult) => void;
81
+ }
82
+ export declare const getProcessor: (event: LambdaEvent) => EventProcessor<LambdaEvent>;
72
83
  export declare const isContentTypeBinary: (contentType: string) => boolean;
73
84
  export declare const isContentEncodingBinary: (contentEncoding: string | null) => boolean;
85
+ export {};
@@ -1,24 +1,16 @@
1
1
  import { Hono } from '../../hono';
2
2
  import type { Env, H, HandlerResponse, Input, MiddlewareHandler } from '../../types';
3
3
  type InitApp<E extends Env = Env> = (app: Hono<E>) => void;
4
- export declare class Factory<E extends Env = any, P extends string = any> {
5
- private initApp?;
6
- constructor(init?: {
7
- initApp?: InitApp<E>;
8
- });
9
- /**
10
- * @experimental
11
- * `createApp` is an experimental feature.
12
- */
13
- createApp: () => Hono<E, import("../../types").BlankSchema, "/">;
14
- createMiddleware: <I extends Input = {}>(middleware: MiddlewareHandler<E, P, I>) => MiddlewareHandler<E, P, I>;
15
- createHandlers<I extends Input = {}, R extends HandlerResponse<any> = any>(handler1: H<E, P, I, R>): [H<E, P, I, R>];
16
- createHandlers<I extends Input = {}, I2 extends Input = I, R extends HandlerResponse<any> = any>(handler1: H<E, P, I, R>, handler2: H<E, P, I2, R>): [H<E, P, I, R>, H<E, P, I2, R>];
17
- createHandlers<I extends Input = {}, I2 extends Input = I, I3 extends Input = I & I2, R extends HandlerResponse<any> = any>(handler1: H<E, P, I, R>, handler2: H<E, P, I2, R>, handler3: H<E, P, I3, R>): [H<E, P, I, R>, H<E, P, I2, R>, H<E, P, I3, R>];
18
- createHandlers<I extends Input = {}, I2 extends Input = I, I3 extends Input = I & I2, I4 extends Input = I & I2 & I3, R extends HandlerResponse<any> = any>(handler1: H<E, P, I, R>, handler2: H<E, P, I2, R>, handler3: H<E, P, I3, R>, handler4: H<E, P, I4, R>): [H<E, P, I, R>, H<E, P, I2, R>, H<E, P, I3, R>, H<E, P, I4, R>];
19
- createHandlers<I extends Input = {}, I2 extends Input = I, I3 extends Input = I & I2, I4 extends Input = I & I2 & I3, I5 extends Input = I & I2 & I3 & I4, R extends HandlerResponse<any> = any>(handler1: H<E, P, I, R>, handler2: H<E, P, I2, R>, handler3: H<E, P, I3, R>, handler4: H<E, P, I4, R>, handler5: H<E, P, I5, R>): [H<E, P, I, R>, H<E, P, I2, R>, H<E, P, I3, R>, H<E, P, I4, R>, H<E, P, I5, R>];
20
- createHandlers<I extends Input = {}, I2 extends Input = I, I3 extends Input = I & I2, I4 extends Input = I & I2 & I3, I5 extends Input = I & I2 & I3 & I4, I6 extends Input = I & I2 & I3 & I4 & I5, R extends HandlerResponse<any> = any>(handler1: H<E, P, I, R>, handler2: H<E, P, I2, R>, handler3: H<E, P, I3, R>, handler4: H<E, P, I4, R>, handler5: H<E, P, I5, R>, handler6: H<E, P, I6, R>): [H<E, P, I, R>, H<E, P, I2, R>, H<E, P, I3, R>, H<E, P, I4, R>, H<E, P, I5, R>, H<E, P, I6, R>];
21
- createHandlers<I extends Input = {}, I2 extends Input = I, I3 extends Input = I & I2, I4 extends Input = I & I2 & I3, I5 extends Input = I & I2 & I3 & I4, I6 extends Input = I & I2 & I3 & I4 & I5, I7 extends Input = I & I2 & I3 & I4 & I5 & I6, R extends HandlerResponse<any> = any>(handler1: H<E, P, I, R>, handler2: H<E, P, I2, R>, handler3: H<E, P, I3, R>, handler4: H<E, P, I4, R>, handler5: H<E, P, I5, R>, handler6: H<E, P, I6, R>, handler7: H<E, P, I7, R>): [
4
+ interface CreateHandlersInterface<E extends Env, P extends string> {
5
+ <I extends Input = {}, R extends HandlerResponse<any> = any>(handler1: H<E, P, I, R>): [
6
+ H<E, P, I, R>
7
+ ];
8
+ <I extends Input = {}, I2 extends Input = I, R extends HandlerResponse<any> = any>(handler1: H<E, P, I, R>, handler2: H<E, P, I2, R>): [H<E, P, I, R>, H<E, P, I2, R>];
9
+ <I extends Input = {}, I2 extends Input = I, I3 extends Input = I & I2, R extends HandlerResponse<any> = any>(handler1: H<E, P, I, R>, handler2: H<E, P, I2, R>, handler3: H<E, P, I3, R>): [H<E, P, I, R>, H<E, P, I2, R>, H<E, P, I3, R>];
10
+ <I extends Input = {}, I2 extends Input = I, I3 extends Input = I & I2, I4 extends Input = I & I2 & I3, R extends HandlerResponse<any> = any>(handler1: H<E, P, I, R>, handler2: H<E, P, I2, R>, handler3: H<E, P, I3, R>, handler4: H<E, P, I4, R>): [H<E, P, I, R>, H<E, P, I2, R>, H<E, P, I3, R>, H<E, P, I4, R>];
11
+ <I extends Input = {}, I2 extends Input = I, I3 extends Input = I & I2, I4 extends Input = I & I2 & I3, I5 extends Input = I & I2 & I3 & I4, R extends HandlerResponse<any> = any>(handler1: H<E, P, I, R>, handler2: H<E, P, I2, R>, handler3: H<E, P, I3, R>, handler4: H<E, P, I4, R>, handler5: H<E, P, I5, R>): [H<E, P, I, R>, H<E, P, I2, R>, H<E, P, I3, R>, H<E, P, I4, R>, H<E, P, I5, R>];
12
+ <I extends Input = {}, I2 extends Input = I, I3 extends Input = I & I2, I4 extends Input = I & I2 & I3, I5 extends Input = I & I2 & I3 & I4, I6 extends Input = I & I2 & I3 & I4 & I5, R extends HandlerResponse<any> = any>(handler1: H<E, P, I, R>, handler2: H<E, P, I2, R>, handler3: H<E, P, I3, R>, handler4: H<E, P, I4, R>, handler5: H<E, P, I5, R>, handler6: H<E, P, I6, R>): [H<E, P, I, R>, H<E, P, I2, R>, H<E, P, I3, R>, H<E, P, I4, R>, H<E, P, I5, R>, H<E, P, I6, R>];
13
+ <I extends Input = {}, I2 extends Input = I, I3 extends Input = I & I2, I4 extends Input = I & I2 & I3, I5 extends Input = I & I2 & I3 & I4, I6 extends Input = I & I2 & I3 & I4 & I5, I7 extends Input = I & I2 & I3 & I4 & I5 & I6, R extends HandlerResponse<any> = any>(handler1: H<E, P, I, R>, handler2: H<E, P, I2, R>, handler3: H<E, P, I3, R>, handler4: H<E, P, I4, R>, handler5: H<E, P, I5, R>, handler6: H<E, P, I6, R>, handler7: H<E, P, I7, R>): [
22
14
  H<E, P, I, R>,
23
15
  H<E, P, I2, R>,
24
16
  H<E, P, I3, R>,
@@ -27,7 +19,7 @@ export declare class Factory<E extends Env = any, P extends string = any> {
27
19
  H<E, P, I6, R>,
28
20
  H<E, P, I7, R>
29
21
  ];
30
- createHandlers<I extends Input = {}, I2 extends Input = I, I3 extends Input = I & I2, I4 extends Input = I & I2 & I3, I5 extends Input = I & I2 & I3 & I4, I6 extends Input = I & I2 & I3 & I4 & I5, I7 extends Input = I & I2 & I3 & I4 & I5 & I6, I8 extends Input = I & I2 & I3 & I4 & I5 & I6 & I7, R extends HandlerResponse<any> = any>(handler1: H<E, P, I, R>, handler2: H<E, P, I2, R>, handler3: H<E, P, I3, R>, handler4: H<E, P, I4, R>, handler5: H<E, P, I5, R>, handler6: H<E, P, I6, R>, handler7: H<E, P, I7, R>, handler8: H<E, P, I8, R>): [
22
+ <I extends Input = {}, I2 extends Input = I, I3 extends Input = I & I2, I4 extends Input = I & I2 & I3, I5 extends Input = I & I2 & I3 & I4, I6 extends Input = I & I2 & I3 & I4 & I5, I7 extends Input = I & I2 & I3 & I4 & I5 & I6, I8 extends Input = I & I2 & I3 & I4 & I5 & I6 & I7, R extends HandlerResponse<any> = any>(handler1: H<E, P, I, R>, handler2: H<E, P, I2, R>, handler3: H<E, P, I3, R>, handler4: H<E, P, I4, R>, handler5: H<E, P, I5, R>, handler6: H<E, P, I6, R>, handler7: H<E, P, I7, R>, handler8: H<E, P, I8, R>): [
31
23
  H<E, P, I, R>,
32
24
  H<E, P, I2, R>,
33
25
  H<E, P, I3, R>,
@@ -37,7 +29,7 @@ export declare class Factory<E extends Env = any, P extends string = any> {
37
29
  H<E, P, I7, R>,
38
30
  H<E, P, I8, R>
39
31
  ];
40
- createHandlers<I extends Input = {}, I2 extends Input = I, I3 extends Input = I & I2, I4 extends Input = I & I2 & I3, I5 extends Input = I & I2 & I3 & I4, I6 extends Input = I & I2 & I3 & I4 & I5, I7 extends Input = I & I2 & I3 & I4 & I5 & I6, I8 extends Input = I & I2 & I3 & I4 & I5 & I6 & I7, I9 extends Input = I & I2 & I3 & I4 & I5 & I6 & I7 & I8, R extends HandlerResponse<any> = any>(handler1: H<E, P, I, R>, handler2: H<E, P, I2, R>, handler3: H<E, P, I3, R>, handler4: H<E, P, I4, R>, handler5: H<E, P, I5, R>, handler6: H<E, P, I6, R>, handler7: H<E, P, I7, R>, handler8: H<E, P, I8, R>, handler9: H<E, P, I9, R>): [
32
+ <I extends Input = {}, I2 extends Input = I, I3 extends Input = I & I2, I4 extends Input = I & I2 & I3, I5 extends Input = I & I2 & I3 & I4, I6 extends Input = I & I2 & I3 & I4 & I5, I7 extends Input = I & I2 & I3 & I4 & I5 & I6, I8 extends Input = I & I2 & I3 & I4 & I5 & I6 & I7, I9 extends Input = I & I2 & I3 & I4 & I5 & I6 & I7 & I8, R extends HandlerResponse<any> = any>(handler1: H<E, P, I, R>, handler2: H<E, P, I2, R>, handler3: H<E, P, I3, R>, handler4: H<E, P, I4, R>, handler5: H<E, P, I5, R>, handler6: H<E, P, I6, R>, handler7: H<E, P, I7, R>, handler8: H<E, P, I8, R>, handler9: H<E, P, I9, R>): [
41
33
  H<E, P, I, R>,
42
34
  H<E, P, I2, R>,
43
35
  H<E, P, I3, R>,
@@ -48,7 +40,7 @@ export declare class Factory<E extends Env = any, P extends string = any> {
48
40
  H<E, P, I8, R>,
49
41
  H<E, P, I9, R>
50
42
  ];
51
- createHandlers<I extends Input = {}, I2 extends Input = I, I3 extends Input = I & I2, I4 extends Input = I & I2 & I3, I5 extends Input = I & I2 & I3 & I4, I6 extends Input = I & I2 & I3 & I4 & I5, I7 extends Input = I & I2 & I3 & I4 & I5 & I6, I8 extends Input = I & I2 & I3 & I4 & I5 & I6 & I7, I9 extends Input = I & I2 & I3 & I4 & I5 & I6 & I7 & I8, I10 extends Input = I & I2 & I3 & I4 & I5 & I6 & I7 & I8 & I9, R extends HandlerResponse<any> = any>(handler1: H<E, P, I, R>, handler2: H<E, P, I2, R>, handler3: H<E, P, I3, R>, handler4: H<E, P, I4, R>, handler5: H<E, P, I5, R>, handler6: H<E, P, I6, R>, handler7: H<E, P, I7, R>, handler8: H<E, P, I8, R>, handler9: H<E, P, I9, R>, handler10: H<E, P, I10, R>): [
43
+ <I extends Input = {}, I2 extends Input = I, I3 extends Input = I & I2, I4 extends Input = I & I2 & I3, I5 extends Input = I & I2 & I3 & I4, I6 extends Input = I & I2 & I3 & I4 & I5, I7 extends Input = I & I2 & I3 & I4 & I5 & I6, I8 extends Input = I & I2 & I3 & I4 & I5 & I6 & I7, I9 extends Input = I & I2 & I3 & I4 & I5 & I6 & I7 & I8, I10 extends Input = I & I2 & I3 & I4 & I5 & I6 & I7 & I8 & I9, R extends HandlerResponse<any> = any>(handler1: H<E, P, I, R>, handler2: H<E, P, I2, R>, handler3: H<E, P, I3, R>, handler4: H<E, P, I4, R>, handler5: H<E, P, I5, R>, handler6: H<E, P, I6, R>, handler7: H<E, P, I7, R>, handler8: H<E, P, I8, R>, handler9: H<E, P, I9, R>, handler10: H<E, P, I10, R>): [
52
44
  H<E, P, I, R>,
53
45
  H<E, P, I2, R>,
54
46
  H<E, P, I3, R>,
@@ -61,6 +53,19 @@ export declare class Factory<E extends Env = any, P extends string = any> {
61
53
  H<E, P, I10, R>
62
54
  ];
63
55
  }
56
+ export declare class Factory<E extends Env = any, P extends string = any> {
57
+ private initApp?;
58
+ constructor(init?: {
59
+ initApp?: InitApp<E>;
60
+ });
61
+ /**
62
+ * @experimental
63
+ * `createApp` is an experimental feature.
64
+ */
65
+ createApp: () => Hono<E, import("../../types").BlankSchema, "/">;
66
+ createMiddleware: <I extends Input = {}>(middleware: MiddlewareHandler<E, P, I>) => MiddlewareHandler<E, P, I>;
67
+ createHandlers: CreateHandlersInterface<E, P>;
68
+ }
64
69
  export declare const createFactory: <E extends Env = any, P extends string = any>(init?: {
65
70
  initApp?: InitApp<E> | undefined;
66
71
  } | undefined) => Factory<E, P>;
@@ -44,8 +44,9 @@ export type Context = [
44
44
  PendingType,
45
45
  boolean,
46
46
  UpdateHook,
47
+ boolean,
47
48
  boolean
48
- ] | [PendingType, boolean, UpdateHook] | [PendingType, boolean] | [PendingType] | [];
49
+ ] | [PendingType, boolean, UpdateHook, boolean] | [PendingType, boolean, UpdateHook] | [PendingType, boolean] | [PendingType] | [];
49
50
  export declare const buildDataStack: [Context, Node][];
50
51
  export declare const build: (context: Context, node: NodeObject, topLevelErrorHandlerNode: NodeObject | undefined, children?: Child[]) => void;
51
52
  export declare const update: (context: Context, node: NodeObject) => Promise<NodeObject | undefined>;
@@ -53,6 +53,7 @@ export declare class HonoRequest<P extends string = '/', I extends Input['out']
53
53
  */
54
54
  param<P2 extends ParamKeys<P> = ParamKeys<P>>(key: P2 extends `${infer _}?` ? never : P2): string;
55
55
  param<P2 extends RemoveQuestion<ParamKeys<P>> = RemoveQuestion<ParamKeys<P>>>(key: P2): string | undefined;
56
+ param(key: string): string | undefined;
56
57
  param<P2 extends string = P>(): UnionToIntersection<ParamKeyToRecord<ParamKeys<P2>>>;
57
58
  private getDecodedParam;
58
59
  private getAllDecodedParams;
@@ -2,21 +2,19 @@ import { HonoRequest } from '../request';
2
2
  export type BodyData = Record<string, string | File | (string | File)[]>;
3
3
  export type ParseBodyOptions = {
4
4
  /**
5
- * Parse all fields with multiple values should be parsed as an array.
5
+ * Determines whether all fields with multiple values should be parsed as arrays.
6
6
  * @default false
7
7
  * @example
8
- * ```ts
9
8
  * const data = new FormData()
10
9
  * data.append('file', 'aaa')
11
10
  * data.append('file', 'bbb')
12
11
  * data.append('message', 'hello')
13
- * ```
14
12
  *
15
- * If `all` is `false`:
16
- * parseBody should return `{ file: 'bbb', message: 'hello' }`
13
+ * If all is false:
14
+ * parseBody should return { file: 'bbb', message: 'hello' }
17
15
  *
18
- * If `all` is `true`:
19
- * parseBody should return `{ file: ['aaa', 'bbb'], message: 'hello' }`
16
+ * If all is true:
17
+ * parseBody should return { file: ['aaa', 'bbb'], message: 'hello' }
20
18
  */
21
19
  all?: boolean;
22
20
  };
@@ -3,17 +3,11 @@ import { HonoRequest } from "../request.js";
3
3
  var parseBody = async (request, options = { all: false }) => {
4
4
  const headers = request instanceof HonoRequest ? request.raw.headers : request.headers;
5
5
  const contentType = headers.get("Content-Type");
6
- if (isFormDataContent(contentType)) {
6
+ if (contentType !== null && contentType.startsWith("multipart/form-data") || contentType !== null && contentType.startsWith("application/x-www-form-urlencoded")) {
7
7
  return parseFormData(request, options);
8
8
  }
9
9
  return {};
10
10
  };
11
- function isFormDataContent(contentType) {
12
- if (contentType === null) {
13
- return false;
14
- }
15
- return contentType.startsWith("multipart/form-data") || contentType.startsWith("application/x-www-form-urlencoded");
16
- }
17
11
  async function parseFormData(request, options) {
18
12
  const formData = await request.formData();
19
13
  if (formData) {
@@ -34,23 +28,16 @@ function convertFormDataToBodyData(formData, options) {
34
28
  return form;
35
29
  }
36
30
  var handleParsingAllValues = (form, key, value) => {
37
- if (form[key] && isArrayField(form[key])) {
38
- appendToExistingArray(form[key], value);
31
+ const formKey = form[key];
32
+ if (form[key] && Array.isArray(form[key])) {
33
+ formKey.push(value);
39
34
  } else if (form[key]) {
40
- convertToNewArray(form, key, value);
35
+ const parsedKey = [...formKey].join("").replace(",", "");
36
+ form[key] = [parsedKey, value];
41
37
  } else {
42
38
  form[key] = value;
43
39
  }
44
40
  };
45
- function isArrayField(field) {
46
- return Array.isArray(field);
47
- }
48
- var appendToExistingArray = (arr, value) => {
49
- arr.push(value);
50
- };
51
- var convertToNewArray = (form, key, value) => {
52
- form[key] = [form[key], value];
53
- };
54
41
  export {
55
42
  parseBody
56
43
  };
@@ -8,7 +8,7 @@ var validator = (target, validationFunc) => {
8
8
  const contentType = c.req.header("Content-Type");
9
9
  switch (target) {
10
10
  case "json":
11
- if (!contentType || !contentType.startsWith("application/json")) {
11
+ if (!contentType || !/^application\/([a-z-]+\+)?json/.test(contentType)) {
12
12
  const message = `Invalid HTTP header: Content-Type=${contentType}`;
13
13
  throw new HTTPException(400, { message });
14
14
  }
@@ -32,7 +32,16 @@ var validator = (target, validationFunc) => {
32
32
  const formData = await bufferToFormData(arrayBuffer, contentType);
33
33
  const form = {};
34
34
  formData.forEach((value2, key) => {
35
- form[key] = value2;
35
+ if (key.endsWith("[]")) {
36
+ if (form[key] === void 0) {
37
+ form[key] = [value2];
38
+ } else if (Array.isArray(form[key])) {
39
+ ;
40
+ form[key].push(value2);
41
+ }
42
+ } else {
43
+ form[key] = value2;
44
+ }
36
45
  });
37
46
  value = form;
38
47
  c.req.bodyCache.formData = formData;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hono",
3
- "version": "4.3.2",
3
+ "version": "4.3.4",
4
4
  "description": "Ultrafast web framework for the Edges",
5
5
  "main": "dist/cjs/index.js",
6
6
  "type": "module",