Skip to content

Commit fa214c7

Browse files
authored
fix(styled-jsx): Pass useLightningcss option to styled-jsx correctly (#77008)
### What? Previously, `styled_jsx.useLightningcss` was not passed correctly. This PR fixes it. ### Why? It's required to enable lightningcss mode for styled-jsx.
1 parent 5c9f0bd commit fa214c7

File tree

3 files changed

+28
-9
lines changed

3 files changed

+28
-9
lines changed

crates/next-custom-transforms/src/chain_transforms.rs

+12-8
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,9 @@ pub struct TransformOptions {
117117

118118
#[serde(default)]
119119
pub lint_codemod_comments: bool,
120+
121+
#[serde(default)]
122+
pub css_env: Option<swc_core::ecma::preset_env::Config>,
120123
}
121124

122125
pub fn custom_before_pass<'a, C>(
@@ -151,20 +154,21 @@ where
151154
}
152155
};
153156

154-
let target_browsers = opts
155-
.swc
156-
.config
157-
.env
158-
.as_ref()
159-
.map(|env| targets_to_versions(env.targets.clone()).expect("failed to parse env.targets"))
160-
.unwrap_or_default();
161-
162157
let styled_jsx = {
163158
let cm = cm.clone();
164159
let file = file.clone();
165160

166161
fn_pass(move |program| {
167162
if let Some(config) = opts.styled_jsx.to_option() {
163+
let target_browsers = opts
164+
.css_env
165+
.as_ref()
166+
.map(|env| {
167+
targets_to_versions(env.targets.clone())
168+
.expect("failed to parse env.targets")
169+
})
170+
.unwrap_or_default();
171+
168172
program.mutate(styled_jsx::visitor::styled_jsx(
169173
cm.clone(),
170174
&file.name,

crates/next-custom-transforms/tests/full.rs

+1
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ fn test(input: &Path, minify: bool) {
8181
optimize_server_react: None,
8282
prefer_esm: false,
8383
debug_function_name: false,
84+
css_env: None,
8485
};
8586

8687
let unresolved_mark = Mark::new();

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

+15-1
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ function getBaseSWCOptions({
6565
compilerOptions,
6666
resolvedBaseUrl,
6767
jsConfig,
68+
supportedBrowsers,
6869
swcCacheDir,
6970
serverComponents,
7071
serverReferenceHashSalt,
@@ -84,6 +85,7 @@ function getBaseSWCOptions({
8485
swcPlugins: ExperimentalConfig['swcPlugins']
8586
resolvedBaseUrl?: ResolvedBaseUrl
8687
jsConfig: any
88+
supportedBrowsers: string[] | undefined
8789
swcCacheDir?: string
8890
serverComponents?: boolean
8991
serverReferenceHashSalt: string
@@ -196,7 +198,9 @@ function getBaseSWCOptions({
196198
: undefined,
197199
relay: compilerOptions?.relay,
198200
// Always transform styled-jsx and error when `client-only` condition is triggered
199-
styledJsx: {},
201+
styledJsx: compilerOptions?.styledJsx ?? {
202+
useLightningcss: jsConfig?.experimental?.useLightningcss ?? false,
203+
},
200204
// Disable css-in-js libs (without client-only integration) transform on server layer for server components
201205
...(!isReactServerLayer && {
202206
// eslint-disable-next-line @typescript-eslint/no-use-before-define
@@ -232,6 +236,14 @@ function getBaseSWCOptions({
232236
preferEsm: esm,
233237
lintCodemodComments: true,
234238
debugFunctionName: development,
239+
240+
...(supportedBrowsers && supportedBrowsers.length > 0
241+
? {
242+
cssEnv: {
243+
targets: supportedBrowsers,
244+
},
245+
}
246+
: {}),
235247
}
236248
}
237249

@@ -319,6 +331,7 @@ export function getJestSWCOptions({
319331
compilerOptions,
320332
jsConfig,
321333
resolvedBaseUrl,
334+
supportedBrowsers: undefined,
322335
esm,
323336
// Don't apply server layer transformations for Jest
324337
// Disable server / client graph assertions for Jest
@@ -408,6 +421,7 @@ export function getLoaderSWCOptions({
408421
compilerOptions,
409422
jsConfig,
410423
// resolvedBaseUrl,
424+
supportedBrowsers,
411425
swcCacheDir,
412426
bundleLayer,
413427
serverComponents,

0 commit comments

Comments
 (0)