diff --git a/packages/next-swc/crates/napi/src/util.rs b/packages/next-swc/crates/napi/src/util.rs index df8ed75e7557b..dbb5509951c23 100644 --- a/packages/next-swc/crates/napi/src/util.rs +++ b/packages/next-swc/crates/napi/src/util.rs @@ -26,7 +26,7 @@ IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -use anyhow::{Context, Error}; +use anyhow::{anyhow, Context, Error}; use napi::{CallContext, Env, JsBuffer, JsExternal, JsString, JsUndefined, JsUnknown, Status}; use serde::de::DeserializeOwned; use std::{any::type_name, convert::TryFrom, path::PathBuf}; @@ -108,6 +108,12 @@ pub fn init_custom_trace_subscriber(cx: CallContext) -> napi::Result let mut layer = ChromeLayerBuilder::new().include_args(true); if let Some(trace_out_file) = trace_out_file_path { + let dir = trace_out_file + .parent() + .ok_or_else(|| anyhow!("Not able to find path to the trace output")) + .convert_err()?; + std::fs::create_dir_all(dir)?; + layer = layer.file(trace_out_file); } diff --git a/packages/next/build/webpack-config.ts b/packages/next/build/webpack-config.ts index b9b965979dcaf..198ce287b3717 100644 --- a/packages/next/build/webpack-config.ts +++ b/packages/next/build/webpack-config.ts @@ -454,10 +454,10 @@ export default async function getBaseWebpackConfig( loggedIgnoredCompilerOptions = true } - const getBabelOrSwcLoader = (isMiddleware: boolean) => { + const getBabelOrSwcLoader = (isMiddleware: boolean, buildDir: string) => { if ( useSWCLoader && - config?.experimental?.swcTrace?.enabled && + config?.experimental?.swcTraceProfiling?.enabled && !swcTraceFlushGuard ) { // This will init subscribers once only in a single process lifecycle, @@ -465,7 +465,12 @@ export default async function getBaseWebpackConfig( // Subscriber need to be initialized _before_ any actual swc's call (transform, etcs) // to collect correct trace spans when they are called. swcTraceFlushGuard = require('./swc')?.initCustomTraceSubscriber?.( - config?.experimental?.swcTrace?.traceFileName + config?.experimental?.swcTraceProfiling?.traceFileName ?? + path.join( + buildDir, + config.distDir, + `swc-trace-profile-${Date.now()}.json` + ) ) } @@ -497,7 +502,7 @@ export default async function getBaseWebpackConfig( } const defaultLoaders = { - babel: getBabelOrSwcLoader(false), + babel: getBabelOrSwcLoader(false, dir), } const rawPageExtensions = hasServerComponents @@ -1279,7 +1284,7 @@ export default async function getBaseWebpackConfig( { ...codeCondition, issuerLayer: 'middleware', - use: getBabelOrSwcLoader(true), + use: getBabelOrSwcLoader(true, dir), }, { ...codeCondition, diff --git a/packages/next/server/config-shared.ts b/packages/next/server/config-shared.ts index 48936d0246c5d..7d40005838126 100644 --- a/packages/next/server/config-shared.ts +++ b/packages/next/server/config-shared.ts @@ -128,7 +128,7 @@ export interface ExperimentalConfig { skipDefaultConversion?: boolean } > - swcTrace?: { + swcTraceProfiling?: { enabled: boolean traceFileName?: string }