58 lines
1.6 KiB
JavaScript
58 lines
1.6 KiB
JavaScript
![]() |
import { RedirectComponentInstance, routeIsRedirect } from "../core/redirects/index.js";
|
||
|
import { preload } from "../core/render/dev/index.js";
|
||
|
import { getPrerenderStatus } from "./metadata.js";
|
||
|
async function getSortedPreloadedMatches({
|
||
|
env,
|
||
|
matches,
|
||
|
settings
|
||
|
}) {
|
||
|
return (await preloadAndSetPrerenderStatus({
|
||
|
env,
|
||
|
matches,
|
||
|
settings
|
||
|
})).sort((a, b) => prioritizePrerenderedMatchesComparator(a.route, b.route));
|
||
|
}
|
||
|
async function preloadAndSetPrerenderStatus({
|
||
|
env,
|
||
|
matches,
|
||
|
settings
|
||
|
}) {
|
||
|
const preloaded = await Promise.all(
|
||
|
matches.map(async (route) => {
|
||
|
const filePath = new URL(`./${route.component}`, settings.config.root);
|
||
|
if (routeIsRedirect(route)) {
|
||
|
return {
|
||
|
preloadedComponent: RedirectComponentInstance,
|
||
|
route,
|
||
|
filePath
|
||
|
};
|
||
|
}
|
||
|
const preloadedComponent = await preload({ env, filePath });
|
||
|
const prerenderStatus = getPrerenderStatus({
|
||
|
filePath,
|
||
|
loader: env.loader
|
||
|
});
|
||
|
if (prerenderStatus !== void 0) {
|
||
|
route.prerender = prerenderStatus;
|
||
|
}
|
||
|
return { preloadedComponent, route, filePath };
|
||
|
})
|
||
|
);
|
||
|
return preloaded;
|
||
|
}
|
||
|
function prioritizePrerenderedMatchesComparator(a, b) {
|
||
|
if (areRegexesEqual(a.pattern, b.pattern)) {
|
||
|
if (a.prerender !== b.prerender) {
|
||
|
return a.prerender ? -1 : 1;
|
||
|
}
|
||
|
return a.component < b.component ? -1 : 1;
|
||
|
}
|
||
|
return 0;
|
||
|
}
|
||
|
function areRegexesEqual(regexp1, regexp2) {
|
||
|
return regexp1.source === regexp2.source && regexp1.global === regexp2.global;
|
||
|
}
|
||
|
export {
|
||
|
getSortedPreloadedMatches
|
||
|
};
|