function parseURL()

in packages/recoil-sync/RecoilSync_URL.js [52:88]


function parseURL(
  href: string,
  loc: LocationOption,
  deserialize: string => mixed,
): ?ItemSnapshot {
  const url = new URL(href);
  switch (loc.part) {
    case 'href':
      return wrapState(deserialize(`${url.pathname}${url.search}${url.hash}`));
    case 'hash':
      return url.hash
        ? wrapState(deserialize(decodeURIComponent(url.hash.substr(1))))
        : null;
    case 'search':
      return url.search
        ? wrapState(deserialize(decodeURIComponent(url.search.substr(1))))
        : null;
    case 'queryParams': {
      const searchParams = new URLSearchParams(url.search);
      const {param} = loc;
      if (param != null) {
        const stateStr = searchParams.get(param);
        return stateStr != null ? wrapState(deserialize(stateStr)) : null;
      }
      return new Map(
        Array.from(searchParams.entries()).map(([key, value]) => {
          try {
            return [key, deserialize(value)];
          } catch (error) {
            return [key, RecoilLoadable.error(error)];
          }
        }),
      );
    }
  }
  throw err(`Unknown URL location part: "${loc.part}"`);
}