From 5391ca6e0ef0a6bd80624b1b7b2a03461848358a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4=20=28Donny=29?= Date: Wed, 5 Feb 2025 17:08:28 +0900 Subject: [PATCH 01/13] Do not run react compioler for files in node modules --- packages/next/src/build/babel/loader/get-config.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/next/src/build/babel/loader/get-config.ts b/packages/next/src/build/babel/loader/get-config.ts index 186ce06f42d17..14a4b8b5da33e 100644 --- a/packages/next/src/build/babel/loader/get-config.ts +++ b/packages/next/src/build/babel/loader/get-config.ts @@ -273,6 +273,10 @@ function getFreshConfig( return false } + if (filename.includes('node_modules')) { + return false + } + if ( loaderOptions.reactCompilerExclude && loaderOptions.reactCompilerExclude(filename) From 5d94226fe1075572f72f8b961e9c883373b0ae15 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4=20=28Donny=29?= Date: Wed, 5 Feb 2025 17:38:58 +0900 Subject: [PATCH 02/13] Disable babel if not required --- packages/next/src/build/babel/loader/get-config.ts | 7 +++++++ packages/next/src/build/babel/loader/transform.ts | 3 +++ 2 files changed, 10 insertions(+) diff --git a/packages/next/src/build/babel/loader/get-config.ts b/packages/next/src/build/babel/loader/get-config.ts index 14a4b8b5da33e..9180ada20add3 100644 --- a/packages/next/src/build/babel/loader/get-config.ts +++ b/packages/next/src/build/babel/loader/get-config.ts @@ -329,6 +329,10 @@ function getFreshConfig( } if (loaderOptions.transformMode === 'standalone') { + if (!reactCompilerPluginsIfEnabled.length) { + return null + } + options.plugins = [jsx, ...reactCompilerPluginsIfEnabled] options.presets = [ [ @@ -462,6 +466,9 @@ export default function getConfig( const cacheKey = getCacheKey(cacheCharacteristics) if (configCache.has(cacheKey)) { const cachedConfig = configCache.get(cacheKey) + if (!cachedConfig) { + return null + } return { ...cachedConfig, diff --git a/packages/next/src/build/babel/loader/transform.ts b/packages/next/src/build/babel/loader/transform.ts index 8357313bb943c..f76debc32b296 100644 --- a/packages/next/src/build/babel/loader/transform.ts +++ b/packages/next/src/build/babel/loader/transform.ts @@ -86,6 +86,9 @@ export default function transform( target, filename, }) + if (!babelConfig) { + return { code: source, map: inputSourceMap } + } getConfigSpan.stop() const normalizeSpan = parentSpan.traceChild('babel-turbo-normalize-file') From 423a9cbf7411bdd13b1619f8e301dc89fa1fdf0e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4=20=28Donny=29?= Date: Wed, 5 Feb 2025 18:13:04 +0900 Subject: [PATCH 03/13] review --- packages/next/src/build/babel/loader/get-config.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/next/src/build/babel/loader/get-config.ts b/packages/next/src/build/babel/loader/get-config.ts index 9180ada20add3..77ba73f2aa668 100644 --- a/packages/next/src/build/babel/loader/get-config.ts +++ b/packages/next/src/build/babel/loader/get-config.ts @@ -273,7 +273,10 @@ function getFreshConfig( return false } - if (filename.includes('node_modules')) { + if ( + filename.includes('/node_modules/') || + filename.includes('\\node_modules\\') + ) { return false } From a2538e91a17f73a7711b01f50c5e919273facfed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4=20=28Donny=29?= Date: Mon, 3 Feb 2025 18:11:39 +0900 Subject: [PATCH 04/13] Make `reactCompilerExclude` async --- packages/next/src/build/babel/loader/get-config.ts | 10 +++++----- packages/next/src/build/babel/loader/index.ts | 2 +- packages/next/src/build/babel/loader/transform.ts | 4 ++-- packages/next/src/build/babel/loader/types.d.ts | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/next/src/build/babel/loader/get-config.ts b/packages/next/src/build/babel/loader/get-config.ts index 77ba73f2aa668..3ad0a56a0bef2 100644 --- a/packages/next/src/build/babel/loader/get-config.ts +++ b/packages/next/src/build/babel/loader/get-config.ts @@ -257,7 +257,7 @@ function checkCustomBabelConfigDeprecation( * Generate a new, flat Babel config, ready to be handed to Babel-traverse. * This config should have no unresolved overrides, presets, etc. */ -function getFreshConfig( +async function getFreshConfig( this: NextJsLoaderContext, cacheCharacteristics: CharacteristicsGermaneToCaching, loaderOptions: NextBabelLoaderOptions, @@ -265,7 +265,7 @@ function getFreshConfig( filename: string, inputSourceMap?: object | null ) { - const hasReactCompiler = (() => { + const hasReactCompiler = await (async () => { if ( loaderOptions.reactCompilerPlugins && loaderOptions.reactCompilerPlugins.length === 0 @@ -282,7 +282,7 @@ function getFreshConfig( if ( loaderOptions.reactCompilerExclude && - loaderOptions.reactCompilerExclude(filename) + (await loaderOptions.reactCompilerExclude(filename)) ) { return false } @@ -439,7 +439,7 @@ type BabelConfig = any const configCache: Map = new Map() const configFiles: Set = new Set() -export default function getConfig( +export default async function getConfig( this: NextJsLoaderContext, { source, @@ -454,7 +454,7 @@ export default function getConfig( filename: string inputSourceMap?: object | null } -): BabelConfig { +): Promise { const cacheCharacteristics = getCacheCharacteristics( loaderOptions, source, diff --git a/packages/next/src/build/babel/loader/index.ts b/packages/next/src/build/babel/loader/index.ts index 119ca6b8dc513..8a789d38180b8 100644 --- a/packages/next/src/build/babel/loader/index.ts +++ b/packages/next/src/build/babel/loader/index.ts @@ -27,7 +27,7 @@ async function nextBabelLoader( const loaderSpanInner = parentTrace.traceChild('next-babel-turbo-transform') const { code: transformedSource, map: outputSourceMap } = - loaderSpanInner.traceFn(() => + await loaderSpanInner.traceAsyncFn(() => transform.call( this, inputSource, diff --git a/packages/next/src/build/babel/loader/transform.ts b/packages/next/src/build/babel/loader/transform.ts index f76debc32b296..71cf68bd06872 100644 --- a/packages/next/src/build/babel/loader/transform.ts +++ b/packages/next/src/build/babel/loader/transform.ts @@ -69,7 +69,7 @@ function transformAst(file: any, babelConfig: any, parentSpan: Span) { } } -export default function transform( +export default async function transform( this: NextJsLoaderContext, source: string, inputSourceMap: object | null | undefined, @@ -79,7 +79,7 @@ export default function transform( parentSpan: Span ) { const getConfigSpan = parentSpan.traceChild('babel-turbo-get-config') - const babelConfig = getConfig.call(this, { + const babelConfig = await getConfig.call(this, { source, loaderOptions, inputSourceMap, diff --git a/packages/next/src/build/babel/loader/types.d.ts b/packages/next/src/build/babel/loader/types.d.ts index 812157a2f9795..59c9f6e105fcd 100644 --- a/packages/next/src/build/babel/loader/types.d.ts +++ b/packages/next/src/build/babel/loader/types.d.ts @@ -17,7 +17,7 @@ export interface NextBabelLoaderBaseOptions { // Custom plugins to be added to the generated babel options. reactCompilerPlugins?: Array - reactCompilerExclude?: (excludePath: string) => boolean + reactCompilerExclude?: (excludePath: string) => Promise } /** From 2773f36a53757cf5d081d1d5bb22d2a078b9b019 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4=20=28Donny=29?= Date: Mon, 3 Feb 2025 18:16:24 +0900 Subject: [PATCH 05/13] isReactCompilerRequired --- packages/next/src/build/get-babel-loader-config.ts | 8 ++++---- packages/next/src/build/swc/index.ts | 7 +++++++ packages/next/src/build/swc/types.ts | 4 ++++ 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/packages/next/src/build/get-babel-loader-config.ts b/packages/next/src/build/get-babel-loader-config.ts index 886ddc615a1ca..44b27418c7042 100644 --- a/packages/next/src/build/get-babel-loader-config.ts +++ b/packages/next/src/build/get-babel-loader-config.ts @@ -1,5 +1,6 @@ import path from 'path' import type { ReactCompilerOptions } from '../server/config-shared' +import { isReactCompilerRequired } from './swc' function getReactCompiler() { try { @@ -101,13 +102,12 @@ const getReactCompilerLoader = ( transformMode: 'standalone', cwd, reactCompilerPlugins, + reactCompilerExclude: async (filename: string) => + reactCompilerExclude?.(filename) || + !(await isReactCompilerRequired(filename)), }, } - if (reactCompilerExclude) { - config.options.reactCompilerExclude = reactCompilerExclude - } - return config } diff --git a/packages/next/src/build/swc/index.ts b/packages/next/src/build/swc/index.ts index 58e17490b974c..cf0e4da61e575 100644 --- a/packages/next/src/build/swc/index.ts +++ b/packages/next/src/build/swc/index.ts @@ -1295,6 +1295,13 @@ export async function minify(src: string, options: any): Promise { return bindings.minify(src, options) } +export async function isReactCompilerRequired( + filename: string +): Promise { + let bindings = await loadBindings() + return bindings.reactCompiler.isReactCompilerRequired(filename) +} + export async function parse(src: string, options: any): Promise { let bindings = await loadBindings() let parserOptions = getParserOptions(options) diff --git a/packages/next/src/build/swc/types.ts b/packages/next/src/build/swc/types.ts index e4d2fb08562b9..bf45ce6bf7aba 100644 --- a/packages/next/src/build/swc/types.ts +++ b/packages/next/src/build/swc/types.ts @@ -39,6 +39,10 @@ export interface Binding { transformStyleAttr(transformAttrOptions: any): Promise } } + + reactCompiler: { + isReactCompilerRequired(filename: string): Promise + } } export type StyledString = From 4ef97c3d8cebd66184e8e78168c4f825510b28d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4=20=28Donny=29?= Date: Mon, 3 Feb 2025 18:17:42 +0900 Subject: [PATCH 06/13] bindings.isReactCompilerRequired --- packages/next/src/build/swc/index.ts | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/packages/next/src/build/swc/index.ts b/packages/next/src/build/swc/index.ts index cf0e4da61e575..12573d08b6153 100644 --- a/packages/next/src/build/swc/index.ts +++ b/packages/next/src/build/swc/index.ts @@ -1082,6 +1082,11 @@ async function loadWasm(importPath = '') { return bindings.mdxCompileSync(src, getMdxOptions(options)) }, }, + reactCompiler: { + isReactCompilerRequired: (filename: string) => { + return bindings.isReactCompilerRequired(filename) + }, + }, } return wasmBindings } catch (e: any) { @@ -1253,6 +1258,11 @@ function loadNative(importPath?: string) { }, }, }, + reactCompiler: { + isReactCompilerRequired: (filename: string) => { + return bindings.isReactCompilerRequired(filename) + }, + }, } return nativeBindings } From 1741c5f5ef52d10c579acaab356e0c149ef81549 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4=20=28Donny=29?= Date: Mon, 3 Feb 2025 20:08:25 +0900 Subject: [PATCH 07/13] Disable for Wasm --- packages/next/src/build/swc/index.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/next/src/build/swc/index.ts b/packages/next/src/build/swc/index.ts index 12573d08b6153..890f15e0cd454 100644 --- a/packages/next/src/build/swc/index.ts +++ b/packages/next/src/build/swc/index.ts @@ -1083,8 +1083,8 @@ async function loadWasm(importPath = '') { }, }, reactCompiler: { - isReactCompilerRequired: (filename: string) => { - return bindings.isReactCompilerRequired(filename) + isReactCompilerRequired(_filename: string) { + return Promise.resolve(true) }, }, } From 3a03dea8246195ee20924e3bc0359af90bfa9421 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4=20=28Donny=29?= Date: Mon, 3 Feb 2025 20:20:35 +0900 Subject: [PATCH 08/13] Implement --- crates/napi/src/lib.rs | 1 + crates/napi/src/react_compiler.rs | 121 ++++++++++++++++++++++++++++++ 2 files changed, 122 insertions(+) create mode 100644 crates/napi/src/react_compiler.rs diff --git a/crates/napi/src/lib.rs b/crates/napi/src/lib.rs index e4b4795d8030d..5ef12a332597d 100644 --- a/crates/napi/src/lib.rs +++ b/crates/napi/src/lib.rs @@ -54,6 +54,7 @@ pub mod minify; #[cfg(not(target_arch = "wasm32"))] pub mod next_api; pub mod parse; +pub mod react_compiler; pub mod transform; #[cfg(not(target_arch = "wasm32"))] pub mod turbo_trace_server; diff --git a/crates/napi/src/react_compiler.rs b/crates/napi/src/react_compiler.rs new file mode 100644 index 0000000000000..80677ef4d6118 --- /dev/null +++ b/crates/napi/src/react_compiler.rs @@ -0,0 +1,121 @@ +use std::{path::PathBuf, sync::Arc}; + +use anyhow::Context as _; +use napi::bindgen_prelude::*; +use swc_core::{ + common::{SourceMap, GLOBALS}, + ecma::{ + ast::{Callee, EsVersion, Expr, FnDecl, Program, ReturnStmt}, + parser::{parse_file_as_program, Syntax, TsSyntax}, + visit::{Visit, VisitWith}, + }, +}; + +use crate::util::MapErr; + +pub struct CheckTask { + pub filename: PathBuf, +} + +#[napi] +impl Task for CheckTask { + type Output = bool; + type JsValue = bool; + + fn compute(&mut self) -> napi::Result { + GLOBALS.set(&Default::default(), || { + // + let cm = Arc::new(SourceMap::default()); + let fm = cm + .load_file(&self.filename.clone()) + .context("failed to load file") + .convert_err()?; + let mut errors = vec![]; + let Ok(program) = parse_file_as_program( + &fm, + Syntax::Typescript(TsSyntax { + tsx: true, + ..Default::default() + }), + EsVersion::EsNext, + None, + &mut errors, + ) else { + return Ok(false); + }; + if !errors.is_empty() { + return Ok(false); + } + + Ok(is_required(&program)) + }) + } + + fn resolve(&mut self, _env: Env, result: Self::Output) -> napi::Result { + Ok(result) + } +} + +#[napi] +pub fn is_react_compiler_required( + filename: String, + signal: Option, +) -> AsyncTask { + let filename = PathBuf::from(filename); + AsyncTask::with_optional_signal(CheckTask { filename }, signal) +} + +fn is_required(program: &Program) -> bool { + let mut finder = Finder::default(); + finder.visit_program(program); + finder.found +} + +#[derive(Default)] +struct Finder { + found: bool, + + /// We are in a function that starts with a capital letter or it's a function that starts with + /// `use` + is_interested: bool, +} + +impl Visit for Finder { + fn visit_callee(&mut self, node: &Callee) { + if self.is_interested { + if let Callee::Expr(e) = node { + if let Expr::Ident(c) = &**e { + if c.sym.starts_with("use") { + self.found = true; + return; + } + } + } + } + + node.visit_children_with(self); + } + + fn visit_fn_decl(&mut self, node: &FnDecl) { + let old = self.is_interested; + self.is_interested = node.ident.sym.starts_with("use") + || node.ident.sym.starts_with(|c: char| c.is_ascii_uppercase()); + + node.visit_children_with(self); + + self.is_interested = old; + } + + fn visit_return_stmt(&mut self, node: &ReturnStmt) { + if self.is_interested { + if let Some(Expr::JSXElement(..) | Expr::JSXEmpty(..) | Expr::JSXFragment(..)) = + node.arg.as_deref() + { + self.found = true; + return; + } + } + + node.visit_children_with(self); + } +} From 65f06b0bcc8dd3b686ac110c59073bcd0aef71f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4=20=28Donny=29?= Date: Mon, 3 Feb 2025 20:29:02 +0900 Subject: [PATCH 09/13] type --- packages/next/src/build/swc/generated-native.d.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/next/src/build/swc/generated-native.d.ts b/packages/next/src/build/swc/generated-native.d.ts index e9e15ae7f4b7f..87a5b62ab0312 100644 --- a/packages/next/src/build/swc/generated-native.d.ts +++ b/packages/next/src/build/swc/generated-native.d.ts @@ -350,6 +350,10 @@ export declare function parse( filename?: string | undefined | null, signal?: AbortSignal | undefined | null ): Promise +export declare function isReactCompilerRequired( + filename: string, + signal?: AbortSignal | undefined | null +): Promise export declare function transform( src: string | Buffer | undefined, isModule: boolean, From 91bbb4ba55c87574f359aa8180ceab8b6f7436c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4=20=28Donny=29?= Date: Tue, 4 Feb 2025 22:40:45 +0900 Subject: [PATCH 10/13] check from babel loader --- packages/next/src/build/babel/loader/get-config.ts | 7 ++++++- packages/next/src/build/babel/loader/types.d.ts | 2 +- packages/next/src/build/get-babel-loader-config.ts | 10 +++++----- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/packages/next/src/build/babel/loader/get-config.ts b/packages/next/src/build/babel/loader/get-config.ts index 3ad0a56a0bef2..debb13e1e2ef2 100644 --- a/packages/next/src/build/babel/loader/get-config.ts +++ b/packages/next/src/build/babel/loader/get-config.ts @@ -8,6 +8,7 @@ import type { NextBabelLoaderOptions, NextJsLoaderContext } from './types' import { consumeIterator } from './util' import * as Log from '../../output/log' import jsx from 'next/dist/compiled/babel/plugin-syntax-jsx' +import { isReactCompilerRequired } from '../../swc' const nextDistPath = /(next[\\/]dist[\\/]shared[\\/]lib)|(next[\\/]dist[\\/]client)|(next[\\/]dist[\\/]pages)/ @@ -282,11 +283,15 @@ async function getFreshConfig( if ( loaderOptions.reactCompilerExclude && - (await loaderOptions.reactCompilerExclude(filename)) + loaderOptions.reactCompilerExclude(filename) ) { return false } + if (!(await isReactCompilerRequired(filename))) { + return false + } + return true })() diff --git a/packages/next/src/build/babel/loader/types.d.ts b/packages/next/src/build/babel/loader/types.d.ts index 59c9f6e105fcd..812157a2f9795 100644 --- a/packages/next/src/build/babel/loader/types.d.ts +++ b/packages/next/src/build/babel/loader/types.d.ts @@ -17,7 +17,7 @@ export interface NextBabelLoaderBaseOptions { // Custom plugins to be added to the generated babel options. reactCompilerPlugins?: Array - reactCompilerExclude?: (excludePath: string) => Promise + reactCompilerExclude?: (excludePath: string) => boolean } /** diff --git a/packages/next/src/build/get-babel-loader-config.ts b/packages/next/src/build/get-babel-loader-config.ts index 44b27418c7042..ecfb4984d3278 100644 --- a/packages/next/src/build/get-babel-loader-config.ts +++ b/packages/next/src/build/get-babel-loader-config.ts @@ -1,6 +1,5 @@ import path from 'path' import type { ReactCompilerOptions } from '../server/config-shared' -import { isReactCompilerRequired } from './swc' function getReactCompiler() { try { @@ -89,7 +88,7 @@ const getReactCompilerLoader = ( cwd: string, isDev: boolean, isServer: boolean, - reactCompilerExclude: ((excludePath: string) => boolean) | undefined + reactCompilerExclude?: ((excludePath: string) => boolean) | undefined ) => { const reactCompilerPlugins = getReactCompilerPlugins(options, isDev, isServer) if (!reactCompilerPlugins) { @@ -102,12 +101,13 @@ const getReactCompilerLoader = ( transformMode: 'standalone', cwd, reactCompilerPlugins, - reactCompilerExclude: async (filename: string) => - reactCompilerExclude?.(filename) || - !(await isReactCompilerRequired(filename)), }, } + if (reactCompilerExclude) { + config.options.reactCompilerExclude = reactCompilerExclude + } + return config } From a842088161236cf0b453ed89fb218dcda3d684eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4=20=28Donny=29?= Date: Tue, 4 Feb 2025 22:51:16 +0900 Subject: [PATCH 11/13] async await --- packages/next/src/build/babel/loader/index.ts | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/packages/next/src/build/babel/loader/index.ts b/packages/next/src/build/babel/loader/index.ts index 8a789d38180b8..99c42e991006a 100644 --- a/packages/next/src/build/babel/loader/index.ts +++ b/packages/next/src/build/babel/loader/index.ts @@ -27,16 +27,17 @@ async function nextBabelLoader( const loaderSpanInner = parentTrace.traceChild('next-babel-turbo-transform') const { code: transformedSource, map: outputSourceMap } = - await loaderSpanInner.traceAsyncFn(() => - transform.call( - this, - inputSource, - inputSourceMap, - loaderOptions, - filename, - target, - loaderSpanInner - ) + await loaderSpanInner.traceAsyncFn( + async () => + await transform.call( + this, + inputSource, + inputSourceMap, + loaderOptions, + filename, + target, + loaderSpanInner + ) ) return [transformedSource, outputSourceMap] From 7992df7e99df9a9acc90d47fbce22c58832a300b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4=20=28Donny=29?= Date: Tue, 4 Feb 2025 22:51:41 +0900 Subject: [PATCH 12/13] revert --- packages/next/src/build/get-babel-loader-config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/next/src/build/get-babel-loader-config.ts b/packages/next/src/build/get-babel-loader-config.ts index ecfb4984d3278..886ddc615a1ca 100644 --- a/packages/next/src/build/get-babel-loader-config.ts +++ b/packages/next/src/build/get-babel-loader-config.ts @@ -88,7 +88,7 @@ const getReactCompilerLoader = ( cwd: string, isDev: boolean, isServer: boolean, - reactCompilerExclude?: ((excludePath: string) => boolean) | undefined + reactCompilerExclude: ((excludePath: string) => boolean) | undefined ) => { const reactCompilerPlugins = getReactCompilerPlugins(options, isDev, isServer) if (!reactCompilerPlugins) { From c4441d4f38782ca4b42659131f4c9609ad6d67bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4=20=28Donny=29?= Date: Tue, 4 Feb 2025 22:57:04 +0900 Subject: [PATCH 13/13] awiat --- packages/next/src/build/babel/loader/get-config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/next/src/build/babel/loader/get-config.ts b/packages/next/src/build/babel/loader/get-config.ts index debb13e1e2ef2..8e5309d30a244 100644 --- a/packages/next/src/build/babel/loader/get-config.ts +++ b/packages/next/src/build/babel/loader/get-config.ts @@ -501,7 +501,7 @@ export default async function getConfig( ) } - const freshConfig = getFreshConfig.call( + const freshConfig = await getFreshConfig.call( this, cacheCharacteristics, loaderOptions,