Skip to content

Turbopack: also inline env vars with undefined value #80990

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: canary
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 10 additions & 3 deletions crates/napi/src/next_api/project.rs
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,13 @@ pub struct NapiEnvVar {
pub value: RcStr,
}

#[napi(object)]
#[derive(Clone, Debug)]
pub struct NapiOptionEnvVar {
pub name: RcStr,
pub value: Option<RcStr>,
}

#[napi(object)]
pub struct NapiDraftModeOptions {
pub preview_mode_id: RcStr,
Expand Down Expand Up @@ -215,9 +222,9 @@ pub struct NapiPartialProjectOptions {
#[napi(object)]
#[derive(Clone, Debug)]
pub struct NapiDefineEnv {
pub client: Vec<NapiEnvVar>,
pub edge: Vec<NapiEnvVar>,
pub nodejs: Vec<NapiEnvVar>,
pub client: Vec<NapiOptionEnvVar>,
pub edge: Vec<NapiOptionEnvVar>,
pub nodejs: Vec<NapiOptionEnvVar>,
}

#[napi(object)]
Expand Down
20 changes: 10 additions & 10 deletions crates/next-api/src/project.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ use next_core::{
get_server_module_options_context, get_server_resolve_options_context,
},
next_telemetry::NextFeatureTelemetry,
util::{NextRuntime, parse_config_from_source},
util::{NextRuntime, OptionEnvMap, parse_config_from_source},
};
use serde::{Deserialize, Serialize};
use tracing::Instrument;
Expand Down Expand Up @@ -248,9 +248,9 @@ pub struct PartialProjectOptions {
)]
#[serde(rename_all = "camelCase")]
pub struct DefineEnv {
pub client: Vec<(RcStr, RcStr)>,
pub edge: Vec<(RcStr, RcStr)>,
pub nodejs: Vec<(RcStr, RcStr)>,
pub client: Vec<(RcStr, Option<RcStr>)>,
pub edge: Vec<(RcStr, Option<RcStr>)>,
pub nodejs: Vec<(RcStr, Option<RcStr>)>,
}

