text: 'use strict';
  
  var utils = require('../utils');
  
  function combinedKey(parentKey, elKey) {
    return parentKey + '.' + elKey;
  }
  
  function buildFormData(formData, data, parentKey) {
    if (Array.isArray(data)) {
      data.forEach(function buildArray(el, i) {
        buildFormData(formData, el, combinedKey(parentKey, i));
      });
    } else if (
      typeof data === 'object' &&
      !(utils.isFile(data) || data === null)
    ) {
      Object.keys(data).forEach(function buildObject(key) {
        buildFormData(
          formData,
          data[key],
          parentKey ? combinedKey(parentKey, key) : key
        );
      });
    } else {
      if (data === undefined) {
        return;
      }
  
      var value =
        typeof data === 'boolean' || typeof data === 'number'
          ? data.toString()
          : data;
      formData.append(parentKey, value);
    }
  }
  
  /**
   * convert a data object to FormData
   *
   * type FormDataPrimitive = string | Blob | number | boolean
   * interface FormDataNest {
   *   [x: string]: FormVal
   * }
   *
   * type FormVal = FormDataNest | FormDataPrimitive
   *
   * @param {FormVal} data
   * @param {?Object} formData
   */
  
  module.exports = function getFormData(data, formData) {
    // eslint-disable-next-line no-param-reassign
    formData = formData || new FormData();
  
    buildFormData(formData, data);
  
    return formData;
  };
  