validator.js 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. // src/validator/validator.ts
  2. import { getCookie } from "../helper/cookie/index.js";
  3. import { HTTPException } from "../http-exception.js";
  4. import { bufferToFormData } from "../utils/buffer.js";
  5. var jsonRegex = /^application\/([a-z-\.]+\+)?json(;\s*[a-zA-Z0-9\-]+\=([^;]+))*$/;
  6. var multipartRegex = /^multipart\/form-data(;\s?boundary=[a-zA-Z0-9'"()+_,\-./:=?]+)?$/;
  7. var urlencodedRegex = /^application\/x-www-form-urlencoded(;\s*[a-zA-Z0-9\-]+\=([^;]+))*$/;
  8. var validator = (target, validationFunc) => {
  9. return async (c, next) => {
  10. let value = {};
  11. const contentType = c.req.header("Content-Type");
  12. switch (target) {
  13. case "json":
  14. if (!contentType || !jsonRegex.test(contentType)) {
  15. break;
  16. }
  17. try {
  18. value = await c.req.json();
  19. } catch {
  20. const message = "Malformed JSON in request body";
  21. throw new HTTPException(400, { message });
  22. }
  23. break;
  24. case "form": {
  25. if (!contentType || !(multipartRegex.test(contentType) || urlencodedRegex.test(contentType))) {
  26. break;
  27. }
  28. let formData;
  29. if (c.req.bodyCache.formData) {
  30. formData = await c.req.bodyCache.formData;
  31. } else {
  32. try {
  33. const arrayBuffer = await c.req.arrayBuffer();
  34. formData = await bufferToFormData(arrayBuffer, contentType);
  35. c.req.bodyCache.formData = formData;
  36. } catch (e) {
  37. let message = "Malformed FormData request.";
  38. message += e instanceof Error ? ` ${e.message}` : ` ${String(e)}`;
  39. throw new HTTPException(400, { message });
  40. }
  41. }
  42. const form = /* @__PURE__ */ Object.create(null);
  43. formData.forEach((value2, key) => {
  44. if (key.endsWith("[]")) {
  45. ;
  46. (form[key] ??= []).push(value2);
  47. } else if (Array.isArray(form[key])) {
  48. ;
  49. form[key].push(value2);
  50. } else if (Object.hasOwn(form, key)) {
  51. form[key] = [form[key], value2];
  52. } else {
  53. form[key] = value2;
  54. }
  55. });
  56. value = form;
  57. break;
  58. }
  59. case "query":
  60. value = Object.fromEntries(
  61. Object.entries(c.req.queries()).map(([k, v]) => {
  62. return v.length === 1 ? [k, v[0]] : [k, v];
  63. })
  64. );
  65. break;
  66. case "param":
  67. value = c.req.param();
  68. break;
  69. case "header":
  70. value = c.req.header();
  71. break;
  72. case "cookie":
  73. value = getCookie(c);
  74. break;
  75. }
  76. const res = await validationFunc(value, c);
  77. if (res instanceof Response) {
  78. return res;
  79. }
  80. c.req.addValidatedData(target, res);
  81. return await next();
  82. };
  83. };
  84. export {
  85. validator
  86. };