one-link/node_modules/hono/dist/validator/validator.js

83 lines
2.4 KiB
JavaScript

// src/validator/validator.ts
import { getCookie } from "../helper/cookie/index.js";
import { HTTPException } from "../http-exception.js";
import { bufferToFormData } from "../utils/buffer.js";
var validator = (target, validationFunc) => {
return async (c, next) => {
let value = {};
const contentType = c.req.header("Content-Type");
switch (target) {
case "json":
if (!contentType || !/^application\/([a-z-]+\+)?json/.test(contentType)) {
const message = `Invalid HTTP header: Content-Type=${contentType}`;
throw new HTTPException(400, { message });
}
try {
value = await c.req.json();
} catch {
const message = "Malformed JSON in request body";
throw new HTTPException(400, { message });
}
break;
case "form": {
if (!contentType) {
break;
}
if (c.req.bodyCache.formData) {
value = await c.req.bodyCache.formData;
break;
}
try {
const arrayBuffer = await c.req.arrayBuffer();
const formData = await bufferToFormData(arrayBuffer, contentType);
const form = {};
formData.forEach((value2, key) => {
if (key.endsWith("[]")) {
if (form[key] === void 0) {
form[key] = [value2];
} else if (Array.isArray(form[key])) {
;
form[key].push(value2);
}
} else {
form[key] = value2;
}
});
value = form;
c.req.bodyCache.formData = formData;
} catch (e) {
let message = "Malformed FormData request.";
message += e instanceof Error ? ` ${e.message}` : ` ${String(e)}`;
throw new HTTPException(400, { message });
}
break;
}
case "query":
value = Object.fromEntries(
Object.entries(c.req.queries()).map(([k, v]) => {
return v.length === 1 ? [k, v[0]] : [k, v];
})
);
break;
case "param":
value = c.req.param();
break;
case "header":
value = c.req.header();
break;
case "cookie":
value = getCookie(c);
break;
}
const res = await validationFunc(value, c);
if (res instanceof Response) {
return res;
}
c.req.addValidatedData(target, res);
await next();
};
};
export {
validator
};