65 lines
2.2 KiB
JavaScript
65 lines
2.2 KiB
JavaScript
const VIRTUAL_MODULE_ID = "astro:prefetch";
|
|
const RESOLVED_VIRTUAL_MODULE_ID = "\0" + VIRTUAL_MODULE_ID;
|
|
const prefetchInternalModuleFsSubpath = "astro/dist/prefetch/index.js";
|
|
const prefetchCode = `import { init } from 'astro/virtual-modules/prefetch.js';init()`;
|
|
function astroPrefetch({ settings }) {
|
|
const prefetchOption = settings.config.prefetch;
|
|
const prefetch = prefetchOption ? typeof prefetchOption === "object" ? prefetchOption : {} : void 0;
|
|
if (prefetch && settings.scripts.every((s) => s.content !== prefetchCode)) {
|
|
settings.scripts.push({
|
|
stage: "page",
|
|
content: `import { init } from 'astro/virtual-modules/prefetch.js';init()`
|
|
});
|
|
}
|
|
const throwPrefetchNotEnabledError = () => {
|
|
throw new Error("You need to enable the `prefetch` Astro config to import `astro:prefetch`");
|
|
};
|
|
return {
|
|
name: "astro:prefetch",
|
|
resolveId: {
|
|
filter: {
|
|
id: new RegExp(`^${VIRTUAL_MODULE_ID}$`)
|
|
},
|
|
handler() {
|
|
if (!prefetch) throwPrefetchNotEnabledError();
|
|
return RESOLVED_VIRTUAL_MODULE_ID;
|
|
}
|
|
},
|
|
load: {
|
|
filter: {
|
|
id: new RegExp(`^${RESOLVED_VIRTUAL_MODULE_ID}$`)
|
|
},
|
|
handler() {
|
|
if (!prefetch) throwPrefetchNotEnabledError();
|
|
return { code: `export { prefetch } from "astro/virtual-modules/prefetch.js";` };
|
|
}
|
|
},
|
|
transform: {
|
|
filter: {
|
|
// NOTE: Handle replacing the specifiers even if prefetch is disabled so View Transitions
|
|
// can import the internal module and not hit runtime issues.
|
|
id: new RegExp(`${prefetchInternalModuleFsSubpath}`)
|
|
},
|
|
handler(code) {
|
|
code = code.replace(
|
|
"__PREFETCH_PREFETCH_ALL__",
|
|
// length: 25
|
|
`${JSON.stringify(prefetch?.prefetchAll)}`.padEnd(25)
|
|
).replace(
|
|
"__PREFETCH_DEFAULT_STRATEGY__",
|
|
// length: 29
|
|
`${JSON.stringify(prefetch?.defaultStrategy)}`.padEnd(29)
|
|
).replace(
|
|
"__EXPERIMENTAL_CLIENT_PRERENDER__",
|
|
// length: 33
|
|
`${JSON.stringify(settings.config.experimental.clientPrerender)}`.padEnd(33)
|
|
);
|
|
return { code, map: null };
|
|
}
|
|
}
|
|
};
|
|
}
|
|
export {
|
|
astroPrefetch as default
|
|
};
|