diff --git a/lib/plugins/src/_internal/dependency-graph.ts b/lib/plugins/src/_internal/dependency-graph.ts index d24f286..bce3f9f 100644 --- a/lib/plugins/src/_internal/dependency-graph.ts +++ b/lib/plugins/src/_internal/dependency-graph.ts @@ -15,7 +15,7 @@ export const pRootNodes = new Set() export const pLeafOrSingleNodes = new Set() // Visited non-leaf nodes -const visited = new WeakSet() +const visited = new Set() // Ordered list of plugins to be started export const pListOrdered: AnyPlugin[] = [] @@ -48,6 +48,7 @@ export function computePendingNodes() { pPending.clear() pLeafOrSingleNodes.clear() pRootNodes.clear() + visited.clear() } export function resolvePluginGraph(plugin: AnyPlugin) { diff --git a/lib/plugins/src/_internal/index.ts b/lib/plugins/src/_internal/index.ts index 8ec2499..41c62fe 100644 --- a/lib/plugins/src/_internal/index.ts +++ b/lib/plugins/src/_internal/index.ts @@ -11,7 +11,12 @@ import { pDecoratorsStart, pImplicitDeps, } from './decorators' -import { pLeafOrSingleNodes, pPending } from './dependency-graph' +import { + computePendingNodes, + pLeafOrSingleNodes, + pListOrdered, + pPending, +} from './dependency-graph' import type { InitPluginApi, Plugin, @@ -299,8 +304,7 @@ export async function enablePlugin(plugin: AnyPlugin) { await Promise.all( getPluginDependencies(plugin).map(dep => { - if (dep.flags & Flag.Enabled) return - return runPluginLate(dep) + if (!isPluginEnabled(dep)) return enablePlugin(dep) }), ) @@ -318,9 +322,18 @@ export async function runPluginLate(plugin: AnyPlugin) { plugin.flags |= Flag.EnabledLate - await preInitPlugin(plugin) - await initPlugin(plugin) - await startPlugin(plugin) + // Reset previous computations + pListOrdered.length = 0 + pPending.add(plugin) + computePendingNodes() + + await Promise.all( + pListOrdered.map(async function runLate(plugin) { + await preInitPlugin(plugin) + await initPlugin(plugin) + await startPlugin(plugin) + }), + ) } /**