hono 4.3.1 → 4.3.3
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.
- package/dist/adapter/aws-lambda/handler.js +3 -1
- package/dist/cjs/adapter/aws-lambda/handler.js +4 -1
- package/dist/cjs/helper/factory/index.js +2 -2
- package/dist/cjs/utils/body.js +6 -19
- package/dist/cjs/validator/validator.js +10 -1
- package/dist/helper/factory/index.js +2 -2
- package/dist/types/adapter/aws-lambda/handler.d.ts +12 -0
- package/dist/types/helper/factory/index.d.ts +26 -21
- package/dist/types/request.d.ts +1 -0
- package/dist/types/types.d.ts +22 -21
- package/dist/types/utils/body.d.ts +5 -7
- package/dist/utils/body.js +6 -19
- package/dist/validator/validator.js +10 -1
- package/package.json +1 -1
|
@@ -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
|
-
|
|
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
|
-
|
|
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);
|
package/dist/cjs/utils/body.js
CHANGED
|
@@ -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 (
|
|
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
|
-
|
|
60
|
-
|
|
53
|
+
const formKey = form[key];
|
|
54
|
+
if (form[key] && Array.isArray(form[key])) {
|
|
55
|
+
formKey.push(value);
|
|
61
56
|
} else if (form[key]) {
|
|
62
|
-
|
|
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
|
|
@@ -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
|
-
|
|
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);
|
|
@@ -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
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
});
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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>;
|
package/dist/types/request.d.ts
CHANGED
|
@@ -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;
|
package/dist/types/types.d.ts
CHANGED
|
@@ -406,29 +406,30 @@ type FlattenIfIntersect<T> = T extends infer O ? {
|
|
|
406
406
|
} : never;
|
|
407
407
|
export type MergeSchemaPath<OrigSchema extends Schema, SubPath extends string> = Prettify<{
|
|
408
408
|
[P in keyof OrigSchema as MergePath<SubPath, P & string>]: {
|
|
409
|
-
[M in keyof OrigSchema[P]]: OrigSchema[P][M]
|
|
410
|
-
input: infer Input;
|
|
411
|
-
output: infer Output;
|
|
412
|
-
outputFormat: infer OutputFormat;
|
|
413
|
-
status: infer Status;
|
|
414
|
-
} ? {
|
|
415
|
-
input: Input extends {
|
|
416
|
-
param: infer _;
|
|
417
|
-
} ? ExtractParams<SubPath> extends never ? Input : FlattenIfIntersect<Input & {
|
|
418
|
-
param: {
|
|
419
|
-
[K in keyof ExtractParams<SubPath> as K extends `${infer Prefix}{${infer _}}` ? Prefix : K]: string;
|
|
420
|
-
};
|
|
421
|
-
}> : RemoveBlankRecord<ExtractParams<SubPath>> extends never ? Input : Input & {
|
|
422
|
-
param: {
|
|
423
|
-
[K in keyof ExtractParams<SubPath> as K extends `${infer Prefix}{${infer _}}` ? Prefix : K]: string;
|
|
424
|
-
};
|
|
425
|
-
};
|
|
426
|
-
output: Output;
|
|
427
|
-
outputFormat: OutputFormat;
|
|
428
|
-
status: Status;
|
|
429
|
-
} : never;
|
|
409
|
+
[M in keyof OrigSchema[P]]: MergeEndpointParamsWithPath<OrigSchema[P][M], SubPath>;
|
|
430
410
|
};
|
|
431
411
|
}>;
|
|
412
|
+
type MergeEndpointParamsWithPath<T, SubPath extends string> = T extends {
|
|
413
|
+
input: infer Input;
|
|
414
|
+
output: infer Output;
|
|
415
|
+
outputFormat: infer OutputFormat;
|
|
416
|
+
status: infer Status;
|
|
417
|
+
} ? {
|
|
418
|
+
input: Input extends {
|
|
419
|
+
param: infer _;
|
|
420
|
+
} ? ExtractParams<SubPath> extends never ? Input : FlattenIfIntersect<Input & {
|
|
421
|
+
param: {
|
|
422
|
+
[K in keyof ExtractParams<SubPath> as K extends `${infer Prefix}{${infer _}}` ? Prefix : K]: string;
|
|
423
|
+
};
|
|
424
|
+
}> : RemoveBlankRecord<ExtractParams<SubPath>> extends never ? Input : Input & {
|
|
425
|
+
param: {
|
|
426
|
+
[K in keyof ExtractParams<SubPath> as K extends `${infer Prefix}{${infer _}}` ? Prefix : K]: string;
|
|
427
|
+
};
|
|
428
|
+
};
|
|
429
|
+
output: Output;
|
|
430
|
+
outputFormat: OutputFormat;
|
|
431
|
+
status: Status;
|
|
432
|
+
} : never;
|
|
432
433
|
export type AddParam<I, P extends string> = ParamKeys<P> extends never ? I : I extends {
|
|
433
434
|
param: infer _;
|
|
434
435
|
} ? I : I & {
|
|
@@ -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
|
-
*
|
|
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
|
|
16
|
-
* parseBody should return
|
|
13
|
+
* If all is false:
|
|
14
|
+
* parseBody should return { file: 'bbb', message: 'hello' }
|
|
17
15
|
*
|
|
18
|
-
* If
|
|
19
|
-
* parseBody should return
|
|
16
|
+
* If all is true:
|
|
17
|
+
* parseBody should return { file: ['aaa', 'bbb'], message: 'hello' }
|
|
20
18
|
*/
|
|
21
19
|
all?: boolean;
|
|
22
20
|
};
|
package/dist/utils/body.js
CHANGED
|
@@ -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 (
|
|
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
|
-
|
|
38
|
-
|
|
31
|
+
const formKey = form[key];
|
|
32
|
+
if (form[key] && Array.isArray(form[key])) {
|
|
33
|
+
formKey.push(value);
|
|
39
34
|
} else if (form[key]) {
|
|
40
|
-
|
|
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
|
};
|
|
@@ -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
|
-
|
|
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;
|