react changelog


Here's a quick peek into the latest and greatest updates we've been cooking up! 🍳✨

New feature: Say hello to cacheSignal()! Now you can abort those pesky network requests when a cache is no longer needed. It's like a self-cleaning kitchen—tidy and efficient! This nifty addition returns an AbortSignal that kicks in when the cache's lifetime is up. Perfect for managing resources like a pro.

New feature: The React DevTools shell just got a makeover with a brand-new 'Layout' selector. Now you can test your devtools in style, whether you're a left-split or top-split kind of person. Plus, we've added a resizable split pane for that extra touch of realism. 🎨

Improvement: We've jazzed up our compiler with support for aliasing signatures. Now functions like nullthrows() and identity() can strut their polymorphic stuff, making type inference more precise and snazzy.

New feature: Our compiler's got a fresh mutability and aliasing model. It's like upgrading from a tricycle to a sports car—streamlined and ready to race! This overhaul replaces older components and promises a smoother ride in determining value construction instructions.

New feature: We've flipped the switch to make our new inference system the default. It's like getting a software upgrade that makes everything run smoother and faster. 🚀

New feature: For those who love testing, we've added a set of new fixtures to flex our compiler's muscles. These cover all sorts of scenarios, ensuring our inference capabilities are as sharp as ever.

Improvement: Our prerelease workflows are now more selective! You can choose specific packages to publish as experimental releases. It's like picking your favorite candy from the jar—only the best for our testers!

Chore: We've tidied up by removing the enableDO_NOT_USE_disableStrictPassiveEffect feature flag. It's out with the old and in with the new, making strict effects in React's Strict Mode the norm.

Bugfix: Squashed a bug that caused infinite loops in the compiler due to uncached applied signatures. Now our abstract memory model converges like a dream. 🐞

Improvement: The DevTools component tree now has a minimum indent size. No more disappearing hierarchy! Stay organized and see your component tree's true beauty, even in the tightest spaces.

Bugfix: We've added a repro for an IIFE-in-ternary issue that was causing a compiler bailout. Now, our compiler can handle those tricky expressions like a seasoned pro.

Bugfix: Fixed an oversight in <ValidateMemoization>. Now, it checks memoization with and without "forget" as intended, ensuring your memoization logic is on point.

That's all for now! Keep coding and stay awesome! 😎

Included Commits

2025-06-13T14:25:04 See commit

This commit introduces a new 'Layout' selector to the React DevTools shell, enhancing the testing environment by allowing users to choose between a vertical or horizontal layout for the DevTools interface. Additionally, it features a resizable split pane, which enables more realistic simulations of how the DevTools will function when resized, similar to the behavior of the Chrome DevTools pane. The changes include modifications to the HTML structure and the addition of JavaScript functionality to handle layout changes and resizing behavior.

To implement this, the code updates the layout management, allowing users to switch between "Left/Right Split" and "Top/Bottom Split" configurations. A draggable divider is also included, which adjusts the size of the panes based on user interaction. This enhancement aims to improve the usability and testing fidelity of the DevTools by providing a more dynamic and responsive interface.

Files changed

  • packages/react-devtools-shell/index.html
2025-06-13T14:28:31 See commit

The recent commit to the devtools Components tab addresses an issue with the component tree view's indentation behavior, which previously scaled down based on the available width of the view. This led to a situation where, in narrow views or with long component names, the indentation could completely disappear, obscuring the hierarchy of components and making it difficult to navigate the tree. To resolve this, the commit introduces a minimum indentation size of 4 pixels, ensuring that some level of indentation is always visible, even in constrained layouts. This change enhances the usability of the component tree, allowing users to better discern the nesting of components.

Additionally, the commit includes a comparison to the Chrome Dev Tools, which utilizes a fixed indentation size to avoid similar issues. The implementation was tested through various methods, including running tests and experimenting with different layout modes in the browser. The changes involved modifications to the indentation size logic in the code, ensuring that the visual representation of the component hierarchy is preserved, regardless of the view's width.

Files changed

  • packages/react-devtools-shared/src/devtools/views/Components/Tree.js
