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}"`);
}