body.js 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. // src/utils/body.ts
  2. import { HonoRequest } from "../request.js";
  3. var parseBody = async (request, options = /* @__PURE__ */ Object.create(null)) => {
  4. const { all = false, dot = false } = options;
  5. const headers = request instanceof HonoRequest ? request.raw.headers : request.headers;
  6. const contentType = headers.get("Content-Type");
  7. if (contentType?.startsWith("multipart/form-data") || contentType?.startsWith("application/x-www-form-urlencoded")) {
  8. return parseFormData(request, { all, dot });
  9. }
  10. return {};
  11. };
  12. async function parseFormData(request, options) {
  13. const formData = await request.formData();
  14. if (formData) {
  15. return convertFormDataToBodyData(formData, options);
  16. }
  17. return {};
  18. }
  19. function convertFormDataToBodyData(formData, options) {
  20. const form = /* @__PURE__ */ Object.create(null);
  21. formData.forEach((value, key) => {
  22. const shouldParseAllValues = options.all || key.endsWith("[]");
  23. if (!shouldParseAllValues) {
  24. form[key] = value;
  25. } else {
  26. handleParsingAllValues(form, key, value);
  27. }
  28. });
  29. if (options.dot) {
  30. Object.entries(form).forEach(([key, value]) => {
  31. const shouldParseDotValues = key.includes(".");
  32. if (shouldParseDotValues) {
  33. handleParsingNestedValues(form, key, value);
  34. delete form[key];
  35. }
  36. });
  37. }
  38. return form;
  39. }
  40. var handleParsingAllValues = (form, key, value) => {
  41. if (form[key] !== void 0) {
  42. if (Array.isArray(form[key])) {
  43. ;
  44. form[key].push(value);
  45. } else {
  46. form[key] = [form[key], value];
  47. }
  48. } else {
  49. if (!key.endsWith("[]")) {
  50. form[key] = value;
  51. } else {
  52. form[key] = [value];
  53. }
  54. }
  55. };
  56. var handleParsingNestedValues = (form, key, value) => {
  57. if (/(?:^|\.)__proto__\./.test(key)) {
  58. return;
  59. }
  60. let nestedForm = form;
  61. const keys = key.split(".");
  62. keys.forEach((key2, index) => {
  63. if (index === keys.length - 1) {
  64. nestedForm[key2] = value;
  65. } else {
  66. if (!nestedForm[key2] || typeof nestedForm[key2] !== "object" || Array.isArray(nestedForm[key2]) || nestedForm[key2] instanceof File) {
  67. nestedForm[key2] = /* @__PURE__ */ Object.create(null);
  68. }
  69. nestedForm = nestedForm[key2];
  70. }
  71. });
  72. };
  73. export {
  74. parseBody
  75. };