2025-06-13T18:22:55 See commit

This commit introduces enhancements to the prerelease workflows in the project, specifically allowing for the selective publishing of packages as experimental releases. The updates include the addition of three new input options (only_packages, skip_packages, and dry) to the runtime_prereleases.yml file. These options enable users to cherry-pick specific packages for release or to skip certain packages altogether, facilitating targeted testing of fixes or features. The intent is to streamline the process of creating experimental releases that can be quickly tested by downstream projects.

Additionally, the commit modifies both the manual and nightly workflows to incorporate these new options, ensuring they are reusable across different scenarios. A Discord notification feature has also been added to alert users when the manual workflow is executed, enhancing communication about the release process. Overall, these changes aim to provide greater flexibility and control over the prerelease publishing process while improving team notifications.

Files changed

  • .github/workflows/runtime_prereleases.yml
  • .github/workflows/runtime_prereleases_manual.yml
  • .github/workflows/runtime_prereleases_nightly.yml
2025-06-16T16:22:47 See commit

This commit removes the feature flag enableDO_NOT_USE_disableStrictPassiveEffect from the React reconciler codebase, indicating a decision to eliminate the ability to disable strict passive effects in React's Strict Mode. The change involves modifications across several files, including ReactFiberHooks.js, ReactFiber.js, and ReactTypeOfMode.js, where references to the flag and associated logic have been removed. The code updates streamline the handling of strict effects, ensuring that they are consistently applied without the option for developers to disable them.

In addition to the code changes, the commit also cleans up related test cases that were designed to validate the behavior of the feature flag. This includes the removal of tests that checked for the flag's functionality in both general and Suspense contexts. Overall, the removal of this feature flag signifies a shift towards a more rigorous enforcement of strict passive effects in React, potentially leading to more predictable behavior in applications using Strict Mode.

Files changed

  • packages/react-reconciler/src/ReactFiber.js
  • packages/react-reconciler/src/ReactFiberHooks.js
  • packages/react-reconciler/src/ReactFiberWorkLoop.js
  • packages/react-reconciler/src/ReactTypeOfMode.js
  • packages/react-reconciler/src/__tests__/ActivityStrictMode-test.js
  • packages/react/src/__tests__/ReactStrictMode-test.internal.js
  • packages/shared/ReactFeatureFlags.js
  • packages/shared/forks/ReactFeatureFlags.native-fb.js
  • packages/shared/forks/ReactFeatureFlags.native-oss.js
  • packages/shared/forks/ReactFeatureFlags.test-renderer.js
  • packages/shared/forks/ReactFeatureFlags.test-renderer.native-fb.js
  • packages/shared/forks/ReactFeatureFlags.test-renderer.www.js
  • packages/shared/forks/ReactFeatureFlags.www-dynamic.js
  • packages/shared/forks/ReactFeatureFlags.www.js
2025-06-17T01:53:27 See commit

This commit introduces a reproduction case for an issue in the React compiler related to using an Immediately Invoked Function Expression (IIFE) within a ternary operator, which is causing a bailout. The commit adds two test files: one for the expected output of the code and another containing the actual code that triggers the error. The provided example demonstrates a component where the ternary operator evaluates a condition, and if false, executes an IIFE that throws an error.

The added tests highlight the need for improved support for labeled statements combined with value blocks in conditional expressions, as indicated by the error message. This change aims to enhance the compiler's capability to handle such patterns, thereby preventing unexpected behavior during compilation.

Files changed

  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/error.todo-iife-inline-ternary.expect.md
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/error.todo-iife-inline-ternary.js
2025-06-17T21:04:40 See commit

The commit introduces the cacheSignal() function alongside the existing cache() functionality in React, addressing the need for managing the lifecycle of cached entries. While cache() allows for storing data with a defined lifetime, cacheSignal() provides an AbortSignal that can be used to abort any outstanding network requests or resources when the cache is no longer needed. This is particularly useful in ensuring that resources are cleaned up appropriately once the render completes, or if the cache is refreshed, thereby preventing unnecessary resource usage and handling errors due to cancellations more gracefully.

