diff --git a/packages/nuxt/src/app/nuxt.ts b/packages/nuxt/src/app/nuxt.ts index 93c5ebc9d8..9f91b855b4 100644 --- a/packages/nuxt/src/app/nuxt.ts +++ b/packages/nuxt/src/app/nuxt.ts @@ -17,7 +17,9 @@ import type { RouteMiddleware } from '../../app' import type { NuxtError } from '../app/composables/error' import type { AsyncDataRequestStatus } from '../app/composables/asyncData' -const nuxtAppCtx = /* #__PURE__ */ getContext('nuxt-app') +const nuxtAppCtx = /* #__PURE__ */ getContext('nuxt-app', { + asyncContext: !!process.env.NUXT_ASYNC_CONTEXT && process.server +}) type HookResult = Promise | void diff --git a/packages/nuxt/src/core/nitro.ts b/packages/nuxt/src/core/nitro.ts index 1f3ff7669a..eaed6dd2d6 100644 --- a/packages/nuxt/src/core/nitro.ts +++ b/packages/nuxt/src/core/nitro.ts @@ -45,7 +45,8 @@ export async function initNitro (nuxt: Nuxt & { _nitro?: Nitro }) { buildDir: nuxt.options.buildDir, experimental: { // @ts-expect-error `typescriptBundlerResolution` coming in next nitro version - typescriptBundlerResolution: nuxt.options.experimental.typescriptBundlerResolution || nuxt.options.typescript?.tsConfig?.compilerOptions?.moduleResolution?.toLowerCase() === 'bundler' || _nitroConfig.typescript?.tsConfig?.compilerOptions?.moduleResolution?.toLowerCase() === 'bundler' + typescriptBundlerResolution: nuxt.options.experimental.typescriptBundlerResolution || nuxt.options.typescript?.tsConfig?.compilerOptions?.moduleResolution?.toLowerCase() === 'bundler' || _nitroConfig.typescript?.tsConfig?.compilerOptions?.moduleResolution?.toLowerCase() === 'bundler', + asyncContext: nuxt.options.experimental.asyncContext }, imports: { autoImport: nuxt.options.imports.autoImport as boolean, @@ -191,6 +192,7 @@ export async function initNitro (nuxt: Nuxt & { _nitro?: Nitro }) { 'process.env.NUXT_INLINE_STYLES': !!nuxt.options.experimental.inlineSSRStyles, 'process.env.NUXT_JSON_PAYLOADS': !!nuxt.options.experimental.renderJsonPayloads, 'process.env.NUXT_COMPONENT_ISLANDS': !!nuxt.options.experimental.componentIslands, + 'process.env.NUXT_ASYNC_CONTEXT': !!nuxt.options.experimental.asyncContext, 'process.dev': nuxt.options.dev, __VUE_PROD_DEVTOOLS__: false }, diff --git a/packages/nuxt/src/core/nuxt.ts b/packages/nuxt/src/core/nuxt.ts index e4af11b73a..b703f64944 100644 --- a/packages/nuxt/src/core/nuxt.ts +++ b/packages/nuxt/src/core/nuxt.ts @@ -25,6 +25,7 @@ import { addModuleTranspiles } from './modules' import { initNitro } from './nitro' import schemaModule from './schema' import { RemovePluginMetadataPlugin } from './plugins/plugin-metadata' +import { AsyncContextInjectionPlugin } from './plugins/async-context' import { resolveDeepImportsPlugin } from './plugins/resolve-deep-imports' export function createNuxt (options: NuxtOptions): Nuxt { @@ -143,6 +144,11 @@ async function initNuxt (nuxt: Nuxt) { addWebpackPlugin(() => DevOnlyPlugin.webpack({ sourcemap: nuxt.options.sourcemap.server || nuxt.options.sourcemap.client })) } + // Transform initial composable call within ` diff --git a/vitest.config.ts b/vitest.config.ts index 29ce8108e2..827ca9db74 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -11,6 +11,9 @@ export default defineConfig({ '@nuxt/test-utils': resolve('./packages/test-utils/src/index.ts') } }, + define: { + 'process.env.NUXT_ASYNC_CONTEXT': 'false' + }, test: { globalSetup: './test/setup.ts', testTimeout: isWindows ? 60000 : 10000,