Skip to content

Commit bdb1236

Browse files
authored
Turbopack: remove css_environment from Environment (#83487)
Change the fix from #83334 to not have a "CSS environment" inside of every environment. I don't think that this makes sense, and it also makes the implementation more complicated. ```diff pub struct Environment { execution: ExecutionEnvironment, + css_environment: ResolvedVc<BrowserEnvironment>, } ``` Instead, we can just pass the client's `Environment` when we create the server's transform rules, to use the client's browserslist config for styled-jsx. #83334 was also missing a test case I recommend the review each commits individually.
1 parent 2279884 commit bdb1236

File tree

23 files changed

+200
-228
lines changed

23 files changed

+200
-228
lines changed

crates/next-api/src/app.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,7 @@ impl AppProject {
218218
NextRuntime::NodeJs,
219219
self.project().encryption_key(),
220220
self.project().server_compile_time_info().environment(),
221+
self.project().client_compile_time_info().environment(),
221222
))
222223
}
223224

@@ -232,6 +233,7 @@ impl AppProject {
232233
NextRuntime::Edge,
233234
self.project().encryption_key(),
234235
self.project().edge_compile_time_info().environment(),
236+
self.project().client_compile_time_info().environment(),
235237
))
236238
}
237239

@@ -246,6 +248,7 @@ impl AppProject {
246248
NextRuntime::NodeJs,
247249
self.project().encryption_key(),
248250
self.project().server_compile_time_info().environment(),
251+
self.project().client_compile_time_info().environment(),
249252
))
250253
}
251254

@@ -260,6 +263,7 @@ impl AppProject {
260263
NextRuntime::Edge,
261264
self.project().encryption_key(),
262265
self.project().edge_compile_time_info().environment(),
266+
self.project().client_compile_time_info().environment(),
263267
))
264268
}
265269

@@ -582,6 +586,7 @@ impl AppProject {
582586
NextRuntime::NodeJs,
583587
self.project().encryption_key(),
584588
self.project().server_compile_time_info().environment(),
589+
self.project().client_compile_time_info().environment(),
585590
))
586591
}
587592

@@ -596,6 +601,7 @@ impl AppProject {
596601
NextRuntime::Edge,
597602
self.project().encryption_key(),
598603
self.project().edge_compile_time_info().environment(),
604+
self.project().client_compile_time_info().environment(),
599605
))
600606
}
601607

crates/next-api/src/pages.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -460,6 +460,7 @@ impl PagesProject {
460460
NextRuntime::NodeJs,
461461
self.project().encryption_key(),
462462
self.project().server_compile_time_info().environment(),
463+
self.project().client_compile_time_info().environment(),
463464
))
464465
}
465466

@@ -476,6 +477,7 @@ impl PagesProject {
476477
NextRuntime::Edge,
477478
self.project().encryption_key(),
478479
self.project().edge_compile_time_info().environment(),
480+
self.project().client_compile_time_info().environment(),
479481
))
480482
}
481483

@@ -492,6 +494,7 @@ impl PagesProject {
492494
NextRuntime::NodeJs,
493495
self.project().encryption_key(),
494496
self.project().server_compile_time_info().environment(),
497+
self.project().client_compile_time_info().environment(),
495498
))
496499
}
497500

@@ -508,6 +511,7 @@ impl PagesProject {
508511
NextRuntime::Edge,
509512
self.project().encryption_key(),
510513
self.project().edge_compile_time_info().environment(),
514+
self.project().client_compile_time_info().environment(),
511515
))
512516
}
513517

@@ -524,6 +528,7 @@ impl PagesProject {
524528
NextRuntime::NodeJs,
525529
self.project().encryption_key(),
526530
self.project().server_compile_time_info().environment(),
531+
self.project().client_compile_time_info().environment(),
527532
))
528533
}
529534

@@ -542,6 +547,7 @@ impl PagesProject {
542547
NextRuntime::Edge,
543548
self.project().encryption_key(),
544549
self.project().edge_compile_time_info().environment(),
550+
self.project().client_compile_time_info().environment(),
545551
))
546552
}
547553

