overlay
This commit is contained in:
@@ -76,6 +76,16 @@ interface ResolveLocationOptions {
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Geocoding results for a route segment, kept for the life of the process.
|
||||
*
|
||||
* A city's coordinates do not change, and the same segment is resolved over and
|
||||
* over: once per per-location route during the prerender (five builds of the
|
||||
* same lookup for every city), and again on every client-side hop from a city's
|
||||
* week page to its comparison or archive.
|
||||
*/
|
||||
const resolvedLocations = new Map<string, GeoLocation>();
|
||||
|
||||
export async function resolveLocationFromRoute({
|
||||
urlLocation,
|
||||
routePrefix,
|
||||
@@ -86,6 +96,11 @@ export async function resolveLocationFromRoute({
|
||||
return coordinateLocation(parseFloat(coordMatch[1]), parseFloat(coordMatch[2]));
|
||||
}
|
||||
|
||||
// The canonical-path check below still has to run per call (the same city is
|
||||
// reached under different route prefixes), so only the lookup is cached.
|
||||
const cached = resolvedLocations.get(urlLocation);
|
||||
if (cached) return finishResolve(cached, routePrefix, event);
|
||||
|
||||
let urlLocationName: string;
|
||||
let urlLocationId: string | undefined;
|
||||
|
||||
@@ -124,6 +139,15 @@ export async function resolveLocationFromRoute({
|
||||
location = candidate;
|
||||
}
|
||||
|
||||
resolvedLocations.set(urlLocation, location);
|
||||
return finishResolve(location, routePrefix, event);
|
||||
}
|
||||
|
||||
function finishResolve(
|
||||
location: GeoLocation,
|
||||
routePrefix: string,
|
||||
event: ResolveLocationOptions['event']
|
||||
): GeoLocation {
|
||||
// trailingSlash is 'always' (see routes/+layout.ts), so the router serves
|
||||
// every path with a trailing slash. Match that here or the equality check
|
||||
// never holds and the redirect loops forever. The comparison also has to
|
||||
|
||||
Reference in New Issue
Block a user