astro
Version:
Astro is a modern site builder with web best practices, performance, and DX front-of-mind.
83 lines (82 loc) • 2.57 kB
JavaScript
import { stringifyParams } from "../routing/params.js";
import { validateDynamicRouteModule, validateGetStaticPathsResult } from "../routing/validation.js";
import { generatePaginateFunction } from "./paginate.js";
async function callGetStaticPaths({
mod,
route,
routeCache,
logger,
ssr,
base
}) {
const cached = routeCache.get(route);
if (!mod) {
throw new Error("This is an error caused by Astro and not your code. Please file an issue.");
}
if (cached?.staticPaths) {
return cached.staticPaths;
}
validateDynamicRouteModule(mod, { ssr, route });
if (ssr && !route.prerender) {
const entry = Object.assign([], { keyed: /* @__PURE__ */ new Map() });
routeCache.set(route, { ...cached, staticPaths: entry });
return entry;
}
let staticPaths = [];
if (!mod.getStaticPaths) {
throw new Error("Unexpected Error.");
}
staticPaths = await mod.getStaticPaths({
// Q: Why the cast?
// A: So users downstream can have nicer typings, we have to make some sacrifice in our internal typings, which necessitate a cast here
paginate: generatePaginateFunction(route, base)
});
validateGetStaticPathsResult(staticPaths, logger, route);
const keyedStaticPaths = staticPaths;
keyedStaticPaths.keyed = /* @__PURE__ */ new Map();
for (const sp of keyedStaticPaths) {
const paramsKey = stringifyParams(sp.params, route);
keyedStaticPaths.keyed.set(paramsKey, sp);
}
routeCache.set(route, { ...cached, staticPaths: keyedStaticPaths });
return keyedStaticPaths;
}
class RouteCache {
logger;
cache = {};
runtimeMode;
constructor(logger, runtimeMode = "production") {
this.logger = logger;
this.runtimeMode = runtimeMode;
}
/** Clear the cache. */
clearAll() {
this.cache = {};
}
set(route, entry) {
const key = this.key(route);
if (this.runtimeMode === "production" && this.cache[key]?.staticPaths) {
this.logger.warn(null, `Internal Warning: route cache overwritten. (${key})`);
}
this.cache[key] = entry;
}
get(route) {
return this.cache[this.key(route)];
}
key(route) {
return `${route.route}_${route.component}`;
}
}
function findPathItemByKey(staticPaths, params, route, logger) {
const paramsKey = stringifyParams(params, route);
const matchedStaticPath = staticPaths.keyed.get(paramsKey);
if (matchedStaticPath) {
return matchedStaticPath;
}
logger.debug("router", `findPathItemByKey() - Unexpected cache miss looking for ${paramsKey}`);
}
export {
RouteCache,
callGetStaticPaths,
findPathItemByKey
};