From ef4bc8b4f91023afac437be9179beef350b32db3 Mon Sep 17 00:00:00 2001 From: Rodrigo Faria Date: Fri, 28 Mar 2025 15:10:32 +0000 Subject: [PATCH 01/76] feat(babel-plugin-react-compiler): support satisfies operator (#32742) Solve https://github.com/facebook/react/pull/29818 --------- Co-authored-by: Rodrigo Faria --- .../src/HIR/BuildHIR.ts | 14 ++++ .../src/HIR/HIR.ts | 14 +++- .../ReactiveScopes/CodegenReactiveFunction.ts | 15 ++-- .../type-annotation-satisfies-array.expect.md | 71 +++++++++++++++++++ .../type-annotation-satisfies-array.ts | 15 ++++ ...type-annotation-satisfies-number.expect.md | 41 +++++++++++ .../type-annotation-satisfies-number.ts | 13 ++++ 7 files changed, 176 insertions(+), 7 deletions(-) create mode 100644 compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/type-annotations/type-annotation-satisfies-array.expect.md create mode 100644 compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/type-annotations/type-annotation-satisfies-array.ts create mode 100644 compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/type-annotations/type-annotation-satisfies-number.expect.md create mode 100644 compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/type-annotations/type-annotation-satisfies-number.ts diff --git a/compiler/packages/babel-plugin-react-compiler/src/HIR/BuildHIR.ts b/compiler/packages/babel-plugin-react-compiler/src/HIR/BuildHIR.ts index 6f93ef2f3a..cba4bf93ed 100644 --- a/compiler/packages/babel-plugin-react-compiler/src/HIR/BuildHIR.ts +++ b/compiler/packages/babel-plugin-react-compiler/src/HIR/BuildHIR.ts @@ -2406,6 +2406,19 @@ function lowerExpression( kind: 'TypeCastExpression', value: lowerExpressionToTemporary(builder, expr.get('expression')), typeAnnotation: typeAnnotation.node, + typeAnnotationKind: 'cast', + type: lowerType(typeAnnotation.node), + loc: exprLoc, + }; + } + case 'TSSatisfiesExpression': { + let expr = exprPath as NodePath; + const typeAnnotation = expr.get('typeAnnotation'); + return { + kind: 'TypeCastExpression', + value: lowerExpressionToTemporary(builder, expr.get('expression')), + typeAnnotation: typeAnnotation.node, + typeAnnotationKind: 'satisfies', type: lowerType(typeAnnotation.node), loc: exprLoc, }; @@ -2417,6 +2430,7 @@ function lowerExpression( kind: 'TypeCastExpression', value: lowerExpressionToTemporary(builder, expr.get('expression')), typeAnnotation: typeAnnotation.node, + typeAnnotationKind: 'as', type: lowerType(typeAnnotation.node), loc: exprLoc, }; diff --git a/compiler/packages/babel-plugin-react-compiler/src/HIR/HIR.ts b/compiler/packages/babel-plugin-react-compiler/src/HIR/HIR.ts index 3a8cb89ca0..5c84cbb9fc 100644 --- a/compiler/packages/babel-plugin-react-compiler/src/HIR/HIR.ts +++ b/compiler/packages/babel-plugin-react-compiler/src/HIR/HIR.ts @@ -910,13 +910,21 @@ export type InstructionValue = value: Place; loc: SourceLocation; } - | { + | ({ kind: 'TypeCastExpression'; value: Place; - typeAnnotation: t.FlowType | t.TSType; type: Type; loc: SourceLocation; - } + } & ( + | { + typeAnnotation: t.FlowType; + typeAnnotationKind: 'cast'; + } + | { + typeAnnotation: t.TSType; + typeAnnotationKind: 'as' | 'satisfies'; + } + )) | JsxExpression | { kind: 'ObjectExpression'; diff --git a/compiler/packages/babel-plugin-react-compiler/src/ReactiveScopes/CodegenReactiveFunction.ts b/compiler/packages/babel-plugin-react-compiler/src/ReactiveScopes/CodegenReactiveFunction.ts index 9d41663d56..02994ef0f9 100644 --- a/compiler/packages/babel-plugin-react-compiler/src/ReactiveScopes/CodegenReactiveFunction.ts +++ b/compiler/packages/babel-plugin-react-compiler/src/ReactiveScopes/CodegenReactiveFunction.ts @@ -2115,10 +2115,17 @@ function codegenInstructionValue( } case 'TypeCastExpression': { if (t.isTSType(instrValue.typeAnnotation)) { - value = t.tsAsExpression( - codegenPlaceToExpression(cx, instrValue.value), - instrValue.typeAnnotation, - ); + if (instrValue.typeAnnotationKind === 'satisfies') { + value = t.tsSatisfiesExpression( + codegenPlaceToExpression(cx, instrValue.value), + instrValue.typeAnnotation, + ); + } else { + value = t.tsAsExpression( + codegenPlaceToExpression(cx, instrValue.value), + instrValue.typeAnnotation, + ); + } } else { value = t.typeCastExpression( codegenPlaceToExpression(cx, instrValue.value), diff --git a/compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/type-annotations/type-annotation-satisfies-array.expect.md b/compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/type-annotations/type-annotation-satisfies-array.expect.md new file mode 100644 index 0000000000..d0083f3c3e --- /dev/null +++ b/compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/type-annotations/type-annotation-satisfies-array.expect.md @@ -0,0 +1,71 @@ + +## Input + +```javascript +// @enableUseTypeAnnotations +function Component(props: {id: number}) { + const x = makeArray(props.id) satisfies number[]; + const y = x.at(0); + return y; +} + +function makeArray(x: T): Array { + return [x]; +} + +export const FIXTURE_ENTRYPOINT = { + fn: Component, + params: [{id: 42}], +}; + +``` + +## Code + +```javascript +import { c as _c } from "react/compiler-runtime"; // @enableUseTypeAnnotations +function Component(props) { + const $ = _c(4); + let t0; + if ($[0] !== props.id) { + t0 = makeArray(props.id); + $[0] = props.id; + $[1] = t0; + } else { + t0 = $[1]; + } + const x = t0 satisfies number[]; + let t1; + if ($[2] !== x) { + t1 = x.at(0); + $[2] = x; + $[3] = t1; + } else { + t1 = $[3]; + } + const y = t1; + return y; +} + +function makeArray(x) { + const $ = _c(2); + let t0; + if ($[0] !== x) { + t0 = [x]; + $[0] = x; + $[1] = t0; + } else { + t0 = $[1]; + } + return t0; +} + +export const FIXTURE_ENTRYPOINT = { + fn: Component, + params: [{ id: 42 }], +}; + +``` + +### Eval output +(kind: ok) 42 \ No newline at end of file diff --git a/compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/type-annotations/type-annotation-satisfies-array.ts b/compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/type-annotations/type-annotation-satisfies-array.ts new file mode 100644 index 0000000000..5024055c10 --- /dev/null +++ b/compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/type-annotations/type-annotation-satisfies-array.ts @@ -0,0 +1,15 @@ +// @enableUseTypeAnnotations +function Component(props: {id: number}) { + const x = makeArray(props.id) satisfies number[]; + const y = x.at(0); + return y; +} + +function makeArray(x: T): Array { + return [x]; +} + +export const FIXTURE_ENTRYPOINT = { + fn: Component, + params: [{id: 42}], +}; diff --git a/compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/type-annotations/type-annotation-satisfies-number.expect.md b/compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/type-annotations/type-annotation-satisfies-number.expect.md new file mode 100644 index 0000000000..0819456dc1 --- /dev/null +++ b/compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/type-annotations/type-annotation-satisfies-number.expect.md @@ -0,0 +1,41 @@ + +## Input + +```javascript +// @enableUseTypeAnnotations +import {identity} from 'shared-runtime'; + +function Component(props: {id: number}) { + const x = identity(props.id); + const y = x satisfies number; + return y; +} + +export const FIXTURE_ENTRYPOINT = { + fn: Component, + params: [{id: 42}], +}; + +``` + +## Code + +```javascript +// @enableUseTypeAnnotations +import { identity } from "shared-runtime"; + +function Component(props) { + const x = identity(props.id); + const y = x satisfies number; + return y; +} + +export const FIXTURE_ENTRYPOINT = { + fn: Component, + params: [{ id: 42 }], +}; + +``` + +### Eval output +(kind: ok) 42 \ No newline at end of file diff --git a/compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/type-annotations/type-annotation-satisfies-number.ts b/compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/type-annotations/type-annotation-satisfies-number.ts new file mode 100644 index 0000000000..2f4ea6222e --- /dev/null +++ b/compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/type-annotations/type-annotation-satisfies-number.ts @@ -0,0 +1,13 @@ +// @enableUseTypeAnnotations +import {identity} from 'shared-runtime'; + +function Component(props: {id: number}) { + const x = identity(props.id); + const y = x satisfies number; + return y; +} + +export const FIXTURE_ENTRYPOINT = { + fn: Component, + params: [{id: 42}], +}; From 1de32a5e75fe96ac3c1b728a117010e11673f6ed Mon Sep 17 00:00:00 2001 From: lauren Date: Fri, 28 Mar 2025 14:35:18 -0400 Subject: [PATCH 02/76] [release] Also split the onlyPackages param (#32777) I missed this the last time. --- [//]: # (BEGIN SAPLING FOOTER) Stack created with [Sapling](https://sapling-scm.com). Best reviewed with [ReviewStack](https://reviewstack.dev/facebook/react/pull/32777). * #32778 * __->__ #32777 --- .../release/prepare-release-from-npm-commands/parse-params.js | 1 + scripts/release/publish-commands/parse-params.js | 1 + 2 files changed, 2 insertions(+) diff --git a/scripts/release/prepare-release-from-npm-commands/parse-params.js b/scripts/release/prepare-release-from-npm-commands/parse-params.js index ef9c4979b2..10dbfb4e51 100644 --- a/scripts/release/prepare-release-from-npm-commands/parse-params.js +++ b/scripts/release/prepare-release-from-npm-commands/parse-params.js @@ -56,6 +56,7 @@ module.exports = () => { const params = commandLineArgs(paramDefinitions); splitCommaParams(params.skipPackages); + splitCommaParams(params.onlyPackages); return params; }; diff --git a/scripts/release/publish-commands/parse-params.js b/scripts/release/publish-commands/parse-params.js index ce9a9b7825..69a53737ac 100644 --- a/scripts/release/publish-commands/parse-params.js +++ b/scripts/release/publish-commands/parse-params.js @@ -49,6 +49,7 @@ const paramDefinitions = [ module.exports = () => { const params = commandLineArgs(paramDefinitions); splitCommaParams(params.skipPackages); + splitCommaParams(params.onlyPackages); splitCommaParams(params.tags); params.tags.forEach(tag => { switch (tag) { From 1825990c5608f0ab0c1475b4292218a508a171c9 Mon Sep 17 00:00:00 2001 From: lauren Date: Fri, 28 Mar 2025 14:35:29 -0400 Subject: [PATCH 03/76] [release] Don't lookup build-info.json when updating version numbers (#32778) From what we can see, `build-info.json` is a vestigal file that we were previously including in builds but are no longer since 2022 (see https://github.com/facebook/react/pull/23257, which removes `build-info.json` which would have broken scripts/release/build-release-locally-commands/add-build-info-json.js). Since this file is no longer built, instead of looking it up we default to the `version` that was passed in as an argument to scripts/release/prepare-release-from-npm.js. Since `version` is what is pulled from npm, there should only be 1 consistent version for all the packages that are pulled. Therefore, only 1 version (eg canary) needs to be replaced to the new stable version. --- [//]: # (BEGIN SAPLING FOOTER) Stack created with [Sapling](https://sapling-scm.com). Best reviewed with [ReviewStack](https://reviewstack.dev/facebook/react/pull/32778). * __->__ #32778 * #32777 --- .../update-stable-version-numbers.js | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/scripts/release/prepare-release-from-npm-commands/update-stable-version-numbers.js b/scripts/release/prepare-release-from-npm-commands/update-stable-version-numbers.js index f201118890..eef68255e2 100644 --- a/scripts/release/prepare-release-from-npm-commands/update-stable-version-numbers.js +++ b/scripts/release/prepare-release-from-npm-commands/update-stable-version-numbers.js @@ -114,20 +114,6 @@ const run = async ({cwd, packages, version, ci}, versionsMap) => { clear(); if (packages.includes('react')) { - // A separate "React version" is used for the embedded renderer version to support DevTools, - // since it needs to distinguish between different version ranges of React. - // We need to replace it as well as the "next" version number. - const buildInfoPath = join(nodeModulesPath, 'react', 'build-info.json'); - const {reactVersion} = await readJson(buildInfoPath); - - if (!reactVersion) { - console.error( - theme`{error Unsupported or invalid build metadata in} {path build/node_modules/react/build-info.json}` + - theme`{error . This could indicate that you have specified an outdated "next" version.}` - ); - process.exit(1); - } - // We print the diff to the console for review, // but it can be large so let's also write it to disk. const diffPath = join(cwd, 'build', 'temp.diff'); @@ -152,10 +138,6 @@ const run = async ({cwd, packages, version, ci}, versionsMap) => { while (afterContents.indexOf(version) >= 0) { afterContents = afterContents.replace(version, newStableVersion); } - // Replace inline renderer version numbers (e.g. shared/ReactVersion). - while (afterContents.indexOf(reactVersion) >= 0) { - afterContents = afterContents.replace(reactVersion, newStableVersion); - } if (beforeContents !== afterContents) { numFilesModified++; // Using a relative path for diff helps with the snapshot test From deb7859bb01831b68615c5e5416174eb4b4e0d58 Mon Sep 17 00:00:00 2001 From: mofeiZ <34200447+mofeiZ@users.noreply.github.com> Date: Fri, 28 Mar 2025 16:03:08 -0400 Subject: [PATCH 04/76] [compiler][snap] Fix test filter + watch mode (#32780) Accidentally broke this when migrating our test runner to use the bundled build https://github.com/facebook/react/pull/32758 The fix is pretty simple. File watcher should listen for changes in `packages/babel-plugin-react-compiler` instead of `cwd`, which is now `packages/snap`. --- compiler/packages/snap/src/runner-watch.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compiler/packages/snap/src/runner-watch.ts b/compiler/packages/snap/src/runner-watch.ts index e6632d83ed..6073fd30f9 100644 --- a/compiler/packages/snap/src/runner-watch.ts +++ b/compiler/packages/snap/src/runner-watch.ts @@ -146,7 +146,7 @@ function subscribeFilterFile( state: RunnerState, onChange: (state: RunnerState) => void, ) { - watcher.subscribe(process.cwd(), async (err, events) => { + watcher.subscribe(PROJECT_ROOT, async (err, events) => { if (err) { console.error(err); process.exit(1); From 50c5cdb65334509a29f864887ec980aefea60083 Mon Sep 17 00:00:00 2001 From: lauren Date: Fri, 28 Mar 2025 16:20:04 -0400 Subject: [PATCH 05/76] Bump next prerelease version numbers (#32782) Updates the version numbers in the prerelease channels. --- ReactVersions.js | 14 +++++++------- packages/react-art/package.json | 6 +++--- packages/react-dom/package.json | 6 +++--- packages/react-native-renderer/package.json | 4 ++-- packages/react-reconciler/package.json | 6 +++--- packages/react-server-dom-fb/package.json | 4 ++-- packages/react-server-dom-parcel/package.json | 10 +++++----- packages/react-server-dom-turbopack/package.json | 4 ++-- packages/react-server-dom-webpack/package.json | 4 ++-- packages/react-test-renderer/package.json | 8 ++++---- packages/scheduler/package.json | 4 ++-- packages/use-subscription/package.json | 2 +- 12 files changed, 36 insertions(+), 36 deletions(-) diff --git a/ReactVersions.js b/ReactVersions.js index 7385671dcc..a22eaf9736 100644 --- a/ReactVersions.js +++ b/ReactVersions.js @@ -18,7 +18,7 @@ // // 0.0.0-experimental-241c4467e-20200129 -const ReactVersion = '19.1.0'; +const ReactVersion = '19.2.0'; // The label used by the @canary channel. Represents the upcoming release's // stability. Most of the time, this will be "canary", but we may temporarily @@ -33,7 +33,7 @@ const canaryChannelLabel = 'canary'; const rcNumber = 0; const stablePackages = { - 'eslint-plugin-react-hooks': '5.2.0', + 'eslint-plugin-react-hooks': '6.0.0', 'jest-react': '0.17.0', react: ReactVersion, 'react-art': ReactVersion, @@ -42,12 +42,12 @@ const stablePackages = { 'react-server-dom-turbopack': ReactVersion, 'react-server-dom-parcel': ReactVersion, 'react-is': ReactVersion, - 'react-reconciler': '0.32.0', - 'react-refresh': '0.17.0', + 'react-reconciler': '0.33.0', + 'react-refresh': '0.18.0', 'react-test-renderer': ReactVersion, - 'use-subscription': '1.11.0', - 'use-sync-external-store': '1.5.0', - scheduler: '0.26.0', + 'use-subscription': '1.12.0', + 'use-sync-external-store': '1.6.0', + scheduler: '0.27.0', }; // These packages do not exist in the @canary or @latest channel, only diff --git a/packages/react-art/package.json b/packages/react-art/package.json index e5ae49076a..b130534689 100644 --- a/packages/react-art/package.json +++ b/packages/react-art/package.json @@ -24,10 +24,10 @@ "dependencies": { "art": "^0.10.1", "create-react-class": "^15.6.2", - "scheduler": "^0.25.0" + "scheduler": "^0.26.0" }, "peerDependencies": { - "react": "^19.0.0" + "react": "^19.1.0" }, "files": [ "LICENSE", @@ -38,4 +38,4 @@ "Rectangle.js", "Wedge.js" ] -} \ No newline at end of file +} diff --git a/packages/react-dom/package.json b/packages/react-dom/package.json index 3b74a69df8..949f73ea27 100644 --- a/packages/react-dom/package.json +++ b/packages/react-dom/package.json @@ -17,10 +17,10 @@ }, "homepage": "https://react.dev/", "dependencies": { - "scheduler": "^0.25.0" + "scheduler": "^0.26.0" }, "peerDependencies": { - "react": "^19.0.0" + "react": "^19.1.0" }, "files": [ "LICENSE", @@ -123,4 +123,4 @@ "./server.js": "./server.browser.js", "./static.js": "./static.browser.js" } -} \ No newline at end of file +} diff --git a/packages/react-native-renderer/package.json b/packages/react-native-renderer/package.json index c143b2cf74..8bdb25162c 100644 --- a/packages/react-native-renderer/package.json +++ b/packages/react-native-renderer/package.json @@ -8,9 +8,9 @@ "directory": "packages/react-native-renderer" }, "dependencies": { - "scheduler": "^0.25.0" + "scheduler": "^0.26.0" }, "peerDependencies": { "react": "^18.0.0" } -} \ No newline at end of file +} diff --git a/packages/react-reconciler/package.json b/packages/react-reconciler/package.json index ca3a4376fa..bdaeff05c3 100644 --- a/packages/react-reconciler/package.json +++ b/packages/react-reconciler/package.json @@ -26,9 +26,9 @@ "node": ">=0.10.0" }, "peerDependencies": { - "react": "^19.0.0" + "react": "^19.1.0" }, "dependencies": { - "scheduler": "^0.25.0" + "scheduler": "^0.26.0" } -} \ No newline at end of file +} diff --git a/packages/react-server-dom-fb/package.json b/packages/react-server-dom-fb/package.json index f81a5d857d..ae3308175b 100644 --- a/packages/react-server-dom-fb/package.json +++ b/packages/react-server-dom-fb/package.json @@ -8,10 +8,10 @@ "directory": "packages/react-server-dom-fb" }, "dependencies": { - "scheduler": "^0.25.0" + "scheduler": "^0.26.0" }, "peerDependencies": { "react": "^18.0.0", "react-dom": "^18.0.0" } -} \ No newline at end of file +} diff --git a/packages/react-server-dom-parcel/package.json b/packages/react-server-dom-parcel/package.json index a4cb7774c3..9cf7cd1aff 100644 --- a/packages/react-server-dom-parcel/package.json +++ b/packages/react-server-dom-parcel/package.json @@ -1,7 +1,7 @@ { "name": "react-server-dom-parcel", "description": "React Server Components bindings for DOM using Parcel. This is intended to be integrated into meta-frameworks. It is not intended to be imported directly.", - "version": "19.0.0", + "version": "19.1.0", "keywords": [ "react" ], @@ -71,15 +71,15 @@ }, "main": "index.js", "repository": { - "type" : "git", - "url" : "https://github.com/facebook/react.git", + "type": "git", + "url": "https://github.com/facebook/react.git", "directory": "packages/react-server-dom-parcel" }, "engines": { "node": ">=0.10.0" }, "peerDependencies": { - "react": "^19.0.0", - "react-dom": "^19.0.0" + "react": "^19.1.0", + "react-dom": "^19.1.0" } } diff --git a/packages/react-server-dom-turbopack/package.json b/packages/react-server-dom-turbopack/package.json index 0c698ab46b..00b97d7cd1 100644 --- a/packages/react-server-dom-turbopack/package.json +++ b/packages/react-server-dom-turbopack/package.json @@ -79,8 +79,8 @@ "node": ">=0.10.0" }, "peerDependencies": { - "react": "^19.0.0", - "react-dom": "^19.0.0" + "react": "^19.1.0", + "react-dom": "^19.1.0" }, "dependencies": { "acorn-loose": "^8.3.0", diff --git a/packages/react-server-dom-webpack/package.json b/packages/react-server-dom-webpack/package.json index 1cb0d90740..c13f28963d 100644 --- a/packages/react-server-dom-webpack/package.json +++ b/packages/react-server-dom-webpack/package.json @@ -100,8 +100,8 @@ "node": ">=0.10.0" }, "peerDependencies": { - "react": "^19.0.0", - "react-dom": "^19.0.0", + "react": "^19.1.0", + "react-dom": "^19.1.0", "webpack": "^5.59.0" }, "dependencies": { diff --git a/packages/react-test-renderer/package.json b/packages/react-test-renderer/package.json index 7303e25ae1..ccefd1e88d 100644 --- a/packages/react-test-renderer/package.json +++ b/packages/react-test-renderer/package.json @@ -19,11 +19,11 @@ }, "homepage": "https://react.dev/", "dependencies": { - "react-is": "^19.0.0", - "scheduler": "^0.25.0" + "react-is": "^19.1.0", + "scheduler": "^0.26.0" }, "peerDependencies": { - "react": "^19.0.0" + "react": "^19.1.0" }, "files": [ "LICENSE", @@ -32,4 +32,4 @@ "shallow.js", "cjs/" ] -} \ No newline at end of file +} diff --git a/packages/scheduler/package.json b/packages/scheduler/package.json index 1db97df9e2..fbdf280b10 100644 --- a/packages/scheduler/package.json +++ b/packages/scheduler/package.json @@ -1,6 +1,6 @@ { "name": "scheduler", - "version": "0.25.0", + "version": "0.26.0", "description": "Cooperative scheduler for the browser environment.", "repository": { "type": "git", @@ -24,4 +24,4 @@ "unstable_post_task.js", "cjs/" ] -} \ No newline at end of file +} diff --git a/packages/use-subscription/package.json b/packages/use-subscription/package.json index cf7aea8d10..d7659878ee 100644 --- a/packages/use-subscription/package.json +++ b/packages/use-subscription/package.json @@ -21,6 +21,6 @@ "rxjs": "^5.5.6" }, "dependencies": { - "use-sync-external-store": "^1.4.0" + "use-sync-external-store": "^1.5.0" } } From d726d692ed896c34fc320f633f07699a415381fa Mon Sep 17 00:00:00 2001 From: Matt Carroll <7158882+mattcarrollcode@users.noreply.github.com> Date: Fri, 28 Mar 2025 13:21:29 -0700 Subject: [PATCH 06/76] Add changelog for 19.1.0 (#32781) --- CHANGELOG.md | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 973d088c25..620a812e03 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,47 @@ +## 19.1.0 (March 28, 2025) + +### Owner Stack +* An Owner Stack is a development-only stack trace that helps identify which components are responsible for rendering a particular component. An Owner Stack is distinct from a Component Stack, which shows the hierarchy of components leading to an error. +* The [captureOwnerStack API](https://react.dev/reference/react/captureOwnerStack) is only available in development mode and returns a Owner Stack, if available. The API can be used to enhance error overlays or log component relationships when debugging. [#29923](https://github.com/facebook/react/pull/29923), [#32353](https://github.com/facebook/react/pull/32353), [#30306](https://github.com/facebook/react/pull/30306), +[#32538](https://github.com/facebook/react/pull/32538), [#32529](https://github.com/facebook/react/pull/32529), [#32538](https://github.com/facebook/react/pull/32538) + +### React +* Enhanced support for Suspense boundaries to be used anywhere, including the client, server, and during hydration. [#32069](https://github.com/facebook/react/pull/32069), [#32163](https://github.com/facebook/react/pull/32163), [#32224](https://github.com/facebook/react/pull/32224), [#32252](https://github.com/facebook/react/pull/32252) +* Reduced unnecessary client rendering through improved hydration scheduling [#31751](https://github.com/facebook/react/pull/31751) +* Increased priority of client rendered Suspense boundaries [#31776](https://github.com/facebook/react/pull/31776) +* Fixed frozen fallback states by rendering unfinished Suspense boundaries on the client. [#31620](https://github.com/facebook/react/pull/31620) +* Reduced garbage collection pressure by improving Suspense boundary retries. [#31667](https://github.com/facebook/react/pull/31667) +* Fixed erroneous “Waiting for Paint” log when the passive effect phase was not delayed [#31526](https://github.com/facebook/react/pull/31526) +* Fixed a regression causing key warnings for flattened positional children in development mode. [#32117](https://github.com/facebook/react/pull/32117) +* Updated `useId` to use valid CSS selectors, changing format from `:r123:` to `«r123»`. [#32001](https://github.com/facebook/react/pull/32001) +* Added a dev-only warning for null/undefined created in useEffect, useInsertionEffect, and useLayoutEffect. [#32355](https://github.com/facebook/react/pull/32355) +* Fixed a bug where dev-only methods were exported in production builds. React.act is no longer available in production builds. [#32200](https://github.com/facebook/react/pull/32200) +* Improved consistency across prod and dev to improve compatibility with Google Closure Complier and bindings [#31808](https://github.com/facebook/react/pull/31808) +* Improve passive effect scheduling for consistent task yielding. [#31785](https://github.com/facebook/react/pull/31785) +* Fixed asserts in React Native when passChildrenWhenCloningPersistedNodes is enabled for OffscreenComponent rendering. [#32528](https://github.com/facebook/react/pull/32528) +* Fixed component name resolution for Portal [#32640](https://github.com/facebook/react/pull/32640) +* Added support for beforetoggle and toggle events on the dialog element. #32479 [#32479](https://github.com/facebook/react/pull/32479) + +### React DOM +* Fixed double warning when the `href` attribute is an empty string [#31783](https://github.com/facebook/react/pull/31783) + * Fixed an edge case where `getHoistableRoot()` didn’t work properly when the container was a Document [#32321](https://github.com/facebook/react/pull/32321) +* Removed support for using HTML comments (e.g. ``) as a DOM container. [#32250](https://github.com/facebook/react/pull/32250) +* Added support for `