Additionally, the commit highlights the behavior of cacheSignal() when called outside of a React render context, where it returns null, indicating that cached functions are treated as uncached in such scenarios. The changes include updates across multiple files, ensuring that cacheSignal() is integrated into both server and client environments, while also maintaining compatibility with existing code structures. This enhancement not only improves resource management in React applications but also aligns with idiomatic JavaScript patterns for handling asynchronous operations and error management.

Files changed

  • packages/react-noop-renderer/src/ReactNoopFlightServer.js
  • packages/react-reconciler/src/ReactFiberAsyncDispatcher.js
  • packages/react-reconciler/src/ReactInternalTypes.js
  • packages/react-reconciler/src/__tests__/ReactCache-test.js
  • packages/react-server/src/ReactFizzAsyncDispatcher.js
  • packages/react-server/src/ReactFlightServer.js
  • packages/react-server/src/flight/ReactFlightAsyncDispatcher.js
  • packages/react-suspense-test-utils/src/ReactSuspenseTestUtils.js
  • packages/react/index.development.js
  • packages/react/index.experimental.development.js
  • packages/react/index.experimental.js
  • packages/react/index.fb.js
  • packages/react/index.js
  • packages/react/index.stable.development.js
  • packages/react/index.stable.js
  • packages/react/src/ReactCacheClient.js
  • packages/react/src/ReactCacheImpl.js
  • packages/react/src/ReactCacheServer.js
  • packages/react/src/ReactClient.js
  • packages/react/src/ReactServer.experimental.development.js
  • packages/react/src/ReactServer.experimental.js
  • packages/react/src/ReactServer.fb.js
  • packages/react/src/ReactServer.js
  • scripts/error-codes/codes.json
2025-06-18T19:58:06 See commit

This commit introduces a new mutability and aliasing model to the React compiler, aimed at enhancing the algorithm responsible for determining the sets of instructions involved in constructing values. The update replaces several existing components, including InferReferenceEffects and InferMutableRanges, streamlining the inference process. Notably, the new model eliminates the use of per-Place effect values while still incorporating them in the final inference results, which is designed to improve the accuracy and efficiency of the compiler's operation.

In addition to the core changes in the mutability model, the commit includes numerous modifications across various files, reflecting a comprehensive overhaul of the inference and analysis processes. New components have been added to support the updated model, and extensive testing has been conducted to ensure that the changes address existing issues while maintaining the integrity of the compiler's functionality. The author plans to provide a detailed document explaining the new model, indicating a commitment to transparency and collaboration within the development community.

