zephyr-rspress-plugin
Version:
Rspress plugin for Zephyr
53 lines (52 loc) • 1.78 kB
JavaScript
import "node:module";
const trackedHooks = new WeakMap();
function trackHook(plugin) {
if ('object' != typeof plugin || null === plugin || !('afterBuild' in plugin) || 'function' != typeof plugin.afterBuild || 'name' in plugin && 'zephyr-rspress-plugin-ssg' === plugin.name) return;
const existing = trackedHooks.get(plugin);
if (existing?.hook === plugin.afterBuild) return existing;
const originalHook = plugin.afterBuild;
const pending = new WeakMap();
const hook = function(config, isProd) {
let jobs = pending.get(config);
if (void 0 === jobs) {
jobs = [];
pending.set(config, jobs);
}
const currentJobs = jobs;
const job = Promise.resolve().then(async ()=>{
await Reflect.apply(originalHook, this, [
config,
isProd
]);
});
currentJobs.push(job);
const remove = ()=>{
const index = currentJobs.indexOf(job);
if (-1 !== index) currentJobs.splice(index, 1);
};
job.then(remove, remove);
return job;
};
plugin.afterBuild = hook;
const tracker = {
hook,
pending
};
trackedHooks.set(plugin, tracker);
return tracker;
}
function trackAfterBuildHooks(plugins) {
const trackers = plugins.map(trackHook).filter((tracker)=>void 0 !== tracker);
return async (config)=>{
await Promise.resolve();
const jobs = trackers.flatMap((tracker)=>{
const job = tracker.pending.get(config)?.shift();
return void 0 === job ? [] : [
job
];
});
await Promise.all(jobs);
};
}
export { trackAfterBuildHooks };
//# sourceMappingURL=afterBuildHooks.mjs.map