Skip to content

Commit

Permalink
Leverage defineEnv for all environment variables in Turbopack (vercel…
Browse files Browse the repository at this point in the history
…#57196)

This ensures all `process.env` replacement comes from define-env in
Next.js, instead of also applying it partially on the Rust side.
<!-- Thanks for opening a PR! Your contribution is much appreciated.
To make sure your PR is handled as smoothly as possible we request that
you follow the checklist sections below.
Choose the right checklist for the change(s) that you're making:

## For Contributors

### Improving Documentation

- Run `pnpm prettier-fix` to fix formatting issues before opening the
PR.
- Read the Docs Contribution Guide to ensure your contribution follows
the docs guidelines:
https://nextjs.org/docs/community/contribution-guide

### Adding or Updating Examples

- The "examples guidelines" are followed from our contributing doc
https://github.com/vercel/next.js/blob/canary/contributing/examples/adding-examples.md
- Make sure the linting passes by running `pnpm build && pnpm lint`. See
https://github.com/vercel/next.js/blob/canary/contributing/repository/linting.md

### Fixing a bug

- Related issues linked using `fixes #number`
- Tests added. See:
https://github.com/vercel/next.js/blob/canary/contributing/core/testing.md#writing-tests-for-nextjs
- Errors have a helpful link attached, see
https://github.com/vercel/next.js/blob/canary/contributing.md

### Adding a feature

- Implements an existing feature request or RFC. Make sure the feature
request has been accepted for implementation before opening a PR. (A
discussion must be opened, see
https://github.com/vercel/next.js/discussions/new?category=ideas)
- Related issues/discussions are linked using `fixes #number`
- e2e tests added
(https://github.com/vercel/next.js/blob/canary/contributing/core/testing.md#writing-tests-for-nextjs)
- Documentation added
- Telemetry added. In case of a feature if it's used or not.
- Errors have a helpful link attached, see
https://github.com/vercel/next.js/blob/canary/contributing.md


## For Maintainers

- Minimal description (aim for explaining to someone not on the team to
understand the PR)
- When linking to a Slack thread, you might want to share details of the
conclusion
- Link both the Linear (Fixes NEXT-xxx) and the GitHub issues
- Add review comments if necessary to explain to the reviewer the logic
behind a change

### What?

### Why?

### How?

Closes NEXT-
Fixes #

-->
  • Loading branch information
timneutkens committed Oct 22, 2023
1 parent 85c3ea8 commit 8074fc1
Show file tree
Hide file tree
Showing 14 changed files with 126 additions and 134 deletions.
6 changes: 1 addition & 5 deletions packages/next-swc/crates/next-api/src/project.rs
Original file line number Diff line number Diff line change
Expand Up @@ -475,7 +475,6 @@ impl Project {
#[turbo_tasks::function]
pub(super) async fn client_compile_time_info(&self) -> Result<Vc<CompileTimeInfo>> {
Ok(get_client_compile_time_info(
self.mode,
self.browserslist_query.clone(),
self.define_env.client(),
))
Expand All @@ -485,22 +484,19 @@ impl Project {
pub(super) async fn server_compile_time_info(self: Vc<Self>) -> Result<Vc<CompileTimeInfo>> {
let this = self.await?;
Ok(get_server_compile_time_info(
this.mode,
self.env(),
self.server_addr(),
this.define_env.nodejs(),
self.next_config(),
))
}

#[turbo_tasks::function]
pub(super) async fn edge_compile_time_info(self: Vc<Self>) -> Result<Vc<CompileTimeInfo>> {
let this = self.await?;
Ok(get_edge_compile_time_info(
this.mode,
self.project_path(),
self.server_addr(),
this.define_env.nodejs(),
this.define_env.edge(),
))
}

Expand Down
11 changes: 3 additions & 8 deletions packages/next-swc/crates/next-build/src/next_build.rs
Original file line number Diff line number Diff line change
Expand Up @@ -134,16 +134,11 @@ pub(crate) async fn next_build(options: TransientInstance<BuildOptions>) -> Resu

let client_define_env = Vc::cell(options.define_env.client.iter().cloned().collect());
let client_compile_time_info =
get_client_compile_time_info(mode, browserslist_query, client_define_env);
get_client_compile_time_info(browserslist_query, client_define_env);

let server_define_env = Vc::cell(options.define_env.nodejs.iter().cloned().collect());
let server_compile_time_info = get_server_compile_time_info(
mode,
env,
ServerAddr::empty(),
server_define_env,
next_config,
);
let server_compile_time_info =
get_server_compile_time_info(env, ServerAddr::empty(), server_define_env);

// TODO(alexkirsz) Pages should build their own routes, outside of a FS.
let next_router_fs = Vc::upcast::<Box<dyn FileSystem>>(VirtualFileSystem::new());
Expand Down
44 changes: 18 additions & 26 deletions packages/next-swc/crates/next-core/src/next_client/context.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ use turbopack_binding::{
turbo::{tasks_env::EnvMap, tasks_fs::FileSystemPath},
turbopack::{
core::{
compile_time_defines,
compile_time_info::{
CompileTimeDefineValue, CompileTimeDefines, CompileTimeInfo, FreeVarReference,
FreeVarReferences,
Expand Down Expand Up @@ -64,40 +63,34 @@ use crate::{
util::foreign_code_context_condition,
};

fn defines(mode: NextMode, define_env: &IndexMap<String, String>) -> CompileTimeDefines {
// Need the empty NEXT_RUNTIME here for compile time evaluation.
let mut defines = compile_time_defines!(
process.turbopack = true,
process.env.NEXT_RUNTIME = "",
process.env.NODE_ENV = mode.node_env(),
process.env.TURBOPACK = true,
);
fn defines(define_env: &IndexMap<String, String>) -> CompileTimeDefines {
let mut defines = IndexMap::new();

for (k, v) in define_env {
defines
.0
.entry(k.split('.').map(|s| s.to_string()).collect())
.or_insert_with(|| CompileTimeDefineValue::JSON(v.clone()));
.entry(k.split('.').map(|s| s.to_string()).collect::<Vec<String>>())
.or_insert_with(|| {
let val = serde_json::from_str(v);
match val {
Ok(serde_json::Value::Bool(v)) => CompileTimeDefineValue::Bool(v),
Ok(serde_json::Value::String(v)) => CompileTimeDefineValue::String(v),
_ => CompileTimeDefineValue::JSON(v.clone()),
}
});
}

defines
CompileTimeDefines(defines)
}

#[turbo_tasks::function]
async fn next_client_defines(
mode: NextMode,
define_env: Vc<EnvMap>,
) -> Result<Vc<CompileTimeDefines>> {
Ok(defines(mode, &*define_env.await?).cell())
async fn next_client_defines(define_env: Vc<EnvMap>) -> Result<Vc<CompileTimeDefines>> {
Ok(defines(&*define_env.await?).cell())
}

#[turbo_tasks::function]
async fn next_client_free_vars(
mode: NextMode,
define_env: Vc<EnvMap>,
) -> Result<Vc<FreeVarReferences>> {
async fn next_client_free_vars(define_env: Vc<EnvMap>) -> Result<Vc<FreeVarReferences>> {
Ok(free_var_references!(
..defines(mode, &*define_env.await?).into_iter(),
..defines(&*define_env.await?).into_iter(),
Buffer = FreeVarReference::EcmaScriptModule {
request: "node:buffer".to_string(),
lookup_path: None,
Expand All @@ -114,7 +107,6 @@ async fn next_client_free_vars(

#[turbo_tasks::function]
pub fn get_client_compile_time_info(
mode: NextMode,
browserslist_query: String,
define_env: Vc<EnvMap>,
) -> Vc<CompileTimeInfo> {
Expand All @@ -127,8 +119,8 @@ pub fn get_client_compile_time_info(
}
.into(),
))))
.defines(next_client_defines(mode, define_env))
.free_var_references(next_client_free_vars(mode, define_env))
.defines(next_client_defines(define_env))
.free_var_references(next_client_free_vars(define_env))
.cell()
}

Expand Down
39 changes: 17 additions & 22 deletions packages/next-swc/crates/next-core/src/next_edge/context.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ use turbopack_binding::{
turbo::{tasks_env::EnvMap, tasks_fs::FileSystemPath},
turbopack::{
core::{
compile_time_defines,
compile_time_info::{
CompileTimeDefineValue, CompileTimeDefines, CompileTimeInfo, FreeVarReference,
FreeVarReferences,
Expand All @@ -32,40 +31,37 @@ use crate::{
util::foreign_code_context_condition,
};

fn defines(mode: NextMode, define_env: &IndexMap<String, String>) -> CompileTimeDefines {
let mut defines = compile_time_defines!(
process.turbopack = true,
process.env.NEXT_RUNTIME = "edge",
process.env.NODE_ENV = mode.node_env(),
process.env.TURBOPACK = true,
);
fn defines(define_env: &IndexMap<String, String>) -> CompileTimeDefines {
let mut defines = IndexMap::new();

for (k, v) in define_env {
defines
.0
.entry(k.split('.').map(|s| s.to_string()).collect())
.or_insert_with(|| CompileTimeDefineValue::JSON(v.clone()));
.entry(k.split('.').map(|s| s.to_string()).collect::<Vec<String>>())
.or_insert_with(|| {
let val = serde_json::from_str(v);
match val {
Ok(serde_json::Value::Bool(v)) => CompileTimeDefineValue::Bool(v),
Ok(serde_json::Value::String(v)) => CompileTimeDefineValue::String(v),
_ => CompileTimeDefineValue::JSON(v.clone()),
}
});
}

defines
CompileTimeDefines(defines)
}

#[turbo_tasks::function]
async fn next_edge_defines(
mode: NextMode,
define_env: Vc<EnvMap>,
) -> Result<Vc<CompileTimeDefines>> {
Ok(defines(mode, &*define_env.await?).cell())
async fn next_edge_defines(define_env: Vc<EnvMap>) -> Result<Vc<CompileTimeDefines>> {
Ok(defines(&*define_env.await?).cell())
}

#[turbo_tasks::function]
async fn next_edge_free_vars(
mode: NextMode,
project_path: Vc<FileSystemPath>,
define_env: Vc<EnvMap>,
) -> Result<Vc<FreeVarReferences>> {
Ok(free_var_references!(
..defines(mode, &*define_env.await?).into_iter(),
..defines(&*define_env.await?).into_iter(),
Buffer = FreeVarReference::EcmaScriptModule {
request: "next/dist/compiled/buffer".to_string(),
lookup_path: Some(project_path),
Expand All @@ -82,16 +78,15 @@ async fn next_edge_free_vars(

#[turbo_tasks::function]
pub fn get_edge_compile_time_info(
mode: NextMode,
project_path: Vc<FileSystemPath>,
server_addr: Vc<ServerAddr>,
define_env: Vc<EnvMap>,
) -> Vc<CompileTimeInfo> {
CompileTimeInfo::builder(Environment::new(Value::new(
ExecutionEnvironment::EdgeWorker(EdgeWorkerEnvironment { server_addr }.into()),
)))
.defines(next_edge_defines(mode, define_env))
.free_var_references(next_edge_free_vars(mode, project_path, define_env))
.defines(next_edge_defines(define_env))
.free_var_references(next_edge_free_vars(project_path, define_env))
.cell()
}

Expand Down
14 changes: 14 additions & 0 deletions packages/next-swc/crates/next-core/src/next_import_map.rs
Original file line number Diff line number Diff line change
Expand Up @@ -339,6 +339,20 @@ pub async fn get_next_server_import_map(
);
import_map.insert_exact_alias("react-server-dom-webpack/server.node", mapping);
import_map.insert_exact_alias("react-server-dom-turbopack/server.node", mapping);
import_map.insert_exact_alias(
"react-dom",
request_to_import_mapping(
project_path,
&format!("next/dist/compiled/react-dom{react_flavor}"),
),
);
import_map.insert_wildcard_alias(
"react-dom/",
request_to_import_mapping(
project_path,
&format!("next/dist/compiled/react-dom{react_flavor}/*"),
),
);
}
ServerContextType::Middleware => {}
}
Expand Down
55 changes: 18 additions & 37 deletions packages/next-swc/crates/next-core/src/next_server/context.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ use turbopack_binding::{
turbopack::{
build::{BuildChunkingContext, MinifyType},
core::{
compile_time_defines,
compile_time_info::{
CompileTimeDefineValue, CompileTimeDefines, CompileTimeInfo, FreeVarReferences,
},
Expand Down Expand Up @@ -193,64 +192,46 @@ pub async fn get_server_resolve_options_context(
.cell())
}

fn defines(
mode: NextMode,
define_env: &IndexMap<String, String>,
server_actions: bool,
) -> CompileTimeDefines {
let mut defines = compile_time_defines!(
process.turbopack = true,
process.env.NEXT_RUNTIME = "nodejs",
process.env.NODE_ENV = mode.node_env(),
process.env.TURBOPACK = true,
process.env.__NEXT_EXPERIMENTAL_REACT = server_actions,
);
fn defines(define_env: &IndexMap<String, String>) -> CompileTimeDefines {
let mut defines = IndexMap::new();

for (k, v) in define_env {
defines
.0
.entry(k.split('.').map(|s| s.to_string()).collect())
.or_insert_with(|| CompileTimeDefineValue::JSON(v.clone()));
.entry(k.split('.').map(|s| s.to_string()).collect::<Vec<String>>())
.or_insert_with(|| {
let val = serde_json::from_str(v);
match val {
Ok(serde_json::Value::Bool(v)) => CompileTimeDefineValue::Bool(v),
Ok(serde_json::Value::String(v)) => CompileTimeDefineValue::String(v),
_ => CompileTimeDefineValue::JSON(v.clone()),
}
});
}

defines
CompileTimeDefines(defines)
}

#[turbo_tasks::function]
async fn next_server_defines(
mode: NextMode,
define_env: Vc<EnvMap>,
server_actions: Vc<bool>,
) -> Result<Vc<CompileTimeDefines>> {
Ok(defines(mode, &*define_env.await?, *server_actions.await?).cell())
async fn next_server_defines(define_env: Vc<EnvMap>) -> Result<Vc<CompileTimeDefines>> {
Ok(defines(&*define_env.await?).cell())
}

#[turbo_tasks::function]
async fn next_server_free_vars(
mode: NextMode,
define_env: Vc<EnvMap>,
server_actions: Vc<bool>,
) -> Result<Vc<FreeVarReferences>> {
Ok(free_var_references!(
..defines(mode, &*define_env.await?, *server_actions.await?).into_iter()
)
.cell())
async fn next_server_free_vars(define_env: Vc<EnvMap>) -> Result<Vc<FreeVarReferences>> {
Ok(free_var_references!(..defines(&*define_env.await?).into_iter()).cell())
}

#[turbo_tasks::function]
pub async fn get_server_compile_time_info(
mode: NextMode,
process_env: Vc<Box<dyn ProcessEnv>>,
server_addr: Vc<ServerAddr>,
define_env: Vc<EnvMap>,
next_config: Vc<NextConfig>,
) -> Vc<CompileTimeInfo> {
let server_actions = next_config.enable_server_actions();
CompileTimeInfo::builder(Environment::new(Value::new(
ExecutionEnvironment::NodeJsLambda(NodeJsEnvironment::current(process_env, server_addr)),
)))
.defines(next_server_defines(mode, define_env, server_actions))
.free_var_references(next_server_free_vars(mode, define_env, server_actions))
.defines(next_server_defines(define_env))
.free_var_references(next_server_free_vars(define_env))
.cell()
}

Expand Down
1 change: 1 addition & 0 deletions packages/next/src/build/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1043,6 +1043,7 @@ export default async function build(
root,
distDir: config.distDir,
defineEnv: createDefineEnv({
isTurbopack: turboNextBuild,
allowedRevalidateHeaderKeys:
config.experimental.allowedRevalidateHeaderKeys,
clientRouterFilters: NextBuildContext.clientRouterFilters,
Expand Down
2 changes: 2 additions & 0 deletions packages/next/src/build/swc/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -420,6 +420,7 @@ export interface DefineEnv {
}

export function createDefineEnv({
isTurbopack,
allowedRevalidateHeaderKeys,
clientRouterFilters,
config,
Expand All @@ -442,6 +443,7 @@ export function createDefineEnv({
for (const variant of Object.keys(defineEnv) as (keyof typeof defineEnv)[]) {
defineEnv[variant] = rustifyEnv(
getDefineEnv({
isTurbopack,
allowedRevalidateHeaderKeys,
clientRouterFilters,
config,
Expand Down
1 change: 1 addition & 0 deletions packages/next/src/build/webpack-config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1948,6 +1948,7 @@ export default async function getBaseWebpackConfig(
...(isClient && { process: [require.resolve('process')] }),
}),
getDefineEnvPlugin({
isTurbopack: false,
allowedRevalidateHeaderKeys,
clientRouterFilters,
config,
Expand Down
Loading

0 comments on commit 8074fc1

Please sign in to comment.