UNPKG

zephyr-rspress-plugin

Version:

Rspress plugin for Zephyr

53 lines (52 loc) • 1.78 kB
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