From 5098b2174b5e9e6b0112f77fb553a54bc01c6796 Mon Sep 17 00:00:00 2001 From: Vladimir Date: Mon, 5 Dec 2022 15:45:52 +0100 Subject: [PATCH] fix: dynamicImportSettled also waits for nested imports (#2389) * fix: dynamicImportSettled also waits for nested imports * chore: wait only not evaluated modules * chore: always mark evaluated * chore: mark external modules evaluated --- packages/vite-node/src/client.ts | 10 ++++++++-- packages/vite-node/src/types.ts | 1 + packages/vitest/src/integrations/vi.ts | 13 +++++++++---- 3 files changed, 18 insertions(+), 6 deletions(-) diff --git a/packages/vite-node/src/client.ts b/packages/vite-node/src/client.ts index e95abee9e663..b2b9d6a7deba 100644 --- a/packages/vite-node/src/client.ts +++ b/packages/vite-node/src/client.ts @@ -247,6 +247,7 @@ export class ViteNodeRunner { debugNative(externalize) const exports = await this.interopedImport(externalize) mod.exports = exports + mod.evaluated = true return exports } @@ -286,7 +287,7 @@ export class ViteNodeRunner { }, }) - Object.assign(mod, { code: transformed, exports }) + Object.assign(mod, { code: transformed, exports, evaluated: false }) const __filename = fileURLToPath(url) const moduleProxy = { @@ -347,7 +348,12 @@ export class ViteNodeRunner { columnOffset: -codeDefinition.length, }) - await fn(...Object.values(context)) + try { + await fn(...Object.values(context)) + } + finally { + mod.evaluated = true + } return exports } diff --git a/packages/vite-node/src/types.ts b/packages/vite-node/src/types.ts index c94cfcfd75a9..606c0f00666a 100644 --- a/packages/vite-node/src/types.ts +++ b/packages/vite-node/src/types.ts @@ -44,6 +44,7 @@ export type CreateHotContextFunction = (runner: ViteNodeRunner, url: string) => export interface ModuleCache { promise?: Promise exports?: any + evaluated?: boolean code?: string map?: RawSourceMap /** diff --git a/packages/vitest/src/integrations/vi.ts b/packages/vitest/src/integrations/vi.ts index 5ed45968f469..8d24ce2319d9 100644 --- a/packages/vitest/src/integrations/vi.ts +++ b/packages/vitest/src/integrations/vi.ts @@ -247,19 +247,24 @@ class VitestUtils { /** * Wait for all imports to load. * Useful, if you have a synchronous call that starts - * importing a module, that you cannot wait otherwise. + * importing a module that you cannot wait otherwise. */ public async dynamicImportSettled() { const state = getWorkerState() const promises: Promise[] = [] for (const mod of state.moduleCache.values()) { - if (mod.promise) + if (mod.promise && !mod.evaluated) promises.push(mod.promise) } + if (!promises.length) + return await Promise.allSettled(promises) - // wait until the end of the loop, so `.then` on modules called, + // wait until the end of the loop, so `.then` on modules is called, // like in import('./example').then(...) - await new Promise(resolve => setTimeout(resolve, 1)).then(() => Promise.resolve()) + // also call dynamicImportSettled again in case new imports were added + await new Promise(resolve => setTimeout(resolve, 1)) + .then(() => Promise.resolve()) + .then(() => this.dynamicImportSettled()) } private _config: null | ResolvedConfig = null