Files changed

  • compiler/packages/babel-plugin-react-compiler/src/Entrypoint/Pipeline.ts
  • compiler/packages/babel-plugin-react-compiler/src/HIR/AssertValidMutableRanges.ts
  • compiler/packages/babel-plugin-react-compiler/src/HIR/BuildHIR.ts
  • compiler/packages/babel-plugin-react-compiler/src/HIR/Environment.ts
  • compiler/packages/babel-plugin-react-compiler/src/HIR/Globals.ts
  • compiler/packages/babel-plugin-react-compiler/src/HIR/HIR.ts
  • compiler/packages/babel-plugin-react-compiler/src/HIR/HIRBuilder.ts
  • compiler/packages/babel-plugin-react-compiler/src/HIR/MergeConsecutiveBlocks.ts
  • compiler/packages/babel-plugin-react-compiler/src/HIR/ObjectShape.ts
  • compiler/packages/babel-plugin-react-compiler/src/HIR/PrintHIR.ts
  • compiler/packages/babel-plugin-react-compiler/src/HIR/ScopeDependencyUtils.ts
  • compiler/packages/babel-plugin-react-compiler/src/HIR/visitors.ts
  • compiler/packages/babel-plugin-react-compiler/src/Inference/AliasingEffects.ts
  • compiler/packages/babel-plugin-react-compiler/src/Inference/AnalyseFunctions.ts
  • compiler/packages/babel-plugin-react-compiler/src/Inference/DropManualMemoization.ts
  • compiler/packages/babel-plugin-react-compiler/src/Inference/InferEffectDependencies.ts
  • compiler/packages/babel-plugin-react-compiler/src/Inference/InferFunctionEffects.ts
  • compiler/packages/babel-plugin-react-compiler/src/Inference/InferMutableRanges.ts
  • compiler/packages/babel-plugin-react-compiler/src/Inference/InferMutationAliasingEffects.ts
  • compiler/packages/babel-plugin-react-compiler/src/Inference/InferMutationAliasingFunctionEffects.ts
  • compiler/packages/babel-plugin-react-compiler/src/Inference/InferMutationAliasingRanges.ts
  • compiler/packages/babel-plugin-react-compiler/src/Inference/InferReferenceEffects.ts
  • compiler/packages/babel-plugin-react-compiler/src/Inference/InlineImmediatelyInvokedFunctionExpressions.ts
  • compiler/packages/babel-plugin-react-compiler/src/Optimization/InlineJsxTransform.ts
  • compiler/packages/babel-plugin-react-compiler/src/Optimization/LowerContextAccess.ts
  • compiler/packages/babel-plugin-react-compiler/src/Optimization/OutlineJsx.ts
  • compiler/packages/babel-plugin-react-compiler/src/ReactiveScopes/CodegenReactiveFunction.ts
  • compiler/packages/babel-plugin-react-compiler/src/Transform/TransformFire.ts
  • compiler/packages/babel-plugin-react-compiler/src/Utils/utils.ts
  • compiler/packages/babel-plugin-react-compiler/src/Validation/ValidateNoFreezingKnownMutableFunctions.ts
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/bug-aliased-capture-aliased-mutate.expect.md
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/bug-aliased-capture-aliased-mutate.js
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/bug-aliased-capture-mutate.expect.md
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/bug-aliased-capture-mutate.js
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/bug-capturing-func-maybealias-captured-mutate.expect.md
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/bug-capturing-func-maybealias-captured-mutate.ts
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/bug-invalid-phi-as-dependency.expect.md
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/bug-invalid-phi-as-dependency.tsx
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/bug-object-expression-computed-key-modified-during-after-construction-hoisted-sequence-expr.expect.md
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/bug-object-expression-computed-key-modified-during-after-construction-hoisted-sequence-expr.js
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/bug-separate-memoization-due-to-callback-capturing.expect.md
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/bug-separate-memoization-due-to-callback-capturing.js
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/error.assign-global-in-jsx-spread-attribute.expect.md
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/error.assign-global-in-jsx-spread-attribute.js
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/error.bug-old-inference-false-positive-ref-validation-in-use-effect.expect.md
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/error.bug-old-inference-false-positive-ref-validation-in-use-effect.js
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/error.invalid-hoisting-setstate.expect.md
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/error.invalid-hoisting-setstate.js
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/error.invalid-hook-function-argument-mutates-local-variable.expect.md
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/error.invalid-jsx-captures-context-variable.expect.md
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/error.invalid-jsx-captures-context-variable.js
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/error.invalid-pass-mutable-function-as-prop.expect.md
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/error.invalid-return-mutable-function-from-hook.expect.md
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/error.invalid-uncalled-function-capturing-mutable-values-memoizes-with-captures-values.expect.md
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/error.invalid-uncalled-function-capturing-mutable-values-memoizes-with-captures-values.js
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/error.mutable-range-shared-inner-outer-function.expect.md
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/error.mutable-range-shared-inner-outer-function.js
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/error.object-capture-global-mutation.expect.md
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/error.object-capture-global-mutation.js
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/array-filter.expect.md
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/array-filter.js
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/array-map-captures-receiver-noAlias.expect.md
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/array-map-captures-receiver-noAlias.js
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/array-push.expect.md
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/array-push.js
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/basic-mutation-via-function-expression.expect.md
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/basic-mutation-via-function-expression.js
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/basic-mutation.expect.md
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/basic-mutation.js
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/capture-backedge-phi-with-later-mutation.expect.md
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/capture-backedge-phi-with-later-mutation.js
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/error.invalid-reassign-local-variable-in-jsx-callback.expect.md
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/error.invalid-reassign-local-variable-in-jsx-callback.js
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/error.invalid-useCallback-captures-reassigned-context.expect.md
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/error.invalid-useCallback-captures-reassigned-context.js
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/error.mutate-frozen-value.expect.md
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/error.mutate-frozen-value.js
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/iife-return-modified-later-phi.expect.md
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/iife-return-modified-later-phi.js
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/mutate-through-boxing-unboxing-function-call-indirections-2.expect.md
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/mutate-through-boxing-unboxing-function-call-indirections-2.js
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/mutate-through-boxing-unboxing-function-call-indirections.expect.md
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/mutate-through-boxing-unboxing-function-call-indirections.js
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/mutate-through-boxing-unboxing-indirections.expect.md
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/mutate-through-boxing-unboxing-indirections.js
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/mutate-through-propertyload.expect.md
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/mutate-through-propertyload.js
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/nullable-objects-assume-invoked-direct-call.expect.md
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/nullable-objects-assume-invoked-direct-call.js
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/potential-mutation-in-function-expression.expect.md
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/potential-mutation-in-function-expression.js
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/reactive-ref.expect.md
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/reactive-ref.js
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/set-add-mutate.expect.md
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/set-add-mutate.js
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/ssa-renaming-ternary-destruction.expect.md
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/ssa-renaming-ternary-destruction.js
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/transitive-mutation-before-capturing-value-created-earlier.expect.md
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/transitive-mutation-before-capturing-value-created-earlier.js
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/object-access-assignment.expect.md
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/object-access-assignment.js
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/repro-aliased-capture-aliased-mutate.expect.md
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/repro-aliased-capture-aliased-mutate.js
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/repro-aliased-capture-mutate.expect.md
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/repro-aliased-capture-mutate.js
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/repro-capturing-func-maybealias-captured-mutate.expect.md
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/repro-capturing-func-maybealias-captured-mutate.ts
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/repro-false-positive-ref-validation-in-use-effect.expect.md
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/repro-false-positive-ref-validation-in-use-effect.js
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/repro-invalid-phi-as-dependency.expect.md
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/repro-invalid-phi-as-dependency.tsx
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/repro-object-expression-computed-key-modified-during-after-construction-hoisted-sequence-expr.expect.md
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/repro-object-expression-computed-key-modified-during-after-construction-hoisted-sequence-expr.js
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/repro-separate-memoization-due-to-callback-capturing.expect.md
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/repro-separate-memoization-due-to-callback-capturing.js
  • compiler/packages/snap/src/SproutTodoFilter.ts
