54 lines
1.8 KiB
JavaScript
54 lines
1.8 KiB
JavaScript
import debugUtil from "debug";
|
|
import { fileURLToPath } from "node:url";
|
|
import PathNormalizer from "./PathNormalizer.js";
|
|
|
|
const debug = debugUtil("Eleventy:EsmResolver");
|
|
|
|
let lastModifiedPaths = new Map();
|
|
export async function initialize({ port }) {
|
|
// From `eleventy.importCacheReset` event in Require.js
|
|
port.on("message", ({ path, newDate }) => {
|
|
lastModifiedPaths.set(path, newDate);
|
|
});
|
|
}
|
|
|
|
// Fixes issue https://github.com/11ty/eleventy/issues/3270
|
|
// Docs: https://nodejs.org/docs/latest/api/module.html#resolvespecifier-context-nextresolve
|
|
export async function resolve(specifier, context, nextResolve) {
|
|
try {
|
|
// Not a relative import and not a file import
|
|
// Or from node_modules (perhaps better to check if the specifier is in the project directory instead)
|
|
if (
|
|
(!specifier.startsWith("../") &&
|
|
!specifier.startsWith("./") &&
|
|
!specifier.startsWith("file:")) ||
|
|
context.parentURL.includes("/node_modules/")
|
|
) {
|
|
return nextResolve(specifier);
|
|
}
|
|
|
|
let fileUrl = new URL(specifier, context.parentURL);
|
|
if (fileUrl.searchParams.has("_cache_bust")) {
|
|
// already is cache busted outside resolver (wider compat, url was changed prior to import, probably in Require.js)
|
|
return nextResolve(specifier);
|
|
}
|
|
|
|
let absolutePath = PathNormalizer.normalizeSeperator(fileURLToPath(fileUrl));
|
|
// Bust the import cache if this is a recently modified file
|
|
if (lastModifiedPaths.has(absolutePath)) {
|
|
fileUrl.search = ""; // delete existing searchparams
|
|
fileUrl.searchParams.set("_cache_bust", lastModifiedPaths.get(absolutePath));
|
|
debug("Cache busting %o to %o", specifier, fileUrl.toString());
|
|
|
|
return nextResolve(fileUrl.toString());
|
|
}
|
|
} catch (e) {
|
|
debug("EsmResolver Error parsing specifier (%o): %o", specifier, e);
|
|
}
|
|
|
|
return nextResolve(specifier);
|
|
}
|
|
|
|
// export async function load(url, context, nextLoad) {
|
|
// }
|