function encodeURL()

in packages/recoil-sync/RecoilSync_URL.js [90:125]


function encodeURL(
  href: string,
  loc: LocationOption,
  items: ItemSnapshot,
  serialize: mixed => string,
): string {
  const url = new URL(href);
  switch (loc.part) {
    case 'href':
      return serialize(unwrapState(items));
    case 'hash':
      url.hash = encodeURIComponent(serialize(unwrapState(items)));
      break;
    case 'search':
      url.search = encodeURIComponent(serialize(unwrapState(items)));
      break;
    case 'queryParams': {
      const {param} = loc;
      const searchParams = new URLSearchParams(url.search);
      if (param != null) {
        searchParams.set(param, serialize(unwrapState(items)));
      } else {
        for (const [itemKey, value] of items.entries()) {
          value instanceof DefaultValue
            ? searchParams.delete(itemKey)
            : searchParams.set(itemKey, serialize(value));
        }
      }
      url.search = searchParams.toString();
      break;
    }
    default:
      throw err(`Unknown URL location part: "${loc.part}"`);
  }
  return url.href;
}