Fix CI test compatibility on Node 20

This commit is contained in:
Youzini-afk
2026-04-10 15:14:05 +08:00
parent c47f4f61d3
commit eaac52473e
12 changed files with 301 additions and 278 deletions

View File

@@ -0,0 +1,54 @@
import { register, registerHooks } from "node:module";
export function toDataModuleUrl(source = "") {
return `data:text/javascript,${encodeURIComponent(String(source || ""))}`;
}
export function installResolveHooks(entries = []) {
const normalizedEntries = (Array.isArray(entries) ? entries : [])
.map((entry) => ({
specifiers: Array.isArray(entry?.specifiers)
? entry.specifiers.map((value) => String(value || "")).filter(Boolean)
: [],
url: String(entry?.url || ""),
}))
.filter((entry) => entry.specifiers.length > 0 && entry.url);
if (typeof registerHooks === "function") {
registerHooks({
resolve(specifier, context, nextResolve) {
for (const entry of normalizedEntries) {
if (entry.specifiers.includes(specifier)) {
return {
shortCircuit: true,
url: entry.url,
};
}
}
return nextResolve(specifier, context);
},
});
return;
}
if (typeof register === "function") {
const loaderSource = `
const entries = ${JSON.stringify(normalizedEntries)};
export async function resolve(specifier, context, nextResolve) {
for (const entry of entries) {
if (Array.isArray(entry.specifiers) && entry.specifiers.includes(specifier)) {
return {
shortCircuit: true,
url: entry.url,
};
}
}
return nextResolve(specifier, context);
}
`;
register(toDataModuleUrl(loaderSource), import.meta.url);
return;
}
throw new Error("No compatible module hook API available");
}