function normalize_stringify_options()

in internal/qs/stringify.ts [242:356]


function normalize_stringify_options(
  opts: StringifyOptions = defaults,
): NonNullableProperties<Omit<StringifyOptions, "indices">> & {
  indices?: boolean;
} {
  if (
    typeof opts.allowEmptyArrays !== "undefined" &&
    typeof opts.allowEmptyArrays !== "boolean"
  ) {
    throw new TypeError(
      "`allowEmptyArrays` option can only be `true` or `false`, when provided",
    );
  }

  if (
    typeof opts.encodeDotInKeys !== "undefined" &&
    typeof opts.encodeDotInKeys !== "boolean"
  ) {
    throw new TypeError(
      "`encodeDotInKeys` option can only be `true` or `false`, when provided",
    );
  }

  if (
    opts.encoder !== null && typeof opts.encoder !== "undefined" &&
    typeof opts.encoder !== "function"
  ) {
    throw new TypeError("Encoder has to be a function.");
  }

  const charset = opts.charset || defaults.charset;
  if (
    typeof opts.charset !== "undefined" && opts.charset !== "utf-8" &&
    opts.charset !== "iso-8859-1"
  ) {
    throw new TypeError(
      "The charset option must be either utf-8, iso-8859-1, or undefined",
    );
  }

  let format = default_format;
  if (typeof opts.format !== "undefined") {
    if (!has.call(formatters, opts.format)) {
      throw new TypeError("Unknown format option provided.");
    }
    format = opts.format;
  }
  const formatter = formatters[format];

  let filter = defaults.filter;
  if (typeof opts.filter === "function" || is_array(opts.filter)) {
    filter = opts.filter;
  }

  let arrayFormat: StringifyOptions["arrayFormat"];
  if (opts.arrayFormat && opts.arrayFormat in array_prefix_generators) {
    arrayFormat = opts.arrayFormat;
  } else if ("indices" in opts) {
    arrayFormat = opts.indices ? "indices" : "repeat";
  } else {
    arrayFormat = defaults.arrayFormat;
  }

  if ("commaRoundTrip" in opts && typeof opts.commaRoundTrip !== "boolean") {
    throw new TypeError("`commaRoundTrip` must be a boolean, or absent");
  }

  const allowDots = typeof opts.allowDots === "undefined"
    ? !!opts.encodeDotInKeys === true ? true : defaults.allowDots
    : !!opts.allowDots;

  return {
    addQueryPrefix: typeof opts.addQueryPrefix === "boolean"
      ? opts.addQueryPrefix
      : defaults.addQueryPrefix,
    // @ts-ignore
    allowDots: allowDots,
    allowEmptyArrays: typeof opts.allowEmptyArrays === "boolean"
      ? !!opts.allowEmptyArrays
      : defaults.allowEmptyArrays,
    arrayFormat: arrayFormat,
    charset: charset,
    charsetSentinel: typeof opts.charsetSentinel === "boolean"
      ? opts.charsetSentinel
      : defaults.charsetSentinel,
    commaRoundTrip: !!opts.commaRoundTrip,
    delimiter: typeof opts.delimiter === "undefined"
      ? defaults.delimiter
      : opts.delimiter,
    encode: typeof opts.encode === "boolean" ? opts.encode : defaults.encode,
    encodeDotInKeys: typeof opts.encodeDotInKeys === "boolean"
      ? opts.encodeDotInKeys
      : defaults.encodeDotInKeys,
    encoder: typeof opts.encoder === "function"
      ? opts.encoder
      : defaults.encoder,
    encodeValuesOnly: typeof opts.encodeValuesOnly === "boolean"
      ? opts.encodeValuesOnly
      : defaults.encodeValuesOnly,
    filter: filter,
    format: format,
    formatter: formatter,
    serializeDate: typeof opts.serializeDate === "function"
      ? opts.serializeDate
      : defaults.serializeDate,
    skipNulls: typeof opts.skipNulls === "boolean"
      ? opts.skipNulls
      : defaults.skipNulls,
    // @ts-ignore
    sort: typeof opts.sort === "function" ? opts.sort : null,
    strictNullHandling: typeof opts.strictNullHandling === "boolean"
      ? opts.strictNullHandling
      : defaults.strictNullHandling,
  };
}