From 411b3abf55d46d185c0c3b2eb2d431a860befb75 Mon Sep 17 00:00:00 2001 From: Vladimir Sheremet Date: Mon, 28 Nov 2022 20:36:26 +0100 Subject: [PATCH 1/4] fix: dynamicImportSettled also waits for nested imports --- packages/vitest/src/integrations/vi.ts | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/packages/vitest/src/integrations/vi.ts b/packages/vitest/src/integrations/vi.ts index 5ed45968f469..046c3f84afc1 100644 --- a/packages/vitest/src/integrations/vi.ts +++ b/packages/vitest/src/integrations/vi.ts @@ -247,7 +247,7 @@ 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() @@ -256,10 +256,15 @@ class VitestUtils { if (mod.promise) 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 From 7803bb4060bdabca402dd8b843009d98e0b8dd67 Mon Sep 17 00:00:00 2001 From: Vladimir Sheremet Date: Mon, 28 Nov 2022 20:39:24 +0100 Subject: [PATCH 2/4] chore: wait only not evaluated modules --- packages/vite-node/src/client.ts | 4 +++- packages/vite-node/src/types.ts | 1 + packages/vitest/src/integrations/vi.ts | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/vite-node/src/client.ts b/packages/vite-node/src/client.ts index e95abee9e663..a5c187990ec5 100644 --- a/packages/vite-node/src/client.ts +++ b/packages/vite-node/src/client.ts @@ -286,7 +286,7 @@ export class ViteNodeRunner { }, }) - Object.assign(mod, { code: transformed, exports }) + Object.assign(mod, { code: transformed, exports, evaluated: false }) const __filename = fileURLToPath(url) const moduleProxy = { @@ -349,6 +349,8 @@ export class ViteNodeRunner { await fn(...Object.values(context)) + 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 046c3f84afc1..8d24ce2319d9 100644 --- a/packages/vitest/src/integrations/vi.ts +++ b/packages/vitest/src/integrations/vi.ts @@ -253,7 +253,7 @@ class VitestUtils { 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) From 7d2a2b21d827879e065852d8e4254c13a4d54934 Mon Sep 17 00:00:00 2001 From: Vladimir Sheremet Date: Mon, 28 Nov 2022 20:40:06 +0100 Subject: [PATCH 3/4] chore: always mark evaluated --- packages/vite-node/src/client.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/packages/vite-node/src/client.ts b/packages/vite-node/src/client.ts index a5c187990ec5..10a551a8d0d2 100644 --- a/packages/vite-node/src/client.ts +++ b/packages/vite-node/src/client.ts @@ -347,9 +347,12 @@ export class ViteNodeRunner { columnOffset: -codeDefinition.length, }) - await fn(...Object.values(context)) - - mod.evaluated = true + try { + await fn(...Object.values(context)) + } + finally { + mod.evaluated = true + } return exports } From a29a787e08b1b95c25fcec20218a5e0618b715c7 Mon Sep 17 00:00:00 2001 From: Vladimir Sheremet Date: Mon, 5 Dec 2022 15:28:28 +0100 Subject: [PATCH 4/4] chore: mark external modules evaluated --- packages/vite-node/src/client.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/vite-node/src/client.ts b/packages/vite-node/src/client.ts index 10a551a8d0d2..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 }