crates/next-api/src/project.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -984,7 +984,6 @@ impl Project {
984984
format!("/ROOT/{}", self.project_path().await?.path).into(),
985985
this.define_env.nodejs(),
986986
self.current_node_js_version(),
987-
this.browserslist_query.clone(),
988987
))
989988
}
990989

@@ -995,7 +994,6 @@ impl Project {
995994
self.project_path().owned().await?,
996995
this.define_env.edge(),
997996
self.current_node_js_version(),
998-
this.browserslist_query.clone(),
999997
))
1000998
}
1001999

@@ -1296,6 +1294,7 @@ impl Project {
12961294
NextRuntime::Edge,
12971295
self.encryption_key(),
12981296
self.edge_compile_time_info().environment(),
1297+
self.client_compile_time_info().environment(),
12991298
),
13001299
get_edge_resolve_options_context(
13011300
self.project_path().owned().await?,
@@ -1358,6 +1357,7 @@ impl Project {
13581357
NextRuntime::NodeJs,
13591358
self.encryption_key(),
13601359
self.server_compile_time_info().environment(),
1360+
self.client_compile_time_info().environment(),
13611361
),
13621362
get_server_resolve_options_context(
13631363
self.project_path().owned().await?,
@@ -1472,6 +1472,7 @@ impl Project {
14721472
NextRuntime::NodeJs,
14731473
self.encryption_key(),
14741474
self.server_compile_time_info().environment(),
1475+
self.client_compile_time_info().environment(),
14751476
),
14761477
get_server_resolve_options_context(
14771478
self.project_path().owned().await?,
@@ -1534,6 +1535,7 @@ impl Project {
15341535
NextRuntime::Edge,
15351536
self.encryption_key(),
15361537
self.edge_compile_time_info().environment(),
1538+
self.client_compile_time_info().environment(),
15371539
),
15381540
get_edge_resolve_options_context(
15391541
self.project_path().owned().await?,

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

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -98,18 +98,18 @@ pub async fn get_client_compile_time_info(
9898
browserslist_query: RcStr,
9999
define_env: Vc<OptionEnvMap>,
100100
) -> Result<Vc<CompileTimeInfo>> {
101-
let environment = BrowserEnvironment {
102-
dom: true,
103-
web_worker: false,
104-
service_worker: false,
105-
browserslist_query: browserslist_query.to_owned(),
106-
}
107-
.resolved_cell();
108-
109101
CompileTimeInfo::builder(
110-
Environment::new(ExecutionEnvironment::Browser(environment), *environment)
111-
.to_resolved()
112-
.await?,
102+
Environment::new(ExecutionEnvironment::Browser(
103+
BrowserEnvironment {
104+
dom: true,
105+
web_worker: false,
106+
service_worker: false,
107+
browserslist_query: browserslist_query.to_owned(),
108+
}
109+
.resolved_cell(),
110+
))
111+
.to_resolved()
112+
.await?,
113113
)
114114
.defines(next_client_defines(define_env).to_resolved().await?)
115115
.free_var_references(next_client_free_vars(define_env).to_resolved().await?)
@@ -274,7 +274,7 @@ pub async fn get_client_module_options_context(
274274
let tree_shaking_mode_for_foreign_code = *next_config
275275
.tree_shaking_mode_for_foreign_code(next_mode.is_development())
276276
.await?;
277-
let css_target_browsers = env.css_runtime_versions();
277+
let target_browsers = env.runtime_versions();
278278

279279
let mut next_client_rules =
280280
get_next_client_transforms_rules(next_config, ty.clone(), mode, false, encryption_key)
@@ -287,7 +287,7 @@ pub async fn get_client_module_options_context(
287287
get_relay_transform_rule(next_config, project_path.clone()).await?,
288288
get_emotion_transform_rule(next_config).await?,
289289
get_styled_components_transform_rule(next_config).await?,
290-
get_styled_jsx_transform_rule(next_config, css_target_browsers).await?,
290+
get_styled_jsx_transform_rule(next_config, target_browsers).await?,
291291
get_react_remove_properties_transform_rule(next_config).await?,
292292
get_remove_console_transform_rule(next_config).await?,
293293
]

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

Lines changed: 4 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,7 @@ use turbopack_core::{
1111
module_id_strategies::ModuleIdStrategy,
1212
},
1313
compile_time_info::{CompileTimeDefines, CompileTimeInfo, FreeVarReference, FreeVarReferences},
14-
environment::{
15-
BrowserEnvironment, EdgeWorkerEnvironment, Environment, ExecutionEnvironment, NodeJsVersion,
16-
},
14+
environment::{EdgeWorkerEnvironment, Environment, ExecutionEnvironment, NodeJsVersion},
1715
free_var_references,
1816
module_graph::export_usage::OptionExportUsageInfo,
1917
};
@@ -62,23 +60,11 @@ pub async fn get_edge_compile_time_info(
6260
project_path: FileSystemPath,
6361
define_env: Vc<OptionEnvMap>,
6462
node_version: ResolvedVc<NodeJsVersion>,
65-
css_browserslist_query: RcStr,
6663
) -> Result<Vc<CompileTimeInfo>> {
67-
let css_environment = BrowserEnvironment {
68-
dom: false,
69-
web_worker: false,
70-
service_worker: false,
71-
browserslist_query: css_browserslist_query,
72-
}
73-
.resolved_cell();
74-
7564
CompileTimeInfo::builder(
76-
Environment::new(
77-
ExecutionEnvironment::EdgeWorker(
78-
EdgeWorkerEnvironment { node_version }.resolved_cell(),
79-
),
80-
*css_environment,
81-
)
65+
Environment::new(ExecutionEnvironment::EdgeWorker(
66+
EdgeWorkerEnvironment { node_version }.resolved_cell(),
67+
))
8268
.to_resolved()
8369
.await?,
8470
)

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

Lines changed: 16 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,7 @@ use turbopack_core::{
2121
},
2222
compile_time_defines,
2323
compile_time_info::{CompileTimeDefines, CompileTimeInfo, FreeVarReferences},
24-
environment::{
25-
BrowserEnvironment, Environment, ExecutionEnvironment, NodeJsEnvironment, NodeJsVersion,
26-
},
24+
environment::{Environment, ExecutionEnvironment, NodeJsEnvironment, NodeJsVersion},
2725
free_var_references,
2826
module_graph::export_usage::OptionExportUsageInfo,
2927
target::CompileTarget,
@@ -371,28 +369,16 @@ pub async fn get_server_compile_time_info(
371369
cwd: RcStr,
372370
define_env: Vc<OptionEnvMap>,
373371
node_version: ResolvedVc<NodeJsVersion>,
374-
css_browserslist_query: RcStr,
375372
) -> Result<Vc<CompileTimeInfo>> {
376-
let css_environment = BrowserEnvironment {
377-
dom: false,
378-
web_worker: false,
379-
service_worker: false,
380-
browserslist_query: css_browserslist_query,
381-
}
382-
.resolved_cell();
383-
384373
CompileTimeInfo::builder(
385-
Environment::new(
386-
ExecutionEnvironment::NodeJsLambda(
387-
NodeJsEnvironment {
388-
compile_target: CompileTarget::current().to_resolved().await?,
389-
node_version,
390-
cwd: ResolvedVc::cell(Some(cwd)),
391-
}
392-
.resolved_cell(),
393-
),
394-
*css_environment,
395-
)
374+
Environment::new(ExecutionEnvironment::NodeJsLambda(
375+
NodeJsEnvironment {
376+
compile_target: CompileTarget::current().to_resolved().await?,
377+
node_version,
378+
cwd: ResolvedVc::cell(Some(cwd)),
379+
}
380+
.resolved_cell(),
381+
))
396382
.to_resolved()
397383
.await?,
398384
)
@@ -405,10 +391,9 @@ pub async fn get_server_compile_time_info(
405391
#[turbo_tasks::function]
406392
pub async fn get_tracing_compile_time_info() -> Result<Vc<CompileTimeInfo>> {
407393
CompileTimeInfo::builder(
408-
Environment::new(
409-
ExecutionEnvironment::NodeJsLambda(NodeJsEnvironment::default().resolved_cell()),
410-
BrowserEnvironment::default().cell(),
411-
)
394+
Environment::new(ExecutionEnvironment::NodeJsLambda(
395+
NodeJsEnvironment::default().resolved_cell(),
396+
))
412397
.to_resolved()
413398
.await?,
414399
)
@@ -456,6 +441,7 @@ pub async fn get_server_module_options_context(
456441
next_runtime: NextRuntime,
457442
encryption_key: ResolvedVc<RcStr>,
458443
environment: ResolvedVc<Environment>,
444+
client_environment: ResolvedVc<Environment>,
459445
) -> Result<Vc<ModuleOptionsContext>> {
460446
let next_mode = mode.await?;
461447
let mut next_server_rules = get_next_server_transforms_rules(
@@ -525,7 +511,6 @@ pub async fn get_server_module_options_context(
525511
let tree_shaking_mode_for_foreign_code = *next_config
526512
.tree_shaking_mode_for_foreign_code(next_mode.is_development())
527513
.await?;
528-
let css_versions = environment.css_runtime_versions();
529514

530515
let tsconfig_path = next_config
531516
.typescript_tsconfig_path()
@@ -586,8 +571,10 @@ pub async fn get_server_module_options_context(
586571
// context type.
587572
let styled_components_transform_rule =
588573
get_styled_components_transform_rule(next_config).await?;
574+
// It's important the client's browserlist config is used for styled-jsx, otherwise we transpile
575+
// the CSS to be compatible with Node.js 20.
589576
let styled_jsx_transform_rule =
590-
get_styled_jsx_transform_rule(next_config, css_versions).await?;
577+
get_styled_jsx_transform_rule(next_config, client_environment.runtime_versions()).await?;
591578

592579
let source_maps = if *next_config.server_source_maps().await? {
593580
SourceMapsType::Full
Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,27 @@
11
export default function Home() {
2-
return <div className="red-text">This text should be red.</div>
2+
return (
3+
<>
4+
<div className="red-text">This text should be red.</div>
5+
<StyledJsxTest />
6+
</>
7+
)
8+
}
9+
10+
function StyledJsxTest() {
11+
return (
12+
<>
13+
<div className="media-query-test">This text should be blue.</div>
14+
<style jsx>{`
15+
.media-query-test {
16+
color: blue;
17+
}
18+
19+
@media (max-width: 400px) {
20+
.media-query-test {
21+
color: orange;
22+
}
23+
}
24+
`}</style>
25+
</>
26+
)
327
}

test/integration/css/test/css-compilation.test.js

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,32 @@ module.exports = {
219219
}
220220
`)
221221
}
222+
223+
const inlineStyle = $('style')
224+
expect(inlineStyle.length).toBe(1)
225+
const inlineCssContent = inlineStyle
226+
.html()
227+
.replace(
228+
/media-query-test.jsx-[a-f0-9]{16}/g,
229+
'media-query-test.jsx-HASH'
230+
)
231+
if (process.env.IS_TURBOPACK_TEST && useLightningcss) {
232+
expect(inlineCssContent).toMatchInlineSnapshot(
233+
`".media-query-test.jsx-HASH{color:#00f}@media (max-width:400px){.media-query-test.jsx-HASH{color:orange}}"`
234+
)
235+
} else if (process.env.IS_TURBOPACK_TEST && !useLightningcss) {
236+
expect(inlineCssContent).toMatchInlineSnapshot(
237+
`".media-query-test.jsx-HASH{color:#00f}@media (max-width:400px){.media-query-test.jsx-HASH{color:orange}}"`
238+
)
239+
} else if (useLightningcss) {
240+
expect(inlineCssContent).toMatchInlineSnapshot(
241+
`".media-query-test.jsx-HASH{color:blue}@media(max-width:400px){.media-query-test.jsx-HASH{color:orange}}"`
242+
)
243+
} else {
244+
expect(inlineCssContent).toMatchInlineSnapshot(
245+
`".media-query-test.jsx-HASH{color:blue}@media(max-width:400px){.media-query-test.jsx-HASH{color:orange}}"`
246+
)
247+
}
222248
})
223249
}
224250
)

0 commit comments

Comments
 (0)