Repository: lynx-family/lynx-stack
Pull request #341: chore(deps): bump swc_core v16.5.0
Author: login: gaoachao
Created: 2025-03-25T15:23:38Z | Merged: 2025-03-26T08:47:18Z

<!--
  Thank you for submitting a pull request!

  We appreciate the time and effort you have invested in making these changes. Please ensure that you provide enough information to allow others to review your pull request.

  Upon submission, your pull request will be automatically assigned with reviewers.

  If you want to learn more about contributing to this project, please visit: https://github.com/lynx-family/lynx-stack/blob/main/CONTRIBUTING.md.
-->

## Summary

<!-- Can you explain the reasoning behind implementing this change? What problem or issue does this pull request resolve? -->

1. `Pass` API https://github.com/swc-project/swc/pull/9680
    1. Replace all `chain!(` with `(`
    2. Replace `-> impl Fold` with `-> impl Pass`
    3. Replace `as_folder` with `visit_mut_pass` and `impl VisitMut + Fold` with `impl VisitMut + Pass`
2. `JsWord` has been removed https://github.com/swc-project/swc/pull/10071
    1. Replace `js_word!` with `atom!`
    2. Replace `JsWord` with `Atom`
3. Bump `rustc-hash` to v2 https://github.com/swc-project/swc/pull/9982
    1. Replace `AHashMap` with `FxHashMap`
<!-- It would be helpful if you could provide any relevant context, such as GitHub issues or related discussions. -->
4. Due to the deprecation of `as_folder`, we need to self-implement `run_transform` rather than calling `compiler.transform`. For implementation details, refer to the SWC codebase at:
  - https://github.com/swc-project/swc/blob/main/crates/swc/src/lib.rs#L642
  - https://github.com/swc-project/swc/blob/main/crates/swc/tests/projects.rs#L750

## Checklist

<!--- Check and mark with an "x" -->

- [x] Tests updated (or not required).
- [x] Documentation updated (or not required).



Diff:
diff --git a/.changeset/loud-cows-mate.md b/.changeset/loud-cows-mate.md
new file mode 100644
index 0000000000..a845151cc8
--- /dev/null
+++ b/.changeset/loud-cows-mate.md
@@ -0,0 +1,2 @@
+---
+---
diff --git a/Cargo.lock b/Cargo.lock
index 8acbf0232a..1fb797990c 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -88,11 +88,17 @@ version = "0.7.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711"
 
+[[package]]
+name = "ascii"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d92bec98840b8f03a5ff5413de5293bfcd8bf96467cf5452609f939ec6f5de16"
+
 [[package]]
 name = "ast_node"
-version = "1.0.0"
+version = "3.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f4d23a6d1d5f18bdbc06d9aa908880e5f49205156ba804751af731c51f5cf81a"
+checksum = "91fb5864e2f5bf9fd9797b94b2dfd1554d4c3092b535008b27d7e15c86675a2f"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -119,9 +125,9 @@ checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
 
 [[package]]
 name = "base64"
-version = "0.21.7"
+version = "0.22.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567"
+checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6"
 
 [[package]]
 name = "base64-simd"
