feat(react-transform): add removeCall support#2423
Conversation
🦋 Changeset detectedLatest commit: d6d1899 The changes in this PR will be included in the next version bump. This PR includes changesets to release 5 packages
Not sure what this means? Click here to learn what changesets are. Click here if you're a maintainer who wants to add another changeset to this PR |
Codecov Report❌ Patch coverage is 📢 Thoughts on this report? Let us know! |
Merging this PR will improve performance by 16.49%
Performance Changes
Comparing Footnotes
|
React External#249 Bundle Size — 590.57KiB (~-0.01%).d6d1899(current) vs 5f2cea3 main#230(baseline) Bundle metrics
Bundle size by type
Bundle analysis report Branch feat-react-transform-remove-call Project dashboard Generated by RelativeCI Documentation Report issue |
React MTF Example#263 Bundle Size — 206.05KiB (0%).d6d1899(current) vs 5f2cea3 main#244(baseline) Bundle metrics
|
| Current #263 |
Baseline #244 |
|
|---|---|---|
0B |
0B |
|
0B |
0B |
|
0% |
0% |
|
0 |
0 |
|
3 |
3 |
|
173 |
173 |
|
67 |
67 |
|
45.77% |
45.77% |
|
2 |
2 |
|
0 |
0 |
Bundle size by type no changes
| Current #263 |
Baseline #244 |
|
|---|---|---|
111.23KiB |
111.23KiB |
|
94.81KiB |
94.81KiB |
Bundle analysis report Branch feat-react-transform-remove-call Project dashboard
Generated by RelativeCI Documentation Report issue
Web Explorer#8705 Bundle Size — 728.84KiB (0%).d6d1899(current) vs 5f2cea3 main#8686(baseline) Bundle metrics
Bundle size by type
|
| Current #8705 |
Baseline #8686 |
|
|---|---|---|
384.62KiB |
384.62KiB |
|
342.07KiB |
342.07KiB |
|
2.16KiB |
2.16KiB |
Bundle analysis report Branch feat-react-transform-remove-call Project dashboard
Generated by RelativeCI Documentation Report issue
React Example#7130 Bundle Size — 236.79KiB (-0.02%).d6d1899(current) vs 5f2cea3 main#7111(baseline) Bundle metrics
Bundle size by type
Bundle analysis report Branch feat-react-transform-remove-call Project dashboard Generated by RelativeCI Documentation Report issue |
5e4f3c5 to
2c7d396
Compare
📝 WalkthroughWalkthroughIntroduces a new Changes
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~25 minutes Possibly related PRs
Suggested reviewers
Poem
🚥 Pre-merge checks | ✅ 2 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (2 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
2c7d396 to
e30fb69
Compare
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@packages/react/transform/swc-plugin-reactlynx/index.d.ts`:
- Around line 84-109: The ShakeVisitorConfig interface currently requires
removeCall; change it to be optional so callers can rely on runtime
defaults—update the declaration for removeCall to be optional (e.g.,
removeCall?: Array<string>) and likewise make the other fields that are
normalized at runtime (pkgName, retainProp, removeCallParams) optional on the
interface so the type matches the runtime normalization in
packages/webpack/react-webpack-plugin/src/loaders/options.ts; keep the element
types the same, only change required -> optional.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
Run ID: 790c5793-b435-42fd-8451-e36c2d79a4d0
📒 Files selected for processing (12)
.changeset/feat-react-transform-remove-call.mdpackages/react/transform/crates/swc_plugin_shake/lib.rspackages/react/transform/crates/swc_plugin_shake/napi.rspackages/react/transform/crates/swc_plugin_shake/tests/__swc_snapshots__/lib.rs/should_not_remove_call_in_scope_id.jspackages/react/transform/crates/swc_plugin_shake/tests/__swc_snapshots__/lib.rs/should_remove_use_effect_call.jspackages/react/transform/crates/swc_plugin_shake/tests/__swc_snapshots__/lib.rs/should_remove_use_effect_param.jspackages/react/transform/crates/swc_plugin_shake/tests/__swc_snapshots__/lib.rs/should_replace_use_effect_call_with_undefined.jspackages/react/transform/index.d.tspackages/react/transform/swc-plugin-reactlynx/index.d.tspackages/rspeedy/plugin-react/etc/react-rsbuild-plugin.api.mdpackages/webpack/react-refresh-webpack-plugin/package.jsonpackages/webpack/react-webpack-plugin/src/loaders/options.ts
e30fb69 to
8f20056
Compare
There was a problem hiding this comment.
♻️ Duplicate comments (1)
packages/react/transform/swc-plugin-reactlynx/index.d.ts (1)
84-109:⚠️ Potential issue | 🟡 MinorMake
removeCalloptional inShakeVisitorConfig.The
removeCallfield (and other fields likepkgName,retainProp,removeCallParams) should be optional since:
- The documentation states "The provided values will be merged with the default values"
- Runtime normalization handles missing values with defaults
- Required fields break backward compatibility for existing code constructing this interface
💡 Suggested fix
- removeCall: Array<string>; + removeCall?: Array<string>;Consider making other fields optional as well for consistency with the merge-with-defaults behavior.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@packages/react/transform/swc-plugin-reactlynx/index.d.ts` around lines 84 - 109, The ShakeVisitorConfig interface currently declares removeCall as required; make removeCall optional (removeCall?: Array<string>) and likewise mark related fields that are merged with defaults—pkgName, retainProp, removeCallParams—as optional in the ShakeVisitorConfig type so callers can omit them and runtime normalization will supply defaults; update the declaration of ShakeVisitorConfig (and any other related config interfaces in this file) to use optional properties to preserve backward compatibility.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Duplicate comments:
In `@packages/react/transform/swc-plugin-reactlynx/index.d.ts`:
- Around line 84-109: The ShakeVisitorConfig interface currently declares
removeCall as required; make removeCall optional (removeCall?: Array<string>)
and likewise mark related fields that are merged with defaults—pkgName,
retainProp, removeCallParams—as optional in the ShakeVisitorConfig type so
callers can omit them and runtime normalization will supply defaults; update the
declaration of ShakeVisitorConfig (and any other related config interfaces in
this file) to use optional properties to preserve backward compatibility.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
Run ID: 648413a5-e891-464d-b76e-8d00a957ad94
📒 Files selected for processing (13)
.changeset/feat-react-transform-remove-call.mdpackages/react/transform/crates/swc_plugin_shake/lib.rspackages/react/transform/crates/swc_plugin_shake/napi.rspackages/react/transform/crates/swc_plugin_shake/tests/__swc_snapshots__/lib.rs/should_not_remove_call_in_scope_id.jspackages/react/transform/crates/swc_plugin_shake/tests/__swc_snapshots__/lib.rs/should_remove_use_effect_call.jspackages/react/transform/crates/swc_plugin_shake/tests/__swc_snapshots__/lib.rs/should_remove_use_effect_param.jspackages/react/transform/crates/swc_plugin_shake/tests/__swc_snapshots__/lib.rs/should_replace_use_effect_call_with_undefined.jspackages/react/transform/index.d.tspackages/react/transform/swc-plugin-reactlynx/index.d.tspackages/rspeedy/plugin-react/etc/react-rsbuild-plugin.api.mdpackages/rspeedy/plugin-react/package.jsonpackages/webpack/react-refresh-webpack-plugin/package.jsonpackages/webpack/react-webpack-plugin/src/loaders/options.ts
✅ Files skipped from review due to trivial changes (7)
- packages/react/transform/crates/swc_plugin_shake/tests/swc_snapshots/lib.rs/should_remove_use_effect_param.js
- packages/rspeedy/plugin-react/package.json
- packages/react/transform/crates/swc_plugin_shake/tests/swc_snapshots/lib.rs/should_replace_use_effect_call_with_undefined.js
- packages/webpack/react-refresh-webpack-plugin/package.json
- packages/react/transform/crates/swc_plugin_shake/tests/swc_snapshots/lib.rs/should_not_remove_call_in_scope_id.js
- packages/react/transform/crates/swc_plugin_shake/tests/swc_snapshots/lib.rs/should_remove_use_effect_call.js
- .changeset/feat-react-transform-remove-call.md
🚧 Files skipped from review as they are similar to previous changes (2)
- packages/webpack/react-webpack-plugin/src/loaders/options.ts
- packages/rspeedy/plugin-react/etc/react-rsbuild-plugin.api.md
8f20056 to
d6d1899
Compare
There was a problem hiding this comment.
Actionable comments posted: 3
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@packages/react/transform/crates/swc_plugin_shake/lib.rs`:
- Around line 85-88: The docs claim removeCall values are merged with defaults
but the N-API path currently forwards ShakeVisitorConfig verbatim, so removeCall
replacement occurs; fix by merging the provided removeCall list with the default
hook list before constructing/passing ShakeVisitorConfig in the N-API code path
(the logic around where ShakeVisitorConfig is built/forwarded in napi.rs), or
alternatively update the docs to say removeCall replaces defaults; reference the
removeCall option and the ShakeVisitorConfig construction in napi.rs and
implement a merge (dedupe + prepend/append as desired) when building the config.
- Around line 171-173: The current should_remove_call only checks the local
callee name against target_calls, so aliased imports (local binding like `ue`
for `useEffect`) won't match; update the importer to record a mapping of local
binding id -> original imported name (e.g., import_map: HashMap<Id, String>) and
then change should_remove_call to: look up the callee's local Id
(fn_name.to_id()) in import_ids/import_map, and if present check
import_map.get(&id) (or the original name) against target_calls (fn_name.sym may
be the local alias, so use the mapped original name for comparison). Ensure the
mapping is populated where imports are collected and used in should_remove_call.
- Around line 199-203: The current transformation in visit_mut_expr replaces
removed calls with a plain identifier Expr::Ident(Ident::new("undefined"...)),
which can be shadowed by local bindings; change this to emit the expression void
0 instead. Locate visit_mut_expr (the branch matching Expr::Call and the call to
should_remove_call) and replace the Expr::Ident("undefined") construction with a
unary void expression (Unary op Void with numeric 0 as the argument) so the
replacement is immune to shadowing.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
Run ID: 6c20a263-f516-4b44-9963-e290dc7ca860
📒 Files selected for processing (12)
.changeset/feat-react-transform-remove-call.mdpackages/react/transform/crates/swc_plugin_shake/lib.rspackages/react/transform/crates/swc_plugin_shake/napi.rspackages/react/transform/crates/swc_plugin_shake/tests/__swc_snapshots__/lib.rs/should_not_remove_call_in_scope_id.jspackages/react/transform/crates/swc_plugin_shake/tests/__swc_snapshots__/lib.rs/should_remove_use_effect_call.jspackages/react/transform/crates/swc_plugin_shake/tests/__swc_snapshots__/lib.rs/should_remove_use_effect_param.jspackages/react/transform/crates/swc_plugin_shake/tests/__swc_snapshots__/lib.rs/should_replace_use_effect_call_with_undefined.jspackages/react/transform/index.d.tspackages/react/transform/swc-plugin-reactlynx/index.d.tspackages/rspeedy/plugin-react/etc/react-rsbuild-plugin.api.mdpackages/webpack/react-refresh-webpack-plugin/package.jsonpackages/webpack/react-webpack-plugin/src/loaders/options.ts
✅ Files skipped from review due to trivial changes (6)
- packages/react/transform/crates/swc_plugin_shake/tests/swc_snapshots/lib.rs/should_replace_use_effect_call_with_undefined.js
- packages/react/transform/crates/swc_plugin_shake/tests/swc_snapshots/lib.rs/should_remove_use_effect_param.js
- packages/react/transform/crates/swc_plugin_shake/tests/swc_snapshots/lib.rs/should_not_remove_call_in_scope_id.js
- packages/webpack/react-refresh-webpack-plugin/package.json
- packages/react/transform/crates/swc_plugin_shake/tests/swc_snapshots/lib.rs/should_remove_use_effect_call.js
- .changeset/feat-react-transform-remove-call.md
🚧 Files skipped from review as they are similar to previous changes (2)
- packages/react/transform/swc-plugin-reactlynx/index.d.ts
- packages/react/transform/crates/swc_plugin_shake/napi.rs
This PR was opened by the [Changesets release](https://github.com/changesets/action) GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated. # Releases ## @lynx-js/react@0.118.0 ### Minor Changes - refactor: create SnapshotInstance in renderToString directly ([#2393](#2393)) - Add `removeCall` for shake function calls. Its initial default value matches the hooks that were previously in `removeCallParams`, and `removeCallParams` now defaults to empty. ([#2423](#2423)) `removeCall` removes matched runtime hook calls entirely, replacing them with `undefined` in expression positions and dropping them in statement positions. `removeCallParams` keeps the existing behavior of preserving the call while stripping its arguments. ### Patch Changes - Improve `shake.removeCall` and `shake.removeCallParams` in the React transform so they also match aliased runtime imports such as `import { useEffect as myUseEffect } ...` and member calls such as `ReactLynxRuntime.useEffect(...)` from default or namespace runtime imports. ([#2437](#2437)) - Create element without ref for suspense in main thread. ([#2426](#2426)) - refactor: make `useEffect`, `useLayoutEffect` and `useImperativeHandle` no-op on the main thread ([#2424](#2424)) ## @lynx-js/react-rsbuild-plugin@0.15.0 ### Minor Changes - Add `removeCall` for shake function calls. Its initial default value matches the hooks that were previously in `removeCallParams`, and `removeCallParams` now defaults to empty. ([#2423](#2423)) `removeCall` removes matched runtime hook calls entirely, replacing them with `undefined` in expression positions and dropping them in statement positions. `removeCallParams` keeps the existing behavior of preserving the call while stripping its arguments. ### Patch Changes - Support `@lynx-js/react` 0.118.0. ([#2432](#2432)) - Updated dependencies \[[`1f4f117`](1f4f117)]: - @lynx-js/react-webpack-plugin@0.9.0 - @lynx-js/react-alias-rsbuild-plugin@0.15.0 - @lynx-js/use-sync-external-store@1.5.0 - @lynx-js/react-refresh-webpack-plugin@0.3.5 - @lynx-js/css-extract-webpack-plugin@0.7.0 - @lynx-js/template-webpack-plugin@0.10.8 ## @lynx-js/react-webpack-plugin@0.9.0 ### Minor Changes - Add `removeCall` for shake function calls. Its initial default value matches the hooks that were previously in `removeCallParams`, and `removeCallParams` now defaults to empty. ([#2423](#2423)) `removeCall` removes matched runtime hook calls entirely, replacing them with `undefined` in expression positions and dropping them in statement positions. `removeCallParams` keeps the existing behavior of preserving the call while stripping its arguments. ## @lynx-js/rspeedy@0.14.1 ### Patch Changes - Updated dependencies \[]: - @lynx-js/web-rsbuild-server-middleware@0.20.1 ## create-rspeedy@0.14.1 ### Patch Changes - Fix the error when installing Lynx DevTool skill. ([#2427](#2427)) ## @lynx-js/lynx-bundle-rslib-config@0.3.1 ### Patch Changes - Updated dependencies \[[`156d64d`](156d64d), [`59d11b2`](59d11b2)]: - @lynx-js/css-serializer@0.1.5 ## @lynx-js/config-rsbuild-plugin@0.0.2 ### Patch Changes - Support `@lynx-js/rspeedy` 0.14.0. ([#2431](#2431)) ## @lynx-js/css-serializer@0.1.5 ### Patch Changes - feat: add support for @media, @supports, and @layer at-rules ([#2330](#2330)) Add support for additional CSS at-rules in the CSS serializer: - `@media` - for media queries - `@supports` - for feature queries - `@layer` - for cascade layers (both named and anonymous) The parser now handles these at-rules with proper recursive parsing support for nested at-rules. - feat: support custom property declaration in keyframe rule ([#2429](#2429)) ## @lynx-js/web-core@0.20.1 ### Patch Changes - Added support for the `global-bind` event handling modifier in the web platform runtime. ([#2438](#2438)) This mechanism enables seamless cross-element event communication without requiring a formal DOM tree relationship, allowing decoupled elements to observe and respond to standard events occurring anywhere within the component tree. ### Usage Global bindings allow an observer element to react to events triggered on another target element. #### 1. Define the Global Subscription Attach `global-bindTap` (or any equivalent standard event alias) to your observer element: ```jsx <view id="observer" global-bindTap={(event) => { // This will trigger whenever 'tap' is caught by a globally bound event. console.log("Global tap handled!", event); }} /> ``` #### 2. Trigger the Event anywhere The event will be triggered via normal user interaction (such as `tap`) on any other constituent elements: ```jsx <view id="target" bindTap={(event) => { // Note: To successfully propagate globally, ensure the event bubbles. }} /> ``` - feat(web-core): add support for configurable rem unit transform ([#2403](#2403)) - **Description**: Added a new configuration option `transformREM` (also exposed as `transform_rem` on the Rust layer) to the Web Core renderer. When enabled, it recursively converts static `rem` unit values in your styles into dynamic CSS custom properties (`calc(VALUE * var(--rem-unit))`) during template decoding and evaluation. This enables developers to implement responsive font scaling and layout sizing dynamically on the client side simply by modifying the root CSS variable `--rem-unit`. - **Usage**: You can enable this feature when working with `LynxView` by setting `transformREM` to `true`, or directly as an HTML attribute `transform-rem`: ```html <lynx-view url="https://example.com/template.js" transform-rem="true" ></lynx-view> ``` ```javascript const lynxView = document.createElement("lynx-view"); lynxView.transformREM = true; ``` With this enabled, a CSS declaration like `font-size: 1.5rem;` is transparently evaluated as `font-size: calc(1.5 * var(--rem-unit));` by the runtime engine. - Updated dependencies \[[`156d64d`](156d64d), [`59d11b2`](59d11b2)]: - @lynx-js/css-serializer@0.1.5 - @lynx-js/web-worker-rpc@0.20.1 ## @lynx-js/template-webpack-plugin@0.10.8 ### Patch Changes - Updated dependencies \[[`156d64d`](156d64d), [`5151fcf`](5151fcf), [`b630df2`](b630df2), [`59d11b2`](59d11b2)]: - @lynx-js/css-serializer@0.1.5 - @lynx-js/web-core@0.20.1 ## @lynx-js/react-umd@0.118.0 ## @lynx-js/react-alias-rsbuild-plugin@0.15.0 ## upgrade-rspeedy@0.14.1 ## @lynx-js/web-rsbuild-server-middleware@0.20.1 ## @lynx-js/web-worker-rpc@0.20.1 Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Summary by CodeRabbit
New Features
removeCallconfiguration option that removes matched runtime hook calls and replaces them withundefinedin expression contexts.Documentation
Checklist