#[derive(Serialize, Deserialize, TraceRawVcs, PartialEq, Eq, ValueDebugFormat, NonLocalValue)]
Expand Down Expand Up @@ -583,25 +583,25 @@ pub struct Project {

#[turbo_tasks::value]
pub struct ProjectDefineEnv {
client: ResolvedVc<EnvMap>,
edge: ResolvedVc<EnvMap>,
nodejs: ResolvedVc<EnvMap>,
client: ResolvedVc<OptionEnvMap>,
edge: ResolvedVc<OptionEnvMap>,
nodejs: ResolvedVc<OptionEnvMap>,
}

#[turbo_tasks::value_impl]
impl ProjectDefineEnv {
#[turbo_tasks::function]
pub fn client(&self) -> Vc<EnvMap> {
pub fn client(&self) -> Vc<OptionEnvMap> {
*self.client
}

#[turbo_tasks::function]
pub fn edge(&self) -> Vc<EnvMap> {
pub fn edge(&self) -> Vc<OptionEnvMap> {
*self.edge
}

#[turbo_tasks::function]
pub fn nodejs(&self) -> Vc<EnvMap> {
pub fn nodejs(&self) -> Vc<OptionEnvMap> {
*self.nodejs
}
}
Expand Down
6 changes: 3 additions & 3 deletions crates/next-build/src/build_options.rs
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ pub struct BuildContext {

#[derive(Debug, Clone)]
pub struct DefineEnv {
pub client: Vec<(RcStr, RcStr)>,
pub edge: Vec<(RcStr, RcStr)>,
pub nodejs: Vec<(RcStr, RcStr)>,
pub client: Vec<(RcStr, Option<RcStr>)>,
pub edge: Vec<(RcStr, Option<RcStr>)>,
pub nodejs: Vec<(RcStr, Option<RcStr>)>,
}
39 changes: 6 additions & 33 deletions crates/next-core/src/next_client/context.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,7 @@ use std::iter::once;

use anyhow::Result;
use turbo_rcstr::{RcStr, rcstr};
use turbo_tasks::{FxIndexMap, OptionVcExt, ResolvedVc, TaskInput, Vc};
use turbo_tasks_env::EnvMap;
use turbo_tasks::{OptionVcExt, ResolvedVc, TaskInput, Vc};
use turbo_tasks_fs::FileSystemPath;
use turbopack::{
css::chunk::CssChunkType,
Expand All @@ -22,10 +21,7 @@ use turbopack_core::{
ChunkingConfig, ChunkingContext, MangleType, MinifyType, SourceMapsType,
module_id_strategies::ModuleIdStrategy,
},
compile_time_info::{
CompileTimeDefineValue, CompileTimeDefines, CompileTimeInfo, DefineableNameSegment,
FreeVarReference, FreeVarReferences,
},
compile_time_info::{CompileTimeDefines, CompileTimeInfo, FreeVarReference, FreeVarReferences},
environment::{BrowserEnvironment, Environment, ExecutionEnvironment},
free_var_references,
resolve::{parse::Request, pattern::Pattern},
Expand Down Expand Up @@ -66,39 +62,16 @@ use crate::{
get_decorators_transform_options, get_jsx_transform_options,
get_typescript_transform_options,
},
util::{foreign_code_context_condition, internal_assets_conditions},
util::{OptionEnvMap, defines, foreign_code_context_condition, internal_assets_conditions},
};

fn defines(define_env: &FxIndexMap<RcStr, RcStr>) -> CompileTimeDefines {
let mut defines = FxIndexMap::default();

for (k, v) in define_env {
defines
.entry(
k.split('.')
.map(|s| DefineableNameSegment::Name(s.into()))
.collect::<Vec<_>>(),
)
.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.into()),
_ => CompileTimeDefineValue::JSON(v.clone()),
}
});
}

CompileTimeDefines(defines)
}

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

#[turbo_tasks::function]
async fn next_client_free_vars(define_env: Vc<EnvMap>) -> Result<Vc<FreeVarReferences>> {
async fn next_client_free_vars(define_env: Vc<OptionEnvMap>) -> Result<Vc<FreeVarReferences>> {
Ok(free_var_references!(
..defines(&*define_env.await?).into_iter(),
Buffer = FreeVarReference::EcmaScriptModule {
Expand All @@ -118,7 +91,7 @@ async fn next_client_free_vars(define_env: Vc<EnvMap>) -> Result<Vc<FreeVarRefer
#[turbo_tasks::function]
pub async fn get_client_compile_time_info(
browserslist_query: RcStr,
define_env: Vc<EnvMap>,
define_env: Vc<OptionEnvMap>,
) -> Result<Vc<CompileTimeInfo>> {
CompileTimeInfo::builder(
Environment::new(ExecutionEnvironment::Browser(
Expand Down
39 changes: 6 additions & 33 deletions crates/next-core/src/next_edge/context.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
use anyhow::Result;
use turbo_rcstr::{RcStr, rcstr};
use turbo_tasks::{FxIndexMap, OptionVcExt, ResolvedVc, Vc};
use turbo_tasks_env::EnvMap;
use turbo_tasks::{OptionVcExt, ResolvedVc, Vc};
use turbo_tasks_fs::FileSystemPath;
use turbopack::{css::chunk::CssChunkType, resolve_options_context::ResolveOptionsContext};
use turbopack_browser::BrowserChunkingContext;
Expand All @@ -10,10 +9,7 @@ use turbopack_core::{
ChunkingConfig, ChunkingContext, MangleType, MinifyType, SourceMapsType,
module_id_strategies::ModuleIdStrategy,
},
compile_time_info::{
CompileTimeDefineValue, CompileTimeDefines, CompileTimeInfo, DefineableNameSegment,
FreeVarReference, FreeVarReferences,
},
compile_time_info::{CompileTimeDefines, CompileTimeInfo, FreeVarReference, FreeVarReferences},
environment::{EdgeWorkerEnvironment, Environment, ExecutionEnvironment, NodeJsVersion},
free_var_references,
};
Expand All @@ -30,34 +26,11 @@ use crate::{
ModuleFeatureReportResolvePlugin, NextSharedRuntimeResolvePlugin,
get_invalid_client_only_resolve_plugin, get_invalid_styled_jsx_resolve_plugin,
},
util::{NextRuntime, foreign_code_context_condition},
util::{NextRuntime, OptionEnvMap, defines, foreign_code_context_condition},
};

fn defines(define_env: &FxIndexMap<RcStr, RcStr>) -> CompileTimeDefines {
let mut defines = FxIndexMap::default();

for (k, v) in define_env {
defines
.entry(
k.split('.')
.map(|s| DefineableNameSegment::Name(s.into()))
.collect::<Vec<_>>(),
)
.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.into()),
_ => CompileTimeDefineValue::JSON(v.clone()),
}
});
}

CompileTimeDefines(defines)
}

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

Expand All @@ -66,7 +39,7 @@ async fn next_edge_defines(define_env: Vc<EnvMap>) -> Result<Vc<CompileTimeDefin
#[turbo_tasks::function]
async fn next_edge_free_vars(
project_path: ResolvedVc<FileSystemPath>,
define_env: Vc<EnvMap>,
define_env: Vc<OptionEnvMap>,
) -> Result<Vc<FreeVarReferences>> {
Ok(free_var_references!(
..defines(&*define_env.await?).into_iter(),
Expand All @@ -82,7 +55,7 @@ async fn next_edge_free_vars(
#[turbo_tasks::function]
pub async fn get_edge_compile_time_info(
project_path: Vc<FileSystemPath>,
define_env: Vc<EnvMap>,
define_env: Vc<OptionEnvMap>,
node_version: ResolvedVc<NodeJsVersion>,
) -> Result<Vc<CompileTimeInfo>> {
CompileTimeInfo::builder(
Expand Down
41 changes: 7 additions & 34 deletions crates/next-core/src/next_server/context.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,7 @@ use std::iter::once;

use anyhow::{Result, bail};
use turbo_rcstr::{RcStr, rcstr};
use turbo_tasks::{FxIndexMap, OptionVcExt, ResolvedVc, TaskInput, Vc};
use turbo_tasks_env::EnvMap;
use turbo_tasks::{OptionVcExt, ResolvedVc, TaskInput, Vc};
use turbo_tasks_fs::FileSystemPath;
use turbopack::{
css::chunk::CssChunkType,
Expand All @@ -19,10 +18,7 @@ use turbopack_core::{
ChunkingConfig, MangleType, MinifyType, SourceMapsType,
module_id_strategies::ModuleIdStrategy,
},
compile_time_info::{
CompileTimeDefineValue, CompileTimeDefines, CompileTimeInfo, DefineableNameSegment,
FreeVarReferences,
},
compile_time_info::{CompileTimeDefines, CompileTimeInfo, FreeVarReferences},
environment::{
Environment, ExecutionEnvironment, NodeJsEnvironment, NodeJsVersion, RuntimeVersions,
},
Expand Down Expand Up @@ -73,8 +69,8 @@ use crate::{
get_typescript_transform_options,
},
util::{
NextRuntime, foreign_code_context_condition, get_transpiled_packages,
internal_assets_conditions, load_next_js_templateon,
NextRuntime, OptionEnvMap, defines, foreign_code_context_condition,
get_transpiled_packages, internal_assets_conditions, load_next_js_templateon,
},
};

Expand Down Expand Up @@ -346,43 +342,20 @@ pub async fn get_server_resolve_options_context(
.cell())
}

fn defines(define_env: &FxIndexMap<RcStr, RcStr>) -> CompileTimeDefines {
let mut defines = FxIndexMap::default();

for (k, v) in define_env {
defines
.entry(
k.split('.')
.map(|s| DefineableNameSegment::Name(s.into()))
.collect::<Vec<_>>(),
)
.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.into()),
_ => CompileTimeDefineValue::JSON(v.clone()),
}
});
}

CompileTimeDefines(defines)
}

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

#[turbo_tasks::function]
async fn next_server_free_vars(define_env: Vc<EnvMap>) -> Result<Vc<FreeVarReferences>> {
async fn next_server_free_vars(define_env: Vc<OptionEnvMap>) -> 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(
cwd: RcStr,
define_env: Vc<EnvMap>,
define_env: Vc<OptionEnvMap>,
node_version: ResolvedVc<NodeJsVersion>,
) -> Result<Vc<CompileTimeInfo>> {
CompileTimeInfo::builder(
Expand Down
35 changes: 35 additions & 0 deletions crates/next-core/src/util.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ use turbo_tasks_fs::{
};
use turbopack_core::{
asset::AssetContent,
compile_time_info::{CompileTimeDefineValue, CompileTimeDefines, DefineableNameSegment},
condition::ContextCondition,
ident::AssetIdent,
issue::{Issue, IssueExt, IssueSeverity, IssueStage, OptionStyledString, StyledString},
Expand All @@ -40,6 +41,40 @@ use crate::{

const NEXT_TEMPLATE_PATH: &str = "dist/esm/build/templates";

/// As opposed to [`EnvMap`], this map allows for `None` values, which means that the variables
/// should be replace with undefined.
#[turbo_tasks::value(transparent)]
pub struct OptionEnvMap(#[turbo_tasks(trace_ignore)] FxIndexMap<RcStr, Option<RcStr>>);

pub fn defines(define_env: &FxIndexMap<RcStr, Option<RcStr>>) -> CompileTimeDefines {
let mut defines = FxIndexMap::default();

for (k, v) in define_env {
defines
.entry(
k.split('.')
.map(|s| DefineableNameSegment::Name(s.into()))
.collect::<Vec<_>>(),
)
.or_insert_with(|| {
if let Some(v) = v {
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.into())
}
_ => CompileTimeDefineValue::JSON(v.clone()),
}
} else {
CompileTimeDefineValue::Undefined
}
});
}

CompileTimeDefines(defines)
}

#[derive(
Debug, Clone, Copy, PartialEq, Eq, Hash, TaskInput, Serialize, Deserialize, TraceRawVcs,
)]
Expand Down
10 changes: 7 additions & 3 deletions packages/next/src/build/swc/generated-native.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,10 @@ export interface NapiEnvVar {
name: RcStr
value: RcStr
}
export interface NapiOptionEnvVar {
name: RcStr
value?: RcStr
}
export interface NapiDraftModeOptions {
previewModeId: RcStr
previewModeEncryptionKey: RcStr
Expand Down Expand Up @@ -184,9 +188,9 @@ export interface NapiPartialProjectOptions {
noMangling?: boolean
}
export interface NapiDefineEnv {
client: Array<NapiEnvVar>
edge: Array<NapiEnvVar>
nodejs: Array<NapiEnvVar>
client: Array<NapiOptionEnvVar>
edge: Array<NapiOptionEnvVar>
nodejs: Array<NapiOptionEnvVar>
}
export interface NapiTurboEngineOptions {
/** Use the new backend with persistent caching enabled. */
Expand Down
Loading
Loading