Skip to content

Commit bef88f9

Browse files
authored
feat(ecma-plugins): extract custom emotion transform (#4662)
### Description First step for WEB-940. Context: https://vercel.slack.com/archives/C03EWR7LGEN/p1681789689115509 Currently all of the ecma transforms are explicitly listed under EcmaInputTransform in turbopack-ecmascript. This makes enum verbose, we have to manually expand it each time adding new transform, as well as turbopack-ecmascript gets larger to contain all of the 3rd party transforms by default. PR extracts non-core transforms into a new crate, named as ecmascript-plugins then utilize EcmaInputTransform::Custom to invoke transforms instead. `EcmaInputTransform::Custom` is renamed to `EcmaInputTransform::Plugin` as well. Goal is extracting all of 3rd party / non-core transforms. This also reduces multiple steps to construct option value between caller (next-*) to actual transform (swcOptions). vercel/next.js#48671 have corresponding next.js changes.
1 parent 1dfda18 commit bef88f9

File tree

19 files changed

+226
-107
lines changed

19 files changed

+226
-107
lines changed

Cargo.lock

Lines changed: 17 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ members = [
3030
"crates/turbopack-dev",
3131
"crates/turbopack-dev-server",
3232
"crates/turbopack-ecmascript",
33+
"crates/turbopack-ecmascript-plugins",
3334
"crates/turbopack-env",
3435
"crates/turbopack-image",
3536
"crates/turbopack-json",
@@ -134,6 +135,7 @@ turbopack-css = { path = "crates/turbopack-css" }
134135
turbopack-dev = { path = "crates/turbopack-dev" }
135136
turbopack-dev-server = { path = "crates/turbopack-dev-server" }
136137
turbopack-ecmascript = { path = "crates/turbopack-ecmascript" }
138+
turbopack-ecmascript-plugins = { path = "crates/turbopack-ecmascript-plugins" }
137139
turbopack-env = { path = "crates/turbopack-env" }
138140
turbopack-image = { path = "crates/turbopack-image" }
139141
turbopack-json = { path = "crates/turbopack-json" }

crates/turbo-binding/Cargo.toml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,12 @@ __turbopack_dev_dynamic_embed_contents = [
108108
]
109109
__turbopack_dev_server = ["__turbopack", "turbopack-dev-server"]
110110
__turbopack_ecmascript = ["__turbopack", "turbopack-ecmascript"]
111+
# [Note]: currently all of the transform features are enabled by default
112+
__turbopack_ecmascript_plugin = [
113+
"__turbopack",
114+
"turbopack-ecmascript-plugins",
115+
"turbopack-ecmascript-plugins/transform_emotion",
116+
]
111117
__turbopack_env = ["__turbopack", "turbopack-env"]
112118
__turbopack_image = ["__turbopack", "turbopack-image"]
113119
__turbopack_image_avif = ["turbopack-image/avif"]
@@ -185,6 +191,7 @@ turbopack-css = { optional = true, workspace = true }
185191
turbopack-dev = { optional = true, workspace = true }
186192
turbopack-dev-server = { optional = true, workspace = true }
187193
turbopack-ecmascript = { optional = true, workspace = true }
194+
turbopack-ecmascript-plugins = { optional = true, workspace = true }
188195
turbopack-env = { optional = true, workspace = true }
189196
turbopack-image = { optional = true, workspace = true }
190197
turbopack-json = { optional = true, workspace = true }

crates/turbo-binding/src/lib.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,8 @@ pub mod turbopack {
7070
pub use turbopack_dev_server as dev_server;
7171
#[cfg(feature = "__turbopack_ecmascript")]
7272
pub use turbopack_ecmascript as ecmascript;
73+
#[cfg(feature = "__turbopack_ecmascript_plugin")]
74+
pub use turbopack_ecmascript_plugins as ecmascript_plugin;
7375
#[cfg(feature = "__turbopack_env")]
7476
pub use turbopack_env as env;
7577
#[cfg(feature = "__turbopack_image")]

crates/turbopack-cli/Cargo.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,9 @@ turbopack-cli-utils = { workspace = true }
5757
turbopack-core = { workspace = true }
5858
turbopack-dev = { workspace = true }
5959
turbopack-dev-server = { workspace = true }
60+
turbopack-ecmascript-plugins = { workspace = true, features = [
61+
"transform_emotion",
62+
] }
6063
turbopack-env = { workspace = true }
6164
turbopack-node = { workspace = true }
6265
webbrowser = { workspace = true }

crates/turbopack-cli/src/dev/web_entry_source.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ use turbopack::{
88
condition::ContextCondition,
99
ecmascript::EcmascriptModuleAssetVc,
1010
module_options::{
11-
EmotionTransformConfigVc, JsxTransformOptions, ModuleOptionsContext,
12-
ModuleOptionsContextVc, StyledComponentsTransformConfigVc,
11+
JsxTransformOptions, ModuleOptionsContext, ModuleOptionsContextVc,
12+
StyledComponentsTransformConfigVc,
1313
},
1414
resolve_options_context::{ResolveOptionsContext, ResolveOptionsContextVc},
1515
transition::TransitionsByNameVc,
@@ -35,6 +35,7 @@ use turbopack_dev_server::{
3535
html::DevHtmlAssetVc,
3636
source::{asset_graph::AssetGraphContentSourceVc, ContentSourceVc},
3737
};
38+
use turbopack_ecmascript_plugins::transform::emotion::EmotionTransformConfigVc;
3839
use turbopack_node::execution_context::ExecutionContextVc;
3940

4041
use crate::embed_js::embed_file_path;

crates/turbopack-cli/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,6 @@ pub(crate) mod embed_js;
88
pub fn register() {
99
turbopack::register();
1010
turbopack_dev::register();
11+
turbopack_ecmascript_plugins::register();
1112
include!(concat!(env!("OUT_DIR"), "/register.rs"));
1213
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
[package]
2+
name = "turbopack-ecmascript-plugins"
3+
version = "0.1.0"
4+
description = "TBD"
5+
license = "MPL-2.0"
6+
edition = "2021"
7+
autobenches = false
8+
9+
[lib]
10+
bench = false
11+
12+
[features]
13+
transform_emotion = []
14+
15+
[dependencies]
16+
anyhow = { workspace = true }
17+
serde = { workspace = true }
18+
19+
turbo-tasks = { workspace = true }
20+
turbopack-ecmascript = { workspace = true }
21+
22+
swc_core = { workspace = true, features = ["ecma_ast", "ecma_visit", "common"] }
23+
swc_emotion = { workspace = true }
24+
25+
[build-dependencies]
26+
turbo-tasks-build = { workspace = true }
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
use turbo_tasks_build::generate_register;
2+
3+
fn main() {
4+
generate_register();
5+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
pub mod transform;
2+
3+
pub fn register() {
4+
turbo_tasks::register();
5+
turbopack_ecmascript::register();
6+
include!(concat!(env!("OUT_DIR"), "/register.rs"));
7+
}

0 commit comments

Comments
 (0)