cba226740e5beb7537914f0a97d74609317b09fca7aa2ac90e1822ffad6f03ee095f23858f704f423c337d12da8ef2c45acce9e6af4d35eb36b5232edf893f 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. 'use strict';
  2. var utils = require('../utils');
  3. function parsePropPath(name) {
  4. // foo[x][y][z]
  5. // foo.x.y.z
  6. // foo-x-y-z
  7. // foo x y z
  8. return utils.matchAll(/\w+|\[(\w*)]/g, name).map(function(match) {
  9. return match[0] === '[]' ? '' : match[1] || match[0];
  10. });
  11. }
  12. function arrayToObject(arr) {
  13. var obj = {};
  14. var keys = Object.keys(arr);
  15. var i;
  16. var len = keys.length;
  17. var key;
  18. for (i = 0; i < len; i++) {
  19. key = keys[i];
  20. obj[key] = arr[key];
  21. }
  22. return obj;
  23. }
  24. function formDataToJSON(formData) {
  25. function buildPath(path, value, target, index) {
  26. var name = path[index++];
  27. var isNumericKey = Number.isFinite(+name);
  28. var isLast = index >= path.length;
  29. name = !name && utils.isArray(target) ? target.length : name;
  30. if (isLast) {
  31. if (utils.hasOwnProperty(target, name)) {
  32. target[name] = [target[name], value];
  33. } else {
  34. target[name] = value;
  35. }
  36. return !isNumericKey;
  37. }
  38. if (!target[name] || !utils.isObject(target[name])) {
  39. target[name] = [];
  40. }
  41. var result = buildPath(path, value, target[name], index);
  42. if (result && utils.isArray(target[name])) {
  43. target[name] = arrayToObject(target[name]);
  44. }
  45. return !isNumericKey;
  46. }
  47. if (utils.isFormData(formData) && utils.isFunction(formData.entries)) {
  48. var obj = {};
  49. utils.forEachEntry(formData, function(name, value) {
  50. buildPath(parsePropPath(name), value, obj, 0);
  51. });
  52. return obj;
  53. }
  54. return null;
  55. }
  56. module.exports = formDataToJSON;