2025-06-18T19:58:16 See commit

The commit titled "Copy fixtures affected by new inference" introduces a series of new test fixtures to the React compiler's Babel plugin, specifically targeting scenarios related to mutability and scope inference. A total of 34 new files were added, including both JavaScript and TypeScript files, along with their corresponding expectation files in Markdown format. These additions aim to enhance the testing framework by covering various edge cases and behaviors associated with mutability in React, particularly in the context of hooks and scope management.

This update is part of a broader effort to refine the compiler's inference capabilities, ensuring that it correctly handles complex scenarios such as nested scopes, function aliasing, and the interaction of hooks with mutable state. By expanding the test suite with these new fixtures, the commit enhances the robustness of the compiler's functionality, facilitating better error detection and overall reliability in React applications.

Files changed

  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/aliased-nested-scope-truncated-dep.expect.md
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/aliased-nested-scope-truncated-dep.tsx
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/capturing-function-alias-computed-load-2-iife.expect.md
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/capturing-function-alias-computed-load-2-iife.js
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/capturing-function-alias-computed-load-3-iife.js
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/capturing-function-alias-computed-load-4-iife.expect.md
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/capturing-function-alias-computed-load-4-iife.js
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/capturing-function-alias-computed-load-iife.expect.md
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/capturing-function-alias-computed-load-iife.js
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/error.mutate-hook-argument.expect.md
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/error.mutate-hook-argument.js
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/error.not-useEffect-external-mutate.expect.md
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/error.not-useEffect-external-mutate.js
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/error.reassignment-to-global-indirect.expect.md
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/error.reassignment-to-global-indirect.js
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/error.reassignment-to-global.expect.md
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/error.todo-repro-named-function-with-shadowed-local-same-name.expect.md
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/error.todo-repro-named-function-with-shadowed-local-same-name.js
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/mutate-after-useeffect-optional-chain.expect.md
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/mutate-after-useeffect-optional-chain.js
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/mutate-after-useeffect-ref-access.expect.md
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/mutate-after-useeffect-ref-access.js
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/mutate-after-useeffect.expect.md
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/mutate-after-useeffect.js
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/object-expression-computed-key-object-mutated-later.expect.md
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/object-expression-computed-key-object-mutated-later.js
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/object-expression-computed-member.expect.md
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/object-expression-computed-member.js
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/useCallback-reordering-deplist-controlflow.tsx
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/useCallback-reordering-depslist-assignment.expect.md
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/useCallback-reordering-depslist-assignment.tsx
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/useMemo-reordering-depslist-assignment.expect.md
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/useMemo-reordering-depslist-assignment.ts
2025-06-18T20:02:12 See commit

