Skip to content

Commit c2be57c

Browse files
authored
Turbopack: pass current Node.js version from JS side instead of invoking node (#80949)
1 parent 4eea8e7 commit c2be57c

File tree

12 files changed

+81
-37
lines changed

12 files changed

+81
-37
lines changed

crates/napi/src/next_api/project.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,9 @@ pub struct NapiProjectOptions {
156156
/// local names for variables, functions etc., which can be useful for
157157
/// debugging/profiling purposes.
158158
pub no_mangling: bool,
159+
160+
/// The version of Node.js that is available/currently running.
161+
pub current_node_js_version: RcStr,
159162
}
160163

161164
/// [NapiProjectOptions] with all fields optional.
@@ -261,6 +264,7 @@ impl From<NapiProjectOptions> for ProjectOptions {
261264
preview_props: val.preview_props.into(),
262265
browserslist_query: val.browserslist_query,
263266
no_mangling: val.no_mangling,
267+
current_node_js_version: val.current_node_js_version,
264268
}
265269
}
266270
}

crates/next-api/benches/hmr.rs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
use std::{
2-
env,
32
fs::{create_dir_all, write},
43
mem::forget,
54
path::{Path, PathBuf},
@@ -182,10 +181,7 @@ impl HmrBenchmark {
182181
project_path: RcStr::from(project_path.clone()),
183182
next_config: load_next_config(),
184183
js_config: RcStr::from("{}"),
185-
env: vec![(
186-
RcStr::from("PATH"),
187-
RcStr::from(env::var("PATH").unwrap_or_default()),
188-
)],
184+
env: vec![],
189185
define_env: DefineEnv {
190186
client: vec![],
191187
edge: vec![],
@@ -205,6 +201,7 @@ impl HmrBenchmark {
205201
},
206202
browserslist_query: RcStr::from("last 2 versions"),
207203
no_mangling: false,
204+
current_node_js_version: RcStr::from("18.0.0"),
208205
};
209206

210207
container.initialize(options).await?;

crates/next-api/src/project.rs

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ use turbopack_core::{
5151
compile_time_info::CompileTimeInfo,
5252
context::AssetContext,
5353
diagnostics::DiagnosticExt,
54+
environment::NodeJsVersion,
5455
file_source::FileSource,
5556
ident::Layer,
5657
issue::{
@@ -186,6 +187,9 @@ pub struct ProjectOptions {
186187
/// local names for variables, functions etc., which can be useful for
187188
/// debugging/profiling purposes.
188189
pub no_mangling: bool,
190+
191+
/// The version of Node.js that is available/currently running.
192+
pub current_node_js_version: RcStr,
189193
}
190194

191195
#[derive(
@@ -442,6 +446,7 @@ impl ProjectContainer {
442446
let preview_props;
443447
let browserslist_query;
444448
let no_mangling;
449+
let current_node_js_version;
445450
{
446451
let options = self.options_state.get();
447452
let options = options
@@ -464,7 +469,8 @@ impl ProjectContainer {
464469
build_id = options.build_id.clone();
465470
preview_props = options.preview_props.clone();
466471
browserslist_query = options.browserslist_query.clone();
467-
no_mangling = options.no_mangling
472+
no_mangling = options.no_mangling;
473+
current_node_js_version = options.current_node_js_version.clone();
468474
}
469475

470476
let dist_dir = next_config
@@ -493,6 +499,7 @@ impl ProjectContainer {
493499
encryption_key,
494500
preview_props,
495501
no_mangling,
502+
current_node_js_version,
496503
}
497504
.cell())
498505
}
@@ -570,6 +577,8 @@ pub struct Project {
570577
/// local names for variables, functions etc., which can be useful for
571578
/// debugging/profiling purposes.
572579
no_mangling: bool,
580+
581+
current_node_js_version: RcStr,
573582
}
574583

575584
#[turbo_tasks::value]
@@ -737,6 +746,11 @@ impl Project {
737746
*self.env
738747
}
739748

749+
#[turbo_tasks::function]
750+
pub(super) fn current_node_js_version(&self) -> Vc<NodeJsVersion> {
751+
NodeJsVersion::Static(ResolvedVc::cell(self.current_node_js_version.clone())).cell()
752+
}
753+
740754
#[turbo_tasks::function]
741755
pub(super) fn next_config(&self) -> Vc<NextConfig> {
742756
*self.next_config
@@ -974,10 +988,10 @@ impl Project {
974988
pub(super) async fn server_compile_time_info(self: Vc<Self>) -> Result<Vc<CompileTimeInfo>> {
975989
let this = self.await?;
976990
Ok(get_server_compile_time_info(
977-
self.env(),
978-
this.define_env.nodejs(),
979991
// `/ROOT` corresponds to `[project]/`, so we need exactly the `path` part.
980992
format!("/ROOT/{}", self.project_path().await?.path).into(),
993+
this.define_env.nodejs(),
994+
self.current_node_js_version(),
981995
))
982996
}
983997

@@ -987,7 +1001,7 @@ impl Project {
9871001
Ok(get_edge_compile_time_info(
9881002
self.project_path(),
9891003
this.define_env.edge(),
990-
self.env(),
1004+
self.current_node_js_version(),
9911005
))
9921006
}
9931007

crates/next-build-test/src/main.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,7 @@ fn main() {
166166
Safari versions, last 1 Edge versions"
167167
.into(),
168168
no_mangling: false,
169+
current_node_js_version: "18.0.0".into(),
169170
};
170171

171172
let json = serde_json::to_string_pretty(&options).unwrap();

crates/next-core/src/next_edge/context.rs

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use anyhow::Result;
22
use turbo_rcstr::{RcStr, rcstr};
33
use turbo_tasks::{FxIndexMap, OptionVcExt, ResolvedVc, Vc};
4-
use turbo_tasks_env::{EnvMap, ProcessEnv};
4+
use turbo_tasks_env::EnvMap;
55
use turbo_tasks_fs::FileSystemPath;
66
use turbopack::{css::chunk::CssChunkType, resolve_options_context::ResolveOptionsContext};
77
use turbopack_browser::BrowserChunkingContext;
@@ -83,16 +83,11 @@ async fn next_edge_free_vars(
8383
pub async fn get_edge_compile_time_info(
8484
project_path: Vc<FileSystemPath>,
8585
define_env: Vc<EnvMap>,
86-
process_env: Vc<Box<dyn ProcessEnv>>,
86+
node_version: ResolvedVc<NodeJsVersion>,
8787
) -> Result<Vc<CompileTimeInfo>> {
8888
CompileTimeInfo::builder(
8989
Environment::new(ExecutionEnvironment::EdgeWorker(
90-
EdgeWorkerEnvironment {
91-
node_version: NodeJsVersion::resolved_cell(NodeJsVersion::Current(
92-
process_env.to_resolved().await?,
93-
)),
94-
}
95-
.resolved_cell(),
90+
EdgeWorkerEnvironment { node_version }.resolved_cell(),
9691
))
9792
.to_resolved()
9893
.await?,

crates/next-core/src/next_server/context.rs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use std::iter::once;
33
use anyhow::{Result, bail};
44
use turbo_rcstr::{RcStr, rcstr};
55
use turbo_tasks::{FxIndexMap, OptionVcExt, ResolvedVc, TaskInput, Vc};
6-
use turbo_tasks_env::{EnvMap, ProcessEnv};
6+
use turbo_tasks_env::EnvMap;
77
use turbo_tasks_fs::FileSystemPath;
88
use turbopack::{
99
css::chunk::CssChunkType,
@@ -381,17 +381,15 @@ async fn next_server_free_vars(define_env: Vc<EnvMap>) -> Result<Vc<FreeVarRefer
381381

382382
#[turbo_tasks::function]
383383
pub async fn get_server_compile_time_info(
384-
process_env: Vc<Box<dyn ProcessEnv>>,
385-
define_env: Vc<EnvMap>,
386384
cwd: RcStr,
385+
define_env: Vc<EnvMap>,
386+
node_version: ResolvedVc<NodeJsVersion>,
387387
) -> Result<Vc<CompileTimeInfo>> {
388388
CompileTimeInfo::builder(
389389
Environment::new(ExecutionEnvironment::NodeJsLambda(
390390
NodeJsEnvironment {
391391
compile_target: CompileTarget::current().to_resolved().await?,
392-
node_version: NodeJsVersion::resolved_cell(NodeJsVersion::Current(
393-
process_env.to_resolved().await?,
394-
)),
392+
node_version,
395393
cwd: ResolvedVc::cell(Some(cwd)),
396394
}
397395
.resolved_cell(),

packages/next/src/build/swc/generated-native.d.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,8 @@ export interface NapiProjectOptions {
136136
* debugging/profiling purposes.
137137
*/
138138
noMangling: boolean
139+
/** The version of Node.js that is available/currently running. */
140+
currentNodeJsVersion: RcStr
139141
}
140142
/** [NapiProjectOptions] with all fields optional. */
141143
export interface NapiPartialProjectOptions {

packages/next/src/build/swc/types.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -423,6 +423,11 @@ export interface ProjectOptions {
423423
* debugging/profiling purposes.
424424
*/
425425
noMangling: boolean
426+
427+
/**
428+
* The version of Node.js that is available/currently running.
429+
*/
430+
currentNodeJsVersion: string
426431
}
427432

428433
export interface DefineEnv {

packages/next/src/build/turbopack-build/impl.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ export async function turbopackBuild(): Promise<{
4343
const rewrites = NextBuildContext.rewrites!
4444
const appDirOnly = NextBuildContext.appDirOnly!
4545
const noMangling = NextBuildContext.noMangling!
46+
const currentNodeJsVersion = process.versions.node
4647

4748
const startTime = process.hrtime()
4849
const bindings = await loadBindings(config?.experimental?.useWasmBinary)
@@ -80,6 +81,7 @@ export async function turbopackBuild(): Promise<{
8081
previewProps,
8182
browserslistQuery: supportedBrowsers.join(', '),
8283
noMangling,
84+
currentNodeJsVersion,
8385
},
8486
{
8587
persistentCaching,

packages/next/src/server/dev/hot-reloader-turbopack.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,8 @@ export async function createHotReloaderTurbopack(
210210
'last 1 Chrome versions, last 1 Firefox versions, last 1 Safari versions, last 1 Edge versions',
211211
]
212212

213+
const currentNodeJsVersion = process.versions.node
214+
213215
const project = await bindings.turbo.createProject(
214216
{
215217
projectPath: projectPath,
@@ -243,6 +245,7 @@ export async function createHotReloaderTurbopack(
243245
previewProps: opts.fsChecker.prerenderManifest.preview,
244246
browserslistQuery: supportedBrowsers.join(', '),
245247
noMangling: false,
248+
currentNodeJsVersion,
246249
},
247250
{
248251
persistentCaching: isPersistentCachingEnabled(opts.nextConfig),

0 commit comments

Comments
 (0)