Skip to content

Commit 9c91010

Browse files
kwonojpadmaia
andauthored
fix(turbopack/transform_options): enforce default react runtime (#48400)
<!-- 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 or adding/fixing 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 ### How? Closes NEXT- Fixes # --> ### What? This PR enforces turbopack uses `automatic` jsx runtime. - closes WEB-901. ### Why? If you set `ts|jsconfig`'s `jsx` to any custom value, you'll encounter next.js message ``` The following mandatory changes were made to your tsconfig.json: - jsx was set to preserve (next.js implements its own optimized jsx transform) ``` Then internally transform sets jsx to use automatic runtime instead. In case of turbopack, its transform pass is embedded so instead of setting it to preserve falls back to automatic by default. PR doesn't handle validations / or emitting user friendly messages yet, just enforce runtime config regardless of how user sets it. There maybe some additional followups to mimic exact transform existing next.js does. --------- Co-authored-by: Maia Teegarden <dev@padmaia.rocks>
1 parent a95611f commit 9c91010

File tree

3 files changed

+13
-25
lines changed

3 files changed

+13
-25
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ pub async fn get_client_module_options_context(
158158
let tsconfig = get_typescript_transform_options(project_path);
159159
let decorators_options = get_decorators_transform_options(project_path);
160160
let mdx_rs_options = *next_config.mdx_rs().await?;
161-
let jsx_runtime_options = get_jsx_transform_options(project_path, mdx_rs_options);
161+
let jsx_runtime_options = get_jsx_transform_options(project_path);
162162
let enable_webpack_loaders = {
163163
let options = &*next_config.webpack_loaders_options().await?;
164164
let loaders_options = WebpackLoadersOptions {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -235,7 +235,7 @@ pub async fn get_server_module_options_context(
235235
let tsconfig = get_typescript_transform_options(project_path);
236236
let decorators_options = get_decorators_transform_options(project_path);
237237
let mdx_rs_options = *next_config.mdx_rs().await?;
238-
let jsx_runtime_options = get_jsx_transform_options(project_path, mdx_rs_options);
238+
let jsx_runtime_options = get_jsx_transform_options(project_path);
239239
let enable_emotion = *get_emotion_compiler_config(next_config).await?;
240240
let enable_styled_components = *get_styled_components_compiler_config(next_config).await?;
241241

packages/next-swc/crates/next-core/src/transform_options.rs

Lines changed: 11 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -123,45 +123,33 @@ pub async fn get_decorators_transform_options(
123123
#[turbo_tasks::function]
124124
pub async fn get_jsx_transform_options(
125125
project_path: FileSystemPathVc,
126-
is_mdx_rs_enabled: bool,
127126
) -> Result<JsxTransformOptionsVc> {
128127
let tsconfig = get_typescript_options(project_path).await;
129128

129+
// [NOTE]: ref: WEB-901
130+
// next.js does not allow to overriding react runtime config via tsconfig /
131+
// jsconfig, it forces overrides into automatic runtime instead.
132+
// [TODO]: we need to emit / validate config message like next.js devserver does
133+
let react_transform_options = JsxTransformOptions {
134+
import_source: None,
135+
runtime: Some("automatic".to_string()),
136+
};
137+
130138
let react_transform_options = if let Some(tsconfig) = tsconfig {
131139
read_from_tsconfigs(&tsconfig, |json, _| {
132140
let jsx_import_source = json["compilerOptions"]["jsxImportSource"]
133141
.as_str()
134142
.map(|s| s.to_string());
135143

136-
// interop between tsconfig's jsx to swc's jsx runtime configuration. Swc's jsx
137-
// runtime is a subset of tsconfig's jsx.
138-
let runtime = if let Some(jsx_runtime) = json["compilerOptions"]["jsx"].as_str() {
139-
match jsx_runtime {
140-
"react" => Some("classic".to_string()),
141-
"react-jsx" => Some("automatic".to_string()),
142-
"react-jsxdev" => Some("automatic".to_string()),
143-
_ => None,
144-
}
145-
} else {
146-
None
147-
};
148-
149144
Some(JsxTransformOptions {
150145
import_source: jsx_import_source,
151-
runtime,
146+
..react_transform_options.clone()
152147
})
153148
})
154149
.await?
155150
.unwrap_or_default()
156-
} else if is_mdx_rs_enabled {
157-
// Mdx can implicitly includes jsx components, trying to enable jsx with default
158-
// if jsx is not explicitly enabled
159-
JsxTransformOptions {
160-
import_source: None,
161-
runtime: None,
162-
}
163151
} else {
164-
Default::default()
152+
react_transform_options
165153
};
166154

167155
Ok(react_transform_options.cell())

0 commit comments

Comments
 (0)