| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- // src/validator/validator.ts
- import { getCookie } from "../helper/cookie/index.js";
- import { HTTPException } from "../http-exception.js";
- import { bufferToFormData } from "../utils/buffer.js";
- var jsonRegex = /^application\/([a-z-\.]+\+)?json(;\s*[a-zA-Z0-9\-]+\=([^;]+))*$/;
- var multipartRegex = /^multipart\/form-data(;\s?boundary=[a-zA-Z0-9'"()+_,\-./:=?]+)?$/;
- var urlencodedRegex = /^application\/x-www-form-urlencoded(;\s*[a-zA-Z0-9\-]+\=([^;]+))*$/;
- var validator = (target, validationFunc) => {
- return async (c, next) => {
- let value = {};
- const contentType = c.req.header("Content-Type");
- switch (target) {
- case "json":
- if (!contentType || !jsonRegex.test(contentType)) {
- break;
- }
- try {
- value = await c.req.json();
- } catch {
- const message = "Malformed JSON in request body";
- throw new HTTPException(400, { message });
- }
- break;
- case "form": {
- if (!contentType || !(multipartRegex.test(contentType) || urlencodedRegex.test(contentType))) {
- break;
- }
- let formData;
- if (c.req.bodyCache.formData) {
- formData = await c.req.bodyCache.formData;
- } else {
- try {
- const arrayBuffer = await c.req.arrayBuffer();
- formData = await bufferToFormData(arrayBuffer, contentType);
- 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 });
- }
- }
- const form = /* @__PURE__ */ Object.create(null);
- formData.forEach((value2, key) => {
- if (key.endsWith("[]")) {
- ;
- (form[key] ??= []).push(value2);
- } else if (Array.isArray(form[key])) {
- ;
- form[key].push(value2);
- } else if (Object.hasOwn(form, key)) {
- form[key] = [form[key], value2];
- } else {
- form[key] = value2;
- }
- });
- value = form;
- 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);
- return await next();
- };
- };
- export {
- validator
- };
|