@@ -134,9 +140,9 @@ dependencies = [
 
 [[package]]
 name = "better_scoped_tls"
-version = "0.1.2"
+version = "1.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "297b153aa5e573b5863108a6ddc9d5c968bd0b20e75cc614ee9821d2f45679c7"
+checksum = "50fd297a11c709be8348aec039c8b91de16075d2b2bdaee1bd562c0875993664"
 dependencies = [
  "scoped-tls",
 ]
@@ -176,9 +182,9 @@ dependencies = [
 
 [[package]]
 name = "browserslist-rs"
-version = "0.16.0"
+version = "0.17.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fdf0ca73de70c3da94e4194e4a01fe732378f55d47cf4c0588caab22a0dbfa14"
+checksum = "74c973b79d9b6b89854493185ab760c6ef8e54bcfad10ad4e33991e46b374ac8"
 dependencies = [
  "ahash 0.8.10",
  "chrono",
@@ -186,7 +192,6 @@ dependencies = [
  "indexmap 2.7.0",
  "itertools",
  "nom",
- "once_cell",
  "serde",
  "serde_json",
  "thiserror 1.0.69",
@@ -247,6 +252,15 @@ dependencies = [
  "thiserror 2.0.9",
 ]
 
+[[package]]
+name = "castaway"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0abae9be0aaf9ea96a3b1b8b1b55c602ca751eba1b1500220cea4ecbafe7c0d5"
+dependencies = [
+ "rustversion",
+]
+
 [[package]]
 name = "cc"
 version = "1.0.78"
@@ -261,14 +275,14 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
 
 [[package]]
 name = "chrono"
-version = "0.4.34"
+version = "0.4.40"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5bc015644b92d5890fab7489e49d21f879d5c990186827d42ec511919404f38b"
+checksum = "1a7964611d71df112cb1730f2ee67324fcf4d0fc6606acbbe9bfe06df124637c"
 dependencies = [
  "android-tzdata",
  "iana-time-zone",
  "num-traits",
- "windows-targets 0.52.0",
+ "windows-link",
 ]
 
 [[package]]
@@ -281,6 +295,19 @@ dependencies = [
  "unicode-width",
 ]
 
+[[package]]
+name = "compact_str"
+version = "0.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f86b9c4c00838774a6d902ef931eff7470720c51d90c2e32cfe15dc304737b3f"
+dependencies = [
+ "castaway",
+ "cfg-if",
+ "itoa",
+ "ryu",
+ "static_assertions",
+]
+
 [[package]]
 name = "convert_case"
 version = "0.6.0"
@@ -305,49 +332,6 @@ dependencies = [
  "libc",
 ]
 
-[[package]]
-name = "crossbeam-channel"
-version = "0.5.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200"
-dependencies = [
- "cfg-if",
- "crossbeam-utils",
-]
-
-[[package]]
-name = "crossbeam-deque"
-version = "0.8.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef"
-dependencies = [
- "cfg-if",
- "crossbeam-epoch",
- "crossbeam-utils",
-]
-
-[[package]]
-name = "crossbeam-epoch"
-version = "0.9.14"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "46bd5f3f85273295a9d14aedfb86f6aadbff6d8f5295c4a9edb08e819dcf5695"
-dependencies = [
- "autocfg",
- "cfg-if",
- "crossbeam-utils",
- "memoffset",
- "scopeguard",
-]
-
-[[package]]
-name = "crossbeam-utils"
-version = "0.8.15"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3c063cd8cc95f5c377ed0d4b49a4b21f632396ff690e8470c29b3359b346984b"
-dependencies = [
- "cfg-if",
-]
-
 [[package]]
 name = "crypto-common"
 version = "0.1.6"
@@ -591,9 +575,9 @@ dependencies = [
 
 [[package]]
 name = "from_variant"
-version = "1.0.0"
+version = "2.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e8d8947525c49c73130b5a7187b55b027b6b78fe60268d9f4c283ed690698cb1"
+checksum = "8d7ccf961415e7aa17ef93dcb6c2441faaa8e768abe09e659b908089546f74c5"
 dependencies = [
  "proc-macro2",
  "swc_macros_common",
@@ -684,15 +668,15 @@ checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70"
 
 [[package]]
 name = "hstr"
-version = "0.2.12"
+version = "1.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dae404c0c5d4e95d4858876ab02eecd6a196bb8caa42050dfa809938833fc412"
+checksum = "71399f53a92ef72ee336a4b30201c6e944827e14e0af23204c291aad9c24cc85"
 dependencies = [
  "hashbrown 0.14.5",
  "new_debug_unreachable",
  "once_cell",
  "phf",
- "rustc-hash",
+ "rustc-hash 2.1.1",
  "triomphe",
 ]
 
@@ -930,9 +914,9 @@ dependencies = [
 
 [[package]]
 name = "jsonc-parser"
-version = "0.21.0"
+version = "0.26.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3a1853e40333206f9a685358046d13ab200169e3ee573019bddf0ede0dc29307"
+checksum = "b558af6b49fd918e970471374e7a798b2c9bbcda624a210ffa3901ee5614bc8e"
 dependencies = [
  "serde_json",
 ]
@@ -1096,15 +1080,6 @@ version = "2.7.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149"
 
-[[package]]
-name = "memoffset"
-version = "0.8.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1"
-dependencies = [
- "autocfg",
-]
-
 [[package]]
 name = "miette"
 version = "7.4.0"
@@ -1407,16 +1382,16 @@ checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116"
 
 [[package]]
 name = "preset_env_base"
-version = "0.6.0"
+version = "2.0.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1aaeaf4147a07c6615d43fce02d8139e1f835e6ee53e69db2a4810823c138c26"
+checksum = "07852df2dda2f0ab8c3407a6fd19e9389563af11c20f6c299bd07ff9fc96d6ae"
 dependencies = [
- "ahash 0.8.10",
  "anyhow",
  "browserslist-rs",
  "dashmap",
  "from_variant",
  "once_cell",
+ "rustc-hash 2.1.1",
  "semver 1.0.22",
  "serde",
  "st-map",
@@ -1455,22 +1430,22 @@ dependencies = [
 
 [[package]]
 name = "ptr_meta"
-version = "0.1.4"
+version = "0.3.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0738ccf7ea06b608c10564b31debd4f5bc5e197fc8bfe088f68ae5ce81e7a4f1"
+checksum = "fe9e76f66d3f9606f44e45598d155cb13ecf09f4a28199e48daf8c8fc937ea90"
 dependencies = [
  "ptr_meta_derive",
 ]
 
 [[package]]
 name = "ptr_meta_derive"
-version = "0.1.4"
+version = "0.3.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac"
+checksum = "ca414edb151b4c8d125c12566ab0d74dc9cdba36fb80eb7b848c15f495fd32d1"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 1.0.107",
+ "syn 2.0.90",
 ]
 
 [[package]]
@@ -1509,28 +1484,6 @@ version = "0.6.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
 
-[[package]]
-name = "rayon"
-version = "1.7.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1d2df5196e37bcc87abebc0053e20787d73847bb33134a69841207dd0a47f03b"
-dependencies = [
- "either",
- "rayon-core",
-]
-
-[[package]]
-name = "rayon-core"
-version = "1.11.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4b8f95bd6966f5c87776639160a66bd8ab9895d9d4ab01ddba9fc60661aebe8d"
-dependencies = [
- "crossbeam-channel",
- "crossbeam-deque",
- "crossbeam-utils",
- "num_cpus",
-]
-
 [[package]]
 name = "react-transform"
 version = "0.0.0"
@@ -1544,6 +1497,7 @@ dependencies = [
  "napi-derive",
  "once_cell",
  "regex",
+ "rustc-hash 2.1.1",
  "serde",
  "serde_json",
  "sha-1",
@@ -1625,6 +1579,12 @@ version = "1.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2"
 
+[[package]]
+name = "rustc-hash"
+version = "2.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d"
+
 [[package]]
 name = "rustc_version"
 version = "0.2.3"
@@ -1825,7 +1785,7 @@ dependencies = [
  "data-encoding",
  "debugid",
  "if_chain",
- "rustc-hash",
+ "rustc-hash 1.1.0",
  "rustc_version",
  "serde",
  "serde_json",
@@ -1881,9 +1841,9 @@ checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f"
 
 [[package]]
 name = "string_enum"
-version = "0.4.4"
+version = "1.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "05e383308aebc257e7d7920224fa055c632478d92744eca77f99be8fa1545b90"
+checksum = "c9fe66b8ee349846ce2f9557a26b8f1e74843c4a13fb381f9a3d73617a5f956a"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -1899,9 +1859,9 @@ checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
 
 [[package]]
 name = "swc"
-version = "0.290.1"
+version = "16.1.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "65928b3a6abe08e6b49d5c55ffa079e973e62796ad4e2ffaaa1df12068141d12"
+checksum = "afca37a21a7f4eed3a77bb067e5693fa7dedb98bb85fd90a9bd9a04df4882174"
 dependencies = [
  "anyhow",
  "base64",
@@ -1914,7 +1874,7 @@ dependencies = [
  "parking_lot",
  "pathdiff",
  "regex",
- "rustc-hash",
+ "rustc-hash 2.1.1",
  "serde",
  "serde_json",
  "sourcemap",
@@ -1949,50 +1909,50 @@ dependencies = [
 
 [[package]]
 name = "swc_allocator"
-version = "0.1.10"
+version = "4.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "76aa0eb65c0f39f9b6d82a7e5192c30f7ac9a78f084a21f270de1d8c600ca388"
+checksum = "cc6b926f0d94bbb34031fe5449428cfa1268cdc0b31158d6ad9c97e0fc1e79dd"
 dependencies = [
+ "allocator-api2",
  "bumpalo",
  "hashbrown 0.14.5",
  "ptr_meta",
- "rustc-hash",
+ "rustc-hash 2.1.1",
  "triomphe",
 ]
 
 [[package]]
 name = "swc_atoms"
-version = "1.0.2"
+version = "5.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b25ff0f3fd48ab1a95d86fd0505fdd1ac904f84d0350dc8222bbc824e9d4fdf6"
+checksum = "9d7077ba879f95406459bc0c81f3141c529b34580bc64d7ab7bd15e7118a0391"
 dependencies = [
  "hstr",
  "once_cell",
- "rustc-hash",
+ "rustc-hash 2.1.1",
  "serde",
 ]
 
 [[package]]
 name = "swc_cached"
-version = "0.3.19"
+version = "2.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "630c761c74ac8021490b78578cc2223aa4a568241e26505c27bf0e4fd4ad8ec2"
+checksum = "d7133338c3bef796430deced151b0eaa5430710a90e38da19e8e3045e8e36eeb"
 dependencies = [
- "ahash 0.8.10",
  "anyhow",
  "dashmap",
  "once_cell",
  "regex",
+ "rustc-hash 2.1.1",
  "serde",
 ]
 
 [[package]]
 name = "swc_common"
-version = "0.40.2"
+version = "8.0.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ca32839a37f3b12213b18623b1bd58d37641cab750c50c3c287876cb98b12ab4"
+checksum = "9e4a932c152e7142de2d5dba1c393e5523c47cd8fe656e5b0d411954bbaf1810"
 dependencies = [
- "ahash 0.8.10",
  "ast_node",
  "better_scoped_tls",
  "cfg-if",
@@ -2002,7 +1962,7 @@ dependencies = [
  "num-bigint",
  "once_cell",
  "parking_lot",
- "rustc-hash",
+ "rustc-hash 2.1.1",
  "serde",
  "siphasher",
  "sourcemap",
@@ -2018,15 +1978,15 @@ dependencies = [
 
 [[package]]
 name = "swc_compiler_base"
-version = "0.24.0"
+version = "13.0.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8e70a05e62eaf316a0ba25aaaacfaa009b12f69d91cbe6b345ca295ecd1f3912"
+checksum = "278d50af64cf07f4e9893a294b5b25488de48de56e352fc5cdebff985854ecd8"
 dependencies = [
  "anyhow",
  "base64",
  "once_cell",
  "pathdiff",
- "rustc-hash",
+ "rustc-hash 2.1.1",
  "serde",
  "serde_json",
  "sourcemap",
@@ -2044,9 +2004,9 @@ dependencies = [
 
 [[package]]
 name = "swc_config"
-version = "0.1.15"
+version = "2.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4740e53eaf68b101203c1df0937d5161a29f3c13bceed0836ddfe245b72dd000"
+checksum = "eb63364aebd1a8490a80fa8933825c6916d4df55d5472312d5adb62c9fb4e4ba"
 dependencies = [
  "anyhow",
  "indexmap 2.7.0",
@@ -2059,9 +2019,9 @@ dependencies = [
 
 [[package]]
 name = "swc_config_macro"
-version = "0.1.4"
+version = "1.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7c5f56139042c1a95b54f5ca48baa0e0172d369bcc9d3d473dad1de36bae8399"
+checksum = "7f2ebd37ef52a8555c8c9be78b694d64adcb5e3bc16c928f030d82f1d65fac57"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -2071,9 +2031,9 @@ dependencies = [
 
 [[package]]
 name = "swc_core"
-version = "0.109.2"
+version = "16.10.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "abb1f322c79d2e0112f1c89b26a6e7c9e37548403a0dbedff322e1410a19568c"
+checksum = "f7453b2e6771d55f483903ed12fa9cf949ff7a3fefdfe4a63a5ea13b542e9eca"
 dependencies = [
  "swc",
  "swc_allocator",
@@ -2100,9 +2060,9 @@ dependencies = [
 
 [[package]]
 name = "swc_css_ast"
-version = "0.147.0"
+version = "8.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d1ae9a520c25198d262a8fed0957321ab3c7e9e5959f75ca16b36fa4d5f355fc"
+checksum = "f9482f1ab79c5de548a8872421a6625fbf7a70102a354bb16da280689edd1768"
 dependencies = [
  "is-macro",
  "string_enum",
@@ -2112,13 +2072,13 @@ dependencies = [
 
 [[package]]
 name = "swc_css_codegen"
-version = "0.158.1"
+version = "8.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5adc71f758abb3b55c3523ca8e7ac497678ccd2e7cc04095fb311dd1b8225783"
+checksum = "0f75578c97d9338cb6ae4007bda693690bac1c5b5d0bf817d43cd0b0e08632a1"
 dependencies = [
  "auto_impl",
  "bitflags 2.5.0",
- "rustc-hash",
+ "rustc-hash 2.1.1",
  "serde",
  "swc_atoms",
  "swc_common",
@@ -2129,9 +2089,9 @@ dependencies = [
 
 [[package]]
 name = "swc_css_codegen_macros"
-version = "0.2.4"
+version = "1.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "de2ece8c7dbdde85aa1bcc9764c5f41f7450d8bf1312eac2375b8dc0ecbc13d7"
+checksum = "50abd25b3b79f18423cdf99b0d11dee24e64496be3b8abe18c10a2c40bd6c91f"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -2141,9 +2101,9 @@ dependencies = [
 
 [[package]]
 name = "swc_css_parser"
-version = "0.157.1"
+version = "8.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5488032ced0e9db01db06388a48a4419e34e39fd94903b40e83cbdc667c69cdd"
+checksum = "d445ed47fad61fa7f0a60c1bfd6364c6686d5f3482959f8c13bed2789e98ee26"
 dependencies = [
  "lexical",
  "serde",
@@ -2154,11 +2114,12 @@ dependencies = [
 
 [[package]]
 name = "swc_css_utils"
-version = "0.144.0"
+version = "8.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "50872344e03c60694589e83afac62b7f30806b9b2e783595522ff1660aef50d6"
+checksum = "0976acf568ddc227f407ade30677f4e36122bd9906cc4c3997796bf76fb773cd"
 dependencies = [
  "once_cell",
+ "rustc-hash 2.1.1",
  "serde",
  "serde_json",
  "swc_atoms",
@@ -2169,9 +2130,9 @@ dependencies = [
 
 [[package]]
 name = "swc_css_visit"
-version = "0.146.0"
+version = "8.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7dfd7289d66619bee7a26159ed22359c1d49ea2649cc7bb0aba654863383ae34"
+checksum = "f2b941b45c434b6875146a0675a4c60c65a79d8c41a37457f8a33c05519d5c7f"
 dependencies = [
  "serde",
  "swc_atoms",
@@ -2182,9 +2143,9 @@ dependencies = [
 
 [[package]]
 name = "swc_ecma_ast"
-version = "0.121.2"
+version = "8.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "84d568834a727fc06c608db119dcea52c2d58e9426e92e72f358e2f7dc847063"
+checksum = "01f80679b1afc52ae0663eed0a2539cc3c108d48c287b5601712f9850d9fa9c2"
 dependencies = [
  "bitflags 2.5.0",
  "is-macro",
@@ -2195,19 +2156,23 @@ dependencies = [
  "string_enum",
  "swc_atoms",
  "swc_common",
+ "swc_visit",
  "unicode-id-start",
 ]
 
 [[package]]
 name = "swc_ecma_codegen"
-version = "0.158.4"
+version = "8.0.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e2549dd7b0f4db0b127fe286958f749b4e2d5467cb6739a78ac887df4f33dcef"
+checksum = "92103aa982740f265d6850bb3ffffbf6c3c1dee30ab0ed25117ca553f0d7467d"
 dependencies = [
+ "ascii",
+ "compact_str",
  "memchr",
  "num-bigint",
  "once_cell",
  "regex",
+ "rustc-hash 2.1.1",
  "serde",
  "sourcemap",
  "swc_allocator",
@@ -2220,9 +2185,9 @@ dependencies = [
 
 [[package]]
 name = "swc_ecma_codegen_macros"
-version = "0.7.6"
+version = "1.0.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "090e409af49c8d1a3c13b3aab1ed09dd4eda982207eb3e63c2ad342f072b49c8"
+checksum = "4ac2ff0957329e0dfcde86a1ac465382e189bf42a5989720d3476bea78eaa31a"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -2232,10 +2197,11 @@ dependencies = [
 
 [[package]]
 name = "swc_ecma_compat_bugfixes"
-version = "0.17.1"
+version = "11.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "204c0589ec432f795f3e38574244163d2288a0444ce7f499aa0b256a2346aeea"
+checksum = "3fbf52155fac8dbf8b13cf412da46e81f8bbe57467334a4e9434837f7bd61506"
 dependencies = [
+ "rustc-hash 2.1.1",
  "swc_atoms",
  "swc_common",
  "swc_ecma_ast",
@@ -2249,9 +2215,9 @@ dependencies = [
 
 [[package]]
 name = "swc_ecma_compat_common"
-version = "0.15.0"
+version = "11.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "eaa58f04f0ede7d44939974aa0795198aedb4a021cb0e56a977465f5a9ee6832"
+checksum = "09054aad2b52da3e6cf72089237700ff43fc5e6ab3ee1c521583c2c549522a38"
 dependencies = [
  "swc_common",
  "swc_ecma_ast",
@@ -2262,14 +2228,14 @@ dependencies = [
 
 [[package]]
 name = "swc_ecma_compat_es2015"
-version = "0.17.1"
+version = "11.0.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "193d25320c12f73f111bd12159519d2fa3aeb3d15cbb1f729882d48e71ce2443"
+checksum = "316c3b578f8a91574ed09b4ec68cbaa8e4e47fb7deea6d365eaa4d5e6c3c54ae"
 dependencies = [
  "arrayvec",
  "indexmap 2.7.0",
  "is-macro",
- "rustc-hash",
+ "rustc-hash 2.1.1",
  "serde",
  "serde_derive",
  "smallvec",
@@ -2289,9 +2255,9 @@ dependencies = [
 
 [[package]]
 name = "swc_ecma_compat_es2016"
-version = "0.17.0"
+version = "11.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a17adff62889cac35a5ac6099777ae20eaef603d0052c1a0e3ef8ac45412a543"
+checksum = "1d557bc5bc9242e07d16e5d42fb1882856d9bafcd26eab77ba124b9e68444e83"
 dependencies = [
  "swc_atoms",
  "swc_common",
@@ -2306,9 +2272,9 @@ dependencies = [
 
 [[package]]
 name = "swc_ecma_compat_es2017"
-version = "0.17.0"
+version = "11.0.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8a4f3c82273be28af3fb96e6b9a0f60218923c5923189e7f04050586be83e05b"
+checksum = "619d010fc6e5c6067f8397fba8887d6395dda21fe55c6f5346f815f4eb028901"
 dependencies = [
  "serde",
  "swc_atoms",
@@ -2324,9 +2290,9 @@ dependencies = [
 
 [[package]]
 name = "swc_ecma_compat_es2018"
-version = "0.17.0"
+version = "11.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8dbed7700a811364d673ddaa4b2aa2e40033baa0264fc4dafbd67c08a711833a"
+checksum = "b926094b18e30780c231032ce8ad6240842d0b0cca01938c61370b67ed8911fc"
 dependencies = [
  "serde",
  "swc_atoms",
@@ -2343,9 +2309,9 @@ dependencies = [
 
 [[package]]
 name = "swc_ecma_compat_es2019"
-version = "0.17.0"
+version = "11.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "abe53062abdd2f87154b26f0f3765ab68eec50156d2a2533fc6f23f21db33fbf"
+checksum = "658ab6efb4ff84a91429d90f5add80c1cf19d9d720cb8e0a47863fc2628e3564"
 dependencies = [
  "swc_atoms",
  "swc_common",
@@ -2359,9 +2325,9 @@ dependencies = [
 
 [[package]]
 name = "swc_ecma_compat_es2020"
-version = "0.17.0"
+version = "12.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fd7c21f8d2dcdf78985663662ac100ffa901f7d9cb262c8fb249e76878e5da39"
+checksum = "e3e0eac482a0ed60af3b7de78ca85e664095dfbd96a21dbafc8dff43e2f13b66"
 dependencies = [
  "serde",
  "swc_atoms",
@@ -2377,9 +2343,9 @@ dependencies = [
 
 [[package]]
 name = "swc_ecma_compat_es2021"
-version = "0.17.0"
+version = "11.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "132b4140f0f95fac85bb0185b729b803549ee10163164ee0ea8dbcb890d6e223"
+checksum = "89dd2f25812eab659bd088c2ace9837d5b6f064e7a184f27d7199d5aae493b20"
 dependencies = [
  "swc_atoms",
  "swc_common",
@@ -2393,10 +2359,11 @@ dependencies = [
 
 [[package]]
 name = "swc_ecma_compat_es2022"
-version = "0.17.1"
+version = "12.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9b8606eb5adf4254a9b7bc9c53c3f3337799f7dcf8f574105adba65ce5172ed7"
+checksum = "fa9e163b2badafc208995f771524492f8b003e52b82e0dff6c11fcb06662dc99"
 dependencies = [
+ "rustc-hash 2.1.1",
  "swc_atoms",
  "swc_common",
  "swc_ecma_ast",
@@ -2412,9 +2379,9 @@ dependencies = [
 
 [[package]]
 name = "swc_ecma_compat_es3"
-version = "0.17.0"
+version = "11.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7238859b1243c22bad33513cf5e9f2191fc8205719c727b665f7fd55efed1706"
+checksum = "0e5bce31592c053191996262d502f219a23edd53ae87ae7f54204bbdd94e5fcc"
 dependencies = [
  "swc_common",
  "swc_ecma_ast",
@@ -2427,9 +2394,9 @@ dependencies = [
 
 [[package]]
 name = "swc_ecma_ext_transforms"
-version = "0.124.0"
+version = "11.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d71495487d393475642215ddc1afaf4979f46d16f0fecc5f0f9869f99734ff61"
+checksum = "111d812c5e61ffc4f2e18573b0f09bcd870463b7eaa0a0419014d88cc7fc084b"
 dependencies = [
  "phf",
  "swc_atoms",
@@ -2441,15 +2408,15 @@ dependencies = [
 
 [[package]]
 name = "swc_ecma_lints"
-version = "0.105.2"
+version = "11.0.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cafe0b5546ef0c681e54afbff5cc9f17cf5ac67edf32b0e8bf2be787f446efb6"
+checksum = "39c61cc0dd2b072152de9cdb6eaf6cb57e979b359ed8d0eb86ce8c3450308b2e"
 dependencies = [
  "auto_impl",
  "dashmap",
  "parking_lot",
- "rayon",
  "regex",
+ "rustc-hash 2.1.1",
  "serde",
  "swc_atoms",
  "swc_common",
@@ -2457,13 +2424,14 @@ dependencies = [
  "swc_ecma_ast",
  "swc_ecma_utils",
  "swc_ecma_visit",
+ "swc_parallel",
 ]
 
 [[package]]
 name = "swc_ecma_loader"
-version = "0.52.1"
+version = "8.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f521eea3476abc7ae7adcbfa3479881087e5ae8fe358d46376d761e83fdb3120"
+checksum = "a801462c997b71e4add7684ce4953c7d6200c75b5552b8d594783da84ad9564c"
 dependencies = [
  "anyhow",
  "dashmap",
@@ -2473,6 +2441,7 @@ dependencies = [
  "parking_lot",
  "path-clean 0.1.0",
  "pathdiff",
+ "rustc-hash 2.1.1",
  "serde",
  "serde_json",
  "swc_atoms",
@@ -2483,9 +2452,9 @@ dependencies = [
 
 [[package]]
 name = "swc_ecma_minifier"
-version = "0.209.2"
+version = "12.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b9f3b070a1169d5dd032055886598557b6ad866cdd3e9db77a37dd1f55d230be"
+checksum = "7856c7095f57c0990ba9c22d18469d57b9f68e851cf27d8d99b5a0238648f0ce"
 dependencies = [
  "arrayvec",
  "indexmap 2.7.0",
@@ -2496,7 +2465,7 @@ dependencies = [
  "phf",
  "radix_fmt",
  "regex",
- "rustc-hash",
+ "rustc-hash 2.1.1",
  "ryu-js",
  "serde",
  "serde_json",
@@ -2512,21 +2481,23 @@ dependencies = [
  "swc_ecma_usage_analyzer",
  "swc_ecma_utils",
  "swc_ecma_visit",
+ "swc_parallel",
  "swc_timer",
  "tracing",
 ]
 
 [[package]]
 name = "swc_ecma_parser"
-version = "0.152.2"
+version = "10.0.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b888663998ef49da15d1dd3377e6b62bab4f994588e4f405628cb058d11ce8b3"
+checksum = "edfbfa5baabd14901a310f9d55d991625787d27d94de5c38a1a2ef85ebc19c97"
 dependencies = [
  "either",
  "new_debug_unreachable",
  "num-bigint",
  "num-traits",
  "phf",
+ "rustc-hash 2.1.1",
  "serde",
  "smallvec",
  "smartstring",
@@ -2540,16 +2511,16 @@ dependencies = [
 
 [[package]]
 name = "swc_ecma_preset_env"
-version = "0.222.2"
+version = "14.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1ca373759c7247341c18ce0632a46f3cff8d537cbcfd006a1445d3c328f241ce"
+checksum = "71fa37f57f20e5641bdc5b728955e254b7cbc4dcc4313f6e8e088dd9ec62775d"
 dependencies = [
  "anyhow",
  "dashmap",
  "indexmap 2.7.0",
  "once_cell",
  "preset_env_base",
- "rustc-hash",
+ "rustc-hash 2.1.1",
  "semver 1.0.22",
  "serde",
  "serde_json",
@@ -2565,13 +2536,14 @@ dependencies = [
 
 [[package]]
 name = "swc_ecma_quote_macros"
-version = "0.63.0"
+version = "10.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b6782774ce045d06682408be632ea2899e807a61fd9a307126d0a2407228de1b"
+checksum = "e4822fc4052681e583cbac5f823351d38de3347b59edd56bebface11dc05e863"
 dependencies = [
  "anyhow",
  "proc-macro2",
  "quote",
+ "rustc-hash 2.1.1",
  "swc_atoms",
  "swc_common",
  "swc_ecma_ast",
@@ -2582,9 +2554,9 @@ dependencies = [
 
 [[package]]
 name = "swc_ecma_testing"
-version = "0.29.0"
+version = "8.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d88a64496b73a0e9c9d8333d14d39904e8d87dbcefe7baaa161803a7f5bae110"
+checksum = "5e72a43b7acd904fa0c6d244a72aeda66febbc5a9720975481cb836d6804b604"
 dependencies = [
  "anyhow",
  "hex",
@@ -2595,9 +2567,9 @@ dependencies = [
 
 [[package]]
 name = "swc_ecma_transforms"
-version = "0.244.0"
+version = "14.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b73549ef9f33d8a175244169b554fde9cd669d331b7090b64c02146147ee0c33"
+checksum = "243295ffdee377b2ee66c94145017f0f60f28f70353d1c02047c9e409f7cd0e2"
 dependencies = [
  "swc_atoms",
  "swc_common",
@@ -2615,16 +2587,16 @@ dependencies = [
 
 [[package]]
 name = "swc_ecma_transforms_base"
-version = "0.150.1"
+version = "11.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "867ae73ffc2ae8cad72651f3b02017131379860e8687e9fae4b1e25da7d91cf1"
+checksum = "39889063ff4819eae414dfe6426aa5cd72ebb0f9f48739a1fa1e7eb82d0adc78"
 dependencies = [
  "better_scoped_tls",
  "bitflags 2.5.0",
  "indexmap 2.7.0",
  "once_cell",
  "phf",
- "rustc-hash",
+ "rustc-hash 2.1.1",
  "serde",
  "smallvec",
  "swc_atoms",
@@ -2633,14 +2605,15 @@ dependencies = [
  "swc_ecma_parser",
  "swc_ecma_utils",
  "swc_ecma_visit",
+ "swc_parallel",
  "tracing",
 ]
 
 [[package]]
 name = "swc_ecma_transforms_classes"
-version = "0.139.1"
+version = "11.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6ecbb88f0256ce6e0fdc69be5da1af089b1ae33f9923f716726b65203428b7ed"
+checksum = "2111a904b8f3c5dd63f56e7c8048851fcd8f748691a162a5d19a5da49f4a9d35"
 dependencies = [
  "swc_atoms",
  "swc_common",
@@ -2652,9 +2625,9 @@ dependencies = [
 
 [[package]]
 name = "swc_ecma_transforms_compat"
-version = "0.176.0"
+version = "12.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "54a83188f4f8d7dc06ac0606bb698d1075ffe47c23e83c02dacccfb71d3bcf68"
+checksum = "d9e25a5cc997638fd050e5e1ddccb49688300f13940ade79ee9bbe584158697b"
 dependencies = [
  "arrayvec",
  "indexmap 2.7.0",
@@ -2688,9 +2661,9 @@ dependencies = [
 
 [[package]]
 name = "swc_ecma_transforms_macros"
-version = "0.5.5"
+version = "1.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "500a1dadad1e0e41e417d633b3d6d5de677c9e0d3159b94ba3348436cdb15aab"
+checksum = "6845dfb88569f3e8cd05901505916a8ebe98be3922f94769ca49f84e8ccec8f7"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -2700,9 +2673,9 @@ dependencies = [
 
 [[package]]
 name = "swc_ecma_transforms_module"
-version = "0.195.0"
+version = "12.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "933221b7c1b8468c885eda2a3ad625d58d1f8259542166f35707a03313fbcdc7"
+checksum = "781eae62860d78d45b1e63d836f89249492db6c136f1893d0c8e0ebdbb7f540a"
 dependencies = [
  "Inflector",
  "anyhow",
@@ -2712,6 +2685,7 @@ dependencies = [
  "path-clean 1.0.1",
  "pathdiff",
  "regex",
+ "rustc-hash 2.1.1",
  "serde",
  "swc_atoms",
  "swc_cached",
@@ -2727,15 +2701,15 @@ dependencies = [
 
 [[package]]
 name = "swc_ecma_transforms_optimization"
-version = "0.213.2"
+version = "11.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "831fa5251fed6d737a3ed4887ceb0a21ca392ebbdd6fb6de00bf8edf48bc86f4"
+checksum = "83c0a8368b173d030aa2fb43688dcae11a98332239c902ccd97002327a1573f3"
 dependencies = [
  "dashmap",
  "indexmap 2.7.0",
  "once_cell",
  "petgraph",
- "rustc-hash",
+ "rustc-hash 2.1.1",
  "serde_json",
  "swc_atoms",
  "swc_common",
@@ -2746,17 +2720,18 @@ dependencies = [
  "swc_ecma_utils",
  "swc_ecma_visit",
  "swc_fast_graph",
+ "swc_parallel",
  "tracing",
 ]
 
 [[package]]
 name = "swc_ecma_transforms_proposal"
-version = "0.184.1"
+version = "11.0.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c7279bc3f706a91d236b0233eb57441809402cd533cf866235c4c66b4f562c82"
+checksum = "fbb38fb5fc6af559ff9ae792c03155655b9d2f214b09d5e899f7c0b76ed1ca98"
 dependencies = [
  "either",
- "rustc-hash",
+ "rustc-hash 2.1.1",
  "serde",
  "smallvec",
  "swc_atoms",
@@ -2771,14 +2746,15 @@ dependencies = [
 
 [[package]]
 name = "swc_ecma_transforms_react"
-version = "0.196.1"
+version = "12.0.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a2874f29c9acacc2ac3d20de5c1ff207f2eb68b536cc7655a6e29874895f6adc"
+checksum = "3db098e259f9543aaa0f77961e64d351a7fd1394ab7588a691eb15aee2ab236e"
 dependencies = [
  "base64",
  "dashmap",
  "indexmap 2.7.0",
  "once_cell",
+ "rustc-hash 2.1.1",
  "serde",
  "sha1",
  "string_enum",
@@ -2796,9 +2772,9 @@ dependencies = [
 
 [[package]]
 name = "swc_ecma_transforms_testing"
-version = "0.155.1"
+version = "11.0.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9a9ef17a904e2f6f340ce658cb9de0f1c328bc7c005d1c81df26e53af6d381f2"
+checksum = "13c4d8c48a36ad5d02626f853edcf52ae82b65d238389e7e76270ddf564b69ab"
 dependencies = [
  "ansi_term",
  "anyhow",
@@ -2808,6 +2784,7 @@ dependencies = [
  "serde_json",
  "sha2",
  "sourcemap",
+ "swc_allocator",
  "swc_common",
  "swc_ecma_ast",
  "swc_ecma_codegen",
@@ -2822,10 +2799,12 @@ dependencies = [
 
 [[package]]
 name = "swc_ecma_transforms_typescript"
-version = "0.203.1"
+version = "12.0.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ea45a4c1332c93de14226c621ea4cb7ac5e0f874142824b21653c6f34cf719f0"
+checksum = "ff4f2ea9134fa999039ace105daee34e4811cc58e34322605bafcd57de4a124c"
 dependencies = [
+ "once_cell",
+ "rustc-hash 2.1.1",
  "ryu-js",
  "serde",
  "swc_atoms",
@@ -2839,12 +2818,12 @@ dependencies = [
 
 [[package]]
 name = "swc_ecma_usage_analyzer"
-version = "0.34.1"
+version = "12.0.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "67cf63780f8abfcebdea8a0d6018575b09d7aac5c2ec778f12fe6dc09d27c6a5"
+checksum = "8af89be14ef84b16529f89a70972c7f85b0e9e2599ea09d9f7c3e5b186b8f225"
 dependencies = [
  "indexmap 2.7.0",
- "rustc-hash",
+ "rustc-hash 2.1.1",
  "swc_atoms",
  "swc_common",
  "swc_ecma_ast",
@@ -2856,28 +2835,29 @@ dependencies = [
 
 [[package]]
 name = "swc_ecma_utils"
-version = "0.138.1"
+version = "11.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "41f6422008758309fb2ab79ddbbf0e635bb69e47e54196b89f00a0217e820620"
+checksum = "721dc779e7de200da96ac4002c710bc32c988e3e1ebf62b39d32bf99f14d9765"
 dependencies = [
  "indexmap 2.7.0",
  "num_cpus",
  "once_cell",
- "rustc-hash",
+ "rustc-hash 2.1.1",
  "ryu-js",
  "swc_atoms",
  "swc_common",
  "swc_ecma_ast",
  "swc_ecma_visit",
+ "swc_parallel",
  "tracing",
  "unicode-id",
 ]
 
 [[package]]
 name = "swc_ecma_visit"
-version = "0.107.1"
+version = "8.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b5983d63df36fdefec8b4bdb88d1fdcd06c9acb815d987c871409a5a64d58f63"
+checksum = "2f7a65fa06d0c0f709f1df4e820ccdc4eca7b3db7f9d131545e20c2ac2f1cd23"
 dependencies = [
  "new_debug_unreachable",
  "num-bigint",
@@ -2890,9 +2870,9 @@ dependencies = [
 
 [[package]]
 name = "swc_eq_ignore_macros"
-version = "0.1.3"
+version = "1.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "695a1d8b461033d32429b5befbf0ad4d7a2c4d6ba9cd5ba4e0645c615839e8e4"
+checksum = "e96e15288bf385ab85eb83cff7f9e2d834348da58d0a31b33bdb572e66ee413e"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -2901,34 +2881,37 @@ dependencies = [
 
 [[package]]
 name = "swc_error_reporters"
-version = "1.0.0"
+version = "9.1.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "83f9286183c9be40aafcbbe8c397403fb32af812a3dffe93eee9067aee4fbedb"
+checksum = "7938665a5561d6c3e2b796b5b2d0bc9a961d461db960cb5139f12e82b45bb471"
 dependencies = [
  "anyhow",
  "miette",
  "once_cell",
  "parking_lot",
+ "serde",
+ "serde_derive",
+ "serde_json",
  "swc_common",
 ]
 
 [[package]]
 name = "swc_fast_graph"
-version = "1.0.1"
+version = "9.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7f5910e7aeb1e0125ad27be9346cc266d1c75b68b6dc57ca37921136f4758416"
+checksum = "bd24b9798b0538803d0a69cffa5f5e051087fa2bd0d23e5a2f05d32edf9ab671"
 dependencies = [
  "indexmap 2.7.0",
  "petgraph",
- "rustc-hash",
+ "rustc-hash 2.1.1",
  "swc_common",
 ]
 
 [[package]]
 name = "swc_macros_common"
-version = "0.3.11"
+version = "1.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "91745f3561057493d2da768437c427c0e979dff7396507ae02f16c981c4a8466"
+checksum = "a509f56fca05b39ba6c15f3e58636c3924c78347d63853632ed2ffcb6f5a0ac7"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -2937,29 +2920,39 @@ dependencies = [
 
 [[package]]
 name = "swc_node_comments"
-version = "0.27.0"
+version = "8.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "31c325461f5e78e7749241f917945164adccfadcc2138a9a2e5ac9d186e1c459"
+checksum = "f97dba66fc5f0df68c706dc99ade59bcba4ce55c585117eefccafe1337ca270f"
 dependencies = [
  "dashmap",
+ "rustc-hash 2.1.1",
  "swc_atoms",
  "swc_common",
 ]
 
+[[package]]
+name = "swc_parallel"
+version = "1.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8f16052d5123ec45c1c49100781363f3f4e4a6be2da6d82f473b79db1e3abeb8"
+dependencies = [
+ "once_cell",
+]
+
 [[package]]
 name = "swc_timer"
-version = "0.27.0"
+version = "1.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f53899e4ab3f9ce3db83b4c845f8a27f37bf700b233febbc9a6da749651c2fbb"
+checksum = "4db06b46cc832f7cf83c2ce21905fc465d01443a2bdccf63644383e1f5847532"
 dependencies = [
  "tracing",
 ]
 
 [[package]]
 name = "swc_trace_macro"
-version = "1.0.0"
+version = "2.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "69aa25f667e4d74ab10a17a266edeb8b354273817b20b91e60471f1c860a221b"
+checksum = "4c78717a841565df57f811376a3d19c9156091c55175e12d378f3a522de70cef"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -2968,34 +2961,38 @@ dependencies = [
 
 [[package]]
 name = "swc_transform_common"
-version = "0.1.1"
+version = "1.0.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "eda3e80e1ad638d3575bc07745a914af13dcb02215098659f864731078271f2c"
+checksum = "79319c2165695896119f0cb22847dedfb0bd7f77acd98dbc5bc1f081105db6f3"
 dependencies = [
  "better_scoped_tls",
  "once_cell",
- "rustc-hash",
+ "rustc-hash 2.1.1",
  "serde",
  "serde_json",
 ]
 
 [[package]]
 name = "swc_typescript"
-version = "0.8.1"
+version = "10.0.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "62f67e7bf045807f80a6b07d3acf3098db27bb3c82c93cc46eaf78ba386be950"
+checksum = "5702d7aa5e2ec80b8b207291a032aaeb40769ea1e4a614dd1644590ae040edd3"
 dependencies = [
+ "petgraph",
+ "rustc-hash 2.1.1",
  "swc_atoms",
  "swc_common",
  "swc_ecma_ast",
+ "swc_ecma_utils",
+ "swc_ecma_visit",
  "thiserror 1.0.69",
 ]
 
 [[package]]
 name = "swc_visit"
-version = "0.6.2"
+version = "2.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1ceb044142ba2719ef9eb3b6b454fce61ab849eb696c34d190f04651955c613d"
+checksum = "9138b6a36bbe76dd6753c4c0794f7e26480ea757bee499738bedbbb3ae3ec5f3"
 dependencies = [
  "either",
  "new_debug_unreachable",
@@ -3064,9 +3061,9 @@ dependencies = [
 
 [[package]]
 name = "testing"
-version = "0.42.1"
+version = "8.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9217860da21fabe9c65981ba42f6dad2bd8f463b670448afe79aa9d50f0bc137"
+checksum = "8d32ddc0e2ebd072cbffe7424087267da990708a5bc3ae29e075904468450275"
 dependencies = [
  "ansi_term",
  "cargo_metadata 0.18.1",
@@ -3074,6 +3071,7 @@ dependencies = [
  "once_cell",
  "pretty_assertions",
  "regex",
+ "rustc-hash 2.1.1",
  "serde",
  "serde_json",
  "swc_common",
@@ -3085,9 +3083,9 @@ dependencies = [
 
 [[package]]
 name = "testing_macros"
-version = "0.2.12"
+version = "1.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f9d3864d4184569c1428645a51a304b3b6e8d3094cd61fb3cce8dfdd9f6d0f72"
+checksum = "a2d27bf245b90a80d5aa231133418ae7db98f032855ce5292e12071ab29c4b26"
 dependencies = [
  "anyhow",
  "glob",
@@ -3463,6 +3461,12 @@ dependencies = [
  "windows-targets 0.48.0",
 ]
 
+[[package]]
+name = "windows-link"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38"
+
 [[package]]
 name = "windows-sys"
 version = "0.52.0"
diff --git a/packages/react/transform/Cargo.toml b/packages/react/transform/Cargo.toml
index 212d6e7991..1a69fafddb 100644
--- a/packages/react/transform/Cargo.toml
+++ b/packages/react/transform/Cargo.toml
@@ -16,11 +16,12 @@ napi = { version = "2.7.0", default-features = false, features = ["napi4"] }
 napi-derive = "2.7.0"
 once_cell = "1.20.2"
 regex = "1.11.1"
+rustc-hash = "2.1.1"
 serde = "1.0.217"
 serde_json = { version = "1.0.134", features = ["preserve_order"] }
 sha-1 = "0.10.1"
 # cSpell:disable-next-line
-swc_core = { version = "0.109.2", features = ["base", "ecma_codegen", "ecma_parser", "ecma_minifier", "ecma_transforms_typescript", "ecma_utils", "ecma_quote", "ecma_transforms_react", "ecma_transforms_optimization", "css_parser", "css_ast", "css_visit", "css_codegen", "__visit", "__testing_transform"] }
+swc_core = { version = "16.5.0", features = ["base", "ecma_codegen", "ecma_parser", "ecma_minifier", "ecma_transforms_typescript", "ecma_utils", "ecma_quote", "ecma_transforms_react", "ecma_transforms_optimization", "css_parser", "css_ast", "css_visit", "css_codegen", "__visit", "__testing_transform"] }
 version-compare = "0.2.0"
 
 # cSpell:disable-next-line
diff --git a/packages/react/transform/src/bundle.rs b/packages/react/transform/src/bundle.rs
index 5fe5628473..762c110745 100644
--- a/packages/react/transform/src/bundle.rs
+++ b/packages/react/transform/src/bundle.rs
@@ -10,9 +10,8 @@ use swc_core::{
     Compiler, PrintArgs,
   },
   common::{
-    chain,
     comments::SingleThreadedComments,
-    errors::{DiagnosticBuilder, Emitter, Handler},
+    errors::{DiagnosticBuilder, Emitter, Handler, HANDLER},
     sync::Lrc,
     FileName, FilePathMapping, Mark, SourceMap, GLOBALS,
   },
@@ -20,8 +19,8 @@ use swc_core::{
     ast::*,
     codegen,
     parser::{EsSyntax, Syntax},
-    transforms::base::{hygiene::hygiene_with_config, resolver},
-    visit::as_folder,
+    transforms::base::{helpers, hygiene::hygiene_with_config, resolver},
+    visit::visit_mut_pass,
   },
 };
 
@@ -136,20 +135,22 @@ pub fn transform_bundle_result_inner(
       Either::A(_) => ExtractStrVisitor::default(),
       Either::B(config) => ExtractStrVisitor::new(config),
     };
-    let extract_str_plugin = Optional::new(as_folder(&mut extract_str_vis), should_extract_str);
+    let extract_str_plugin =
+      Optional::new(visit_mut_pass(&mut extract_str_vis), should_extract_str);
     let mut worklet_post_process_vis = WorkletPostProcessorVisitor::default();
-    let worklet_post_process_plugin = as_folder(&mut worklet_post_process_vis);
-    let program = c.transform(
-      &handler,
-      program,
-      true,
-      chain!(
-        resolver(Mark::new(), Mark::new(), true),
-        extract_str_plugin,
-        worklet_post_process_plugin,
-        hygiene_with_config(Default::default()),
-      ),
+    let worklet_post_process_plugin = visit_mut_pass(&mut worklet_post_process_vis);
+
+    let pass = (
+      resolver(Mark::new(), Mark::new(), true),
+      extract_str_plugin,
+      worklet_post_process_plugin,
+      hygiene_with_config(Default::default()),
     );
+
+    let program = helpers::HELPERS.set(&helpers::Helpers::new(true), || {
+      HANDLER.set(&handler, || program.apply(pass))
+    });
+
     let result = c.print(
       &program,
       PrintArgs {
diff --git a/packages/react/transform/src/lib.rs b/packages/react/transform/src/lib.rs
index be26b89e86..dc54212e52 100644
--- a/packages/react/transform/src/lib.rs
+++ b/packages/react/transform/src/lib.rs
@@ -26,16 +26,17 @@ use std::vec;
 
 use napi::{bindgen_prelude::AsyncTask, Either, Env, Task};
 
+use rustc_hash::FxBuildHasher;
+
 use swc_core::{
+  atoms::Atom,
   base::{
     config::{GlobalPassOption, IsModule, SourceMapsConfig},
     Compiler, PrintArgs,
   },
   common::{
-    chain,
-    collections::ARandomState,
     comments::SingleThreadedComments,
-    errors::{DiagnosticBuilder, Emitter, Handler},
+    errors::{DiagnosticBuilder, Emitter, Handler, HANDLER},
     pass::Optional,
     sync::Lrc,
     FileName, FilePathMapping, Mark, SourceMap, GLOBALS,
@@ -47,13 +48,14 @@ use swc_core::{
     transforms::{
       base::{
         fixer::fixer,
+        helpers,
         hygiene::{hygiene_with_config, Config},
         resolver,
       },
       optimization::{simplifier, simplify},
       react, typescript,
     },
-    visit::{as_folder, FoldWith},
+    visit::visit_mut_pass,
   },
 };
 
@@ -386,10 +388,10 @@ fn transform_react_lynx_inner(
 
     let directive_dce_plugin = match options.directive_dce {
       Either::A(config) => Optional::new(
-        as_folder(DirectiveDCEVisitor::new(Default::default())),
+        visit_mut_pass(DirectiveDCEVisitor::new(Default::default())),
         config,
       ),
-      Either::B(config) => Optional::new(as_folder(DirectiveDCEVisitor::new(config)), true),
+      Either::B(config) => Optional::new(visit_mut_pass(DirectiveDCEVisitor::new(config)), true),
     };
 
     let define_dce_plugin = {
@@ -397,7 +399,7 @@ fn transform_react_lynx_inner(
         vars: match &options.define_dce {
           Either::A(_) => Default::default(),
           Either::B(config) => {
-            let mut map = indexmap::IndexMap::<_, _, ARandomState>::default();
+            let mut map = indexmap::IndexMap::<_, _, FxBuildHasher>::default();
             for (key, value) in &config.define {
               map.insert(key.as_str().into(), value.as_str().into());
             }
@@ -416,14 +418,14 @@ fn transform_react_lynx_inner(
 
     let css_scope_plugin = match options.css_scope {
       Either::A(enabled) => Optional::new(
-        as_folder(CSSScopeVisitor::new(
+        visit_mut_pass(CSSScopeVisitor::new(
           CSSScopeVisitorConfig::default(),
           Some(&comments),
         )),
         enabled,
       ),
       Either::B(config) => Optional::new(
-        as_folder(CSSScopeVisitor::new(config, Some(&comments))),
+        visit_mut_pass(CSSScopeVisitor::new(config, Some(&comments))),
         true,
       ),
     };
@@ -446,7 +448,10 @@ fn transform_react_lynx_inner(
         react::Options {
           next: Some(false),
           runtime: Some(react::Runtime::Automatic),
-          import_source: snapshot_plugin_config.jsx_import_source.clone(),
+          import_source: snapshot_plugin_config
+            .jsx_import_source
+            .clone()
+            .map(|s| Atom::from(s)),
           pragma: None,
           pragma_frag: None,
           // We may want `main-thread:foo={fooMainThreadFunc}` to work
@@ -462,21 +467,23 @@ fn transform_react_lynx_inner(
     );
 
     let snapshot_plugin = Optional::new(
-      JSXTransformer::new(
-        snapshot_plugin_config,
-        cm.clone(),
-        Some(&comments),
-        top_level_mark,
-        unresolved_mark,
-        options.mode.unwrap_or(TransformMode::Production),
-      )
-      .with_content_hash(content_hash.clone()),
+      visit_mut_pass(
+        JSXTransformer::new(
+          snapshot_plugin_config,
+          cm.clone(),
+          Some(&comments),
+          top_level_mark,
+          unresolved_mark,
+          options.mode.unwrap_or(TransformMode::Production),
+        )
+        .with_content_hash(content_hash.clone()),
+      ),
       enabled,
     );
 
     let shake_plugin = match options.shake.clone() {
-      Either::A(config) => Optional::new(as_folder(ShakeVisitor::default()), config),
-      Either::B(config) => Optional::new(as_folder(ShakeVisitor::new(config)), true),
+      Either::A(config) => Optional::new(visit_mut_pass(ShakeVisitor::default()), config),
+      Either::B(config) => Optional::new(visit_mut_pass(ShakeVisitor::new(config)), true),
     };
 
     let simplify_pass = simplifier(
@@ -492,20 +499,21 @@ fn transform_react_lynx_inner(
 
     let compat_plugin = match options.compat.clone() {
       Either::A(config) => Optional::new(
-        as_folder(CompatVisitor::new(
+        visit_mut_pass(CompatVisitor::new(
           CompatVisitorConfig::default(),
           Some(&comments),
         )),
         config,
       ),
-      Either::B(config) => {
-        Optional::new(as_folder(CompatVisitor::new(config, Some(&comments))), true)
-      }
+      Either::B(config) => Optional::new(
+        visit_mut_pass(CompatVisitor::new(config, Some(&comments))),
+        true,
+      ),
     };
 
     let compat_post_plugin = match options.compat {
       Either::A(config) => Optional::new(
-        as_folder(CompatPostVisitor::new(
+        visit_mut_pass(CompatPostVisitor::new(
           Default::default(),
           unresolved_mark,
           top_level_mark,
@@ -513,7 +521,7 @@ fn transform_react_lynx_inner(
         config,
       ),
       Either::B(config) => Optional::new(
-        as_folder(CompatPostVisitor::new(
+        visit_mut_pass(CompatPostVisitor::new(
           config,
           unresolved_mark,
           top_level_mark,
@@ -524,25 +532,25 @@ fn transform_react_lynx_inner(
 
     let refresh_plugin = match options.refresh {
       Either::A(config) => Optional::new(
-        as_folder(RefreshVisitor::new(
+        visit_mut_pass(RefreshVisitor::new(
           RefreshVisitorConfig::default(),
           content_hash.clone(),
         )),
         config,
       ),
       Either::B(config) => Optional::new(
-        as_folder(RefreshVisitor::new(config, content_hash.clone())),
+        visit_mut_pass(RefreshVisitor::new(config, content_hash.clone())),
         true,
       ),
     };
 
     let worklet_plugin = match options.worklet {
       Either::A(config) => Optional::new(
-        as_folder(WorkletVisitor::default().with_content_hash(content_hash)),
+        visit_mut_pass(WorkletVisitor::default().with_content_hash(content_hash)),
         config,
       ),
       Either::B(config) => Optional::new(
-        as_folder(
+        visit_mut_pass(
           WorkletVisitor::new(options.mode.unwrap_or(TransformMode::Production), config)
             .with_content_hash(content_hash),
         ),
@@ -552,21 +560,21 @@ fn transform_react_lynx_inner(
 
     let dynamic_import_plugin = match options.dynamic_import.unwrap_or(Either::A(true)) {
       Either::A(config) => Optional::new(
-        as_folder(DynamicImportVisitor::new(
+        visit_mut_pass(DynamicImportVisitor::new(
           Default::default(),
           Some(&comments),
         )),
         config,
       ),
       Either::B(config) => Optional::new(
-        as_folder(DynamicImportVisitor::new(config, Some(&comments))),
+        visit_mut_pass(DynamicImportVisitor::new(config, Some(&comments))),
         true,
       ),
     };
 
     let inject_plugin = match options.inject.unwrap_or(Either::A(false)) {
       Either::A(config) => Optional::new(
-        as_folder(InjectVisitor::new(
+        visit_mut_pass(InjectVisitor::new(
           Default::default(),
           unresolved_mark,
           top_level_mark,
@@ -574,12 +582,13 @@ fn transform_react_lynx_inner(
         config,
       ),
       Either::B(config) => Optional::new(
-        as_folder(InjectVisitor::new(config, unresolved_mark, top_level_mark)),
+        visit_mut_pass(InjectVisitor::new(config, unresolved_mark, top_level_mark)),
         true,
       ),
     };
 
-    let pass = chain!(
+    let pass = (
+      &mut fixer(Some(&comments)),
       resolver(unresolved_mark, top_level_mark, true),
       typescript::typescript(
         typescript::Config {
@@ -588,7 +597,7 @@ fn transform_react_lynx_inner(
           ..Default::default()
         },
         unresolved_mark,
-        top_level_mark
+        top_level_mark,
       ),
       dynamic_import_plugin,
       refresh_plugin,
@@ -599,22 +608,25 @@ fn transform_react_lynx_inner(
       directive_dce_plugin,
       define_dce_plugin,
       simplify_pass_1, // do simplify after DCE above to make shake below works better
-      shake_plugin,
-      simplify_pass,
-      react_transformer,
-      // TODO(hongzhiyuan.hzy): if `ident` we added above is correctly marked, this pass will be unnecessary
-      resolver(unresolved_mark, top_level_mark, true),
-      compat_post_plugin,
-      inject_plugin,
-      hygiene_with_config(Config {
-        top_level_mark,
-        ..Default::default()
-      })
+      (
+        shake_plugin,
+        simplify_pass,
+        react_transformer,
+        // TODO(hongzhiyuan.hzy): if `ident` we added above is correctly marked, this pass will be unnecessary
+        resolver(unresolved_mark, top_level_mark, true),
+        compat_post_plugin,
+        inject_plugin,
+        hygiene_with_config(Config {
+          top_level_mark,
+          ..Default::default()
+        }),
+        &mut fixer(Some(&comments)),
+      ),
     );
 
-    let program = c
-      .transform(&handler, program, true, pass)
-      .fold_with(&mut fixer(Some(&comments)));
+    let program = helpers::HELPERS.set(&helpers::Helpers::new(true), || {
+      HANDLER.set(&handler, || program.apply(pass))
+    });
 
     let result = c.print(
       &program,
diff --git a/packages/react/transform/src/swc_plugin_compat/mod.rs b/packages/react/transform/src/swc_plugin_compat/mod.rs
index 4529a61df7..b9aa32d209 100644
--- a/packages/react/transform/src/swc_plugin_compat/mod.rs
+++ b/packages/react/transform/src/swc_plugin_compat/mod.rs
@@ -1005,14 +1005,14 @@ where
 mod tests {
   use napi::Either;
   use swc_core::{
-    common::{chain, comments::SingleThreadedComments, Mark},
+    common::{comments::SingleThreadedComments, Mark},
     ecma::{
       parser::{EsSyntax, Syntax},
       transforms::{
         base::{hygiene::hygiene_with_config, resolver},
         testing::test,
       },
-      visit::as_folder,
+      visit::visit_mut_pass,
     },
   };
 
@@ -1025,9 +1025,9 @@ mod tests {
       jsx: true,
       ..Default::default()
     }),
-    |_| chain!(
+    |_| (
       resolver(Mark::new(), Mark::new(), true),
-      as_folder(CompatVisitor::<&SingleThreadedComments>::default()),
+      visit_mut_pass(CompatVisitor::<&SingleThreadedComments>::default()),
       hygiene_with_config(Default::default()),
     ),
     should_rename_view,
@@ -1043,9 +1043,9 @@ mod tests {
       jsx: true,
       ..Default::default()
     }),
-    |_| chain!(
+    |_| (
       resolver(Mark::new(), Mark::new(), true),
-      as_folder(CompatVisitor::<&SingleThreadedComments>::default()),
+      visit_mut_pass(CompatVisitor::<&SingleThreadedComments>::default()),
       hygiene_with_config(Default::default()),
     ),
     should_not_rename_view_in_scope,
@@ -1068,9 +1068,9 @@ mod tests {
       jsx: true,
       ..Default::default()
     }),
-    |_| chain!(
+    |_| (
       resolver(Mark::new(), Mark::new(), true),
-      as_folder(CompatVisitor::<&SingleThreadedComments>::default()),
+      visit_mut_pass(CompatVisitor::<&SingleThreadedComments>::default()),
       hygiene_with_config(Default::default()),
     ),
     should_not_rename_view_redeclaration,
@@ -1089,9 +1089,9 @@ mod tests {
       jsx: true,
       ..Default::default()
     }),
-    |_| chain!(
+    |_| (
       resolver(Mark::new(), Mark::new(), true),
-      as_folder(CompatVisitor::<&SingleThreadedComments>::default()),
+      visit_mut_pass(CompatVisitor::<&SingleThreadedComments>::default()),
       hygiene_with_config(Default::default()),
     ),
     should_not_handle_jsx_member_expression,
@@ -1107,9 +1107,9 @@ mod tests {
       jsx: true,
       ..Default::default()
     }),
-    |_| chain!(
+    |_| (
       resolver(Mark::new(), Mark::new(), true),
-      as_folder(CompatVisitor::<&SingleThreadedComments>::default()),
+      visit_mut_pass(CompatVisitor::<&SingleThreadedComments>::default()),
       hygiene_with_config(Default::default()),
     ),
     should_transform_event_props_1,
@@ -1125,9 +1125,9 @@ mod tests {
       jsx: true,
       ..Default::default()
     }),
-    |_| chain!(
+    |_| (
       resolver(Mark::new(), Mark::new(), true),
-      as_folder(CompatVisitor::<&SingleThreadedComments>::default()),
+      visit_mut_pass(CompatVisitor::<&SingleThreadedComments>::default()),
       hygiene_with_config(Default::default()),
     ),
     should_transform_event_props_2,
@@ -1142,9 +1142,9 @@ mod tests {
       jsx: true,
       ..Default::default()
     }),
-    |_| chain!(
+    |_| (
       resolver(Mark::new(), Mark::new(), true),
-      as_folder(CompatVisitor::<&SingleThreadedComments>::default()),
+      visit_mut_pass(CompatVisitor::<&SingleThreadedComments>::default()),
       hygiene_with_config(Default::default()),
     ),
     should_handle_recursive,
@@ -1165,9 +1165,9 @@ mod tests {
       jsx: true,
       ..Default::default()
     }),
-    |_| chain!(
+    |_| (
       resolver(Mark::new(), Mark::new(), true),
-      as_folder(CompatVisitor::<&SingleThreadedComments>::default()),
+      visit_mut_pass(CompatVisitor::<&SingleThreadedComments>::default()),
       hygiene_with_config(Default::default()),
     ),
     should_change_runtime_pkg,
@@ -1182,9 +1182,9 @@ mod tests {
       jsx: true,
       ..Default::default()
     }),
-    |_| chain!(
+    |_| (
       resolver(Mark::new(), Mark::new(), true),
-      as_folder(CompatVisitor::<&SingleThreadedComments>::new(
+      visit_mut_pass(CompatVisitor::<&SingleThreadedComments>::new(
         CompatVisitorConfig {
           add_component_element: Either::A(true),
           ..Default::default()
@@ -1219,9 +1219,9 @@ mod tests {
       jsx: true,
       ..Default::default()
     }),
-    |_| chain!(
+    |_| (
       resolver(Mark::new(), Mark::new(), true),
-      as_folder(CompatVisitor::<&SingleThreadedComments>::new(
+      visit_mut_pass(CompatVisitor::<&SingleThreadedComments>::new(
         CompatVisitorConfig {
           add_component_element: Either::B(AddComponentElementConfig {
             compiler_only: true
@@ -1258,9 +1258,9 @@ mod tests {
       jsx: true,
       ..Default::default()
     }),
-    |_| chain!(
+    |_| (
       resolver(Mark::new(), Mark::new(), true),
-      as_folder(CompatVisitor::<&SingleThreadedComments>::new(
+      visit_mut_pass(CompatVisitor::<&SingleThreadedComments>::new(
         CompatVisitorConfig {
           add_component_element: Either::A(true),
           ..Default::default()
@@ -1281,9 +1281,9 @@ mod tests {
       jsx: true,
       ..Default::default()
     }),
-    |_| chain!(
+    |_| (
       resolver(Mark::new(), Mark::new(), true),
-      as_folder(CompatVisitor::<&SingleThreadedComments>::new(
+      visit_mut_pass(CompatVisitor::<&SingleThreadedComments>::new(
         CompatVisitorConfig {
           add_component_element: Either::B(AddComponentElementConfig {
             compiler_only: true
@@ -1306,9 +1306,9 @@ mod tests {
       jsx: true,
       ..Default::default()
     }),
-    |_| chain!(
+    |_| (
       resolver(Mark::new(), Mark::new(), true),
-      as_folder(CompatVisitor::<&SingleThreadedComments>::new(
+      visit_mut_pass(CompatVisitor::<&SingleThreadedComments>::new(
         CompatVisitorConfig {
           // add_component_element: Either::A(true),
           ..Default::default()
@@ -1329,9 +1329,9 @@ mod tests {
       jsx: true,
       ..Default::default()
     }),
-    |_| chain!(
+    |_| (
       resolver(Mark::new(), Mark::new(), true),
-      as_folder(CompatVisitor::<&SingleThreadedComments>::new(
+      visit_mut_pass(CompatVisitor::<&SingleThreadedComments>::new(
         CompatVisitorConfig {
           add_component_element: Either::A(true),
           simplify_ctor_like_react_lynx_2: true,
@@ -1367,9 +1367,9 @@ mod tests {
       jsx: true,
       ..Default::default()
     }),
-    |_| chain!(
+    |_| (
       resolver(Mark::new(), Mark::new(), true),
-      as_folder(CompatVisitor::<&SingleThreadedComments>::new(
+      visit_mut_pass(CompatVisitor::<&SingleThreadedComments>::new(
         CompatVisitorConfig {
           add_component_element: Either::A(true),
           simplify_ctor_like_react_lynx_2: true,
@@ -1407,9 +1407,9 @@ mod tests {
       jsx: true,
       ..Default::default()
     }),
-    |_| chain!(
+    |_| (
       resolver(Mark::new(), Mark::new(), true),
-      as_folder(CompatVisitor::<&SingleThreadedComments>::new(
+      visit_mut_pass(CompatVisitor::<&SingleThreadedComments>::new(
         CompatVisitorConfig {
           add_component_element: Either::A(true),
           simplify_ctor_like_react_lynx_2: true,
@@ -1445,9 +1445,9 @@ mod tests {
       jsx: true,
       ..Default::default()
     }),
-    |_| chain!(
+    |_| (
       resolver(Mark::new(), Mark::new(), true),
-      as_folder(CompatVisitor::<&SingleThreadedComments>::new(
+      visit_mut_pass(CompatVisitor::<&SingleThreadedComments>::new(
         CompatVisitorConfig {
           add_component_element: Either::A(true),
           simplify_ctor_like_react_lynx_2: true,
@@ -1485,9 +1485,9 @@ mod tests {
       jsx: true,
       ..Default::default()
     }),
-    |_| chain!(
+    |_| (
       resolver(Mark::new(), Mark::new(), true),
-      as_folder(CompatVisitor::<&SingleThreadedComments>::new(
+      visit_mut_pass(CompatVisitor::<&SingleThreadedComments>::new(
         CompatVisitorConfig {
           add_component_element: Either::A(true),
           simplify_ctor_like_react_lynx_2: true,
@@ -1537,9 +1537,9 @@ mod tests {
       jsx: true,
       ..Default::default()
     }),
-    |_| chain!(
+    |_| (
       resolver(Mark::new(), Mark::new(), true),
-      as_folder(CompatVisitor::<&SingleThreadedComments>::new(
+      visit_mut_pass(CompatVisitor::<&SingleThreadedComments>::new(
         CompatVisitorConfig {
           remove_component_attr_regex: Some("^(on|handle|bind)[A-Z]".into()),
           ..Default::default()
diff --git a/packages/react/transform/src/swc_plugin_compat/simplify_ctor_like_react_lynx_2.rs b/packages/react/transform/src/swc_plugin_compat/simplify_ctor_like_react_lynx_2.rs
index c5ef9c0ee3..a52fd3b4c0 100644
--- a/packages/react/transform/src/swc_plugin_compat/simplify_ctor_like_react_lynx_2.rs
+++ b/packages/react/transform/src/swc_plugin_compat/simplify_ctor_like_react_lynx_2.rs
@@ -1,6 +1,7 @@
 use regex::Regex;
+use rustc_hash::FxHashSet;
 use swc_core::{
-  common::{collections::AHashSet, util::take::Take},
+  common::util::take::Take,
   ecma::{
     ast::*,
     utils::collect_decls,
@@ -11,7 +12,7 @@ use swc_core::{
 pub struct CtorSimplifyVisitor {
   in_constructor: bool,
   is_target_object: bool,
-  current_ctor_bindings: Option<AHashSet<Id>>,
+  current_ctor_bindings: Option<FxHashSet<Id>>,
 
   pub remain_props: Vec<PropOrSpread>,
   pub remain_stmts: Vec<Stmt>,
@@ -176,7 +177,7 @@ impl Visit for FuncDetectVisitor {
 
 struct LocalDeclsDetectVisitor<'a> {
   pub has: bool,
-  pub bindings: &'a Option<AHashSet<Id>>,
+  pub bindings: &'a Option<FxHashSet<Id>>,
 }
 
 impl Visit for LocalDeclsDetectVisitor<'_> {
diff --git a/packages/react/transform/src/swc_plugin_compat_post/mod.rs b/packages/react/transform/src/swc_plugin_compat_post/mod.rs
index 64fcf2d376..b354a45c86 100644
--- a/packages/react/transform/src/swc_plugin_compat_post/mod.rs
+++ b/packages/react/transform/src/swc_plugin_compat_post/mod.rs
@@ -74,11 +74,11 @@ impl VisitMut for CompatPostVisitor {
 #[cfg(test)]
 mod tests {
   use swc_core::{
-    common::{chain, Mark},
+    common::Mark,
     ecma::{
       parser::{EsSyntax, Syntax},
       transforms::{base::resolver, testing::test},
-      visit::as_folder,
+      visit::visit_mut_pass,
     },
   };
 
@@ -97,15 +97,15 @@ mod tests {
       let unresolved_mark = Mark::new();
       let top_level_mark = Mark::new();
 
-      chain!(
+      (
         resolver(unresolved_mark, top_level_mark, true),
-        as_folder(CompatPostVisitor::new(
+        visit_mut_pass(CompatPostVisitor::new(
           CompatVisitorConfig {
             dark_mode: Some(napi::Either::A(true)),
             ..Default::default()
           },
           unresolved_mark,
-          top_level_mark
+          top_level_mark,
         )),
       )
     },
@@ -126,9 +126,9 @@ mod tests {
       let unresolved_mark = Mark::new();
       let top_level_mark = Mark::new();
 
-      chain!(
+      (
         resolver(unresolved_mark, top_level_mark, true),
-        as_folder(CompatPostVisitor::new(
+        visit_mut_pass(CompatPostVisitor::new(
           CompatVisitorConfig {
             dark_mode: Some(napi::Either::B(DarkModeConfig {
               theme_expr: "__globalProps.xxx ?? __globalProps.yyy ?? 'zzz'".into(),
@@ -136,7 +136,7 @@ mod tests {
             ..Default::default()
           },
           unresolved_mark,
-          top_level_mark
+          top_level_mark,
         )),
       )
     },
diff --git a/packages/react/transform/src/swc_plugin_css_scope/mod.rs b/packages/react/transform/src/swc_plugin_css_scope/mod.rs
index 5452c2bca6..2d6b11d6b1 100644
--- a/packages/react/transform/src/swc_plugin_css_scope/mod.rs
+++ b/packages/react/transform/src/swc_plugin_css_scope/mod.rs
@@ -212,7 +212,7 @@ mod tests {
     ecma::{
       parser::{EsSyntax, Syntax},
       transforms::testing::test,
-      visit::as_folder,
+      visit::visit_mut_pass,
     },
   };
 
@@ -241,7 +241,7 @@ mod tests {
       jsx: true,
       ..Default::default()
     }),
-    |_| as_folder(CSSScopeVisitor::<SingleThreadedComments>::new(
+    |_| visit_mut_pass(CSSScopeVisitor::<SingleThreadedComments>::new(
       CSSScopeVisitorConfig {
         mode: CSSScope::All,
         ..Default::default()
@@ -258,7 +258,7 @@ mod tests {
       jsx: true,
       ..Default::default()
     }),
-    |_| as_folder(CSSScopeVisitor::<SingleThreadedComments>::new(
+    |_| visit_mut_pass(CSSScopeVisitor::<SingleThreadedComments>::new(
       super::CSSScopeVisitorConfig {
         mode: CSSScope::None,
         ..Default::default()
@@ -275,7 +275,7 @@ mod tests {
       jsx: true,
       ..Default::default()
     }),
-    |_| as_folder(CSSScopeVisitor::<SingleThreadedComments>::new(
+    |_| visit_mut_pass(CSSScopeVisitor::<SingleThreadedComments>::new(
       super::CSSScopeVisitorConfig {
         mode: CSSScope::None,
         ..Default::default()
@@ -292,7 +292,7 @@ mod tests {
       jsx: true,
       ..Default::default()
     }),
-    |_| as_folder(CSSScopeVisitor::<SingleThreadedComments>::new(
+    |_| visit_mut_pass(CSSScopeVisitor::<SingleThreadedComments>::new(
       super::CSSScopeVisitorConfig {
         mode: CSSScope::All,
         ..Default::default()
@@ -309,7 +309,7 @@ mod tests {
       jsx: true,
       ..Default::default()
     }),
-    |_| as_folder(CSSScopeVisitor::<SingleThreadedComments>::new(
+    |_| visit_mut_pass(CSSScopeVisitor::<SingleThreadedComments>::new(
       super::CSSScopeVisitorConfig {
         mode: CSSScope::All,
         ..Default::default()
@@ -326,7 +326,7 @@ mod tests {
       jsx: true,
       ..Default::default()
     }),
-    |_| as_folder(CSSScopeVisitor::<SingleThreadedComments>::new(
+    |_| visit_mut_pass(CSSScopeVisitor::<SingleThreadedComments>::new(
       super::CSSScopeVisitorConfig {
         mode: CSSScope::Modules,
         ..Default::default()
@@ -343,7 +343,7 @@ mod tests {
       jsx: true,
       ..Default::default()
     }),
-    |_| as_folder(CSSScopeVisitor::<SingleThreadedComments>::new(
+    |_| visit_mut_pass(CSSScopeVisitor::<SingleThreadedComments>::new(
       super::CSSScopeVisitorConfig {
         mode: CSSScope::Modules,
         ..Default::default()
diff --git a/packages/react/transform/src/swc_plugin_directive_dce/mod.rs b/packages/react/transform/src/swc_plugin_directive_dce/mod.rs
index 092e220a29..c42cc644b2 100644
--- a/packages/react/transform/src/swc_plugin_directive_dce/mod.rs
+++ b/packages/react/transform/src/swc_plugin_directive_dce/mod.rs
@@ -217,7 +217,7 @@ mod tests {
   };
   use swc_core::{
     ecma::parser::Syntax,
-    ecma::visit::as_folder,
+    ecma::visit::visit_mut_pass,
     ecma::{parser::EsSyntax, transforms::testing::test},
   };
 
@@ -229,7 +229,7 @@ mod tests {
       jsx: true,
       ..Default::default()
     }),
-    |_| as_folder(DirectiveDCEVisitor::new(DirectiveDCEVisitorConfig {
+    |_| visit_mut_pass(DirectiveDCEVisitor::new(DirectiveDCEVisitorConfig {
       target: TransformTarget::LEPUS,
     })),
     should_eliminate_js_only_but_keep_constructor,
@@ -249,7 +249,7 @@ mod tests {
       jsx: true,
       ..Default::default()
     }),
-    |_| as_folder(DirectiveDCEVisitor::new(DirectiveDCEVisitorConfig {
+    |_| visit_mut_pass(DirectiveDCEVisitor::new(DirectiveDCEVisitorConfig {
       target: TransformTarget::LEPUS,
     })),
     should_eliminate_js_only_class_method,
@@ -273,7 +273,7 @@ mod tests {
       jsx: true,
       ..Default::default()
     }),
-    |_| as_folder(DirectiveDCEVisitor::new(DirectiveDCEVisitorConfig {
+    |_| visit_mut_pass(DirectiveDCEVisitor::new(DirectiveDCEVisitorConfig {
       target: TransformTarget::LEPUS,
     })),
     should_eliminate_js_only_class_property,
@@ -297,7 +297,7 @@ mod tests {
       jsx: true,
       ..Default::default()
     }),
-    |_| as_folder(DirectiveDCEVisitor::new(DirectiveDCEVisitorConfig {
+    |_| visit_mut_pass(DirectiveDCEVisitor::new(DirectiveDCEVisitorConfig {
       target: TransformTarget::LEPUS,
     })),
     should_eliminate_js_only_embedded,
@@ -320,7 +320,7 @@ mod tests {
       jsx: true,
       ..Default::default()
     }),
-    |_| as_folder(DirectiveDCEVisitor::new(DirectiveDCEVisitorConfig {
+    |_| visit_mut_pass(DirectiveDCEVisitor::new(DirectiveDCEVisitorConfig {
       target: TransformTarget::MIXED,
     })),
     should_do_nothing_in_mixed_target,
@@ -340,7 +340,7 @@ mod tests {
       jsx: true,
       ..Default::default()
     }),
-    |_| as_folder(DirectiveDCEVisitor::new(DirectiveDCEVisitorConfig {
+    |_| visit_mut_pass(DirectiveDCEVisitor::new(DirectiveDCEVisitorConfig {
       target: TransformTarget::MIXED,
     })),
     should_do_nothing_when_arrow_function_return_directive,
@@ -355,7 +355,7 @@ mod tests {
       jsx: true,
       ..Default::default()
     }),
-    |_| as_folder(DirectiveDCEVisitor::new(DirectiveDCEVisitorConfig {
+    |_| visit_mut_pass(DirectiveDCEVisitor::new(DirectiveDCEVisitorConfig {
       target: TransformTarget::LEPUS,
     })),
     should_eliminate_native_modules_in_default_params,
@@ -373,7 +373,7 @@ mod tests {
       jsx: true,
       ..Default::default()
     }),
-    |_| as_folder(DirectiveDCEVisitor::new(DirectiveDCEVisitorConfig {
+    |_| visit_mut_pass(DirectiveDCEVisitor::new(DirectiveDCEVisitorConfig {
       target: TransformTarget::LEPUS,
     })),
     should_eliminate_fn_body_in_component_props,
@@ -392,7 +392,7 @@ mod tests {
       jsx: true,
       ..Default::default()
     }),
-    |_| as_folder(DirectiveDCEVisitor::new(DirectiveDCEVisitorConfig {
+    |_| visit_mut_pass(DirectiveDCEVisitor::new(DirectiveDCEVisitorConfig {
       target: TransformTarget::LEPUS,
     })),
     should_eliminate_fn_decl,
diff --git a/packages/react/transform/src/swc_plugin_dynamic_import/mod.rs b/packages/react/transform/src/swc_plugin_dynamic_import/mod.rs
index 5a0efb05b6..a6145db747 100644
--- a/packages/react/transform/src/swc_plugin_dynamic_import/mod.rs
+++ b/packages/react/transform/src/swc_plugin_dynamic_import/mod.rs
@@ -246,7 +246,7 @@ mod tests {
     ecma::{
       parser::{EsSyntax, Syntax},
       transforms::testing::test,
-      visit::as_folder,
+      visit::visit_mut_pass,
     },
   };
 
@@ -258,7 +258,7 @@ mod tests {
       jsx: true,
       ..Default::default()
     }),
-    |_| as_folder(DynamicImportVisitor::new(
+    |_| visit_mut_pass(DynamicImportVisitor::new(
       DynamicImportVisitorConfig {
         layer: "test".into(),
         ..Default::default()
diff --git a/packages/react/transform/src/swc_plugin_extract_str/mod.rs b/packages/react/transform/src/swc_plugin_extract_str/mod.rs
index e2c4608762..79445622f6 100644
--- a/packages/react/transform/src/swc_plugin_extract_str/mod.rs
+++ b/packages/react/transform/src/swc_plugin_extract_str/mod.rs
@@ -184,14 +184,14 @@ impl VisitMut for ExtractStrVisitor {
 #[cfg(test)]
 mod tests {
   use swc_core::{
-    common::{chain, Mark},
+    common::Mark,
     ecma::{
       parser::{EsSyntax, Syntax},
       transforms::{
         base::{hygiene::hygiene_with_config, resolver},
         testing::test,
       },
-      visit::as_folder,
+      visit::visit_mut_pass,
     },
   };
 
@@ -202,9 +202,9 @@ mod tests {
     Syntax::Es(EsSyntax {
       ..Default::default()
     }),
-    |_| chain!(
+    |_| (
       resolver(Mark::new(), Mark::new(), true),
-      as_folder(ExtractStrVisitor::new(ExtractStrConfig {
+      visit_mut_pass(ExtractStrVisitor::new(ExtractStrConfig {
         str_length: 1,
         extracted_str_arr: None
       })),
@@ -234,9 +234,9 @@ mod tests {
     Syntax::Es(EsSyntax {
       ..Default::default()
     }),
-    |_| chain!(
+    |_| (
       resolver(Mark::new(), Mark::new(), true),
-      as_folder(ExtractStrVisitor::new(ExtractStrConfig {
+      visit_mut_pass(ExtractStrVisitor::new(ExtractStrConfig {
         str_length: 1,
         extracted_str_arr: Some(vec![
           "123".to_string(),
diff --git a/packages/react/transform/src/swc_plugin_inject/mod.rs b/packages/react/transform/src/swc_plugin_inject/mod.rs
index 8b51b29ad6..776c23b9b9 100644
--- a/packages/react/transform/src/swc_plugin_inject/mod.rs
+++ b/packages/react/transform/src/swc_plugin_inject/mod.rs
@@ -244,10 +244,10 @@ fn parse_define(define: &str) -> PResult<Box<Expr>> {
 mod tests {
   use std::collections::HashMap;
   use swc_core::{
-    common::{chain, Mark},
+    common::Mark,
     ecma::parser::Syntax,
     ecma::{parser::EsSyntax, transforms::testing::test},
-    ecma::{transforms::base::resolver, visit::as_folder},
+    ecma::{transforms::base::resolver, visit::visit_mut_pass},
   };
 
   use crate::swc_plugin_inject::{InjectAs, InjectVisitor, InjectVisitorConfig};
@@ -262,36 +262,36 @@ mod tests {
       let unresolved_mark = Mark::new();
       let top_level_mark = Mark::new();
 
-      chain!(
+      (
         resolver(unresolved_mark, top_level_mark, true),
-        as_folder(InjectVisitor::new(
+        visit_mut_pass(InjectVisitor::new(
           InjectVisitorConfig {
             inject: HashMap::from([
               (
                 "__SOME__".into(),
-                InjectAs::Expr("__globalProps.xxx ?? __globalProps.yyy ?? 'zzz'".into())
+                InjectAs::Expr("__globalProps.xxx ?? __globalProps.yyy ?? 'zzz'".into()),
               ),
               (
                 "__SOME_2__".into(),
-                InjectAs::Expr("__globalProps.xxx ?? __globalProps.yyy ?? zzz".into())
+                InjectAs::Expr("__globalProps.xxx ?? __globalProps.yyy ?? zzz".into()),
               ),
               (
                 "__SOME_3__".into(),
-                InjectAs::Expr("__globalProps.xxx ?? __globalProps.yyy ?? __SOME__".into())
+                InjectAs::Expr("__globalProps.xxx ?? __globalProps.yyy ?? __SOME__".into()),
               ),
               ("zzz".into(), InjectAs::ImportDefault("@lynx-js/zzz".into())),
               (
                 "FiberElementApi".into(),
-                InjectAs::ImportStarAs("@lynx-js/react".into())
+                InjectAs::ImportStarAs("@lynx-js/react".into()),
               ),
               (
                 "__SetClasses".into(),
-                InjectAs::ImportNamed("@lynx-js/react".into(), "__SetClassesDarkMode".into())
-              )
+                InjectAs::ImportNamed("@lynx-js/react".into(), "__SetClassesDarkMode".into()),
+              ),
             ]),
           },
           unresolved_mark,
-          top_level_mark
+          top_level_mark,
         )),
       )
     },
@@ -314,17 +314,17 @@ mod tests {
       let unresolved_mark = Mark::new();
       let top_level_mark = Mark::new();
 
-      chain!(
+      (
         resolver(unresolved_mark, top_level_mark, true),
-        as_folder(InjectVisitor::new(
+        visit_mut_pass(InjectVisitor::new(
           InjectVisitorConfig {
             inject: HashMap::from([(
               "__DARK_MODE_THEME__".into(),
-              InjectAs::Expr("__globalProps.xxx ?? __globalProps.yyy ?? 'zzz'".into())
-            ),]),
+              InjectAs::Expr("__globalProps.xxx ?? __globalProps.yyy ?? 'zzz'".into()),
+            )]),
           },
           unresolved_mark,
-          top_level_mark
+          top_level_mark,
         )),
       )
     },
diff --git a/packages/react/transform/src/swc_plugin_refresh/mod.rs b/packages/react/transform/src/swc_plugin_refresh/mod.rs
index d94e4ea11b..df8cb6fe48 100644
--- a/packages/react/transform/src/swc_plugin_refresh/mod.rs
+++ b/packages/react/transform/src/swc_plugin_refresh/mod.rs
@@ -290,11 +290,11 @@ impl VisitMut for RefreshVisitor {
 #[cfg(test)]
 mod tests {
   use swc_core::{
-    common::{chain, Mark},
+    common::Mark,
     ecma::{
       parser::{EsSyntax, Syntax},
       transforms::{base::resolver, testing::test},
-      visit::as_folder,
+      visit::visit_mut_pass,
     },
   };
 
@@ -306,9 +306,9 @@ mod tests {
       jsx: true,
       ..Default::default()
     }),
-    |_| chain!(
+    |_| (
       resolver(Mark::new(), Mark::new(), true),
-      as_folder(RefreshVisitor::new(
+      visit_mut_pass(RefreshVisitor::new(
         Default::default(),
         "__file_hash__".into()
       ))
@@ -329,9 +329,9 @@ mod tests {
       jsx: true,
       ..Default::default()
     }),
-    |_| chain!(
+    |_| (
       resolver(Mark::new(), Mark::new(), true),
-      as_folder(RefreshVisitor::new(
+      visit_mut_pass(RefreshVisitor::new(
         RefreshVisitorConfig {
           library: Some(vec!["@custom/react".into()])
         },
@@ -354,9 +354,9 @@ mod tests {
       jsx: true,
       ..Default::default()
     }),
-    |_| chain!(
+    |_| (
       resolver(Mark::new(), Mark::new(), true),
-      as_folder(RefreshVisitor::new(
+      visit_mut_pass(RefreshVisitor::new(
         Default::default(),
         "__file_hash__".into()
       ))
@@ -377,9 +377,9 @@ mod tests {
       jsx: true,
       ..Default::default()
     }),
-    |_| chain!(
+    |_| (
       resolver(Mark::new(), Mark::new(), true),
-      as_folder(RefreshVisitor::new(
+      visit_mut_pass(RefreshVisitor::new(
         Default::default(),
         "__file_hash__".into()
       ))
@@ -400,9 +400,9 @@ mod tests {
       jsx: true,
       ..Default::default()
     }),
-    |_| chain!(
+    |_| (
       resolver(Mark::new(), Mark::new(), true),
-      as_folder(RefreshVisitor::new(
+      visit_mut_pass(RefreshVisitor::new(
         Default::default(),
         "__file_hash__".into()
       ))
@@ -423,9 +423,9 @@ mod tests {
       jsx: true,
       ..Default::default()
     }),
-    |_| chain!(
+    |_| (
       resolver(Mark::new(), Mark::new(), true),
-      as_folder(RefreshVisitor::new(
+      visit_mut_pass(RefreshVisitor::new(
         Default::default(),
         "__file_hash__".into()
       ))
@@ -446,9 +446,9 @@ mod tests {
       jsx: true,
       ..Default::default()
     }),
-    |_| chain!(
+    |_| (
       resolver(Mark::new(), Mark::new(), true),
-      as_folder(RefreshVisitor::new(
+      visit_mut_pass(RefreshVisitor::new(
         Default::default(),
         "__file_hash__".into()
       ))
@@ -473,9 +473,9 @@ mod tests {
       jsx: true,
       ..Default::default()
     }),
-    |_| chain!(
+    |_| (
       resolver(Mark::new(), Mark::new(), true),
-      as_folder(RefreshVisitor::new(
+      visit_mut_pass(RefreshVisitor::new(
         Default::default(),
         "__file_hash__".into()
       ))
@@ -505,9 +505,9 @@ mod tests {
       jsx: true,
       ..Default::default()
     }),
-    |_| chain!(
+    |_| (
       resolver(Mark::new(), Mark::new(), true),
-      as_folder(RefreshVisitor::new(
+      visit_mut_pass(RefreshVisitor::new(
         Default::default(),
         "__file_hash__".into()
       ))
@@ -528,9 +528,9 @@ mod tests {
       jsx: true,
       ..Default::default()
     }),
-    |_| chain!(
+    |_| (
       resolver(Mark::new(), Mark::new(), true),
-      as_folder(RefreshVisitor::new(
+      visit_mut_pass(RefreshVisitor::new(
         Default::default(),
         "__file_hash__".into()
       ))
diff --git a/packages/react/transform/src/swc_plugin_shake/mod.rs b/packages/react/transform/src/swc_plugin_shake/mod.rs
index 288e2d95c1..66b600ea21 100644
--- a/packages/react/transform/src/swc_plugin_shake/mod.rs
+++ b/packages/react/transform/src/swc_plugin_shake/mod.rs
@@ -202,10 +202,10 @@ fn get_class_member_name(c: &ClassMember) -> Option<String> {
 #[cfg(test)]
 mod tests {
   use swc_core::{
-    common::{chain, Mark},
+    common::Mark,
     ecma::parser::Syntax,
     ecma::{parser::EsSyntax, transforms::testing::test},
-    ecma::{transforms::base::resolver, visit::as_folder},
+    ecma::{transforms::base::resolver, visit::visit_mut_pass},
   };
 
   use crate::ShakeVisitor;
@@ -216,7 +216,7 @@ mod tests {
       jsx: true,
       ..Default::default()
     }),
-    |_| as_folder(ShakeVisitor::default()),
+    |_| visit_mut_pass(ShakeVisitor::default()),
     should_remove_test,
     r#"
     export class A extends Component {
@@ -234,7 +234,7 @@ mod tests {
       jsx: true,
       ..Default::default()
     }),
-    |_| as_folder(ShakeVisitor::default()),
+    |_| visit_mut_pass(ShakeVisitor::default()),
     should_not_remove_test_with_other_runtime,
     r#"
     export class A extends Component {
@@ -249,7 +249,7 @@ mod tests {
       jsx: true,
       ..Default::default()
     }),
-    |_| as_folder(ShakeVisitor::default()),
+    |_| visit_mut_pass(ShakeVisitor::default()),
     should_keep_state_and_remove_other,
     r#"
     export class A extends Component {
@@ -272,7 +272,7 @@ mod tests {
       jsx: true,
       ..Default::default()
     }),
-    |_| as_folder(ShakeVisitor::default()),
+    |_| visit_mut_pass(ShakeVisitor::default()),
     should_keep_constructor_and_used,
     r#"
     export class A extends Component {
@@ -298,7 +298,7 @@ mod tests {
       jsx: true,
       ..Default::default()
     }),
-    |_| as_folder(ShakeVisitor::default()),
+    |_| visit_mut_pass(ShakeVisitor::default()),
     should_keep_with_nested_class,
     r#"
     export class A extends Component {
@@ -319,7 +319,7 @@ mod tests {
       jsx: true,
       ..Default::default()
     }),
-    |_| as_folder(ShakeVisitor::default()),
+    |_| visit_mut_pass(ShakeVisitor::default()),
     should_keep_render_and_used,
     r#"
     import { Component } from "@lynx-js/react-runtime";
@@ -343,7 +343,7 @@ mod tests {
       jsx: true,
       ..Default::default()
     }),
-    |_| as_folder(ShakeVisitor::default()),
+    |_| visit_mut_pass(ShakeVisitor::default()),
     should_keep_indirect,
     r#"
     export class A extends Component {
@@ -369,7 +369,7 @@ mod tests {
       jsx: true,
       ..Default::default()
     }),
-    |_| as_folder(ShakeVisitor::default()),
+    |_| visit_mut_pass(ShakeVisitor::default()),
     should_remove_unused_indirect,
     r#"
     export class A extends Component {
@@ -390,7 +390,7 @@ mod tests {
 
   test!(
     Default::default(),
-    |_| as_folder(ShakeVisitor::default()),
+    |_| visit_mut_pass(ShakeVisitor::default()),
     should_remove_use_effect_param,
     r#"
     import { useEffect } from "@lynx-js/react-runtime";
@@ -408,9 +408,9 @@ mod tests {
       jsx: true,
       ..Default::default()
     }),
-    |_| chain!(
+    |_| (
       resolver(Mark::new(), Mark::new(), true),
-      as_folder(ShakeVisitor::new(Default::default())),
+      visit_mut_pass(ShakeVisitor::new(Default::default())),
     ),
     should_not_remove_in_scope_id,
     r#"
@@ -429,9 +429,9 @@ mod tests {
       jsx: true,
       ..Default::default()
     }),
-    |_| chain!(
+    |_| (
       resolver(Mark::new(), Mark::new(), true),
-      as_folder(ShakeVisitor::new(Default::default())),
+      visit_mut_pass(ShakeVisitor::new(Default::default())),
     ),
     only_shake_class_like_react_component_class,
     r#"
@@ -463,9 +463,9 @@ mod tests {
       jsx: true,
       ..Default::default()
     }),
-    |_| chain!(
+    |_| (
       resolver(Mark::new(), Mark::new(), true),
-      as_folder(ShakeVisitor::new(Default::default())),
+      visit_mut_pass(ShakeVisitor::new(Default::default())),
     ),
     should_keep_access_inside_class_property_iife,
     r#"
diff --git a/packages/react/transform/src/swc_plugin_snapshot/jsx_helpers.rs b/packages/react/transform/src/swc_plugin_snapshot/jsx_helpers.rs
index d07dceadb8..b85f9c1527 100644
--- a/packages/react/transform/src/swc_plugin_snapshot/jsx_helpers.rs
+++ b/packages/react/transform/src/swc_plugin_snapshot/jsx_helpers.rs
@@ -6,7 +6,7 @@ use swc_core::{
   common::{errors::HANDLER, iter::IdentifyLast, Spanned, DUMMY_SP},
   ecma::{
     ast::{JSXExpr, *},
-    atoms::{js_word, Atom, JsWord},
+    atoms::{atom, Atom},
   },
 };
 
@@ -14,7 +14,7 @@ pub fn jsx_name(name: JSXElementName) -> Box<Expr> {
   let span = name.span();
   match name {
     JSXElementName::Ident(i) => {
-      if i.sym == js_word!("this") {
+      if i.sym == atom!("this") {
         return Box::new(Expr::This(ThisExpr { span }));
       }
       // If it starts with lowercase
@@ -50,7 +50,7 @@ pub fn jsx_name(name: JSXElementName) -> Box<Expr> {
 
         (match obj {
           JSXObject::Ident(i) => {
-            if i.sym == js_word!("this") {
+            if i.sym == atom!("this") {
               Expr::This(ThisExpr { span })
             } else {
               Expr::Ident(i)
@@ -73,7 +73,7 @@ pub fn jsx_name(name: JSXElementName) -> Box<Expr> {
   }
 }
 
-pub fn jsx_attr_name(name: &JSXAttrName) -> JsWord {
+pub fn jsx_attr_name(name: &JSXAttrName) -> Atom {
   match name {
     JSXAttrName::Ident(ref id) => id.sym.clone(),
     JSXAttrName::JSXNamespacedName(ref name) => format!("{}:{}", name.ns.sym, name.name.sym).into(),
@@ -128,7 +128,7 @@ pub fn jsx_props_to_obj(jsx: &JSXElement) -> Option<ObjectLit> {
   Some(obj)
 }
 
-pub fn jsx_text_to_str(t: &Atom) -> JsWord {
+pub fn jsx_text_to_str(t: &Atom) -> Atom {
   static SPACE_START: Lazy<Regex> = Lazy::new(|| Regex::new("^[ ]+").unwrap());
   static SPACE_END: Lazy<Regex> = Lazy::new(|| Regex::new("[ ]+$").unwrap());
   let mut buf = String::new();
diff --git a/packages/react/transform/src/swc_plugin_snapshot/mod.rs b/packages/react/transform/src/swc_plugin_snapshot/mod.rs
index 42c1a11c29..c5e9d4fa78 100644
--- a/packages/react/transform/src/swc_plugin_snapshot/mod.rs
+++ b/packages/react/transform/src/swc_plugin_snapshot/mod.rs
@@ -15,7 +15,7 @@ use swc_core::{
   ecma::{
     ast::{JSXExpr, *},
     utils::{is_literal, prepend_stmt, private_ident},
-    visit::{Fold, FoldWith, VisitMut, VisitMutWith},
+    visit::{VisitMut, VisitMutWith},
   },
   quote, quote_expr,
 };
@@ -262,9 +262,9 @@ impl DynamicPart {
   }
 }
 
-pub struct DynamicPartExtractor<'a, F>
+pub struct DynamicPartExtractor<'a, V>
 where
-  F: Fold,
+  V: VisitMut,
 {
   page_id: Lazy<Ident>,
   runtime_id: Expr,
@@ -276,15 +276,15 @@ where
   snapshot_creator: Option<Function>,
   dynamic_part_count: i32,
   dynamic_parts: Vec<DynamicPart>,
-  dynamic_part_folder: &'a mut F,
+  dynamic_part_visitor: &'a mut V,
   key: Option<JSXAttrValue>,
 }
 
-impl<'a, F> DynamicPartExtractor<'a, F>
+impl<'a, V> DynamicPartExtractor<'a, V>
 where
-  F: Fold,
+  V: VisitMut,
 {
-  fn new(runtime_id: Expr, dynamic_part_count: i32, dynamic_part_folder: &'a mut F) -> Self {
+  fn new(runtime_id: Expr, dynamic_part_count: i32, dynamic_part_visitor: &'a mut V) -> Self {
     DynamicPartExtractor {
       page_id: Lazy::new(|| private_ident!("pageId")),
       runtime_id,
@@ -296,7 +296,7 @@ where
       snapshot_creator: None,
       dynamic_part_count,
       dynamic_parts: vec![],
-      dynamic_part_folder,
+      dynamic_part_visitor,
       key: None,
     }
   }
@@ -381,14 +381,14 @@ where
   }
 }
 
-impl<'a, F> VisitMut for DynamicPartExtractor<'a, F>
+impl<'a, V> VisitMut for DynamicPartExtractor<'a, V>
 where
-  F: Fold,
+  V: VisitMut,
 {
   fn visit_mut_jsx_element(&mut self, n: &mut JSXElement) {
     if jsx_is_internal_slot(&n) {
       if self.dynamic_part_count > 1 {
-        n.map_with_mut(|value| value.fold_children_with(self.dynamic_part_folder));
+        n.visit_mut_children_with(self.dynamic_part_visitor);
         self.dynamic_parts.push(DynamicPart::Slot(
           jsx_unwrap_internal_slot(n.take()),
           self.element_index,
@@ -589,7 +589,7 @@ where
                           ..
                         })) => {
                           // expr.map_with_mut(|value| {
-                          //     value.fold_with(self.dynamic_part_folder)
+                          //     value.fold_with(self.dynamic_part_visitor)
                           // });
                           match &**expr {
                             Expr::Lit(value) => {
@@ -947,7 +947,7 @@ where
         self.parent_element = pre_parent_element;
       } else {
         if self.dynamic_part_count <= 1 {
-          n.map_with_mut(|value| value.fold_children_with(self.dynamic_part_folder));
+          n.visit_mut_children_with(self.dynamic_part_visitor);
           let children_expr = jsx_children_to_expr(n.children.take());
           if is_list {
             self
@@ -966,7 +966,7 @@ where
           //     static_stmt
           // });
 
-          // n.map_with_mut(|value| value.fold_with(self.dynamic_part_folder));
+          // n.map_with_mut(|value| value.fold_with(self.dynamic_part_visitor));
           // if is_list {
           //     // unreachable!()
           //     self.dynamic_parts
@@ -1037,7 +1037,7 @@ where
         _ => {}
       };
     } else {
-      n.map_with_mut(|value| value.fold_children_with(self.dynamic_part_folder));
+      n.visit_mut_children_with(self.dynamic_part_visitor);
 
       if self.parent_element.is_some() {
         self.dynamic_parts.push(DynamicPart::Children(
@@ -1216,16 +1216,16 @@ where
   }
 }
 
-impl<C> Fold for JSXTransformer<C>
+impl<C> VisitMut for JSXTransformer<C>
 where
   C: Comments + Clone,
 {
-  fn fold_jsx_element(&mut self, mut node: JSXElement) -> JSXElement {
+  fn visit_mut_jsx_element(&mut self, node: &mut JSXElement) {
     match *jsx_name(node.opening.name.clone()) {
       Expr::Lit(lit) => {
         if let Lit::Str(s) = &lit {
           if s.value.as_ref() == "wrapper" {
-            return node.fold_children_with(self);
+            return node.visit_mut_children_with(self);
           }
           if s.value.as_ref() == "page" {
             if self.runtime_components_module_item.is_none() {
@@ -1256,7 +1256,7 @@ where
               }
               _ => {}
             }
-            return node.fold_children_with(self);
+            return node.visit_mut_children_with(self);
           }
 
           if s.value.as_ref() == "component" {
@@ -1269,7 +1269,7 @@ where
         }
       }
       _ => {
-        return node.fold_children_with(self);
+        return node.visit_mut_children_with(self);
       }
     }
 
@@ -1576,7 +1576,7 @@ where
     self.current_snapshot_id = Some(snapshot_id.clone());
     self.current_snapshot_defs.push(snapshot_def);
 
-    return JSXElement {
+    *node = JSXElement {
       span: node.span(),
       opening: JSXOpeningElement {
         name: JSXElementName::Ident(snapshot_id.clone()),
@@ -1612,10 +1612,10 @@ where
     };
   }
 
-  fn fold_module_items(&mut self, mut n: Vec<ModuleItem>) -> Vec<ModuleItem> {
+  fn visit_mut_module_items(&mut self, n: &mut Vec<ModuleItem>) {
     let mut new_items: Vec<ModuleItem> = vec![];
     for (_i, item) in n.iter_mut().enumerate() {
-      item.map_with_mut(|item| item.fold_with(self));
+      item.visit_mut_with(self);
       new_items.extend(self.current_snapshot_defs.take());
       new_items.push(item.take());
     }
@@ -1627,10 +1627,10 @@ where
       None => {}
     }
 
-    return new_items;
+    *n = new_items;
   }
 
-  fn fold_module(&mut self, mut n: Module) -> Module {
+  fn visit_mut_module(&mut self, n: &mut Module) {
     self.parse_directives(n.span);
     for item in &n.body {
       let span = item.span();
@@ -1641,7 +1641,7 @@ where
       self.css_id_value = Some(Expr::Lit(Lit::Num(0.into())));
     }
 
-    n = n.fold_children_with(self);
+    n.visit_mut_children_with(self);
     match Lazy::<Expr>::get(&self.runtime_id) {
       Some(runtime_id) => {
         match runtime_id {
@@ -1671,12 +1671,11 @@ where
       }
       None => {}
     }
-    n
   }
 
-  fn fold_expr(&mut self, mut n: Expr) -> Expr {
-    if n.is_call() {
-      let n = n.as_mut_call().unwrap();
+  fn visit_mut_expr(&mut self, node: &mut Expr) {
+    if node.is_call() {
+      let n = node.as_mut_call().unwrap();
       if n.callee.is_expr() {
         let callee_expr = n.callee.as_expr().unwrap();
         if callee_expr.is_ident_ref_to("__SNAPSHOT__") {
@@ -1687,9 +1686,9 @@ where
               if arg.expr.is_jsx_element() {
                 let jsx = arg.expr.as_mut_jsx_element().unwrap();
                 self.current_snapshot_id = None;
-                self.fold_jsx_element(*jsx.take());
+                self.visit_mut_jsx_element(jsx);
                 if self.current_snapshot_id.is_some() {
-                  return Expr::Ident(self.current_snapshot_id.take().unwrap());
+                  *node = Expr::Ident(self.current_snapshot_id.take().unwrap());
                 }
               }
             }
@@ -1698,7 +1697,7 @@ where
       }
     }
 
-    n.fold_children_with(self)
+    node.visit_mut_children_with(self)
   }
 }
 
@@ -1719,10 +1718,11 @@ where
 #[cfg(test)]
 mod tests {
   use swc_core::{
-    common::{chain, comments::SingleThreadedComments, Mark},
+    common::{comments::SingleThreadedComments, Mark},
     ecma::{
       parser::{EsSyntax, Syntax},
       transforms::{base::resolver, react, testing::test},
+      visit::visit_mut_pass,
     },
   };
 
@@ -1739,9 +1739,9 @@ mod tests {
       let unresolved_mark = Mark::new();
       let top_level_mark = Mark::new();
 
-      chain!(
+      (
         resolver(unresolved_mark, top_level_mark, true),
-        JSXTransformer::<&SingleThreadedComments>::new(
+        visit_mut_pass(JSXTransformer::<&SingleThreadedComments>::new(
           super::JSXTransformerConfig {
             preserve_jsx: true,
             ..Default::default()
@@ -1750,8 +1750,8 @@ mod tests {
           None,
           top_level_mark,
           unresolved_mark,
-          TransformMode::Test
-        )
+          TransformMode::Test,
+        )),
       )
     },
     basic_full_static,
@@ -1773,9 +1773,9 @@ mod tests {
       let unresolved_mark = Mark::new();
       let top_level_mark = Mark::new();
 
-      chain!(
+      (
         resolver(unresolved_mark, top_level_mark, true),
-        JSXTransformer::<&SingleThreadedComments>::new(
+        visit_mut_pass(JSXTransformer::<&SingleThreadedComments>::new(
           super::JSXTransformerConfig {
             preserve_jsx: true,
             ..Default::default()
@@ -1784,8 +1784,8 @@ mod tests {
           None,
           top_level_mark,
           unresolved_mark,
-          TransformMode::Test
-        )
+          TransformMode::Test,
+        )),
       )
     },
     basic_full_static_snapshot_extract,
@@ -1803,9 +1803,9 @@ mod tests {
       let unresolved_mark = Mark::new();
       let top_level_mark = Mark::new();
 
-      chain!(
+      (
         resolver(unresolved_mark, top_level_mark, true),
-        JSXTransformer::<&SingleThreadedComments>::new(
+        visit_mut_pass(JSXTransformer::<&SingleThreadedComments>::new(
           super::JSXTransformerConfig {
             preserve_jsx: true,
             ..Default::default()
@@ -1814,8 +1814,8 @@ mod tests {
           None,
           top_level_mark,
           unresolved_mark,
-          TransformMode::Test
-        )
+          TransformMode::Test,
+        )),
       )
     },
     basic_full_static_snapshot_extract_it,
@@ -1836,7 +1836,7 @@ mod tests {
       jsx: true,
       ..Default::default()
     }),
-    |t| JSXTransformer::<&SingleThreadedComments>::new(
+    |t| visit_mut_pass(JSXTransformer::<&SingleThreadedComments>::new(
       super::JSXTransformerConfig {
         preserve_jsx: true,
         ..Default::default()
@@ -1846,7 +1846,7 @@ mod tests {
       Mark::new(),
       Mark::new(),
       TransformMode::Test,
-    ),
+    )),
     basic_component,
     // Input codes
     r#"
@@ -1862,7 +1862,7 @@ mod tests {
       jsx: true,
       ..Default::default()
     }),
-    |t| JSXTransformer::<&SingleThreadedComments>::new(
+    |t| visit_mut_pass(JSXTransformer::<&SingleThreadedComments>::new(
       super::JSXTransformerConfig {
         preserve_jsx: true,
         ..Default::default()
@@ -1872,7 +1872,7 @@ mod tests {
       Mark::new(),
       Mark::new(),
       TransformMode::Test,
-    ),
+    )),
     page_component,
     // Input codes
     r#"
@@ -1891,7 +1891,7 @@ mod tests {
       jsx: true,
       ..Default::default()
     }),
-    |t| JSXTransformer::<&SingleThreadedComments>::new(
+    |t| visit_mut_pass(JSXTransformer::<&SingleThreadedComments>::new(
       super::JSXTransformerConfig {
         preserve_jsx: true,
         ..Default::default()
@@ -1901,7 +1901,7 @@ mod tests {
       Mark::new(),
       Mark::new(),
       TransformMode::Development,
-    ),
+    )),
     page_element_dev,
     // Input codes
     r#"
@@ -1920,7 +1920,7 @@ mod tests {
       jsx: true,
       ..Default::default()
     }),
-    |t| JSXTransformer::<&SingleThreadedComments>::new(
+    |t| visit_mut_pass(JSXTransformer::<&SingleThreadedComments>::new(
       super::JSXTransformerConfig {
         preserve_jsx: true,
         ..Default::default()
@@ -1930,7 +1930,7 @@ mod tests {
       Mark::new(),
       Mark::new(),
       TransformMode::Test,
-    ),
+    )),
     page_element,
     // Input codes
     r#"
@@ -1949,7 +1949,7 @@ mod tests {
       jsx: true,
       ..Default::default()
     }),
-    |t| JSXTransformer::<&SingleThreadedComments>::new(
+    |t| visit_mut_pass(JSXTransformer::<&SingleThreadedComments>::new(
       super::JSXTransformerConfig {
         preserve_jsx: true,
         ..Default::default()
@@ -1959,7 +1959,7 @@ mod tests {
       Mark::new(),
       Mark::new(),
       TransformMode::Test
-    ),
+    )),
     basic_component_with_static_sibling,
     // Input codes
     r#"
@@ -1979,8 +1979,8 @@ mod tests {
     |t| {
       let top_level_mark = Mark::new();
       let unresolved_mark = Mark::new();
-      chain!(
-        JSXTransformer::<&SingleThreadedComments>::new(
+      (
+        visit_mut_pass(JSXTransformer::<&SingleThreadedComments>::new(
           super::JSXTransformerConfig {
             preserve_jsx: false,
             ..Default::default()
@@ -1989,8 +1989,8 @@ mod tests {
           None,
           top_level_mark,
           unresolved_mark,
-          TransformMode::Test
-        ),
+          TransformMode::Test,
+        )),
         react::react::<&SingleThreadedComments>(
           t.cm.clone(),
           None,
@@ -2006,7 +2006,7 @@ mod tests {
             ..Default::default()
           },
           top_level_mark,
-          unresolved_mark
+          unresolved_mark,
         ),
       )
     },
@@ -2029,8 +2029,8 @@ mod tests {
     |t| {
       let top_level_mark = Mark::new();
       let unresolved_mark = Mark::new();
-      chain!(
-        JSXTransformer::<&SingleThreadedComments>::new(
+      (
+        visit_mut_pass(JSXTransformer::<&SingleThreadedComments>::new(
           super::JSXTransformerConfig {
             preserve_jsx: false,
             ..Default::default()
@@ -2039,8 +2039,8 @@ mod tests {
           None,
           top_level_mark,
           unresolved_mark,
-          TransformMode::Test
-        ),
+          TransformMode::Test,
+        )),
         react::react::<&SingleThreadedComments>(
           t.cm.clone(),
           None,
@@ -2056,7 +2056,7 @@ mod tests {
             ..Default::default()
           },
           top_level_mark,
-          unresolved_mark
+          unresolved_mark,
         ),
       )
     },
@@ -2076,7 +2076,7 @@ mod tests {
       jsx: true,
       ..Default::default()
     }),
-    |t| JSXTransformer::<&SingleThreadedComments>::new(
+    |t| visit_mut_pass(JSXTransformer::<&SingleThreadedComments>::new(
       super::JSXTransformerConfig {
         preserve_jsx: true,
         ..Default::default()
@@ -2086,7 +2086,7 @@ mod tests {
       Mark::new(),
       Mark::new(),
       TransformMode::Test
-    ),
+    )),
     basic_expr_container,
     // Input codes
     r#"
@@ -2102,7 +2102,7 @@ mod tests {
       jsx: true,
       ..Default::default()
     }),
-    |t| JSXTransformer::<&SingleThreadedComments>::new(
+    |t| visit_mut_pass(JSXTransformer::<&SingleThreadedComments>::new(
       super::JSXTransformerConfig {
         preserve_jsx: true,
         ..Default::default()
@@ -2112,7 +2112,7 @@ mod tests {
       Mark::new(),
       Mark::new(),
       TransformMode::Test
-    ),
+    )),
     basic_expr_container_with_static_sibling,
     // Input codes
     r#"
@@ -2129,7 +2129,7 @@ mod tests {
       jsx: true,
       ..Default::default()
     }),
-    |t| JSXTransformer::<&SingleThreadedComments>::new(
+    |t| visit_mut_pass(JSXTransformer::<&SingleThreadedComments>::new(
       super::JSXTransformerConfig {
         preserve_jsx: true,
         ..Default::default()
@@ -2139,7 +2139,7 @@ mod tests {
       Mark::new(),
       Mark::new(),
       TransformMode::Test
-    ),
+    )),
     should_inject_implicit_flatten,
     // Input codes
     r#"
@@ -2166,7 +2166,7 @@ mod tests {
       jsx: true,
       ..Default::default()
     }),
-    |t| JSXTransformer::<&SingleThreadedComments>::new(
+    |t| visit_mut_pass(JSXTransformer::<&SingleThreadedComments>::new(
       super::JSXTransformerConfig {
         preserve_jsx: true,
         ..Default::default()
@@ -2176,7 +2176,7 @@ mod tests {
       Mark::new(),
       Mark::new(),
       TransformMode::Test
-    ),
+    )),
     basic_list,
     // Input codes
     r#"
@@ -2195,7 +2195,7 @@ mod tests {
       jsx: true,
       ..Default::default()
     }),
-    |t| JSXTransformer::<&SingleThreadedComments>::new(
+    |t| visit_mut_pass(JSXTransformer::<&SingleThreadedComments>::new(
       super::JSXTransformerConfig {
         preserve_jsx: true,
         ..Default::default()
@@ -2205,7 +2205,7 @@ mod tests {
       Mark::new(),
       Mark::new(),
       TransformMode::Test
-    ),
+    )),
     basic_list_with_fragment,
     // Input codes
     r#"
@@ -2231,9 +2231,9 @@ mod tests {
       let unresolved_mark = Mark::new();
       let top_level_mark = Mark::new();
 
-      chain!(
+      (
         resolver(unresolved_mark, top_level_mark, true),
-        JSXTransformer::<&SingleThreadedComments>::new(
+        visit_mut_pass(JSXTransformer::<&SingleThreadedComments>::new(
           super::JSXTransformerConfig {
             preserve_jsx: true,
             ..Default::default()
@@ -2242,8 +2242,8 @@ mod tests {
           None,
           top_level_mark,
           unresolved_mark,
-          TransformMode::Test
-        )
+          TransformMode::Test,
+        )),
       )
     },
     basic_list_toplevel,
@@ -2267,7 +2267,7 @@ mod tests {
       jsx: true,
       ..Default::default()
     }),
-    |t| JSXTransformer::<&SingleThreadedComments>::new(
+    |t| visit_mut_pass(JSXTransformer::<&SingleThreadedComments>::new(
       super::JSXTransformerConfig {
         preserve_jsx: true,
         ..Default::default()
@@ -2277,7 +2277,7 @@ mod tests {
       Mark::new(),
       Mark::new(),
       TransformMode::Test
-    ),
+    )),
     should_static_extract_inline_style,
     // Input codes
     r#"
@@ -2301,7 +2301,7 @@ mod tests {
       jsx: true,
       ..Default::default()
     }),
-    |t| JSXTransformer::<&SingleThreadedComments>::new(
+    |t| visit_mut_pass(JSXTransformer::<&SingleThreadedComments>::new(
       super::JSXTransformerConfig {
         preserve_jsx: true,
         ..Default::default()
@@ -2311,7 +2311,7 @@ mod tests {
       Mark::new(),
       Mark::new(),
       TransformMode::Test
-    ),
+    )),
     should_static_extract_dynamic_inline_style,
     // Input codes
     r#"
@@ -2328,7 +2328,7 @@ mod tests {
       jsx: true,
       ..Default::default()
     }),
-    |t| JSXTransformer::new(
+    |t| visit_mut_pass(JSXTransformer::new(
       super::JSXTransformerConfig {
         preserve_jsx: true,
         ..Default::default()
@@ -2338,7 +2338,7 @@ mod tests {
       Mark::new(),
       Mark::new(),
       TransformMode::Test
-    ),
+    )),
     should_extract_css_id_without_css_id,
     // Input codes
     r#"
@@ -2355,7 +2355,7 @@ mod tests {
       jsx: true,
       ..Default::default()
     }),
-    |t| JSXTransformer::new(
+    |t| visit_mut_pass(JSXTransformer::new(
       super::JSXTransformerConfig {
         preserve_jsx: true,
         ..Default::default()
@@ -2365,7 +2365,7 @@ mod tests {
       Mark::new(),
       Mark::new(),
       TransformMode::Test
-    ),
+    )),
     should_extract_css_id,
     // Input codes
     r#"
@@ -2385,7 +2385,7 @@ mod tests {
       jsx: true,
       ..Default::default()
     }),
-    |t| JSXTransformer::new(
+    |t| visit_mut_pass(JSXTransformer::new(
       super::JSXTransformerConfig {
         preserve_jsx: true,
         is_dynamic_component: Some(true),
@@ -2396,7 +2396,7 @@ mod tests {
       Mark::new(),
       Mark::new(),
       TransformMode::Test
-    ),
+    )),
     should_extract_css_id_dynamic_component,
     // Input codes
     r#"
@@ -2416,7 +2416,7 @@ mod tests {
       jsx: true,
       ..Default::default()
     }),
-    |t| JSXTransformer::new(
+    |t| visit_mut_pass(JSXTransformer::new(
       super::JSXTransformerConfig {
         preserve_jsx: true,
         is_dynamic_component: Some(true),
@@ -2427,7 +2427,7 @@ mod tests {
       Mark::new(),
       Mark::new(),
       TransformMode::Test
-    ),
+    )),
     should_extract_css_id_dynamic_component_without_css_id,
     // Input codes
     r#"
@@ -2447,8 +2447,8 @@ mod tests {
     |t| {
       let top_level_mark = Mark::new();
       let unresolved_mark = Mark::new();
-      chain!(
-        JSXTransformer::<&SingleThreadedComments>::new(
+      (
+        visit_mut_pass(JSXTransformer::<&SingleThreadedComments>::new(
           super::JSXTransformerConfig {
             preserve_jsx: false,
             ..Default::default()
@@ -2457,8 +2457,8 @@ mod tests {
           None,
           top_level_mark,
           unresolved_mark,
-          TransformMode::Test
-        ),
+          TransformMode::Test,
+        )),
         react::react::<&SingleThreadedComments>(
           t.cm.clone(),
           None,
@@ -2474,7 +2474,7 @@ mod tests {
             ..Default::default()
           },
           top_level_mark,
-          unresolved_mark
+          unresolved_mark,
         ),
       )
     },
@@ -2496,7 +2496,7 @@ mod tests {
     |t| {
       let top_level_mark = Mark::new();
       let unresolved_mark = Mark::new();
-      JSXTransformer::<&SingleThreadedComments>::new(
+      visit_mut_pass(JSXTransformer::<&SingleThreadedComments>::new(
         super::JSXTransformerConfig {
           preserve_jsx: false,
           ..Default::default()
@@ -2506,7 +2506,7 @@ mod tests {
         top_level_mark,
         unresolved_mark,
         TransformMode::Test,
-      )
+      ))
     },
     inline_style_literal,
     // Input codes
@@ -2525,7 +2525,7 @@ mod tests {
     |t| {
       let top_level_mark = Mark::new();
       let unresolved_mark = Mark::new();
-      JSXTransformer::<&SingleThreadedComments>::new(
+      visit_mut_pass(JSXTransformer::<&SingleThreadedComments>::new(
         super::JSXTransformerConfig {
           preserve_jsx: false,
           ..Default::default()
@@ -2535,7 +2535,7 @@ mod tests {
         top_level_mark,
         unresolved_mark,
         TransformMode::Test,
-      )
+      ))
     },
     inline_style_literal_unknown_property,
     // Input codes
@@ -2554,7 +2554,7 @@ mod tests {
     |t| {
       let top_level_mark = Mark::new();
       let unresolved_mark = Mark::new();
-      JSXTransformer::<&SingleThreadedComments>::new(
+      visit_mut_pass(JSXTransformer::<&SingleThreadedComments>::new(
         super::JSXTransformerConfig {
           preserve_jsx: false,
           ..Default::default()
@@ -2564,7 +2564,7 @@ mod tests {
         top_level_mark,
         unresolved_mark,
         TransformMode::Test,
-      )
+      ))
     },
     empty_module,
     // Input codes
@@ -2582,7 +2582,7 @@ mod tests {
     |t| {
       let top_level_mark = Mark::new();
       let unresolved_mark = Mark::new();
-      JSXTransformer::<&SingleThreadedComments>::new(
+      visit_mut_pass(JSXTransformer::<&SingleThreadedComments>::new(
         super::JSXTransformerConfig {
           preserve_jsx: false,
           runtime_pkg: "@lynx-js/react/internal".into(),
@@ -2593,7 +2593,7 @@ mod tests {
         top_level_mark,
         unresolved_mark,
         TransformMode::Development,
-      )
+      ))
     },
     mode_development_spread,
     // Input codes
@@ -2612,8 +2612,8 @@ mod tests {
     |t| {
       let top_level_mark = Mark::new();
       let unresolved_mark = Mark::new();
-      chain!(
-        JSXTransformer::<&SingleThreadedComments>::new(
+      (
+        visit_mut_pass(JSXTransformer::<&SingleThreadedComments>::new(
           super::JSXTransformerConfig {
             preserve_jsx: false,
             target: TransformTarget::MIXED,
@@ -2624,7 +2624,7 @@ mod tests {
           top_level_mark,
           unresolved_mark,
           TransformMode::Development,
-        ),
+        )),
         react::react::<&SingleThreadedComments>(
           t.cm.clone(),
           None,
@@ -2667,8 +2667,8 @@ mod tests {
     |t| {
       let top_level_mark = Mark::new();
       let unresolved_mark = Mark::new();
-      chain!(
-        JSXTransformer::<&SingleThreadedComments>::new(
+      (
+        visit_mut_pass(JSXTransformer::<&SingleThreadedComments>::new(
           super::JSXTransformerConfig {
             preserve_jsx: false,
             target: TransformTarget::MIXED,
@@ -2679,7 +2679,7 @@ mod tests {
           top_level_mark,
           unresolved_mark,
           TransformMode::Development,
-        ),
+        )),
         react::react::<&SingleThreadedComments>(
           t.cm.clone(),
           None,
@@ -2722,8 +2722,8 @@ mod tests {
     |t| {
       let top_level_mark = Mark::new();
       let unresolved_mark = Mark::new();
-      chain!(
-        JSXTransformer::<&SingleThreadedComments>::new(
+      (
+        visit_mut_pass(JSXTransformer::<&SingleThreadedComments>::new(
           super::JSXTransformerConfig {
             preserve_jsx: false,
             target: TransformTarget::MIXED,
@@ -2734,7 +2734,7 @@ mod tests {
           top_level_mark,
           unresolved_mark,
           TransformMode::Development,
-        ),
+        )),
         react::react::<&SingleThreadedComments>(
           t.cm.clone(),
           None,
@@ -2779,8 +2779,8 @@ mod tests {
     |t| {
       let top_level_mark = Mark::new();
       let unresolved_mark = Mark::new();
-      chain!(
-        JSXTransformer::<&SingleThreadedComments>::new(
+      (
+        visit_mut_pass(JSXTransformer::<&SingleThreadedComments>::new(
           super::JSXTransformerConfig {
             preserve_jsx: false,
             target: TransformTarget::MIXED,
@@ -2791,7 +2791,7 @@ mod tests {
           top_level_mark,
           unresolved_mark,
           TransformMode::Development,
-        ),
+        )),
         react::react::<&SingleThreadedComments>(
           t.cm.clone(),
           None,
@@ -2834,8 +2834,8 @@ mod tests {
     |t| {
       let top_level_mark = Mark::new();
       let unresolved_mark = Mark::new();
-      chain!(
-        JSXTransformer::<&SingleThreadedComments>::new(
+      (
+        visit_mut_pass(JSXTransformer::<&SingleThreadedComments>::new(
           super::JSXTransformerConfig {
             preserve_jsx: false,
             target: TransformTarget::MIXED,
@@ -2846,7 +2846,7 @@ mod tests {
           top_level_mark,
           unresolved_mark,
           TransformMode::Development,
-        ),
+        )),
         react::react::<&SingleThreadedComments>(
           t.cm.clone(),
           None,
@@ -2885,7 +2885,7 @@ mod tests {
       jsx: true,
       ..Default::default()
     }),
-    |t| JSXTransformer::<&SingleThreadedComments>::new(
+    |t| visit_mut_pass(JSXTransformer::<&SingleThreadedComments>::new(
       super::JSXTransformerConfig {
         preserve_jsx: true,
         ..Default::default()
@@ -2895,7 +2895,7 @@ mod tests {
       Mark::new(),
       Mark::new(),
       TransformMode::Test,
-    ),
+    )),
     should_excape_newline_character,
     // Input codes
     r#"
diff --git a/packages/react/transform/src/swc_plugin_snapshot/slot_marker.rs b/packages/react/transform/src/swc_plugin_snapshot/slot_marker.rs
index f91c4fafb1..678acc9cb1 100644
--- a/packages/react/transform/src/swc_plugin_snapshot/slot_marker.rs
+++ b/packages/react/transform/src/swc_plugin_snapshot/slot_marker.rs
@@ -177,10 +177,10 @@ impl VisitMut for WrapperMarker {
 #[cfg(test)]
 mod tests {
   use swc_core::{
-    common::{chain, Mark},
+    common::Mark,
     ecma::parser::Syntax,
     ecma::{parser::EsSyntax, transforms::testing::test},
-    ecma::{transforms::base::resolver, visit::as_folder},
+    ecma::{transforms::base::resolver, visit::visit_mut_pass},
   };
 
   test!(
@@ -193,9 +193,9 @@ mod tests {
       let unresolved_mark = Mark::new();
       let top_level_mark = Mark::new();
 
-      chain!(
+      (
         resolver(unresolved_mark, top_level_mark, true),
-        as_folder(super::WrapperMarker {
+        visit_mut_pass(super::WrapperMarker {
           current_is_children_full_dynamic: false,
           dynamic_part_count: 0,
         }),
diff --git a/packages/react/transform/src/swc_plugin_worklet/decl_collect.rs b/packages/react/transform/src/swc_plugin_worklet/decl_collect.rs
index 3391316896..5eda22cbd6 100644
--- a/packages/react/transform/src/swc_plugin_worklet/decl_collect.rs
+++ b/packages/react/transform/src/swc_plugin_worklet/decl_collect.rs
@@ -1,11 +1,11 @@
-use swc_core::common::collections::AHashSet;
+use rustc_hash::FxHashSet;
 use swc_core::common::SyntaxContext;
 use swc_core::ecma::ast::*;
 use swc_core::ecma::utils::ident::IdentLike;
 use swc_core::ecma::visit::{noop_visit_type, Visit, VisitWith};
 
 pub struct BindingCollector {
-  decls: AHashSet<Id>,
+  decls: FxHashSet<Id>,
   is_pat_decl: bool,
   should_enter_ctx: bool,
   add_var_only: bool,
@@ -180,7 +180,7 @@ impl Visit for BindingCollector {
  * }
  * ```
  */
-pub fn collect_inner_scope_decls<N>(n: &N) -> AHashSet<Id>
+pub fn collect_inner_scope_decls<N>(n: &N) -> FxHashSet<Id>
 where
   N: VisitWith<BindingCollector>,
 {
@@ -210,7 +210,7 @@ where
  * }
  * ```
  */
-pub fn collect_current_scope_decls<N>(n: &N) -> AHashSet<Id>
+pub fn collect_current_scope_decls<N>(n: &N) -> FxHashSet<Id>
 where
   N: VisitWith<BindingCollector>,
 {
diff --git a/packages/react/transform/src/swc_plugin_worklet/extract_ident.rs b/packages/react/transform/src/swc_plugin_worklet/extract_ident.rs
index 295a20e986..c0a9aab5e0 100644
--- a/packages/react/transform/src/swc_plugin_worklet/extract_ident.rs
+++ b/packages/react/transform/src/swc_plugin_worklet/extract_ident.rs
@@ -2,10 +2,10 @@ use crate::swc_plugin_worklet::decl_collect::{
   collect_current_scope_decls, collect_inner_scope_decls,
 };
 use crate::swc_plugin_worklet::globals::{DEFAULT_GLOBALS, LYNX_GLOBALS};
+use rustc_hash::FxHashSet;
 use std::cmp::max;
 use std::mem::swap;
 use std::ops::Deref;
-use swc_core::common::collections::AHashSet;
 use swc_core::common::util::take::Take;
 use swc_core::common::{EqIgnoreSpan, DUMMY_SP};
 use swc_core::ecma::ast::*;
@@ -18,7 +18,7 @@ pub struct ExtractingIdentsCollectorConfig {
 }
 
 struct ScopeEnv {
-  ids_declared_locally: AHashSet<Id>,
+  ids_declared_locally: FxHashSet<Id>,
   is_inner_fn_scope: bool,
   is_worklet_fn_scope: bool,
 }
@@ -56,7 +56,7 @@ impl ExtractingIdentsCollector {
       next_block_decls_collected: false,
       scope_env: vec![ScopeEnv {
         is_worklet_fn_scope: true,
-        ids_declared_locally: AHashSet::default(),
+        ids_declared_locally: FxHashSet::default(),
         is_inner_fn_scope: false,
       }],
       member_expr_depth: 0,
@@ -222,7 +222,7 @@ impl ExtractingIdentsCollector {
       })
   }
 
-  fn push_fn_scope(&mut self, ids_declared_in_scope: AHashSet<Id>) {
+  fn push_fn_scope(&mut self, ids_declared_in_scope: FxHashSet<Id>) {
     let last_scope = self.scope_env.last().unwrap();
     self.scope_env.push(ScopeEnv {
       is_worklet_fn_scope: false,
@@ -231,7 +231,7 @@ impl ExtractingIdentsCollector {
     });
   }
 
-  fn push_block_scope(&mut self, ids_declared_in_scope: AHashSet<Id>) {
+  fn push_block_scope(&mut self, ids_declared_in_scope: FxHashSet<Id>) {
     let last_scope = self.scope_env.last().unwrap();
     self.scope_env.push(ScopeEnv {
       is_worklet_fn_scope: false,
diff --git a/packages/react/transform/src/swc_plugin_worklet/mod.rs b/packages/react/transform/src/swc_plugin_worklet/mod.rs
index 1379e3d110..3e6ec64549 100644
--- a/packages/react/transform/src/swc_plugin_worklet/mod.rs
+++ b/packages/react/transform/src/swc_plugin_worklet/mod.rs
@@ -475,13 +475,13 @@ impl WorkletVisitor {
 mod tests {
   use crate::swc_plugin_worklet::{TransformTarget, WorkletVisitor, WorkletVisitorConfig};
   use crate::TransformMode;
-  use swc_core::common::{chain, Mark};
+  use swc_core::common::Mark;
   use swc_core::ecma::parser::TsSyntax;
   use swc_core::ecma::transforms::base::hygiene::hygiene;
   use swc_core::ecma::transforms::base::resolver;
   use swc_core::{
     ecma::parser::Syntax,
-    ecma::visit::as_folder,
+    ecma::visit::visit_mut_pass,
     ecma::{parser::EsSyntax, transforms::testing::test},
   };
 
@@ -490,9 +490,9 @@ mod tests {
     Syntax::Typescript(TsSyntax {
       ..Default::default()
     }),
-    |_| chain!(
+    |_| (
       resolver(Mark::new(), Mark::new(), true),
-      as_folder(WorkletVisitor::new(
+      visit_mut_pass(WorkletVisitor::new(
         TransformMode::Test,
         WorkletVisitorConfig {
           filename: "index.js".into(),
@@ -519,9 +519,9 @@ function worklet(event: Event) {
     Syntax::Typescript(TsSyntax {
       ..Default::default()
     }),
-    |_| chain!(
+    |_| (
       resolver(Mark::new(), Mark::new(), true),
-      as_folder(WorkletVisitor::new(
+      visit_mut_pass(WorkletVisitor::new(
         TransformMode::Test,
         WorkletVisitorConfig {
           filename: "index.js".into(),
@@ -548,9 +548,9 @@ function worklet(event: Event) {
     Syntax::Typescript(TsSyntax {
       ..Default::default()
     }),
-    |_| chain!(
+    |_| (
       resolver(Mark::new(), Mark::new(), true),
-      as_folder(WorkletVisitor::new(
+      visit_mut_pass(WorkletVisitor::new(
         TransformMode::Test,
         WorkletVisitorConfig {
           filename: "index.js".into(),
@@ -577,9 +577,9 @@ function worklet(event: Event) {
     Syntax::Es(EsSyntax {
       ..Default::default()
     }),
-    |_| chain!(
+    |_| (
       resolver(Mark::new(), Mark::new(), true),
-      as_folder(WorkletVisitor::new(
+      visit_mut_pass(WorkletVisitor::new(
         TransformMode::Test,
         WorkletVisitorConfig {
           filename: "index.js".into(),
@@ -616,9 +616,9 @@ function X(event) {
     Syntax::Es(EsSyntax {
       ..Default::default()
     }),
-    |_| chain!(
+    |_| (
       resolver(Mark::new(), Mark::new(), true),
-      as_folder(WorkletVisitor::new(
+      visit_mut_pass(WorkletVisitor::new(
         TransformMode::Test,
         WorkletVisitorConfig {
           filename: "index.js".into(),
@@ -655,9 +655,9 @@ function X(event) {
     Syntax::Es(EsSyntax {
       ..Default::default()
     }),
-    |_| chain!(
+    |_| (
       resolver(Mark::new(), Mark::new(), true),
-      as_folder(WorkletVisitor::new(
+      visit_mut_pass(WorkletVisitor::new(
         TransformMode::Test,
         WorkletVisitorConfig {
           filename: "index.js".into(),
@@ -686,9 +686,9 @@ function Y(event) {
     Syntax::Es(EsSyntax {
       ..Default::default()
     }),
-    |_| chain!(
+    |_| (
       resolver(Mark::new(), Mark::new(), true),
-      as_folder(WorkletVisitor::new(
+      visit_mut_pass(WorkletVisitor::new(
         TransformMode::Test,
         WorkletVisitorConfig {
           filename: "index.js".into(),
@@ -719,9 +719,9 @@ function App() {
     Syntax::Es(EsSyntax {
       ..Default::default()
     }),
-    |_| chain!(
+    |_| (
       resolver(Mark::new(), Mark::new(), true),
-      as_folder(WorkletVisitor::new(
+      visit_mut_pass(WorkletVisitor::new(
         TransformMode::Test,
         WorkletVisitorConfig {
           filename: "index.js".into(),
@@ -746,9 +746,9 @@ let X = (event) => {
     Syntax::Es(EsSyntax {
       ..Default::default()
     }),
-    |_| chain!(
+    |_| (
       resolver(Mark::new(), Mark::new(), true),
-      as_folder(WorkletVisitor::new(
+      visit_mut_pass(WorkletVisitor::new(
         TransformMode::Test,
         WorkletVisitorConfig {
           filename: "index.js".into(),
@@ -773,9 +773,9 @@ let X = function (event) {
     Syntax::Es(EsSyntax {
       ..Default::default()
     }),
-    |_| chain!(
+    |_| (
       resolver(Mark::new(), Mark::new(), true),
-      as_folder(WorkletVisitor::new(
+      visit_mut_pass(WorkletVisitor::new(
         TransformMode::Test,
         WorkletVisitorConfig {
           filename: "index.js".into(),
@@ -804,9 +804,9 @@ class App extends Component {
     Syntax::Es(EsSyntax {
       ..Default::default()
     }),
-    |_| chain!(
+    |_| (
       resolver(Mark::new(), Mark::new(), true),
-      as_folder(WorkletVisitor::new(
+      visit_mut_pass(WorkletVisitor::new(
         TransformMode::Test,
         WorkletVisitorConfig {
           filename: "index.js".into(),
@@ -835,9 +835,9 @@ class App extends Component {
     Syntax::Es(EsSyntax {
       ..Default::default()
     }),
-    |_| chain!(
+    |_| (
       resolver(Mark::new(), Mark::new(), true),
-      as_folder(WorkletVisitor::new(
+      visit_mut_pass(WorkletVisitor::new(
         TransformMode::Test,
         WorkletVisitorConfig {
           filename: "index.js".into(),
@@ -865,9 +865,9 @@ class App extends Component {
     Syntax::Es(EsSyntax {
       ..Default::default()
     }),
-    |_| chain!(
+    |_| (
       resolver(Mark::new(), Mark::new(), true),
-      as_folder(WorkletVisitor::new(
+      visit_mut_pass(WorkletVisitor::new(
         TransformMode::Test,
         WorkletVisitorConfig {
           filename: "index.js".into(),
@@ -895,9 +895,9 @@ class App extends Component {
     Syntax::Es(EsSyntax {
       ..Default::default()
     }),
-    |_| chain!(
+    |_| (
       resolver(Mark::new(), Mark::new(), true),
-      as_folder(WorkletVisitor::new(
+      visit_mut_pass(WorkletVisitor::new(
         TransformMode::Test,
         WorkletVisitorConfig {
           filename: "index.js".into(),
@@ -926,9 +926,9 @@ class App extends Component {
     Syntax::Es(EsSyntax {
       ..Default::default()
     }),
-    |_| chain!(
+    |_| (
       resolver(Mark::new(), Mark::new(), true),
-      as_folder(WorkletVisitor::new(
+      visit_mut_pass(WorkletVisitor::new(
         TransformMode::Test,
         WorkletVisitorConfig {
           filename: "index.js".into(),
@@ -957,9 +957,9 @@ class App extends Component {
     Syntax::Es(EsSyntax {
       ..Default::default()
     }),
-    |_| chain!(
+    |_| (
       resolver(Mark::new(), Mark::new(), true),
-      as_folder(WorkletVisitor::new(
+      visit_mut_pass(WorkletVisitor::new(
         TransformMode::Test,
         WorkletVisitorConfig {
           filename: "index.js".into(),
@@ -987,9 +987,9 @@ class App extends Component {
     Syntax::Es(EsSyntax {
       ..Default::default()
     }),
-    |_| chain!(
+    |_| (
       resolver(Mark::new(), Mark::new(), true),
-      as_folder(WorkletVisitor::new(
+      visit_mut_pass(WorkletVisitor::new(
         TransformMode::Test,
         WorkletVisitorConfig {
           filename: "index.js".into(),
@@ -1017,9 +1017,9 @@ class App extends Component {
     Syntax::Es(EsSyntax {
       ..Default::default()
     }),
-    |_| chain!(
+    |_| (
       resolver(Mark::new(), Mark::new(), true),
-      as_folder(WorkletVisitor::new(
+      visit_mut_pass(WorkletVisitor::new(
         TransformMode::Test,
         WorkletVisitorConfig {
           filename: "index.js".into(),
@@ -1049,9 +1049,9 @@ function X() {
     Syntax::Es(EsSyntax {
       ..Default::default()
     }),
-    |_| chain!(
+    |_| (
       resolver(Mark::new(), Mark::new(), true),
-      as_folder(WorkletVisitor::new(
+      visit_mut_pass(WorkletVisitor::new(
         TransformMode::Test,
         WorkletVisitorConfig {
           filename: "index.js".into(),
@@ -1086,9 +1086,9 @@ function A() {
     Syntax::Es(EsSyntax {
       ..Default::default()
     }),
-    |_| chain!(
+    |_| (
       resolver(Mark::new(), Mark::new(), true),
-      as_folder(WorkletVisitor::new(
+      visit_mut_pass(WorkletVisitor::new(
         TransformMode::Test,
         WorkletVisitorConfig {
           filename: "index.js".into(),
@@ -1122,9 +1122,9 @@ class Bpp extends Component {
     Syntax::Es(EsSyntax {
       ..Default::default()
     }),
-    |_| chain!(
+    |_| (
       resolver(Mark::new(), Mark::new(), true),
-      as_folder(WorkletVisitor::new(
+      visit_mut_pass(WorkletVisitor::new(
         TransformMode::Test,
         WorkletVisitorConfig {
           filename: "index.js".into(),
@@ -1152,9 +1152,9 @@ class App extends Component {
     Syntax::Es(EsSyntax {
       ..Default::default()
     }),
-    |_| chain!(
+    |_| (
       resolver(Mark::new(), Mark::new(), true),
-      as_folder(WorkletVisitor::new(
+      visit_mut_pass(WorkletVisitor::new(
         TransformMode::Test,
         WorkletVisitorConfig {
           filename: "index.js".into(),
@@ -1180,9 +1180,9 @@ class App extends Component {
     Syntax::Es(EsSyntax {
       ..Default::default()
     }),
-    |_| chain!(
+    |_| (
       resolver(Mark::new(), Mark::new(), true),
-      as_folder(WorkletVisitor::new(
+      visit_mut_pass(WorkletVisitor::new(
         TransformMode::Test,
         WorkletVisitorConfig {
           filename: "index.js".into(),
@@ -1210,9 +1210,9 @@ class App extends Component {
     Syntax::Es(EsSyntax {
       ..Default::default()
     }),
-    |_| chain!(
+    |_| (
       resolver(Mark::new(), Mark::new(), true),
-      as_folder(WorkletVisitor::new(
+      visit_mut_pass(WorkletVisitor::new(
         TransformMode::Test,
         WorkletVisitorConfig {
           filename: "index.js".into(),
@@ -1240,9 +1240,9 @@ class App extends Component {
     Syntax::Es(EsSyntax {
       ..Default::default()
     }),
-    |_| chain!(
+    |_| (
       resolver(Mark::new(), Mark::new(), true),
-      as_folder(WorkletVisitor::new(
+      visit_mut_pass(WorkletVisitor::new(
         TransformMode::Test,
         WorkletVisitorConfig {
           filename: "index.js".into(),
@@ -1271,9 +1271,9 @@ class App extends Component {
     Syntax::Typescript(TsSyntax {
       ..Default::default()
     }),
-    |_| chain!(
+    |_| (
       resolver(Mark::new(), Mark::new(), true),
-      as_folder(WorkletVisitor::new(
+      visit_mut_pass(WorkletVisitor::new(
         TransformMode::Test,
         WorkletVisitorConfig {
           filename: "index.ts".into(),
@@ -1303,9 +1303,9 @@ class App extends Component {
     Syntax::Typescript(TsSyntax {
       ..Default::default()
     }),
-    |_| chain!(
+    |_| (
       resolver(Mark::new(), Mark::new(), true),
-      as_folder(WorkletVisitor::new(
+      visit_mut_pass(WorkletVisitor::new(
         TransformMode::Test,
         WorkletVisitorConfig {
           filename: "index.ts".into(),
@@ -1332,9 +1332,9 @@ class App extends Component {
     Syntax::Typescript(TsSyntax {
       ..Default::default()
     }),
-    |_| chain!(
+    |_| (
       resolver(Mark::new(), Mark::new(), true),
-      as_folder(WorkletVisitor::new(
+      visit_mut_pass(WorkletVisitor::new(
         TransformMode::Test,
         WorkletVisitorConfig {
           filename: "index.ts".into(),
@@ -1361,9 +1361,9 @@ class App extends Component {
     Syntax::Typescript(TsSyntax {
       ..Default::default()
     }),
-    |_| chain!(
+    |_| (
       resolver(Mark::new(), Mark::new(), true),
-      as_folder(WorkletVisitor::new(
+      visit_mut_pass(WorkletVisitor::new(
         TransformMode::Test,
         WorkletVisitorConfig {
           filename: "index.ts".into(),
@@ -1401,9 +1401,9 @@ class App extends Component {
     Syntax::Typescript(TsSyntax {
       ..Default::default()
     }),
-    |_| chain!(
+    |_| (
       resolver(Mark::new(), Mark::new(), true),
-      as_folder(WorkletVisitor::new(
+      visit_mut_pass(WorkletVisitor::new(
         TransformMode::Test,
         WorkletVisitorConfig {
           filename: "index.ts".into(),
@@ -1441,9 +1441,9 @@ class App extends Component {
     Syntax::Typescript(TsSyntax {
       ..Default::default()
     }),
-    |_| chain!(
+    |_| (
       resolver(Mark::new(), Mark::new(), true),
-      as_folder(WorkletVisitor::new(
+      visit_mut_pass(WorkletVisitor::new(
         TransformMode::Test,
         WorkletVisitorConfig {
           filename: "index.ts".into(),
@@ -1470,9 +1470,9 @@ class App extends Component {
     Syntax::Typescript(TsSyntax {
       ..Default::default()
     }),
-    |_| chain!(
+    |_| (
       resolver(Mark::new(), Mark::new(), true),
-      as_folder(WorkletVisitor::new(
+      visit_mut_pass(WorkletVisitor::new(
         TransformMode::Test,
         WorkletVisitorConfig {
           filename: "index.ts".into(),
@@ -1498,9 +1498,9 @@ class App extends Component {
     Syntax::Typescript(TsSyntax {
       ..Default::default()
     }),
-    |_| chain!(
+    |_| (
       resolver(Mark::new(), Mark::new(), true),
-      as_folder(WorkletVisitor::new(
+      visit_mut_pass(WorkletVisitor::new(
         TransformMode::Test,
         WorkletVisitorConfig {
           filename: "index.ts".into(),
@@ -1526,9 +1526,9 @@ class App extends Component {
     Syntax::Typescript(TsSyntax {
       ..Default::default()
     }),
-    |_| chain!(
+    |_| (
       resolver(Mark::new(), Mark::new(), true),
-      as_folder(WorkletVisitor::new(
+      visit_mut_pass(WorkletVisitor::new(
         TransformMode::Test,
         WorkletVisitorConfig {
           filename: "index.ts".into(),
@@ -1578,9 +1578,9 @@ class App extends Component {
     Syntax::Typescript(TsSyntax {
       ..Default::default()
     }),
-    |_| chain!(
+    |_| (
       resolver(Mark::new(), Mark::new(), true),
-      as_folder(WorkletVisitor::new(
+      visit_mut_pass(WorkletVisitor::new(
         TransformMode::Test,
         WorkletVisitorConfig {
           filename: "index.ts".into(),
@@ -1605,9 +1605,9 @@ class App extends Component {
     Syntax::Typescript(TsSyntax {
       ..Default::default()
     }),
-    |_| chain!(
+    |_| (
       resolver(Mark::new(), Mark::new(), true),
-      as_folder(WorkletVisitor::new(
+      visit_mut_pass(WorkletVisitor::new(
         TransformMode::Test,
         WorkletVisitorConfig {
           filename: "index.ts".into(),
@@ -1632,9 +1632,9 @@ class App extends Component {
     Syntax::Typescript(TsSyntax {
       ..Default::default()
     }),
-    |_| chain!(
+    |_| (
       resolver(Mark::new(), Mark::new(), true),
-      as_folder(WorkletVisitor::new(
+      visit_mut_pass(WorkletVisitor::new(
         TransformMode::Test,
         WorkletVisitorConfig {
           filename: "index.ts".into(),
@@ -1670,9 +1670,9 @@ class App extends Component {
     Syntax::Typescript(TsSyntax {
       ..Default::default()
     }),
-    |_| chain!(
+    |_| (
       resolver(Mark::new(), Mark::new(), true),
-      as_folder(WorkletVisitor::new(
+      visit_mut_pass(WorkletVisitor::new(
         TransformMode::Test,
         WorkletVisitorConfig {
           filename: "index.ts".into(),
@@ -1711,9 +1711,9 @@ class App extends Component {
     Syntax::Typescript(TsSyntax {
       ..Default::default()
     }),
-    |_| chain!(
+    |_| (
       resolver(Mark::new(), Mark::new(), true),
-      as_folder(WorkletVisitor::new(
+      visit_mut_pass(WorkletVisitor::new(
         TransformMode::Test,
         WorkletVisitorConfig {
           filename: "index.ts".into(),
@@ -1752,9 +1752,9 @@ class App extends Component {
     Syntax::Typescript(TsSyntax {
       ..Default::default()
     }),
-    |_| chain!(
+    |_| (
       resolver(Mark::new(), Mark::new(), true),
-      as_folder(WorkletVisitor::new(
+      visit_mut_pass(WorkletVisitor::new(
         TransformMode::Test,
         WorkletVisitorConfig {
           filename: "index.ts".into(),
@@ -1795,9 +1795,9 @@ class App extends Component {
     Syntax::Typescript(TsSyntax {
       ..Default::default()
     }),
-    |_| chain!(
+    |_| (
       resolver(Mark::new(), Mark::new(), true),
-      as_folder(WorkletVisitor::new(
+      visit_mut_pass(WorkletVisitor::new(
         TransformMode::Test,
         WorkletVisitorConfig {
           filename: "index.ts".into(),
@@ -1838,9 +1838,9 @@ class App extends Component {
     Syntax::Typescript(TsSyntax {
       ..Default::default()
     }),
-    |_| chain!(
+    |_| (
       resolver(Mark::new(), Mark::new(), true),
-      as_folder(WorkletVisitor::new(
+      visit_mut_pass(WorkletVisitor::new(
         TransformMode::Test,
         WorkletVisitorConfig {
           filename: "index.ts".into(),
@@ -1944,9 +1944,9 @@ class App extends Component {
     Syntax::Typescript(TsSyntax {
       ..Default::default()
     }),
-    |_| chain!(
+    |_| (
       resolver(Mark::new(), Mark::new(), true),
-      as_folder(WorkletVisitor::new(
+      visit_mut_pass(WorkletVisitor::new(
         TransformMode::Test,
         WorkletVisitorConfig {
           filename: "index.ts".into(),
@@ -2050,9 +2050,9 @@ class App extends Component {
     Syntax::Typescript(TsSyntax {
       ..Default::default()
     }),
-    |_| chain!(
+    |_| (
       resolver(Mark::new(), Mark::new(), true),
-      as_folder(WorkletVisitor::new(
+      visit_mut_pass(WorkletVisitor::new(
         TransformMode::Test,
         WorkletVisitorConfig {
           filename: "index.ts".into(),
@@ -2080,9 +2080,9 @@ class App extends Component {
     Syntax::Typescript(TsSyntax {
       ..Default::default()
     }),
-    |_| chain!(
+    |_| (
       resolver(Mark::new(), Mark::new(), true),
-      as_folder(WorkletVisitor::new(
+      visit_mut_pass(WorkletVisitor::new(
         TransformMode::Test,
         WorkletVisitorConfig {
           filename: "index.ts".into(),
@@ -2109,9 +2109,9 @@ class App extends Component {
     Syntax::Typescript(TsSyntax {
       ..Default::default()
     }),
-    |_| chain!(
+    |_| (
       resolver(Mark::new(), Mark::new(), true),
-      as_folder(WorkletVisitor::new(
+      visit_mut_pass(WorkletVisitor::new(
         TransformMode::Test,
         WorkletVisitorConfig {
           filename: "index.ts".into(),
@@ -2138,9 +2138,9 @@ class App extends Component {
     Syntax::Typescript(TsSyntax {
       ..Default::default()
     }),
-    |_| chain!(
+    |_| (
       resolver(Mark::new(), Mark::new(), true),
-      as_folder(WorkletVisitor::new(
+      visit_mut_pass(WorkletVisitor::new(
         TransformMode::Test,
         WorkletVisitorConfig {
           filename: "index.ts".into(),
diff --git a/packages/react/transform/src/swc_plugin_worklet_post_process/mod.rs b/packages/react/transform/src/swc_plugin_worklet_post_process/mod.rs
index 7b89fccd1b..161b9cf0ac 100644
--- a/packages/react/transform/src/swc_plugin_worklet_post_process/mod.rs
+++ b/packages/react/transform/src/swc_plugin_worklet_post_process/mod.rs
@@ -51,14 +51,16 @@ impl VisitMut for WorkletPostProcessorVisitor {
 mod tests {
   use crate::swc_plugin_worklet_post_process::WorkletPostProcessorVisitor;
   use swc_core::ecma::parser::TsSyntax;
-  use swc_core::{ecma::parser::Syntax, ecma::transforms::testing::test, ecma::visit::as_folder};
+  use swc_core::{
+    ecma::parser::Syntax, ecma::transforms::testing::test, ecma::visit::visit_mut_pass,
+  };
 
   test!(
     module,
     Syntax::Typescript(TsSyntax {
       ..Default::default()
     }),
-    |_| as_folder(WorkletPostProcessorVisitor::default()),
+    |_| visit_mut_pass(WorkletPostProcessorVisitor::default()),
     should_transform_worklet,
     r#"
 registerWorklet("57ba11b1", function(event) {
@@ -81,7 +83,7 @@ registerWorklet("57ba11b2", function(event) {
     Syntax::Typescript(TsSyntax {
       ..Default::default()
     }),
-    |_| as_folder(WorkletPostProcessorVisitor::default()),
+    |_| visit_mut_pass(WorkletPostProcessorVisitor::default()),
     should_transform_worklet_2,
     r#"
 function f() {


Reviews:
user: login: colinaaa
body: LGTM, just a few minor suggestions.
state: DISMISSED
author_association: COLLABORATOR
submitted_at: 2025-03-26T05:26:49Z
user: login: gaoachao
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-03-26T05:48:17Z
user: login: colinaaa
state: APPROVED
author_association: COLLABORATOR
submitted_at: 2025-03-26T07:49:10Z

Review comments:
diff_hunk: @@ -276,15 +276,15 @@ where
   snapshot_creator: Option<Function>,
   dynamic_part_count: i32,
   dynamic_parts: Vec<DynamicPart>,
-  dynamic_part_folder: &'a mut F,
+  dynamic_part_folder: &'a mut V,
path: packages/react/transform/src/swc_plugin_snapshot/mod.rs
user: login: colinaaa
body: nitpick: this is not a folder anymore
```suggestion
  dynamic_part_visitor: &'a mut V,
```
created_at: 2025-03-26T04:59:12Z
author_association: COLLABORATOR
diff_hunk: @@ -6,15 +6,15 @@ use swc_core::{
   common::{errors::HANDLER, iter::IdentifyLast, Spanned, DUMMY_SP},
   ecma::{
     ast::{JSXExpr, *},
-    atoms::{js_word, Atom, JsWord},
+    atoms::Atom,
   },
 };
 
 pub fn jsx_name(name: JSXElementName) -> Box<Expr> {
   let span = name.span();
   match name {
     JSXElementName::Ident(i) => {
-      if i.sym == js_word!("this") {
+      if i.sym == Atom::new("this") {
path: packages/react/transform/src/swc_plugin_snapshot/jsx_helpers.rs
user: login: colinaaa
body: It seems like `js_word!` is an alias of `atom!`. https://github.com/swc-project/swc/pull/10071
created_at: 2025-03-26T05:18:56Z
author_association: COLLABORATOR
diff_hunk: @@ -6,15 +6,15 @@ use swc_core::{
   common::{errors::HANDLER, iter::IdentifyLast, Spanned, DUMMY_SP},
   ecma::{
     ast::{JSXExpr, *},
-    atoms::{js_word, Atom, JsWord},
+    atoms::Atom,
   },
 };
 
 pub fn jsx_name(name: JSXElementName) -> Box<Expr> {
   let span = name.span();
   match name {
     JSXElementName::Ident(i) => {
-      if i.sym == js_word!("this") {
+      if i.sym == Atom::new("this") {
path: packages/react/transform/src/swc_plugin_snapshot/jsx_helpers.rs
user: login: gaoachao
body: https://github.com/lynx-family/lynx-stack/pull/341/commits/d595dcab9cba2c3cdc5aa865a85ccfea661988d1
created_at: 2025-03-26T05:48:17Z
author_association: COLLABORATOR

PR comments:
user: login: changeset-bot[bot]
created_at: 2025-03-25T15:23:42Z
body: ###  🦋  Changeset detected

Latest commit: d595dcab9cba2c3cdc5aa865a85ccfea661988d1

**The changes in this PR will be included in the next version bump.**

<details><summary>This PR includes changesets to release 0 packages</summary>

  When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

</details>

Not sure what this means? [Click here  to learn what changesets are](https://github.com/changesets/changesets/blob/main/docs/adding-a-changeset.md).

[Click here if you're a maintainer who wants to add another changeset to this PR](https://github.com/lynx-family/lynx-stack/new/chore/bump-swc-core?filename=.changeset/selfish-terms-learn.md&value=---%0A%22%40lynx-js%2Freact%22%3A%20patch%0A%22%40lynx-js%2Freact-transform%22%3A%20patch%0A---%0A%0Achore(deps)%3A%20bump%20swc_core%20v16.5.0%0A)


author_association: NONE
user: login: codecov[bot]
created_at: 2025-03-25T17:10:10Z
body: ## [Codecov](https://app.codecov.io/gh/lynx-family/lynx-stack/pull/341?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=lynx-family) Report
Attention: Patch coverage is `81.54613%` with `74 lines` in your changes missing coverage. Please review.

:white_check_mark: All tests successful. No failed tests found.
| [Files with missing lines](https://app.codecov.io/gh/lynx-family/lynx-stack/pull/341?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=lynx-family) | Patch % | Lines |
|---|---|---|
| [packages/react/transform/src/lib.rs](https://app.codecov.io/gh/lynx-family/lynx-stack/pull/341?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=lynx-family#diff-cGFja2FnZXMvcmVhY3QvdHJhbnNmb3JtL3NyYy9saWIucnM=) | 0.00% | [57 Missing :warning: ](https://app.codecov.io/gh/lynx-family/lynx-stack/pull/341?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=lynx-family) |
| [packages/react/transform/src/bundle.rs](https://app.codecov.io/gh/lynx-family/lynx-stack/pull/341?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=lynx-family#diff-cGFja2FnZXMvcmVhY3QvdHJhbnNmb3JtL3NyYy9idW5kbGUucnM=) | 0.00% | [13 Missing :warning: ](https://app.codecov.io/gh/lynx-family/lynx-stack/pull/341?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=lynx-family) |
| [...ges/react/transform/src/swc\_plugin\_snapshot/mod.rs](https://app.codecov.io/gh/lynx-family/lynx-stack/pull/341?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=lynx-family#diff-cGFja2FnZXMvcmVhY3QvdHJhbnNmb3JtL3NyYy9zd2NfcGx1Z2luX3NuYXBzaG90L21vZC5ycw==) | 98.18% | [2 Missing :warning: ](https://app.codecov.io/gh/lynx-family/lynx-stack/pull/341?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=lynx-family) |
| [...es/react/transform/src/swc\_plugin\_css\_scope/mod.rs](https://app.codecov.io/gh/lynx-family/lynx-stack/pull/341?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=lynx-family#diff-cGFja2FnZXMvcmVhY3QvdHJhbnNmb3JtL3NyYy9zd2NfcGx1Z2luX2Nzc19zY29wZS9tb2QucnM=) | 85.71% | [1 Missing :warning: ](https://app.codecov.io/gh/lynx-family/lynx-stack/pull/341?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=lynx-family) |
| [...t/transform/src/swc\_plugin\_snapshot/jsx\_helpers.rs](https://app.codecov.io/gh/lynx-family/lynx-stack/pull/341?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=lynx-family#diff-cGFja2FnZXMvcmVhY3QvdHJhbnNmb3JtL3NyYy9zd2NfcGx1Z2luX3NuYXBzaG90L2pzeF9oZWxwZXJzLnJz) | 75.00% | [1 Missing :warning: ](https://app.codecov.io/gh/lynx-family/lynx-stack/pull/341?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=lynx-family) |

:loudspeaker: Thoughts on this report? [Let us know!](https://github.com/codecov/feedback/issues/255)
author_association: NONE
user: login: codspeed-hq[bot]
created_at: 2025-03-25T17:12:51Z
body: <!-- __CODSPEED_PERFORMANCE_REPORT_COMMENT__ -->
<!-- __CODSPEED_INSTRUMENTATION_PERFORMANCE_REPORT_COMMENT__ -->

## [CodSpeed Performance Report](https://codspeed.io/lynx-family/lynx-stack/branches/chore%2Fbump-swc-core)

### Merging #341 will **not alter performance**

<sub>Comparing <code>chore/bump-swc-core</code> (d595dca) with <code>main</code> (7b41e5a)</sub>



### Summary

`✅ 1` untouched benchmarks  




author_association: NONE