The commit titled "Enable new inference by default" (commit #33497) introduces a significant update to the React compiler by making the new inference system the default behavior. This change affects various files within the Babel plugin for React, particularly in the handling of environment settings and test cases related to inferred effects and dependency management. The modifications include updates to error handling for invalid function usages, improvements in the inference of effect dependencies, and adjustments to the handling of memoization and callback dependencies.

In addition to enabling the new inference by default, the commit also includes numerous updates to test fixtures to ensure the accuracy and robustness of the new inference system. These tests cover a wide range of scenarios, including capturing function aliases, handling nested scopes, and validating the behavior of hooks under various conditions. Overall, this commit aims to enhance the compiler's efficiency and reliability while providing a more intuitive experience for developers using React.

Files changed

  • compiler/packages/babel-plugin-react-compiler/src/HIR/Environment.ts
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/aliased-nested-scope-truncated-dep.expect.md
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/capturing-function-alias-computed-load-2-iife.expect.md
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/capturing-function-alias-computed-load-3-iife.expect.md
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/capturing-function-alias-computed-load-4-iife.expect.md
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/capturing-function-alias-computed-load-iife.expect.md
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/error.invalid-impure-functions-in-render.expect.md
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/error.invalid-non-imported-reanimated-shared-value-writes.expect.md
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/error.mutate-hook-argument.expect.md
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/error.not-useEffect-external-mutate.expect.md
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/error.reassignment-to-global-indirect.expect.md
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/error.reassignment-to-global.expect.md
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/error.todo-repro-named-function-with-shadowed-local-same-name.expect.md
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/infer-effect-dependencies/bailout-retry/mutate-after-useeffect-optional-chain.expect.md
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/infer-effect-dependencies/bailout-retry/mutate-after-useeffect-ref-access.expect.md
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/infer-effect-dependencies/bailout-retry/mutate-after-useeffect.expect.md
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/infer-effect-dependencies/no-emit/retry-no-emit.expect.md
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/infer-effect-dependencies/reactive-setState.expect.md
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/inner-function/nullable-objects/array-map-named-callback-cross-context.expect.md
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/object-expression-computed-key-object-mutated-later.expect.md
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/object-expression-computed-member.expect.md
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/preserve-memo-validation/useCallback-reordering-deplist-controlflow.expect.md
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/preserve-memo-validation/useCallback-reordering-depslist-assignment.expect.md
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/preserve-memo-validation/useMemo-reordering-depslist-assignment.expect.md
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/transform-fire/shared-hook-calls.expect.md
2025-06-18T22:43:23 See commit

This commit addresses an issue in the compiler related to an infinite loop that occurs when applying new aliasing signatures, which can lead to the generation of new temporaries and prevent the abstract memory model from converging. The solution involves implementing a caching mechanism for the applications of these signatures to ensure that the compiler can efficiently handle the effects of aliasing without entering an infinite loop.

The changes made include modifications to several files within the Babel plugin for React. Key updates involve the introduction of caching for applied signatures and adjustments to function signatures and effects handling. The commit also includes new test cases to verify the fix, demonstrating the input that previously caused the infinite loop and showing the expected output after the implementation of the caching mechanism. Overall, this enhancement improves the stability and performance of the compiler's handling of aliasing effects.

Files changed

  • compiler/packages/babel-plugin-react-compiler/src/Inference/AliasingEffects.ts
  • compiler/packages/babel-plugin-react-compiler/src/Inference/InferMutationAliasingEffects.ts
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/repro-compiler-infinite-loop.expect.md
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/repro-compiler-infinite-loop.js
2025-06-18T22:43:48 See commit

This commit introduces support for aliasing signatures in the module type provider of the compiler, enabling functions like nullthrows() and identity() to have polymorphic return types based on their input types. The changes involve the addition of new configurations and schemas for aliasing signatures, which define how the input parameters and return values of functions interact, particularly in terms of mutability and effects. This enhancement allows for more precise type inference in scenarios where the behavior of functions can vary depending on the inputs they receive.

The implementation includes updates to various files, introducing new types and schemas in the TypeSchema.ts to accommodate aliasing signatures and their effects. Additionally, test cases demonstrating the functionality of the newly supported aliasing signatures with functions such as typedIdentity and identity have been added, ensuring that the compiler can correctly handle these cases. Overall, this commit enhances the type system's expressiveness, particularly in handling mutable and immutable data within the React framework.

Files changed

  • compiler/packages/babel-plugin-react-compiler/src/HIR/Globals.ts
  • compiler/packages/babel-plugin-react-compiler/src/HIR/TypeSchema.ts
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/typed-identity-function-frozen-input.expect.md
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/typed-identity-function-frozen-input.js
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/typed-identity-function-mutable-input.expect.md
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/typed-identity-function-mutable-input.js
  • compiler/packages/snap/src/sprout/shared-runtime-type-provider.ts
  • compiler/packages/snap/src/sprout/shared-runtime.ts
2025-06-18T23:00:36 See commit

The commit titled "Fix " addresses an oversight in the memoization validation process within the React compiler. Previously, the implementation focused solely on checking the compiled output, which did not align with the intended functionality of comparing memoization outcomes with and without the "forget" mechanism. The changes made in this commit include the removal of the alwaysCheck parameter from the ValidateMemoization component's calls, simplifying the validation logic to ensure it correctly reflects the intended behavior.

In addition to modifying the ValidateMemoization calls across various test fixtures, the commit introduces the onlyCheckCompiled parameter to enhance the validation process. This adjustment allows for a more accurate comparison of outputs depending on the memoization state. The updates contribute to a more robust and reliable validation framework, ensuring that the memoization logic behaves as expected under different conditions, thereby improving the overall integrity of the React compiler's functionality.

Files changed

  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/todo-control-flow-sensitive-mutation.expect.md
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/todo-control-flow-sensitive-mutation.tsx
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/todo-transitivity-createfrom-capture-lambda.expect.md
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/todo-transitivity-createfrom-capture-lambda.tsx
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/transitivity-add-captured-array-to-itself.expect.md
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/transitivity-add-captured-array-to-itself.tsx
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/transitivity-capture-createfrom-lambda.expect.md
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/transitivity-capture-createfrom-lambda.tsx
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/transitivity-capture-createfrom.expect.md
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/transitivity-capture-createfrom.tsx
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/transitivity-createfrom-capture.expect.md
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/transitivity-createfrom-capture.tsx
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/transitivity-phi-assign-or-capture.expect.md
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/transitivity-phi-assign-or-capture.tsx
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/typed-identity-function-frozen-input.expect.md
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/typed-identity-function-frozen-input.js
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/weakmap-constructor.expect.md
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/weakmap-constructor.js
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/weakset-constructor.expect.md
  • compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/weakset-constructor.js
  • compiler/packages/snap/src/sprout/shared-runtime.ts